X-Git-Url: http://git.scottworley.com/pinch/blobdiff_plain/10ddbaff0197f0ef93a910d7ea3f9f7d0ebac3a4..2b0b80e7e213e3e165cea4b80f5aa99377d9442c:/pinch.py diff --git a/pinch.py b/pinch.py index 10481e4..47f4e34 100644 --- a/pinch.py +++ b/pinch.py @@ -25,7 +25,17 @@ from typing import ( Tuple, ) -import xdg +# Use xdg module when it's less painful to have as a dependency + + +class XDG(types.SimpleNamespace): + XDG_CACHE_HOME: str + + +xdg = XDG( + XDG_CACHE_HOME=os.getenv( + 'XDG_CACHE_HOME', + os.path.expanduser('~/.cache'))) Digest16 = NewType('Digest16', str) @@ -73,7 +83,7 @@ class Verification: def result(self, r: bool) -> None: message, color = {True: ('OK ', 92), False: ('FAIL', 91)}[r] length = len(message) - cols = shutil.get_terminal_size().columns + cols = shutil.get_terminal_size().columns or 80 pad = (cols - (self.line_length + length)) % cols print(' ' * pad + self._color(message, color), file=sys.stderr) self.line_length = 0 @@ -121,7 +131,7 @@ def fetch(v: Verification, channel: Channel) -> None: request = urllib.request.urlopen(channel.channel_url, timeout=10) channel.channel_html = request.read() channel.forwarded_url = request.geturl() - v.result(request.status == 200) + v.result(request.status == 200) # type: ignore # (for old mypy) v.check('Got forwarded', channel.channel_url != channel.forwarded_url) @@ -174,7 +184,7 @@ def digest_file(filename: str) -> Digest16: def to_Digest16(v: Verification, digest32: Digest32) -> Digest16: v.status('Converting digest to base16') process = subprocess.run( - ['nix', 'to-base16', '--type', 'sha256', digest32], capture_output=True) + ['nix', 'to-base16', '--type', 'sha256', digest32], stdout=subprocess.PIPE) v.result(process.returncode == 0) return Digest16(process.stdout.decode().strip()) @@ -182,7 +192,7 @@ def to_Digest16(v: Verification, digest32: Digest32) -> Digest16: def to_Digest32(v: Verification, digest16: Digest16) -> Digest32: v.status('Converting digest to base32') process = subprocess.run( - ['nix', 'to-base32', '--type', 'sha256', digest16], capture_output=True) + ['nix', 'to-base32', '--type', 'sha256', digest16], stdout=subprocess.PIPE) v.result(process.returncode == 0) return Digest32(process.stdout.decode().strip()) @@ -193,7 +203,7 @@ def fetch_with_nix_prefetch_url( digest: Digest16) -> str: v.status('Fetching %s' % url) process = subprocess.run( - ['nix-prefetch-url', '--print-path', url, digest], capture_output=True) + ['nix-prefetch-url', '--print-path', url, digest], stdout=subprocess.PIPE) v.result(process.returncode == 0) prefetch_digest, path, empty = process.stdout.decode().split('\n') assert empty == '' @@ -202,7 +212,7 @@ def fetch_with_nix_prefetch_url( v.status("Verifying file digest") file_digest = digest_file(path) v.result(file_digest == digest) - return path + return path # type: ignore # (for old mypy) def fetch_resources(v: Verification, channel: Channel) -> None: @@ -222,8 +232,17 @@ def git_cachedir(git_repo: str) -> str: return os.path.join( xdg.XDG_CACHE_HOME, 'pinch/git', - digest_string( - git_repo.encode())) + digest_string(git_repo.encode())) + + +def tarball_cache_file(channel: Channel) -> str: + return os.path.join( + xdg.XDG_CACHE_HOME, + 'pinch/git-tarball', + '%s-%s-%s' % + (digest_string(channel.git_repo.encode()), + channel.git_revision, + channel.release_name)) def verify_git_ancestry(v: Verification, channel: Channel) -> None: @@ -371,6 +390,12 @@ def git_checkout(v: Verification, channel: Channel, dest: str) -> None: def git_get_tarball(v: Verification, channel: Channel) -> str: + cache_file = tarball_cache_file(channel) + if os.path.exists(cache_file): + cached_tarball = open(cache_file).read(9999) + if os.path.exists(cached_tarball): + return cached_tarball + with tempfile.TemporaryDirectory() as output_dir: output_filename = os.path.join( output_dir, channel.release_name + '.tar.xz') @@ -392,9 +417,13 @@ def git_get_tarball(v: Verification, channel: Channel) -> str: v.status('Putting tarball in Nix store') process = subprocess.run( - ['nix-store', '--add', output_filename], capture_output=True) + ['nix-store', '--add', output_filename], stdout=subprocess.PIPE) v.result(process.returncode == 0) - return process.stdout.decode().strip() + store_tarball = process.stdout.decode().strip() + + os.makedirs(os.path.dirname(cache_file), exist_ok=True) + open(cache_file, 'w').write(store_tarball) + return store_tarball # type: ignore # (for old mypy) def check_channel_metadata( @@ -449,12 +478,13 @@ def git_revision_name(v: Verification, channel: Channel) -> str: process = subprocess.run(['git', '-C', git_cachedir(channel.git_repo), - 'lo', + 'log', '-n1', '--format=%ct-%h', '--abbrev=11', + '--no-show-signature', channel.git_revision], - capture_output=True) + stdout=subprocess.PIPE) v.result(process.returncode == 0 and process.stdout != b'') return '%s-%s' % (os.path.basename(channel.git_repo), process.stdout.decode().strip()) @@ -573,4 +603,5 @@ def main() -> None: args.func(args) -main() +if __name__ == '__main__': + main()