From 9343cf4818bc2b3772e46842b6703b2e9cd99e4d Mon Sep 17 00:00:00 2001 From: Scott Worley Date: Mon, 15 Jun 2020 12:57:35 -0700 Subject: [PATCH 1/1] Start pulling release_name and git_revision out of SearchPath --- pinch.py | 41 ++++++++++++++++++++++++++--------------- 1 file changed, 26 insertions(+), 15 deletions(-) diff --git a/pinch.py b/pinch.py index 4c2341f..5e6aab9 100644 --- a/pinch.py +++ b/pinch.py @@ -152,9 +152,12 @@ class GitSearchPath(TarrableSearchPath): raise Exception( 'Cannot update unpinned channel "%s" (Run "pin" before "update")' % section) + the_pin = GitPin( + release_name=conf['release_name'], + git_revision=conf['git_revision']) - ensure_git_rev_available(v, self) - return git_get_tarball(v, self) + ensure_git_rev_available(v, self, the_pin) + return git_get_tarball(v, self, the_pin) class ChannelSearchPath(TarrableSearchPath): @@ -164,9 +167,9 @@ class ChannelSearchPath(TarrableSearchPath): del self.git_revision fetch(v, self) - parse_channel(v, self) - fetch_resources(v, self) - ensure_git_rev_available(v, self) + new_gitpin = parse_channel(v, self) + fetch_resources(v, self, new_gitpin) + ensure_git_rev_available(v, self, new_gitpin) check_channel_contents(v, self) return ChannelPin( release_name=self.release_name, @@ -225,7 +228,7 @@ def fetch(v: Verification, channel: TarrableSearchPath) -> None: v.check('Got forwarded', channel.channel_url != channel.forwarded_url) -def parse_channel(v: Verification, channel: TarrableSearchPath) -> None: +def parse_channel(v: Verification, channel: TarrableSearchPath) -> GitPin: v.status('Parsing channel description as XML') d = xml.dom.minidom.parseString(channel.channel_html) v.ok() @@ -256,6 +259,7 @@ def parse_channel(v: Verification, channel: TarrableSearchPath) -> None: channel.table[name] = ChannelTableEntry( url=url, digest=digest, size=size) v.ok() + return GitPin(release_name=title_name, git_revision=channel.git_revision) def digest_string(s: bytes) -> Digest16: @@ -305,7 +309,10 @@ def fetch_with_nix_prefetch_url( return path # type: ignore # (for old mypy) -def fetch_resources(v: Verification, channel: ChannelSearchPath) -> None: +def fetch_resources( + v: Verification, + channel: ChannelSearchPath, + pin: GitPin) -> None: for resource in ['git-revision', 'nixexprs.tar.xz']: fields = channel.table[resource] fields.absolute_url = urllib.parse.urljoin( @@ -315,7 +322,7 @@ def fetch_resources(v: Verification, channel: ChannelSearchPath) -> None: v.status('Verifying git commit on main page matches git commit in table') v.result( open( - channel.table['git-revision'].file).read(999) == channel.git_revision) + channel.table['git-revision'].file).read(999) == pin.git_revision) def git_cachedir(git_repo: str) -> str: @@ -405,12 +412,13 @@ def git_fetch(v: Verification, channel: TarrableSearchPath) -> None: def ensure_git_rev_available( v: Verification, - channel: TarrableSearchPath) -> None: + channel: TarrableSearchPath, + pin: GitPin) -> None: cachedir = git_cachedir(channel.git_repo) if os.path.exists(cachedir): v.status('Checking if we already have this rev:') process = subprocess.run( - ['git', '-C', cachedir, 'cat-file', '-e', channel.git_revision]) + ['git', '-C', cachedir, 'cat-file', '-e', pin.git_revision]) if process.returncode == 0: v.status('yes') if process.returncode == 1: @@ -487,7 +495,10 @@ def git_checkout( v.result(git.returncode == 0 and tar.returncode == 0) -def git_get_tarball(v: Verification, channel: TarrableSearchPath) -> str: +def git_get_tarball( + v: Verification, + channel: TarrableSearchPath, + pin: GitPin) -> str: cache_file = tarball_cache_file(channel) if os.path.exists(cache_file): cached_tarball = open(cache_file).read(9999) @@ -496,17 +507,17 @@ def git_get_tarball(v: Verification, channel: TarrableSearchPath) -> str: with tempfile.TemporaryDirectory() as output_dir: output_filename = os.path.join( - output_dir, channel.release_name + '.tar.xz') + output_dir, pin.release_name + '.tar.xz') with open(output_filename, 'w') as output_file: v.status( 'Generating tarball for git revision %s' % - channel.git_revision) + pin.git_revision) git = subprocess.Popen(['git', '-C', git_cachedir(channel.git_repo), 'archive', - '--prefix=%s/' % channel.release_name, - channel.git_revision], + '--prefix=%s/' % pin.release_name, + pin.git_revision], stdout=subprocess.PIPE) xz = subprocess.Popen(['xz'], stdin=git.stdout, stdout=output_file) xz.wait() -- 2.44.1