From: Scott Worley Date: Tue, 2 Jun 2020 18:17:17 +0000 (-0700) Subject: Cache nix store paths of generated tarballs X-Git-Tag: 1.3~1 X-Git-Url: http://git.scottworley.com/pinch/commitdiff_plain/eb0c6f1b9ad97954d3ee229428ac84d8f33be546?ds=inline 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. --- 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(