44 lines
1.3 KiB
Python
44 lines
1.3 KiB
Python
|
|
||
|
import json
|
||
|
import os
|
||
|
import subprocess
|
||
|
|
||
|
with open(os.environ["NIX_ATTRS_JSON_FILE"], "r") as f:
|
||
|
closures = json.load(f)["closure"]
|
||
|
|
||
|
os.chdir(os.environ["out"])
|
||
|
|
||
|
nixPrefix = os.environ["NIX_STORE"] # Usually /nix/store
|
||
|
|
||
|
with open("nix-cache-info", "w") as f:
|
||
|
f.write("StoreDir: " + nixPrefix + "\n")
|
||
|
|
||
|
def dropPrefix(path):
|
||
|
return path[len(nixPrefix + "/"):]
|
||
|
|
||
|
for item in closures:
|
||
|
narInfoHash = dropPrefix(item["path"]).split("-")[0]
|
||
|
|
||
|
xzFile = "nar/" + narInfoHash + ".nar.xz"
|
||
|
with open(xzFile, "w") as f:
|
||
|
subprocess.run("nix-store --dump %s | xz -c" % item["path"], stdout=f, shell=True)
|
||
|
|
||
|
fileHash = subprocess.run(["nix-hash", "--base32", "--type", "sha256", item["path"]], capture_output=True).stdout.decode().strip()
|
||
|
fileSize = os.path.getsize(xzFile)
|
||
|
|
||
|
# Rename the .nar.xz file to its own hash to match "nix copy" behavior
|
||
|
finalXzFile = "nar/" + fileHash + ".nar.xz"
|
||
|
os.rename(xzFile, finalXzFile)
|
||
|
|
||
|
with open(narInfoHash + ".narinfo", "w") as f:
|
||
|
f.writelines((x + "\n" for x in [
|
||
|
"StorePath: " + item["path"],
|
||
|
"URL: " + finalXzFile,
|
||
|
"Compression: xz",
|
||
|
"FileHash: sha256:" + fileHash,
|
||
|
"FileSize: " + str(fileSize),
|
||
|
"NarHash: " + item["narHash"],
|
||
|
"NarSize: " + str(item["narSize"]),
|
||
|
"References: " + " ".join(dropPrefix(ref) for ref in item["references"]),
|
||
|
]))
|