1+ import argparse
12from functools import partial
23import json
34from multiprocessing import Pool
@@ -10,44 +11,64 @@ def dropPrefix(path, nixPrefix):
1011 return path [len (nixPrefix + "/" ) :]
1112
1213
13- def processItem (item , nixPrefix , outDir ):
14+ def processItem (
15+ item , nixPrefix , outDir , compression , compressionCommand , compressionExtension
16+ ):
1417 narInfoHash = dropPrefix (item ["path" ], nixPrefix ).split ("-" )[0 ]
1518
16- xzFile = outDir / "nar" / f"{ narInfoHash } .nar.xz "
17- with open (xzFile , "wb" ) as f :
19+ narFile = outDir / "nar" / f"{ narInfoHash } { compressionExtension } "
20+ with open (narFile , "wb" ) as f :
1821 subprocess .run (
19- f"nix-store --dump { item ['path' ]} | xz -c " ,
22+ f"nix-store --dump { item ['path' ]} { compressionCommand } " ,
2023 stdout = f ,
2124 shell = True ,
2225 check = True ,
2326 )
2427
2528 fileHash = (
2629 subprocess .run (
27- ["nix-hash" , "--base32" , "--type" , "sha256" , "--flat" , xzFile ],
30+ ["nix-hash" , "--base32" , "--type" , "sha256" , "--flat" , narFile ],
2831 capture_output = True ,
2932 check = True ,
3033 )
3134 .stdout .decode ()
3235 .strip ()
3336 )
34- fileSize = os .path .getsize (xzFile )
37+ fileSize = os .path .getsize (narFile )
3538
36- finalXzFileName = Path ("nar" ) / f"{ fileHash } .nar.xz "
37- os .rename (xzFile , outDir / finalXzFileName )
39+ finalNarFileName = Path ("nar" ) / f"{ fileHash } { compressionExtension } "
40+ os .rename (narFile , outDir / finalNarFileName )
3841
3942 with open (outDir / f"{ narInfoHash } .narinfo" , "wt" ) as f :
4043 f .write (f"StorePath: { item ['path' ]} \n " )
41- f .write (f"URL: { finalXzFileName } \n " )
42- f .write ("Compression: xz \n " )
44+ f .write (f"URL: { finalNarFileName } \n " )
45+ f .write (f "Compression: { compression } \n " )
4346 f .write (f"FileHash: sha256:{ fileHash } \n " )
4447 f .write (f"FileSize: { fileSize } \n " )
4548 f .write (f"NarHash: { item ['narHash' ]} \n " )
4649 f .write (f"NarSize: { item ['narSize' ]} \n " )
47- f .write (f"References: { ' ' .join (dropPrefix (ref , nixPrefix ) for ref in item ['references' ])} \n " )
50+ f .write (
51+ f"References: { ' ' .join (dropPrefix (ref , nixPrefix ) for ref in item ['references' ])} \n "
52+ )
4853
4954
5055def main ():
56+ parser = argparse .ArgumentParser ()
57+ parser .add_argument ("--compression" , choices = ["none" , "xz" , "zstd" ])
58+ args = parser .parse_args ()
59+
60+ compressionCommand = {
61+ "none" : "" ,
62+ "xz" : "| xz -c" ,
63+ "zstd" : "| zstd" ,
64+ }[args .compression ]
65+
66+ compressionExtension = {
67+ "none" : "" ,
68+ "xz" : ".xz" ,
69+ "zstd" : ".zst" ,
70+ }[args .compression ]
71+
5172 outDir = Path (os .environ ["out" ])
5273 nixPrefix = os .environ ["NIX_STORE" ]
5374 numWorkers = int (os .environ .get ("NIX_BUILD_CORES" , "4" ))
@@ -61,7 +82,14 @@ def main():
6182 f .write (f"StoreDir: { nixPrefix } \n " )
6283
6384 with Pool (processes = numWorkers ) as pool :
64- worker = partial (processItem , nixPrefix = nixPrefix , outDir = outDir )
85+ worker = partial (
86+ processItem ,
87+ nixPrefix = nixPrefix ,
88+ outDir = outDir ,
89+ compression = args .compression ,
90+ compressionCommand = compressionCommand ,
91+ compressionExtension = compressionExtension ,
92+ )
6593 pool .map (worker , closures )
6694
6795
0 commit comments