X-Git-Url: http://git.scottworley.com/pinch/blobdiff_plain/3aa393bbc0cd6dd203cd69024112afc62d521581..4603b1a7c9e6463deba8c974e4181bd5ce2be9ef:/pinch.py diff --git a/pinch.py b/pinch.py index d346a14..2698226 100644 --- a/pinch.py +++ b/pinch.py @@ -119,6 +119,21 @@ class Channel(SearchPath): 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,7 +527,7 @@ def git_revision_name(v: Verification, channel: Channel) -> str: process.stdout.decode().strip()) -def read_search_path(conf: configparser.SectionProxy) -> Channel: +def read_search_path(conf: configparser.SectionProxy) -> SearchPath: return Channel(**dict(conf.items())) @@ -522,6 +537,18 @@ def read_config(filename: str) -> configparser.ConfigParser: return config +def read_config_files( + filenames: Iterable[str]) -> Dict[str, configparser.SectionProxy]: + merged_config: Dict[str, configparser.SectionProxy] = {} + for file in filenames: + config = read_config(file) + for section in config.sections(): + if section in merged_config: + raise Exception('Duplicate channel "%s"' % section) + merged_config[section] = config[section] + return merged_config + + def pin(args: argparse.Namespace) -> None: v = Verification() config = read_config(args.channels_file) @@ -529,56 +556,31 @@ def pin(args: argparse.Namespace) -> None: if args.channels and section not in args.channels: continue - channel = read_search_path(config[section]) + sp = read_search_path(config[section]) - channel.pin(v, config[section]) + sp.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() exprs: Dict[str, str] = {} - configs = [read_config(filename) for filename in args.channels_file] - for config in configs: - for section in config.sections(): - if 'alias_of' in config[section]: - assert 'git_repo' not in config[section] - continue - tarball = fetch_channel(v, section, config[section]) - if section in exprs: - raise Exception('Duplicate channel "%s"' % section) - exprs[section] = ( - 'f: f { name = "%s"; channelName = "%%s"; src = builtins.storePath "%s"; }' % - (config[section]['release_name'], tarball)) - - for config in configs: - for section in config.sections(): - if 'alias_of' in config[section]: - if section in exprs: - raise Exception('Duplicate channel "%s"' % section) - exprs[section] = exprs[str(config[section]['alias_of'])] + config = read_config_files(args.channels_file) + for section in config: + if 'alias_of' in config[section]: + assert 'git_repo' not in config[section] + continue + sp = read_search_path(config[section]) + tarball = sp.fetch(v, section, config[section]) + exprs[section] = ( + 'f: f { name = "%s"; channelName = "%%s"; src = builtins.storePath "%s"; }' % + (config[section]['release_name'], tarball)) + + for section in config: + if 'alias_of' in config[section]: + exprs[section] = exprs[str(config[section]['alias_of'])] command = [ 'nix-env',