pytrainer: unpin python 3.10
[NixPkgs.git] / pkgs / common-updater / unstable-updater.nix
blobe6981f633534bbdb2a1fc7a75d337cd2e69ec001
1 { lib
2 , writeShellApplication
3 , coreutils
4 , git
5 , nix
6 , common-updater-scripts
7 }:
9 # This is an updater for unstable packages that should always use the latest
10 # commit.
11 # To use this updater, add the following to your package set:
12 # passthru.updateScript = unstableGitUpdater { };
13 # relevant attributes can be passed as below:
15 { url ? null # The git url, if empty it will be set to src.gitRepoUrl
16 , branch ? null
17 , hardcodeZeroVersion ? false # Use a made-up version "0" instead of latest tag. Use when the project's tagging system is incompatible with what we expect from versions
18 , tagFormat ? "*" # A `git describe --tags --match '<format>'` pattern that tags must match to be considered
19 , tagPrefix ? null # strip this prefix from a tag name
20 , tagConverter ? null # A command to convert more complex tag formats. It receives the git tag via stdin and should convert it into x.y.z format to stdout
21 , shallowClone ? true
24 assert lib.asserts.assertMsg (tagPrefix == null || tagConverter == null) "Can only use either tagPrefix or tagConverter!";
26 let
27   updateScript = writeShellApplication {
28     name = "unstable-update-script";
29     runtimeInputs = [
30       common-updater-scripts
31       coreutils
32       git
33       nix
34     ];
35     text = ''
36       set -ex
38       url=""
39       branch=""
40       hardcode_zero_version=""
41       tag_format=""
42       tag_prefix=""
43       tag_converter=""
44       shallow_clone=""
45       : "''${systemArg:=}"
47       while (( $# > 0 )); do
48           flag="$1"
49           shift 1
50           case "$flag" in
51             --url=*)
52               url="''${flag#*=}"
53               ;;
54             --branch=*)
55               branch="''${flag#*=}"
56               ;;
57             --hardcode-zero-version)
58               hardcode_zero_version=1
59               ;;
60             --tag-format=*)
61               tag_format="''${flag#*=}"
62               ;;
63             --tag-prefix=*)
64               tag_prefix="''${flag#*=}"
65               ;;
66             --tag-converter=*)
67               tag_converter="''${flag#*=}"
68               ;;
69             --shallow-clone)
70               shallow_clone=1
71               ;;
72             *)
73               echo "$0: unknown option ‘''${flag}’"
74               exit 1
75               ;;
76           esac
77       done
79       # By default we set url to src.gitRepoUrl
80       if [[ -z "$url" ]]; then
81           # system argument cannot be passed as 1 argument
82           # shellcheck disable=SC2086
83           url="$(nix-instantiate $systemArg --eval -E \
84                      "with import ./. {}; $UPDATE_NIX_ATTR_PATH.src.gitRepoUrl" \
85               | tr -d '"')"
86       fi
88       # Get info about HEAD from a shallow git clone
89       tmpdir="$(mktemp -d)"
91       cloneArgs=()
93       if [[ "$shallow_clone" == "1" ]]; then
94           cloneArgs+=(--depth=1)
95       fi
97       if [[ -n "$branch" ]]; then
98           cloneArgs+=(--branch="$branch")
99       fi
101       git clone "''${cloneArgs[@]}" "$url" "$tmpdir"
102       getLatestVersion() {
103           git describe --tags --abbrev=0 --match "''${tag_format}" 2> /dev/null || true
104       }
106       pushd "$tmpdir"
107       commit_date="$(git show -s --pretty='format:%cs')"
108       commit_sha="$(git show -s --pretty='format:%H')"
109       last_tag=""
110       if [[ -z "$hardcode_zero_version" ]]; then
111           if [[ "$shallow_clone" == "1" ]]; then
112               depth=100
113               while (( depth < 10000 )); do
114                   last_tag="$(getLatestVersion)"
115                   if [[ -n "$last_tag" ]]; then
116                       break
117                   fi
118                   git fetch --depth="$depth" --tags
119                   depth=$(( depth * 2 ))
120               done
122               if [[ -z "$last_tag" ]]; then
123                   # To be extra sure, check if full history helps with finding a tag
124                   git fetch --tags
125                   last_tag="$(getLatestVersion)"
126               fi
127           else
128               last_tag="$(getLatestVersion)"
129           fi
130           if [[ -z "$last_tag" ]]; then
131               last_tag="0"
132           fi
133           if [[ -n "$tag_prefix" ]]; then
134               echo "Stripping prefix '$tag_prefix' from tag '$last_tag'"
135               last_tag="''${last_tag#"''${tag_prefix}"}"
136           fi
137           if [[ -n "$tag_converter" ]]; then
138               echo "Running '$last_tag' through: $tag_converter"
139               last_tag="$(echo "''${last_tag}" | ''${tag_converter})"
140           fi
141       else
142           last_tag="0"
143       fi
144       if [[ ! "$last_tag" =~ ^[[:digit:]] ]]; then
145           echo "Last tag '$last_tag' does not start with a digit" > /dev/stderr
146           exit 1
147       fi
148       new_version="$last_tag-unstable-$commit_date"
149       popd
150       # rm -rf "$tmpdir"
152       # update the nix expression
153       update-source-version \
154           "$UPDATE_NIX_ATTR_PATH" \
155           "$new_version" \
156           --rev="$commit_sha"
157     '';
158   };
162   (lib.getExe updateScript)
163   "--url=${builtins.toString url}"
164   "--tag-format=${tagFormat}"
165 ] ++ lib.optionals (branch != null) [
166   "--branch=${branch}"
167 ] ++ lib.optionals (tagPrefix != null) [
168   "--tag-prefix=${tagPrefix}"
169 ] ++ lib.optionals (tagConverter != null) [
170   "--tag-converter=${tagConverter}"
171 ] ++ lib.optionals hardcodeZeroVersion [
172   "--hardcode-zero-version"
173 ] ++ lib.optionals shallowClone [
174   "--shallow-clone"