unstableGitUpdater: Allow using stable versions

It is important to keep the version as parsed by `builtins.parseDrvName`
monotonic for packages that often switch between stable and unstable versions,
for nix-env to be able to update them reliably.

Let’s optionally use the version format described by RFC 107:
https://github.com/NixOS/rfcs/pull/107
The downside is that it requires fetching
more commits to be able to determine the latest tag.
This commit is contained in:
Jan Tojnar 2022-02-18 08:19:31 +01:00
parent 3985dde04e
commit 97276fe650

View file

@ -10,6 +10,8 @@
# commit. # commit.
{ url ? null # The git url, if empty it will be set to src.url { url ? null # The git url, if empty it will be set to src.url
, branch ? null , branch ? null
, stableVersion ? false # Use version format according to RFC 107 (i.e. LAST_TAG+date=YYYY-MM-DD)
, tagPrefix ? "" # strip this prefix from a tag name when using stable version
}: }:
let let
@ -18,6 +20,8 @@ let
url="" url=""
branch="" branch=""
use_stable_version=""
tag_prefix=""
while (( $# > 0 )); do while (( $# > 0 )); do
flag="$1" flag="$1"
@ -29,6 +33,12 @@ let
--branch=*) --branch=*)
branch="''${flag#*=}" branch="''${flag#*=}"
;; ;;
--use-stable-version)
use_stable_version=1
;;
--tag-prefix=*)
tag_prefix="''${flag#*=}"
;;
*) *)
echo "$0: unknown option ''${flag}" echo "$0: unknown option ''${flag}"
exit 1 exit 1
@ -60,13 +70,34 @@ let
pushd "$tmpdir" pushd "$tmpdir"
commit_date="$(${git}/bin/git show -s --pretty='format:%cs')" commit_date="$(${git}/bin/git show -s --pretty='format:%cs')"
commit_sha="$(${git}/bin/git show -s --pretty='format:%H')" commit_sha="$(${git}/bin/git show -s --pretty='format:%H')"
if [[ -z "$use_stable_version" ]]; then
new_version="unstable-$commit_date"
else
depth=100
while (( $depth < 10000 )); do
last_tag="$(${git}/bin/git describe --tags --abbrev=0 2> /dev/null || true)"
if [[ -n "$last_tag" ]]; then
break
fi
${git}/bin/git fetch --depth="$depth" --tags
depth=$(( $depth * 2 ))
done
if [[ -z "$last_tag" ]]; then
echo "Cound not found a tag within last 10000 commits" > /dev/stderr
exit 1
fi
if [[ -n "$tag_prefix" ]]; then
last_tag="''${last_tag#$tag_prefix}"
fi
new_version="$last_tag+date=$commit_date"
fi
popd popd
${coreutils}/bin/rm -rf "$tmpdir" # ${coreutils}/bin/rm -rf "$tmpdir"
# update the nix expression # update the nix expression
${common-updater-scripts}/bin/update-source-version \ ${common-updater-scripts}/bin/update-source-version \
"$UPDATE_NIX_ATTR_PATH" \ "$UPDATE_NIX_ATTR_PATH" \
"unstable-$commit_date" \ "$new_version" \
--rev="$commit_sha" --rev="$commit_sha"
''; '';
@ -75,5 +106,7 @@ in [
"--url=${builtins.toString url}" "--url=${builtins.toString url}"
] ++ lib.optionals (branch != null) [ ] ++ lib.optionals (branch != null) [
"--branch=${branch}" "--branch=${branch}"
] ++ lib.optionals stableVersion [
"--use-stable-version"
"--tag-prefix=${tagPrefix}"
] ]