nixpkgs/pkgs/common-updater/unstable-updater.nix
Jan Tojnar 7aae279ad9 unstableGitUpdater: fix updating fetchzip-based sources
a67950f20b added `url` attribute
from `fetchurl` and therefore also from `fetchzip`.
We previously relied on `url` from fetchgit-based fetchers
to find the repo URL but now it will just return tarballs
in the case of `fetchFrom{GitHub,GitLab}`.

Let’s add an attribute to `fetch{git,FromGitHub,FromGitLab}`
to expose a repo URL consistently.
2022-05-24 19:12:12 +02:00

113 lines
2.9 KiB
Nix
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{ lib
, writeShellScript
, coreutils
, git
, nix
, common-updater-scripts
}:
# This is an updater for unstable packages that should always use the latest
# commit.
{ url ? null # The git url, if empty it will be set to src.url
, 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
updateScript = writeShellScript "unstable-update-script.sh" ''
set -ex
url=""
branch=""
use_stable_version=""
tag_prefix=""
while (( $# > 0 )); do
flag="$1"
shift 1
case "$flag" in
--url=*)
url="''${flag#*=}"
;;
--branch=*)
branch="''${flag#*=}"
;;
--use-stable-version)
use_stable_version=1
;;
--tag-prefix=*)
tag_prefix="''${flag#*=}"
;;
*)
echo "$0: unknown option ''${flag}"
exit 1
;;
esac
done
# By default we set url to src.url
if [[ -z "$url" ]]; then
url="$(${nix}/bin/nix-instantiate $systemArg --eval -E \
"with import ./. {}; $UPDATE_NIX_ATTR_PATH.src.gitRepoUrl" \
| tr -d '"')"
fi
# Get info about HEAD from a shallow git clone
tmpdir="$(${coreutils}/bin/mktemp -d)"
cloneArgs=(
--bare
--depth=1
)
if [[ -n "$branch" ]]; then
cloneArgs+=(--branch="$branch")
fi
${git}/bin/git clone "''${cloneArgs[@]}" "$url" "$tmpdir"
pushd "$tmpdir"
commit_date="$(${git}/bin/git show -s --pretty='format:%cs')"
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
# ${coreutils}/bin/rm -rf "$tmpdir"
# update the nix expression
${common-updater-scripts}/bin/update-source-version \
"$UPDATE_NIX_ATTR_PATH" \
"$new_version" \
--rev="$commit_sha"
'';
in [
updateScript
"--url=${builtins.toString url}"
] ++ lib.optionals (branch != null) [
"--branch=${branch}"
] ++ lib.optionals stableVersion [
"--use-stable-version"
"--tag-prefix=${tagPrefix}"
]