From 34c51b70fbe2fa69e368268d04413feb6d9cc996 Mon Sep 17 00:00:00 2001 From: sternenseemann Date: Mon, 7 Jul 2025 16:03:17 +0200 Subject: [PATCH] maintainers/scripts/haskell: unify pkg set update into single commit Currently, every package set consists of three commits, generated by update-hackage.sh, update-stackage.sh and regenerate-hackage-packages.sh, respectively. This is suboptimal, as it necessarly causes intermediate states of Nixpkgs where the generated hackage-packages.nix and all-cabal-hasehs and/or the hackage2nix configuration files are out of sync. Ideally, running regenerate-hackage-packages.sh is a no-op for every Nixpkgs revision. This is achieved by adding a wrapper script, update-package-set.sh, which runs the individual moving parts and commits the result. --- .../scripts/haskell/merge-and-open-pr.sh | 8 +-- .../scripts/haskell/update-package-set.sh | 53 +++++++++++++++++++ 2 files changed, 54 insertions(+), 7 deletions(-) create mode 100755 maintainers/scripts/haskell/update-package-set.sh diff --git a/maintainers/scripts/haskell/merge-and-open-pr.sh b/maintainers/scripts/haskell/merge-and-open-pr.sh index ea985acfc9a0..e5f5aa5e2831 100755 --- a/maintainers/scripts/haskell/merge-and-open-pr.sh +++ b/maintainers/scripts/haskell/merge-and-open-pr.sh @@ -80,13 +80,7 @@ echo "Merging https://github.com/NixOS/nixpkgs/pull/${curr_haskell_updates_pr_nu gh pr merge --repo NixOS/nixpkgs --merge "$curr_haskell_updates_pr_num" # Update stackage, Hackage hashes, and regenerate Haskell package set -echo "Updating Stackage..." -./maintainers/scripts/haskell/update-stackage.sh --do-commit -echo "Updating Hackage hashes..." -./maintainers/scripts/haskell/update-hackage.sh --do-commit -echo "Regenerating Hackage packages..." -# Using fast here because after the hackage-update eval errors will likely break the transitive dependencies check. -./maintainers/scripts/haskell/regenerate-hackage-packages.sh --fast --do-commit +./maintainers/scripts/haskell/update-package-set.sh # Push these new commits to the haskell-updates branch echo "Pushing commits just created to the remote $push_remote/haskell-updates branch..." diff --git a/maintainers/scripts/haskell/update-package-set.sh b/maintainers/scripts/haskell/update-package-set.sh new file mode 100755 index 000000000000..94ccf2827555 --- /dev/null +++ b/maintainers/scripts/haskell/update-package-set.sh @@ -0,0 +1,53 @@ +#! /usr/bin/env nix-shell +#! nix-shell -i bash +#! nix-shell -p git -I nixpkgs=. +set -euo pipefail + +filesToStage=( + 'pkgs/data/misc/hackage/pin.json' + 'pkgs/development/haskell-modules/configuration-hackage2nix/stackage.yaml' + 'pkgs/development/haskell-modules/hackage-packages.nix' +) + +if ! git diff --quiet --cached; then + echo "Please commit staged changes before running $0" >&2 + exit 100 +fi + +if ! git diff --quiet -- "${filesToStage[@]}"; then + echo -n "Please commit your changes to the following files before running $0: " >&2 + echo "${filesToStage[@]}" >&2 + exit 100 +fi + +stackage_diff="$(./maintainers/scripts/haskell/update-stackage.sh)" +hackage_diff="$(./maintainers/scripts/haskell/update-hackage.sh)" +readonly stackage_diff hackage_diff + +# Prefer Stackage version diff in the commit header, fall back to Hackage +if [[ -n "$stackage_diff" ]]; then + commit_message="haskellPackages: stackage $stackage_diff" + if [[ -n "$hackage_diff" ]]; then + commit_message="$commit_message + +all-cabal-hashes: $hackage_diff" + fi +elif [[ -n "$hackage_diff" ]]; then + commit_message="haskellPackages: hackage $hackage_diff + +all-cabal-hashes: $hackage_diff" +else + echo "Neither Hackage nor Stackage changed. Nothing to do." >&2 + exit 0 +fi + +commit_message="$commit_message + +(generated by maintainers/scripts/haskell/update-package-set.sh)" + +# Using fast here because after the hackage-update eval errors will likely break the transitive dependencies check. +./maintainers/scripts/haskell/regenerate-hackage-packages.sh --fast + +# A --do-commit flag probably doesn't make much sense +git add -- "${filesToStage[@]}" +git commit -m "$commit_message"