add helper/update-flake.sh

This greatly simplifies updating nixpkgs.
See the comment at the top of update-flake.sh for a description.
This commit is contained in:
Erik Arvstedt 2021-08-16 10:42:08 +02:00
parent f7c2133250
commit 87df809a88
No known key found for this signature in database
GPG key ID: 33312B944DD97846
2 changed files with 122 additions and 0 deletions

77
helper/update-flake.nix Normal file
View file

@ -0,0 +1,77 @@
{ prevVersions ? null }:
let
flake = builtins.getFlake (toString ../.);
inherit (flake.inputs.nixpkgs) lib;
in rec {
# Convert the list of pinned pkgs to an attrset with form
# {
# stable = { bitcoind = "0.21.1"; ... };
# unstable = { btcpayserver = "1.2.1"; ... };
# }
# A pinned pkg is added to `stable` if the stable and unstable pkg versions
# are identical.
versions = let
pinned = flake.nbPkgs.x86_64-linux.pinned;
pinnedPkgs = lib.filterAttrs (n: v: lib.isDerivation v) pinned;
stable = pinned.pkgs;
unstable = pinned.pkgsUnstable;
isStable = builtins.partition (pkgName:
!(unstable ? "${pkgName}") ||
((stable ? "${pkgName}") && stable.${pkgName}.version == unstable.${pkgName}.version)
) (builtins.attrNames pinnedPkgs);
in {
stable = lib.genAttrs isStable.right (pkgName: stable.${pkgName}.version);
unstable = lib.genAttrs isStable.wrong (pkgName: unstable.${pkgName}.version);
};
showUpdates = let
prev = builtins.fromJSON prevVersions;
prevPkgs = prev.stable // prev.unstable;
mapFilter = f: xs: lib.remove null (map f xs);
mkChanges = title: pkgs:
let
lines = mapFilter (pkgName:
let
version = pkgs.${pkgName};
prevVersion = prevPkgs.${pkgName};
in
if version != prevVersion then
"${pkgName}: ${prevVersion} -> ${version}"
else
null
) (builtins.attrNames pkgs);
in
if lines == [] then
null
else
builtins.concatStringsSep "\n" ([title] ++ lines);
changes = [
(mkChanges "Pkg updates in nixpkgs stable:" versions.stable)
(mkChanges "Pkg updates in nixpkgs unstable:" versions.unstable)
];
allChanges = builtins.concatStringsSep "\n\n" (lib.remove null changes);
in
if allChanges == "" then
"No pkg version updates."
else
allChanges;
pinnedFile = let
toLines = pkgs: builtins.concatStringsSep "\n " (builtins.attrNames pkgs);
in ''
# This file is generated by ../helper/update-flake.nix
pkgs: pkgsUnstable:
{
inherit (pkgs)
${toLines versions.stable};
inherit (pkgsUnstable)
${toLines versions.unstable};
inherit pkgs pkgsUnstable;
}
'';
}