From 224febb08c923a8e4fb4325fc0f0101b5917561e Mon Sep 17 00:00:00 2001 From: Gregor Kleen Date: Mon, 22 Dec 2025 14:12:57 +0100 Subject: ... --- .../nixpkgs-pr-watch/nixpkgs_pr_watch/__main__.py | 73 ++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 accounts/gkleen@sif/utils/nixpkgs-pr-watch/nixpkgs_pr_watch/__main__.py (limited to 'accounts/gkleen@sif/utils/nixpkgs-pr-watch/nixpkgs_pr_watch/__main__.py') diff --git a/accounts/gkleen@sif/utils/nixpkgs-pr-watch/nixpkgs_pr_watch/__main__.py b/accounts/gkleen@sif/utils/nixpkgs-pr-watch/nixpkgs_pr_watch/__main__.py new file mode 100644 index 00000000..2fff9f07 --- /dev/null +++ b/accounts/gkleen@sif/utils/nixpkgs-pr-watch/nixpkgs_pr_watch/__main__.py @@ -0,0 +1,73 @@ +import argparse +import re +import requests +from urllib.parse import urljoin +from xdg_base_dirs import xdg_config_home, xdg_config_dirs +import toml +import sys + +from github import Github + +class ApiKeyAuth(requests.auth.AuthBase): + def __init__(self, token): + self.token = token + def __call__(self, r): + r.headers["x-api-key"] = self.token + return r + +class ChangeDetectionSession(requests.Session): + def __init__(self, base_url: str, api_token: str): + super().__init__() + self.base_url = base_url + self.auth = ApiKeyAuth(api_token) + + def request(self, method, url, *args, **kwargs): + joined_url = urljoin(urljoin(self.base_url, '/api/v1/'), url) + return super().request(method, joined_url, *args, **kwargs) + +def main(): + def pr_number(s): + if m := re.fullmatch(r'(?:https?://github\.com/NixOS/nixpkgs/pull/)?(?P[0-9]+)', s, flags=re.I): + return int(m.group('pr')) + else: + raise ValueError + + parser = argparse.ArgumentParser(prog = "nixpkgs-pr-watch") + parser.add_argument('prs', metavar = 'PR', type = pr_number, nargs = '+') + + args = parser.parse_args() + + config = None + for d in [xdg_config_home(), *xdg_config_dirs()]: + try: + config = toml.load(d / 'nixpkgs-pr-watch.toml') + break + except FileNotFoundError: + pass + + for pr in args.prs: + pr_title = None + with Github() as g: + pr_title = g.get_repo('NixOS/nixpkgs').get_pull(pr).title + + api = ChangeDetectionSession( + base_url = config.get("BaseUrl"), + api_token = config.get("ApiToken"), + ) + try: + api.post( + "watch", + headers = { + 'Content-Type': 'application/json', + }, + json = { + "url": urljoin("https://nixpkgs.molybdenum.software/api/v2/landings/", str(pr)), + **({ "title": pr_title } if pr_title else {}), + "time_between_check_use_default": False, + "time_between_check": { "hours": 1 }, + "fetch_backend": "html_requests", + }, + ).raise_for_status() + except requests.HTTPError as e: + print(e.response.text, file=sys.stderr) + raise e -- cgit v1.2.3