111 lines
2.7 KiB
Nix
111 lines
2.7 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"
|
||
];
|
||
}
|