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]+)(?:[^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