138 releases = [r
for r
in api(f
"/repos/{REPO}/releases?per_page=30", token)
139 if TAG_RE.match(r[
"tag_name"])
and not r[
"draft"]]
140 releases.sort(key=
lambda r: r[
"tag_name"], reverse=
True)
151 for a
in rel[
"assets"]:
152 for key, match
in FORMATS.items():
153 if not match(a[
"name"]):
155 cur = newest.get(key)
156 if cur
and (cur[
"release"] > rel[
"tag_name"]
159 m = VERSION_RE.match(a[
"name"])
162 "url": a[
"browser_download_url"],
164 "uploaded": a[
"updated_at"],
165 "release": rel[
"tag_name"],
166 "version": m.group(
"version")
if m
else None,
167 "commit_short": m.group(
"hash")
if m
else None,
168 "sha256": (a.get(
"digest")
or "").removeprefix(
"sha256:")
or None,
170 if len(newest) == len(FORMATS):
174 for key, entry
in newest.items():
175 if not entry[
"sha256"]:
176 print(f
"hashing {entry['name']} ...", file=sys.stderr)
184 if "docker" in newest:
185 if hub
and hub[
"version"].replace(
"-",
"+", 1) == newest[
"docker"][
"version"]:
186 newest[
"docker"].update({
"image": hub[
"image"],
"pull": hub[
"pull"],
"digest": hub[
"digest"]})
188 newest[
"docker"] = hub
193 for entry
in newest.values():
194 short = entry[
"commit_short"]
195 if short
and short
not in commits:
197 commits[short] =
api(f
"/repos/{REPO}/commits/{short}", token)[
"sha"]
198 except Exception
as e:
199 print(f
"could not resolve {short}: {e}", file=sys.stderr)
200 commits[short] =
None
201 entry[
"commit"] = commits.get(short)
205 "generated": datetime.datetime.now(datetime.timezone.utc).strftime(
"%Y-%m-%dT%H:%M:%SZ"),
206 "channel":
"nightly",
208 "download_page":
"https://ansel.photos/en/download/",
209 "formats": dict(sorted(newest.items())),
316 ap = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter)
317 sub = ap.add_subparsers(dest=
"cmd", required=
True)
318 m = sub.add_parser(
"manifest"); m.add_argument(
"--no-hashes", action=
"store_true")
319 for name
in (
"cask",
"scoop",
"summary",
"oneline",
"check"):
320 sub.add_parser(name).add_argument(
"manifest")
321 args = ap.parse_args()
323 if args.cmd ==
"manifest":
324 doc =
build_manifest(os.environ.get(
"GITHUB_TOKEN"), with_hashes=
not args.no_hashes)
325 json.dump(doc, sys.stdout, indent=1); sys.stdout.write(
"\n")
327 doc = json.load(open(args.manifest, encoding=
"utf-8"))
328 if args.cmd ==
"check":
330 render = {
"cask": render_cask,
"scoop": render_scoop,
"summary": render_summary,
"oneline": render_oneline}
331 sys.stdout.write(render[args.cmd](doc))