gnome3: add updateScript

+76 -1
+7 -1
pkgs/desktops/gnome-3/default.nix
··· 1 - { pkgs }: 1 + { pkgs, lib }: 2 2 3 3 let 4 4 ··· 12 12 in newself; 13 13 14 14 callPackage = pkgs.newScope self; 15 + 16 + # Convert a version to branch (3.26.18 → 3.26) 17 + # Used for finding packages on GNOME mirrors 18 + versionBranch = version: builtins.concatStringsSep "." (lib.take 2 (lib.splitString "." version)); 19 + 20 + updateScript = callPackage ./update.nix { }; 15 21 16 22 version = "3.26"; 17 23 maintainers = with pkgs.lib.maintainers; [ lethalman jtojnar ];
+58
pkgs/desktops/gnome-3/find-latest-version.py
··· 1 + import argparse 2 + import json 3 + import requests 4 + import sys 5 + 6 + def version_to_list(version): 7 + return list(map(int, version.split('.'))) 8 + 9 + def odd_unstable(version_str, selected): 10 + version = version_to_list(version_str) 11 + if len(version) < 2: 12 + return True 13 + 14 + even = version[1] % 2 == 0 15 + if selected == 'stable': 16 + return even 17 + else: 18 + return not even 19 + 20 + def no_policy(version, selected): 21 + return True 22 + 23 + version_policies = { 24 + 'odd-unstable': odd_unstable, 25 + 'none': no_policy, 26 + } 27 + 28 + def make_version_policy(version_predicate, selected): 29 + return lambda version: version_predicate(version, selected) 30 + 31 + parser = argparse.ArgumentParser(description='Find latest version for a GNOME package by crawling their release server.') 32 + parser.add_argument('package-name', help='Name of the directory in https://ftp.gnome.org/pub/GNOME/sources/ containing the package.') 33 + parser.add_argument('version-policy', help='Policy determining which versions are considered stable. For most GNOME packages, odd minor versions are unstable but there are exceptions.', choices=version_policies.keys(), nargs='?', default='odd-unstable') 34 + parser.add_argument('requested-release', help='Most of the time, we will want to update to stable version but sometimes it is useful to test.', choices=['stable', 'unstable'], nargs='?', default='stable') 35 + 36 + 37 + if __name__ == '__main__': 38 + args = parser.parse_args() 39 + 40 + package_name = getattr(args, 'package-name') 41 + requested_release = getattr(args, 'requested-release') 42 + version_predicate = version_policies[getattr(args, 'version-policy')] 43 + version_policy = make_version_policy(version_predicate, requested_release) 44 + 45 + # The structure of cache.json: https://gitlab.gnome.org/Infrastructure/sysadmin-bin/blob/master/ftpadmin#L762 46 + cache = json.loads(requests.get('https://ftp.gnome.org/pub/GNOME/sources/{}/cache.json'.format(package_name)).text) 47 + if type(cache) != list or cache[0] != 4: 48 + print('Unknown format of cache.json file.', file=sys.stderr) 49 + sys.exit(1) 50 + 51 + versions = cache[2][package_name] 52 + versions = sorted(filter(version_policy, versions), key=version_to_list) 53 + 54 + if len(versions) == 0: 55 + print('No versions matched.', file=sys.stderr) 56 + sys.exit(1) 57 + 58 + print(versions[-1])
+11
pkgs/desktops/gnome-3/update.nix
··· 1 + { lib, writeScript, python3, common-updater-scripts, coreutils, gnugrep, gnused }: 2 + { packageName, attrPath ? packageName, versionPolicy ? "odd-unstable" }: 3 + 4 + let 5 + python = python3.withPackages (p: [ p.requests ]); 6 + in writeScript "update-${packageName}" '' 7 + set -o errexit 8 + PATH=${lib.makeBinPath [ common-updater-scripts coreutils gnugrep gnused python ]} 9 + latest_tag=$(python "${./find-latest-version.py}" "${packageName}" "${versionPolicy}" "stable") 10 + update-source-version "${attrPath}" "$latest_tag" 11 + ''