summary refs log tree commit diff
path: root/pkgs/common-updater/scripts/list-directory-versions
blob: 46c9e9d30a5d17d4906a2aadbcc22568d96a7a30 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#!/usr/bin/env python

import argparse
import requests
import os
import subprocess
import json
import re
from bs4 import BeautifulSoup

parser = argparse.ArgumentParser(
    description="Get all available versions listed for a package in a site."
)

parser.add_argument(
    "--pname",
    default=os.environ.get("UPDATE_NIX_PNAME"),
    required="UPDATE_NIX_PNAME" not in os.environ,
    help="name of the package",
)
parser.add_argument(
    "--attr-path",
    default=os.environ.get("UPDATE_NIX_ATTR_PATH"),
    help="attribute path of the package",
)
parser.add_argument("--url", help="url of the page that lists the package versions")
parser.add_argument("--file", help="file name for writing debugging information")


if __name__ == "__main__":
    args = parser.parse_args()

    pname = args.pname

    attr_path = args.attr_path or pname

    url = args.url or json.loads(
        subprocess.check_output(
            [
                "nix-instantiate",
                "--json",
                "--eval",
                "-E",
                f"with import ./. {{}}; dirOf (lib.head {attr_path}.src.urls)",
            ],
            text=True,
        )
    )

    # print a debugging message
    if args.file:
        with open(args.file, "a") as f:
            f.write(f"# Listing versions for {pname} from {url}\n")

    page = requests.get(url)
    soup = BeautifulSoup(page.content, "html.parser")
    links = soup.find_all("a")
    for link in links:
        link_url = link.get("href", None)
        if link_url is not None:
            match = re.fullmatch(
                rf"{args.pname}-([\d.]+?(-[\d\w.-]+?)?)(\.tar)?(\.[^.]*)", link_url
            )
            if match:
                print(match.group(1))