Clone of https://github.com/NixOS/nixpkgs.git (to stress-test knotserver)
at devShellTools-shell 103 lines 3.0 kB view raw
1#!/usr/bin/env nix-shell 2#!nix-shell --pure --keep NIX_PATH -i python3 -p nix git nixfmt-rfc-style "python3.withPackages (ps: [ ps. packaging ps.beautifulsoup4 ps.requests ])" 3 4# Usage: Run ./update.py from the directory containing tarballs.list. The script checks for the 5# latest versions of all packages, updates the expressions if any update is found, and commits 6# any changes. 7 8import subprocess 9 10import requests 11from bs4 import BeautifulSoup 12from packaging import version 13 14mirror = "mirror://xorg/" 15allversions = {} 16 17print("Downloading latest version info...") 18 19# xorg packages 20for component in [ 21 "individual/app", 22 "individual/data", 23 "individual/data/xkeyboard-config", 24 "individual/doc", 25 "individual/driver", 26 "individual/font", 27 "individual/lib", 28 "individual/proto", 29 "individual/util", 30 "individual/xcb", 31 "individual/xserver", 32]: 33 url = "https://xorg.freedesktop.org/releases/{}/".format(component) 34 r = requests.get(url) 35 soup = BeautifulSoup(r.text, "html.parser") 36 for a in soup.table.find_all("a"): 37 href = a["href"] 38 if not href.endswith((".tar.bz2", ".tar.gz", ".tar.xz")): 39 continue 40 41 pname, rem = href.rsplit("-", 1) 42 ver, _, ext = rem.rsplit(".", 2) 43 44 if "rc" in ver: 45 continue 46 47 entry = allversions.setdefault(f"{mirror}{component}/{pname}", ([], {})) 48 entry[0].append(version.parse(ver)) 49 entry[1][ver] = f"{mirror}{component}/{href}" 50 51print("Finding updated versions...") 52 53with open("./tarballs.list") as f: 54 lines_tarballs = f.readlines() 55 56updated_tarballs = [] 57changes = {} 58changes_text = [] 59for line in lines_tarballs: 60 line = line.rstrip("\n") 61 62 if line.startswith(mirror): 63 pname, rem = line.rsplit("-", 1) 64 if line.startswith(mirror): 65 ver, _, _ = rem.rsplit(".", 2) 66 else: 67 ver, _ = rem.rsplit(".", 1) 68 69 if pname not in allversions: 70 print("# WARNING: no version found for {}".format(pname)) 71 continue 72 73 highest = max(allversions[pname][0]) 74 if highest > version.parse(ver): 75 line = allversions[pname][1][str(highest)] 76 text = f"{pname.split('/')[-1]}: {ver} -> {str(highest)}" 77 print(f" Updating {text}") 78 changes[pname] = line 79 changes_text.append(text) 80 81 updated_tarballs.append(line) 82 83if len(changes) == 0: 84 print("No updates found") 85 exit() 86 87print("Updating tarballs.list...") 88 89with open("./tarballs.list", "w") as f: 90 f.writelines(f'{tarball}\n' for tarball in updated_tarballs) 91 92print("Generating updated expr (slow)...") 93 94subprocess.run(["./generate-expr-from-tarballs.pl", "tarballs.list"], check=True) 95 96print("Formatting generated expr...") 97 98subprocess.run(["nixfmt", "default.nix"], check=True) 99 100print("Committing...") 101 102subprocess.run(["git", "add", "default.nix", "tarballs.list"], check=True) 103subprocess.run(["git", "commit", "-mxorg.*: update\n\n%s" % "\n".join(changes_text)], check=True)