mirror of
https://github.com/justinwoo/easy-dhall-nix.git
synced 2024-11-14 15:19:41 +01:00
5e05faf619
fetchurl does not unpack, but we need it to support MacOS prefetch, because the `--unpack` option to `nix-prefetch-url` does not handle zips with multiple directories in them, and some upstream tarballs switched to that.
78 lines
2.6 KiB
Python
Executable file
78 lines
2.6 KiB
Python
Executable file
#!/usr/bin/env nix-shell
|
|
#!nix-shell -I nixpkgs=./nixpkgs.nix -i python3 -p python3 curl nix
|
|
|
|
import json
|
|
import re
|
|
import subprocess as sub
|
|
import sys
|
|
|
|
# fetch the release info from releases/latest
|
|
def curl_latest_release():
|
|
url = "https://api.github.com/repos/dhall-lang/dhall-haskell/releases/latest"
|
|
return json.loads(sub.check_output(["curl", url]))
|
|
|
|
# fetch the latest nixos unstable version
|
|
def curl_latest_nixos_unstable():
|
|
url = "https://nixos.org/channels/nixos-unstable/git-revision"
|
|
return sub.check_output(["curl", "--location", url]).strip().decode()
|
|
|
|
def update_nixpkgs(lockfile_path, new_hash):
|
|
# --unpack produces the hash required by `builtins.fetchTarball`
|
|
github_archive = "https://github.com/NixOS/nixpkgs/archive/{}.tar.gz".format(new_hash)
|
|
hash = sub.check_output([
|
|
"nix-prefetch-url", '--unpack', github_archive
|
|
]).strip().decode()
|
|
date = sub.check_output([
|
|
"date", "--iso-8601=minutes"
|
|
]).strip().decode()
|
|
with open(lockfile_path, 'w') as f:
|
|
json.dump({
|
|
"comment": "autogenerated by fetch.py",
|
|
"url": github_archive,
|
|
"sha256": hash,
|
|
"date": date
|
|
}, f, indent=2)
|
|
|
|
|
|
# call nix-prefetch-url on each asset to get their hashes
|
|
def prefetch_binaries(release):
|
|
res = []
|
|
for a in release['assets']:
|
|
if "linux" in a['name'] or "macos" in a['name']:
|
|
print(a['name'], file=sys.stderr)
|
|
hash = sub.check_output([
|
|
"nix-prefetch-url", a['browser_download_url']
|
|
]).strip().decode()
|
|
res += [{
|
|
'name': a['name'],
|
|
'url': a['browser_download_url'],
|
|
'hash': hash
|
|
}]
|
|
return res
|
|
|
|
# convert the list of binaries to an object we can address
|
|
def postprocess(fetched):
|
|
obj = {}
|
|
for i in fetched:
|
|
# split on the first digit ("dhall-foo-bar-1.2.3")
|
|
name = re.split(r'-\d', i['name'])[0]
|
|
post = "-linux" if "linux" in i['name'] else "-darwin"
|
|
obj[name + post] = i
|
|
return(obj)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
print("updating nixpkgs to latest unstable", file=sys.stderr)
|
|
nixos_hash = curl_latest_nixos_unstable()
|
|
update_nixpkgs("./nixpkgs.json", nixos_hash)
|
|
|
|
release = curl_latest_release()
|
|
version = release['tag_name']
|
|
|
|
print("updating to release {}".format(version), file=sys.stderr)
|
|
fetched = prefetch_binaries(release)
|
|
res = postprocess(fetched)
|
|
|
|
print("writing ./release.json", file=sys.stderr)
|
|
with open("./release.json", mode='w') as f:
|
|
json.dump(res, f, indent=2)
|