108 lines
3.3 KiB
Nix
108 lines
3.3 KiB
Nix
{ stdenv, writeScript, coreutils, gnugrep, gnused, common-updater-scripts, nix }:
|
|
|
|
{ pname
|
|
, version
|
|
, attrPath ? pname
|
|
, versionLister
|
|
, ignoredVersions ? ""
|
|
, rev-prefix ? ""
|
|
, odd-unstable ? false
|
|
, patchlevel-unstable ? false
|
|
}:
|
|
|
|
let
|
|
# where to print git commands and debugging messages
|
|
fileForGitCommands = "update-git-commits.txt";
|
|
|
|
# shell script to update package
|
|
updateScript = writeScript "update-script.sh" ''
|
|
#! ${stdenv.shell}
|
|
set -o errexit
|
|
set -x
|
|
|
|
pname="$1"
|
|
version="$2"
|
|
attr_path="$3"
|
|
version_lister="$4"
|
|
ignored_versions="$5"
|
|
rev_prefix="$6"
|
|
odd_unstable="$7"
|
|
patchlevel_unstable="$8"
|
|
|
|
# print header
|
|
echo "# $pname-$version" >> ${fileForGitCommands}
|
|
|
|
function version_is_ignored() {
|
|
local tag="$1"
|
|
[ -n "$ignored_versions" ] && grep -E "$ignored_versions" <<< "$tag"
|
|
}
|
|
|
|
function version_is_unstable() {
|
|
local tag="$1"
|
|
local enforce="$2"
|
|
if [ -n "$odd_unstable" -o -n "$enforce" ]; then
|
|
local minor=$(echo "$tag" | ${gnused}/bin/sed -rne 's,^[0-9]+\.([0-9]+).*,\1,p')
|
|
if [ $((minor % 2)) -eq 1 ]; then
|
|
return 0
|
|
fi
|
|
fi
|
|
if [ -n "$patchlevel_unstable" -o -n "$enforce" ]; then
|
|
local patchlevel=$(echo "$tag" | ${gnused}/bin/sed -rne 's,^[0-9]+\.[0-9]+\.([0-9]+).*$,\1,p')
|
|
if ((patchlevel >= 90)); then
|
|
return 0
|
|
fi
|
|
fi
|
|
return 1
|
|
}
|
|
|
|
tags=$($version_lister $pname ${fileForGitCommands}) || exit 1
|
|
|
|
# print available tags
|
|
for tag in $tags; do
|
|
echo "# found $pname version: $tag" >> ${fileForGitCommands}
|
|
done
|
|
|
|
# cut any revision prefix not used in the NixOS package version
|
|
if [ -n "$rev_prefix" ]; then
|
|
tags=$(echo "$tags" | ${gnugrep}/bin/grep "^$rev_prefix")
|
|
tags=$(echo "$tags" | ${gnused}/bin/sed -e "s,^$rev_prefix,,")
|
|
fi
|
|
tags=$(echo "$tags" | ${gnugrep}/bin/grep "^[0-9]")
|
|
|
|
# sort the tags in decreasing order
|
|
tags=$(echo "$tags" | ${coreutils}/bin/sort --reverse --version-sort)
|
|
|
|
# find the newest tag
|
|
# do not consider development versions
|
|
for latest_tag in $tags; do
|
|
if version_is_ignored "$latest_tag"; then
|
|
echo "# skip ignored version: $pname-$latest_tag" >> ${fileForGitCommands}
|
|
latest_tag=
|
|
elif version_is_unstable "$latest_tag"; then
|
|
echo "# skip development version: $pname-$latest_tag" >> ${fileForGitCommands}
|
|
latest_tag=
|
|
else
|
|
if version_is_unstable "$latest_tag" "enforce"; then
|
|
echo "# use potential development version: $pname-$latest_tag" >> ${fileForGitCommands}
|
|
fi
|
|
break
|
|
fi
|
|
done
|
|
|
|
if [ -n "$latest_tag" ]; then
|
|
# print commands to commit the changes
|
|
if [ "$version" != "$latest_tag" ]; then
|
|
pfile=$(EDITOR=echo ${nix}/bin/nix edit -f. "$attr_path")
|
|
echo " git add $pfile " >> ${fileForGitCommands}
|
|
echo " git commit -m '$attr_path: $version -> $latest_tag'" >> ${fileForGitCommands}
|
|
fi
|
|
|
|
# update the nix expression
|
|
${common-updater-scripts}/bin/update-source-version "$attr_path" "$latest_tag"
|
|
fi
|
|
|
|
echo "" >> ${fileForGitCommands}
|
|
'';
|
|
|
|
in
|
|
[ updateScript pname version attrPath versionLister ignoredVersions rev-prefix odd-unstable patchlevel-unstable ]
|