nixpkgs/pkgs/desktops/gnome/update.nix
Jan Tojnar 68505781e3 gnome.updateScript: More Python
This was prompted by the need to capture exit status of `find-latest-version.py` in the next commit.
I had to drop `errexit` (if I did not want to result to even worse hacks) but that concealed errors like the following,
when I accidentally used an incorrect equals operator in numeric comparison:

    line 24: ((: 1 = 1 : attempted assignment to non-variable (error token is "= 1 ")

Converting the plumbing in `gnome/update.nix` to Python also makes it slightly easier to read.

For now, `find-latest-version.py` is still invoked as a separate process (rather than being imported as a Python module),
as `update.nix` might be replaced by `genericUpdater` in the future.
2022-10-25 15:09:34 +02:00

79 lines
2.4 KiB
Nix
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{ 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
_, 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",
)
latest_tag = latest_tag.strip()
subprocess.run(
[
"${common-updater-scripts}/bin/update-source-version",
attr_path,
latest_tag,
],
check=True,
)
report = [
{
"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"
];
}