return Digest16(hasher.hexdigest())
-@functools.lru_cache
-def _experimental_flag_needed(v: Verification) -> bool:
- v.status('Checking Nix version')
- process = subprocess.run(['nix', '--help'], stdout=subprocess.PIPE)
- v.result(process.returncode == 0)
- return b'--experimental-features' in process.stdout
-
-
-def _nix_command(v: Verification) -> List[str]:
- return ['nix', '--experimental-features',
- 'nix-command'] if _experimental_flag_needed(v) else ['nix']
+_NIX_COMMAND = ['nix', '--experimental-features', 'nix-command']
def to_Digest16(v: Verification, digest32: Digest32) -> Digest16:
v.status('Converting digest to base16')
- process = subprocess.run(_nix_command(v) + [
+ process = subprocess.run(_NIX_COMMAND + [
'to-base16',
'--type',
'sha256',
def to_Digest32(v: Verification, digest16: Digest16) -> Digest32:
v.status('Converting digest to base32')
- process = subprocess.run(_nix_command(v) + [
+ process = subprocess.run(_NIX_COMMAND + [
'to-base32',
'--type',
'sha256',
assert isinstance(sp, AliasSearchPath) # For mypy
exprs[section] = exprs[sp.alias_of]
- command = [
- 'nix-env',
- '--profile',
- args.profile,
- '--show-trace',
- '--file',
- '<nix/unpack-channel.nix>',
- '--install',
- '--remove-all',
- ] + search_paths + ['--from-expression'] + [
- exprs[name] % name for name in sorted(exprs.keys())]
- if args.dry_run:
- print(' '.join(map(shlex.quote, command)))
- else:
- v.status('Installing channels with nix-env')
- process = subprocess.run(command)
- v.result(process.returncode == 0)
+ with tempfile.NamedTemporaryFile() as unpack_channel_nix:
+ unpack_channel_nix.write(b'''
+ { name, channelName, src, }:
+ derivation {
+ inherit name channelName src;
+ builder = "builtin:unpack-channel";
+ system = "builtin";
+ preferLocalBuild = true;
+ }
+ ''')
+ unpack_channel_nix.flush()
+
+ command = [
+ 'nix-env',
+ '--profile',
+ args.profile,
+ '--show-trace',
+ '--file',
+ unpack_channel_nix.name,
+ '--install',
+ '--remove-all',
+ ] + search_paths + ['--from-expression'] + [
+ exprs[name] % name for name in sorted(exprs.keys())]
+ if args.dry_run:
+ print(' '.join(map(shlex.quote, command)))
+ else:
+ v.status('Installing channels with nix-env')
+ process = subprocess.run(command)
+ v.result(process.returncode == 0)
def main() -> None: