87 lines
2.6 KiB
Nix
87 lines
2.6 KiB
Nix
{ stdenv, pkgs, lib, writeScript, python3, common-updater-scripts }:
|
||
{ packageName, attrPath ? packageName, versionPolicy ? "tagged", freeze ? false }:
|
||
|
||
let
|
||
python = python3.withPackages (p: [ p.requests p.libversion ]);
|
||
package = lib.attrByPath (lib.splitString "." attrPath) (throw "Cannot find attribute ‘${attrPath}’.") pkgs;
|
||
packageVersion = lib.getVersion package;
|
||
upperBound =
|
||
let
|
||
versionComponents = lib.versions.splitVersion packageVersion;
|
||
minorVersion = lib.versions.minor packageVersion;
|
||
minorAvailable = builtins.length versionComponents > 1 && builtins.match "[0-9]+" minorVersion != null;
|
||
nextMinor = builtins.fromJSON minorVersion + 1;
|
||
upperBound = "${lib.versions.major packageVersion}.${builtins.toString nextMinor}";
|
||
in
|
||
if builtins.isBool freeze then
|
||
lib.optionals (freeze && minorAvailable) [ upperBound ]
|
||
else if builtins.isString freeze then
|
||
[ freeze ]
|
||
else
|
||
throw "“freeze” argument needs to be either a boolean, or a version string.";
|
||
updateScript = writeScript "gnome-update-script" ''
|
||
#!${python}/bin/python
|
||
import json
|
||
import os
|
||
import subprocess
|
||
import sys
|
||
from libversion import Version
|
||
|
||
_, attr_path, package_name, package_version, version_policy, *remaining_args = sys.argv
|
||
|
||
flv_args = [
|
||
package_name,
|
||
version_policy,
|
||
os.environ.get("GNOME_UPDATE_STABILITY", "stable"),
|
||
]
|
||
|
||
match remaining_args:
|
||
case []:
|
||
pass
|
||
case [upper_bound]:
|
||
flv_args.append(f"--upper-bound={upper_bound}")
|
||
case other:
|
||
print("gnome-update-script: Received too many arguments.", file=sys.stderr)
|
||
sys.exit(1)
|
||
|
||
latest_tag = subprocess.check_output(
|
||
[
|
||
"${python}/bin/python",
|
||
"${./find-latest-version.py}",
|
||
*flv_args,
|
||
],
|
||
encoding="utf-8",
|
||
)
|
||
|
||
if Version(latest_tag) <= Version(package_version):
|
||
# No newer updates found.
|
||
print(json.dumps([]))
|
||
sys.exit(0)
|
||
|
||
latest_tag = latest_tag.strip()
|
||
subprocess.run(
|
||
[
|
||
"${common-updater-scripts}/bin/update-source-version",
|
||
attr_path,
|
||
latest_tag,
|
||
],
|
||
check=True,
|
||
)
|
||
|
||
report = [
|
||
{
|
||
"attrPath": attr_path,
|
||
"commitBody": f"https://gitlab.gnome.org/GNOME/{package_name}/-/compare/{package_version}...{latest_tag}",
|
||
},
|
||
]
|
||
|
||
print(json.dumps(report))
|
||
'';
|
||
in {
|
||
name = "gnome-update-script";
|
||
command = [ updateScript attrPath packageName packageVersion versionPolicy ] ++ upperBound;
|
||
supportedFeatures = [
|
||
"commit"
|
||
];
|
||
}
|