From 87df809a8808c1aaddeb82397ac3f37816cdee1b Mon Sep 17 00:00:00 2001 From: Erik Arvstedt Date: Mon, 16 Aug 2021 10:42:08 +0200 Subject: [PATCH] add helper/update-flake.sh This greatly simplifies updating nixpkgs. See the comment at the top of update-flake.sh for a description. --- helper/update-flake.nix | 77 +++++++++++++++++++++++++++++++++++++++++ helper/update-flake.sh | 45 ++++++++++++++++++++++++ 2 files changed, 122 insertions(+) create mode 100644 helper/update-flake.nix create mode 100755 helper/update-flake.sh diff --git a/helper/update-flake.nix b/helper/update-flake.nix new file mode 100644 index 0000000..23e2012 --- /dev/null +++ b/helper/update-flake.nix @@ -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; + } + ''; +} diff --git a/helper/update-flake.sh b/helper/update-flake.sh new file mode 100755 index 0000000..939786f --- /dev/null +++ b/helper/update-flake.sh @@ -0,0 +1,45 @@ +#!/usr/bin/env bash +set -euo pipefail + +# This script does the following: +# - Update all flake inputs, including nixpkgs +# - Print version updates of pinned pkgs like so: +# Pkg updates in nixpkgs unstable: +# bitcoin: 0.20.0 -> 0.21.1 +# btcpayserver: 1.1.0 -> 1.1.2 +# - Write ../pkgs/pinned.nix: +# Packages for which the stable und unstable versions are identical are +# pinned to stable. +# All other pkgs are pinned to unstable. + +# cd to script dir +cd "${BASH_SOURCE[0]%/*}" + +if [[ $(nix flake 2>&1) != *"requires a sub-command"* ]]; then + echo "Error. This script requires nix flake support." + echo "https://nixos.wiki/wiki/Flakes#Installing_flakes" + exit 1 +fi + +if [[ ${1:-} != -f ]] && ! git diff --quiet ../flake.{nix,lock}; then + echo "error: flake.nix/flake.lock have changes. Run with option -f to ignore." + exit 1 +fi + +versions=$(nix eval --json -f update-flake.nix versions) + +## Uncomment the following to generate a version change message for testing +# versions=$(echo "$versions" | sed 's|1|0|g') + +nix flake update .. + +echo +nix eval --raw -f update-flake.nix --argstr prevVersions "$versions" showUpdates; echo + +pinned=../pkgs/pinned.nix +pinnedSrc=$(nix eval --raw -f update-flake.nix --argstr prevVersions "$versions" pinnedFile) +if [[ $pinnedSrc != $(cat "$pinned") ]]; then + echo "$pinnedSrc" > "$pinned" + echo + echo "Updated pinned.nix" +fi