{ungoogled-,}chromium,chromedriver: 130.0.6723.58 -> 130.0.6723.69 (#351519)
[NixPkgs.git] / pkgs / common-updater / generic-updater.nix
blob2ebfb0fa6fc226988265f664bc3b6e376b4a7011
1 { lib
2 , stdenv
3 , common-updater-scripts
4 , coreutils
5 , gnugrep
6 , gnused
7 , nix
8 , writeScript
9 }:
11 { name ? null
12 , pname ? null
13 , version ? null
14 , attrPath ? null
15 , versionLister
16 , allowedVersions ? ""
17 , ignoredVersions ? ""
18 , rev-prefix ? ""
19 , odd-unstable ? false
20 , patchlevel-unstable ? false
23 let
24   # where to print git commands and debugging messages
25   fileForGitCommands = "update-git-commits.txt";
27   grep = lib.getExe gnugrep;
28   sed = lib.getExe gnused;
30   # shell script to update package
31   updateScript = writeScript "generic-update-script.sh" ''
32     #! ${stdenv.shell}
33     set -o errexit
34     set -x
36     name="$1"
37     pname="$2"
38     version="$3"
39     attr_path="$4"
40     version_lister="$5"
41     allowed_versions="$6"
42     ignored_versions="$7"
43     rev_prefix="$8"
44     odd_unstable="$9"
45     patchlevel_unstable="$${10}"
47     [[ -n "$name" ]] || name="$UPDATE_NIX_NAME"
48     [[ -n "$pname" ]] || pname="$UPDATE_NIX_PNAME"
49     [[ -n "$version" ]] || version="$UPDATE_NIX_OLD_VERSION"
50     [[ -n "$attr_path" ]] || attr_path="$UPDATE_NIX_ATTR_PATH"
52     # print header
53     echo "# $name" >> ${fileForGitCommands}
55     function version_is_ignored() {
56       local tag="$1"
57       [ -n "$ignored_versions" ] && ${grep} -E -e "$ignored_versions" <<< "$tag"
58     }
60     function version_is_unstable() {
61       local tag="$1"
62       local enforce="$2"
63       if [ -n "$odd_unstable" -o -n "$enforce" ]; then
64         local minor=$(echo "$tag" | ${sed} -rne 's,^[0-9]+\.([0-9]+).*,\1,p')
65         if [ $((minor % 2)) -eq 1 ]; then
66           return 0
67         fi
68       fi
69       if [ -n "$patchlevel_unstable" -o -n "$enforce" ]; then
70         local patchlevel=$(echo "$tag" | ${sed} -rne 's,^[0-9]+\.[0-9]+\.([0-9]+).*$,\1,p')
71         if ((patchlevel >= 90)); then
72           return 0
73         fi
74       fi
75       return 1
76     }
78     tags=$(sh -c "$version_lister --pname=$pname --attr-path=$attr_path --file=\"${fileForGitCommands}\"") || exit 1
80     # print available tags
81     for tag in $tags; do
82         echo "# found $pname version: $tag" >> ${fileForGitCommands}
83     done
85     # cut any revision prefix not used in the NixOS package version
86     if [ -n "$rev_prefix" ]; then
87       tags=$(echo "$tags" | ${grep} "^$rev_prefix")
88       tags=$(echo "$tags" | ${sed} -e "s,^$rev_prefix,,")
89     fi
90     tags=$(echo "$tags" | ${grep} "^[0-9]")
91     if [ -n "$allowed_versions" ]; then
92       tags=$(echo "$tags" | ${grep} -E -e "$allowed_versions")
93     fi
95     # sort the tags in decreasing order
96     tags=$(echo "$tags" | ${coreutils}/bin/sort --reverse --version-sort)
98     # find the newest tag
99     # do not consider development versions
100     for latest_tag in $tags; do
101       if version_is_ignored "$latest_tag"; then
102         echo "#   skip ignored version: $pname-$latest_tag" >> ${fileForGitCommands}
103         latest_tag=
104       elif version_is_unstable "$latest_tag"; then
105         echo "#   skip development version: $pname-$latest_tag" >> ${fileForGitCommands}
106         latest_tag=
107       else
108         if version_is_unstable "$latest_tag" "enforce"; then
109           echo "#   use potential development version: $pname-$latest_tag" >> ${fileForGitCommands}
110         fi
111         break
112       fi
113     done
115     if [ -n "$latest_tag" ]; then
116       # print commands to commit the changes
117       if [ "$version" != "$latest_tag" ]; then
118         pfile=$(EDITOR=echo ${nix}/bin/nix edit --extra-experimental-features nix-command -f. "$attr_path")
119         echo "   git add $pfile " >> ${fileForGitCommands}
120         echo "   git commit -m '$attr_path: $version -> $latest_tag'" >> ${fileForGitCommands}
121       fi
123       # update the nix expression
124       ${common-updater-scripts}/bin/update-source-version --print-changes "$attr_path" "$latest_tag"
125     else
126       # No changes for commit protocol.
127       echo "[]"
128     fi
130     echo "" >> ${fileForGitCommands}
131   '';
133 in {
134   name = "generic-update-script";
135   command = [ updateScript name pname version attrPath versionLister allowedVersions ignoredVersions rev-prefix odd-unstable patchlevel-unstable ];
136   supportedFeatures = [
137     # Stdout must contain output according to the updateScript commit protocol when the update script finishes with a non-zero exit code.
138     "commit"
139   ];