Some checks failed
Periodic Merges (6h) / master → staging-nixos (push) Failing after 12m50s
Periodic Merges (6h) / master → staging-next (push) Failing after 12m54s
Periodic Merges (24h) / merge-base(master,staging) → haskell-updates (push) Failing after 11m54s
Periodic Merges (6h) / staging-next → staging (push) Failing after 12m13s
Periodic Merges (24h) / staging-next-25.05 → staging-25.05 (push) Failing after 13m24s
Periodic Merges (24h) / release-25.05 → staging-next-25.05 (push) Failing after 14m28s
149 lines
3.4 KiB
Python
Executable File
149 lines
3.4 KiB
Python
Executable File
#!/usr/bin/env nix-shell
|
|
#!nix-shell -i python3 -p "python3.withPackages (ps: [ ps.beautifulsoup4 ps.requests ])"
|
|
|
|
"""
|
|
Update the gildas package in nixpkgs.
|
|
|
|
"""
|
|
|
|
import re
|
|
import subprocess
|
|
import requests
|
|
import os
|
|
from bs4 import BeautifulSoup
|
|
|
|
|
|
def to_version(srcVersion):
|
|
"""
|
|
Convert the source version to the package version
|
|
|
|
This function converts the source version from the format "apr25a"
|
|
to "20250401_a".
|
|
|
|
"""
|
|
|
|
months = {
|
|
"jan": "01",
|
|
"feb": "02",
|
|
"mar": "03",
|
|
"apr": "04",
|
|
"may": "05",
|
|
"jun": "06",
|
|
"jul": "07",
|
|
"aug": "08",
|
|
"sep": "09",
|
|
"oct": "10",
|
|
"nov": "11",
|
|
"dec": "12",
|
|
}
|
|
|
|
month = srcVersion[0:3]
|
|
year = srcVersion[3:5]
|
|
revision = srcVersion[5:6]
|
|
|
|
return f"20{year}{months[month]}01_{revision}"
|
|
|
|
|
|
def get_srcVersion():
|
|
"""
|
|
Get the available source versions from the gildas website
|
|
|
|
"""
|
|
|
|
srcVersions = []
|
|
response = requests.get("https://www.iram.fr/~gildas/dist/index.html")
|
|
soup = BeautifulSoup(response.text, "html.parser")
|
|
pattern = r"^gildas-src-([a-z]{3}\d{2}[a-z])\.tar\.xz$"
|
|
for link in soup.find_all("a"):
|
|
href = link["href"]
|
|
match = re.search(pattern, href)
|
|
if match:
|
|
srcVersions.append(match.group(1))
|
|
|
|
return srcVersions
|
|
|
|
|
|
def find_latest(srcVersions):
|
|
"""
|
|
Return the latest source version from a list
|
|
|
|
"""
|
|
|
|
latestVersion = ""
|
|
for srcVersion in srcVersions:
|
|
version = to_version(srcVersion)
|
|
if version > latestVersion:
|
|
latest = srcVersion
|
|
|
|
return latest
|
|
|
|
|
|
def get_hash(srcVersion):
|
|
"""
|
|
Get the hash of a given source versionn
|
|
|
|
"""
|
|
|
|
url = f"http://www.iram.fr/~gildas/dist/gildas-src-{srcVersion}.tar.xz"
|
|
srcHash = subprocess.check_output(["nix-prefetch-url", url]).decode().strip()
|
|
# Convert to SRI representation
|
|
srcSRIHash = (
|
|
subprocess.check_output(["nix-hash", "--to-sri", "--type", "sha256", srcHash])
|
|
.decode()
|
|
.strip()
|
|
)
|
|
return srcSRIHash
|
|
|
|
|
|
def get_package_attribute(attr):
|
|
"""
|
|
Get a package attribute
|
|
|
|
"""
|
|
|
|
pattern = attr + r'\s*=\s*"([^"]+)";'
|
|
with open("package.nix", "r") as f:
|
|
for line in f:
|
|
match = re.search(pattern, line)
|
|
if match:
|
|
return match.group(1)
|
|
|
|
|
|
def update_package(srcVersion, version, srcHash):
|
|
"""
|
|
Update the package
|
|
|
|
"""
|
|
|
|
current_srcVersion = get_package_attribute("srcVersion")
|
|
current_version = get_package_attribute("version")
|
|
current_hash = get_package_attribute("hash")
|
|
|
|
with open("package.nix", "r") as f:
|
|
lines = f.readlines()
|
|
|
|
with open("package.nix", "w") as f:
|
|
for line in lines:
|
|
line = line.replace(current_srcVersion, srcVersion)
|
|
line = line.replace(current_version, version)
|
|
line = line.replace(current_hash, srcHash)
|
|
f.write(line)
|
|
|
|
|
|
def main():
|
|
os.chdir(os.path.dirname(os.path.abspath(__file__))) # allow to run from anywhere
|
|
latest = find_latest(get_srcVersion())
|
|
if latest != get_package_attribute("srcVersion"):
|
|
srcVersion = latest
|
|
version = to_version(srcVersion)
|
|
print(f"Updating gildas to {version}...")
|
|
srcHash = get_hash(srcVersion)
|
|
update_package(srcVersion, version, srcHash)
|
|
print("done")
|
|
else:
|
|
print("Already up to date")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|