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)