#! /usr/bin/env nix-shell #! nix-shell -p python3 -i python3 import os import urllib.request as ureq import json import html if not all( f"UPDATE_NIX_{v}" in os.environ for v in ["NAME", "PNAME", "OLD_VERSION", "ATTR_PATH"] ) or not os.environ['UPDATE_NIX_ATTR_PATH'].startswith("nerd-fonts."): raise Exception( "Please don't run this script manually, only with:\n" "nix-shell maintainers/scripts/update.nix --argstr path nerd-fonts " "--argstr commit true" ) RELEASE_INFO_URL = "https://api.github.com/repos/ryanoasis/nerd-fonts/releases/latest" FONTS_INFO_URL_TEMPLATE = "https://raw.githubusercontent.com/ryanoasis/nerd-fonts/refs/tags/{}/bin/scripts/lib/fonts.json" SHA256_URL_TEMPLATE = "https://github.com/ryanoasis/nerd-fonts/releases/download/{}/SHA-256.txt" RELEASE_INFO_FILENAME = "release.json" FONTS_INFO_FILENAME = "fonts.json" CHECKSUMS_FILENAME = "checksums.json" def fetchjson(url): with ureq.urlopen(url) as r: return json.loads(r.read()) def storejson(path, obj): with open(path, "w", encoding="utf-8") as f: json.dump(obj, f, indent=2, ensure_ascii=False) # Needed to satisfy EditorConfig's rules f.write('\n') def slicedict(d, ks): return {k: html.unescape(d[k]) for k in ks} os.chdir(os.path.join(os.path.dirname(os.path.abspath(__file__)), "manifests")) release_info = slicedict( fetchjson(RELEASE_INFO_URL), ["tag_name", "published_at"] ) tag_name = release_info["tag_name"] with open(RELEASE_INFO_FILENAME, "r", encoding="utf-8") as f: former_tag_name = json.load(f)["tag_name"] if tag_name == former_tag_name: raise Exception("no newer version available") # See: https://github.com/NixOS/nixpkgs/blob/master/pkgs/README.md#supported-features print(json.dumps( [ { "attrPath": "nerd-fonts", "oldVersion": former_tag_name.removeprefix("v"), "newVersion": tag_name.removeprefix("v"), }, ], indent=2 )) storejson(RELEASE_INFO_FILENAME, release_info) storejson( FONTS_INFO_FILENAME, [ slicedict( item, [ "caskName", "description", "folderName", "licenseId", "patchedName", "version", ] ) for item in fetchjson(FONTS_INFO_URL_TEMPLATE.format(tag_name))["fonts"] ], ) storejson( CHECKSUMS_FILENAME, { filename: sha256 for row in ureq.urlopen(SHA256_URL_TEMPLATE.format(tag_name)) for sha256, filename in [row.decode('utf-8').split()] if filename.endswith(".tar.xz") }, )