X-Git-Url: http://git.scottworley.com/pinch/blobdiff_plain/207c8e0d666bb54fb1c6001b4370e5c2229bb4ae..b2bb38e6b9172072458ec1c8aed3e0b4c5f54a43:/pinch.py diff --git a/pinch.py b/pinch.py index 369dd56..130f69a 100644 --- a/pinch.py +++ b/pinch.py @@ -247,7 +247,7 @@ def compare(a: str, b: str) -> Tuple[List[str], List[str], List[str]]: def fetch_channel( v: Verification, channel: ChannelSearchPath) -> Tuple[str, str]: - v.status('Fetching channel') + v.status('Fetching channel from %s' % channel.channel_url) request = urllib.request.urlopen(channel.channel_url, timeout=10) channel_html = request.read().decode() forwarded_url = request.geturl() @@ -302,30 +302,39 @@ def digest_file(filename: str) -> Digest16: 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'] + + def to_Digest16(v: Verification, digest32: Digest32) -> Digest16: v.status('Converting digest to base16') - process = subprocess.run(['nix', - '--experimental-features', - 'nix-command', - 'to-base16', - '--type', - 'sha256', - digest32], - stdout=subprocess.PIPE) + process = subprocess.run(_nix_command(v) + [ + 'to-base16', + '--type', + 'sha256', + digest32], + stdout=subprocess.PIPE) v.result(process.returncode == 0) return Digest16(process.stdout.decode().strip()) def to_Digest32(v: Verification, digest16: Digest16) -> Digest32: v.status('Converting digest to base32') - process = subprocess.run(['nix', - '--experimental-features', - 'nix-command', - 'to-base32', - '--type', - 'sha256', - digest16], - stdout=subprocess.PIPE) + 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()) @@ -342,7 +351,7 @@ def fetch_with_nix_prefetch_url( assert empty == '' v.check("Verifying nix-prefetch-url's digest", to_Digest16(v, Digest32(prefetch_digest)) == digest) - v.status("Verifying file digest") + v.status("Verifying digest of %s" % path) file_digest = digest_file(path) v.result(file_digest == digest) return path # type: ignore # (for old mypy)