Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#!/usr/bin/env python
import argparse
import json
from pathlib import Path
import httpx
from ps_tools import get_url_hash
# We pass this to builtins.fetchTarball which only supports sha256
HASH_TYPE = "sha256"
DEFAULT_CHANNEL = "nixos-21.05"
CHANNEL_URL_TEMPLATE = "https://channels.nixos.org/{channel}/nixexprs.tar.xz"
def get_nixos_channel_url(*, channel):
"""
Get the URL for the current release of the given nixos channel.
`https://channels.nixos.org/<channel>` redirects to the path on
`https://releases.nixos.org` that corresponds to the current release
of that channel. This captures that redirect, so we can pin against
the release.
"""
response = httpx.head(
CHANNEL_URL_TEMPLATE.format(channel=channel), allow_redirects=False
)
response.raise_for_status()
assert response.is_redirect
return str(response.next_request.url)
def main():
parser = argparse.ArgumentParser(description="Update a pinned nixos repository.")
parser.add_argument(
"repo_file",
metavar="repo-file",
nargs="?",
default=Path(__file__).parent.with_name("nixpkgs-2105.json"),
type=Path,
help="JSON file with pinned configuration.",
)
parser.add_argument(
"--dry-run",
action="store_true",
)
parser.set_defaults(channel=DEFAULT_CHANNEL)
args = parser.parse_args()
repo_file = args.repo_file
config = json.loads(repo_file.read_text())
config["url"] = get_nixos_channel_url(channel=args.channel)
hash_data = get_url_hash(HASH_TYPE, name=config["name"], url=config["url"])
config["sha256"] = hash_data["outputHash"]
output = json.dumps(config, indent=2)
if args.dry_run:
print(output)
else:
repo_file.write_text(output)
if __name__ == "__main__":
main()