X-Git-Url: http://git.scottworley.com/pinch/blobdiff_plain/faff8642d1b68a819a41186ec720a0f00f43f712..93d2dafe3922ef5230ae41f759563fa5c3aa180e:/pinch.py diff --git a/pinch.py b/pinch.py index a8af6a6..632994b 100644 --- a/pinch.py +++ b/pinch.py @@ -100,6 +100,40 @@ class Channel(SearchPath): old_git_revision: str table: Dict[str, ChannelTableEntry] + def pin(self, v: Verification, conf: configparser.SectionProxy) -> None: + if hasattr(self, 'alias_of'): + assert not hasattr(self, 'git_repo') + return + + if hasattr(self, 'git_revision'): + self.old_git_revision = self.git_revision + del self.git_revision + + if 'channel_url' in conf: + pin_channel(v, self) + conf['release_name'] = self.release_name + conf['tarball_url'] = self.table['nixexprs.tar.xz'].absolute_url + conf['tarball_sha256'] = self.table['nixexprs.tar.xz'].digest + else: + git_fetch(v, self) + conf['release_name'] = git_revision_name(v, self) + conf['git_revision'] = self.git_revision + + def fetch(self, v: Verification, section: str, + conf: configparser.SectionProxy) -> str: + if 'git_repo' not in conf or 'release_name' not in conf: + raise Exception( + 'Cannot update unpinned channel "%s" (Run "pin" before "update")' % + section) + + if 'channel_url' in conf: + return fetch_with_nix_prefetch_url( + v, conf['tarball_url'], Digest16( + conf['tarball_sha256'])) + + ensure_git_rev_available(v, self) + return git_get_tarball(v, self) + def compare(a: str, b: str) -> Tuple[List[str], List[str], List[str]]: @@ -512,47 +546,12 @@ def pin(args: argparse.Namespace) -> None: channel = read_search_path(config[section]) - if hasattr(channel, 'alias_of'): - assert not hasattr(channel, 'git_repo') - continue - - if hasattr(channel, 'git_revision'): - channel.old_git_revision = channel.git_revision - del channel.git_revision - - if 'channel_url' in config[section]: - pin_channel(v, channel) - config[section]['release_name'] = channel.release_name - config[section]['tarball_url'] = channel.table['nixexprs.tar.xz'].absolute_url - config[section]['tarball_sha256'] = channel.table['nixexprs.tar.xz'].digest - else: - git_fetch(v, channel) - config[section]['release_name'] = git_revision_name(v, channel) - config[section]['git_revision'] = channel.git_revision + channel.pin(v, config[section]) with open(args.channels_file, 'w') as configfile: config.write(configfile) -def fetch_channel( - v: Verification, - section: str, - conf: configparser.SectionProxy) -> str: - if 'git_repo' not in conf or 'release_name' not in conf: - raise Exception( - 'Cannot update unpinned channel "%s" (Run "pin" before "update")' % - section) - - if 'channel_url' in conf: - return fetch_with_nix_prefetch_url( - v, conf['tarball_url'], Digest16( - conf['tarball_sha256'])) - - channel = read_search_path(conf) - ensure_git_rev_available(v, channel) - return git_get_tarball(v, channel) - - def update(args: argparse.Namespace) -> None: v = Verification() config = configparser.ConfigParser() @@ -563,7 +562,8 @@ def update(args: argparse.Namespace) -> None: if 'alias_of' in config[section]: assert 'git_repo' not in config[section] continue - tarball = fetch_channel(v, section, config[section]) + sp = read_search_path(config[section]) + tarball = sp.fetch(v, section, config[section]) if section in exprs: raise Exception('Duplicate channel "%s"' % section) exprs[section] = (