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',
return Digest16(process.stdout.decode().strip())
-def to_Digest32(v: Verification, digest16: Digest16) -> Digest32:
- v.status('Converting digest to base32')
- process = subprocess.run(_nix_command(v) + [
- 'to-base32',
- '--type',
- 'sha256',
- digest16],
- stdout=subprocess.PIPE)
- v.result(process.returncode == 0)
- return Digest32(process.stdout.decode().strip())
-
-
def fetch_with_nix_prefetch_url(
v: Verification,
url: str,
git_revision],
stdout=subprocess.PIPE)
v.result(process.returncode == 0 and process.stdout != b'')
- return f'{os.path.basename(channel.git_repo)}-{process.stdout.decode().strip()}'
+ return f'{
+ os.path.basename(channel.git_repo)}-{
+ process.stdout.decode().strip()}'
K = TypeVar('K')
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: