X-Git-Url: http://git.scottworley.com/pinch/blobdiff_plain/d7cfdb226f4463b96a3ce50f93142e4b6c0d8420..9f936f16fa5cec8d983cd2ed4006f6806a67e234:/pinch.py?ds=sidebyside diff --git a/pinch.py b/pinch.py index 1b11709..8fe7df1 100644 --- a/pinch.py +++ b/pinch.py @@ -34,7 +34,7 @@ from typing import ( # Use xdg module when it's less painful to have as a dependency -class XDG(types.SimpleNamespace): +class XDG(NamedTuple): XDG_CACHE_HOME: str @@ -172,12 +172,12 @@ class ChannelSearchPath(TarrableSearchPath): new_gitpin = parse_channel(v, self) fetch_resources(v, self, new_gitpin) ensure_git_rev_available(v, self, new_gitpin, old_revision) - check_channel_contents(v, self) + check_channel_contents(v, self, new_gitpin) return ChannelPin( - release_name=self.release_name, + release_name=new_gitpin.release_name, tarball_url=self.table['nixexprs.tar.xz'].absolute_url, tarball_sha256=self.table['nixexprs.tar.xz'].digest, - git_revision=self.git_revision) + git_revision=new_gitpin.git_revision) # Lint TODO: Put tarball_url and tarball_sha256 in ChannelSearchPath # pylint: disable=no-self-use @@ -241,12 +241,11 @@ def parse_channel(v: Verification, channel: TarrableSearchPath) -> GitPin: h1_name = d.getElementsByTagName('h1')[0].firstChild.nodeValue.split()[2] v.status(title_name) v.result(title_name == h1_name) - channel.release_name = title_name v.status('Extracting git commit:') git_commit_node = d.getElementsByTagName('tt')[0] - channel.git_revision = git_commit_node.firstChild.nodeValue - v.status(channel.git_revision) + git_revision = git_commit_node.firstChild.nodeValue + v.status(git_revision) v.ok() v.status('Verifying git commit label') v.result(git_commit_node.previousSibling.nodeValue == 'Git commit ') @@ -261,7 +260,7 @@ def parse_channel(v: Verification, channel: TarrableSearchPath) -> GitPin: channel.table[name] = ChannelTableEntry( url=url, digest=digest, size=size) v.ok() - return GitPin(release_name=title_name, git_revision=channel.git_revision) + return GitPin(release_name=title_name, git_revision=git_revision) def digest_string(s: bytes) -> Digest16: @@ -334,14 +333,14 @@ def git_cachedir(git_repo: str) -> str: digest_string(git_repo.encode())) -def tarball_cache_file(channel: TarrableSearchPath) -> str: +def tarball_cache_file(channel: TarrableSearchPath, pin: GitPin) -> 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)) + pin.git_revision, + pin.release_name)) def verify_git_ancestry( @@ -445,12 +444,12 @@ def ensure_git_rev_available( def compare_tarball_and_git( v: Verification, - channel: TarrableSearchPath, + pin: GitPin, channel_contents: str, git_contents: str) -> None: v.status('Comparing channel tarball with git checkout') match, mismatch, errors = compare(os.path.join( - channel_contents, channel.release_name), git_contents) + channel_contents, pin.release_name), git_contents) v.ok() v.check('%d files match' % len(match), len(match) > 0) v.check('%d files differ' % len(mismatch), len(mismatch) == 0) @@ -491,13 +490,14 @@ def extract_tarball( def git_checkout( v: Verification, channel: TarrableSearchPath, + pin: GitPin, dest: str) -> None: v.status('Checking out corresponding git revision') git = subprocess.Popen(['git', '-C', git_cachedir(channel.git_repo), 'archive', - channel.git_revision], + pin.git_revision], stdout=subprocess.PIPE) tar = subprocess.Popen( ['tar', 'x', '-C', dest, '-f', '-'], stdin=git.stdout) @@ -512,7 +512,7 @@ def git_get_tarball( v: Verification, channel: TarrableSearchPath, pin: GitPin) -> str: - cache_file = tarball_cache_file(channel) + cache_file = tarball_cache_file(channel, pin) if os.path.exists(cache_file): cached_tarball = open(cache_file).read(9999) if os.path.exists(cached_tarball): @@ -550,40 +550,41 @@ def git_get_tarball( def check_channel_metadata( v: Verification, - channel: TarrableSearchPath, + pin: GitPin, channel_contents: str) -> None: v.status('Verifying git commit in channel tarball') v.result( open( os.path.join( channel_contents, - channel.release_name, - '.git-revision')).read(999) == channel.git_revision) + pin.release_name, + '.git-revision')).read(999) == pin.git_revision) v.status( 'Verifying version-suffix is a suffix of release name %s:' % - channel.release_name) + pin.release_name) version_suffix = open( os.path.join( channel_contents, - channel.release_name, + pin.release_name, '.version-suffix')).read(999) v.status(version_suffix) - v.result(channel.release_name.endswith(version_suffix)) + v.result(pin.release_name.endswith(version_suffix)) def check_channel_contents( v: Verification, - channel: TarrableSearchPath) -> None: + channel: TarrableSearchPath, + pin: GitPin) -> None: with tempfile.TemporaryDirectory() as channel_contents, \ tempfile.TemporaryDirectory() as git_contents: extract_tarball(v, channel, channel_contents) - check_channel_metadata(v, channel, channel_contents) + check_channel_metadata(v, pin, channel_contents) - git_checkout(v, channel, git_contents) + git_checkout(v, channel, pin, git_contents) - compare_tarball_and_git(v, channel, channel_contents, git_contents) + compare_tarball_and_git(v, pin, channel_contents, git_contents) v.status('Removing temporary directories') v.ok()