From eb0c6f1b9ad97954d3ee229428ac84d8f33be546 Mon Sep 17 00:00:00 2001 From: Scott Worley Date: Tue, 2 Jun 2020 11:17:17 -0700 Subject: [PATCH] Cache nix store paths of generated tarballs This eliminates the slow "Generating tarball for git revision" step for tarballs that have already been generated and are already in the nix store. --- pinch.py | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/pinch.py b/pinch.py index 10481e4..732a91f 100644 --- a/pinch.py +++ b/pinch.py @@ -222,8 +222,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 +380,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') @@ -394,7 +409,11 @@ def git_get_tarball(v: Verification, channel: Channel) -> str: process = subprocess.run( ['nix-store', '--add', output_filename], capture_output=True) 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 def check_channel_metadata( -- 2.44.1