X-Git-Url: http://git.scottworley.com/pinch/blobdiff_plain/411b705ecc2b1210dfce0bb43ea5900b71b6281d..2fa9cbea8f21396556223dbf07e01e6af87ff5e8:/pinch.py diff --git a/pinch.py b/pinch.py index 7049b69..34c63f1 100644 --- a/pinch.py +++ b/pinch.py @@ -1,3 +1,4 @@ +from abc import ABC, abstractmethod import argparse import configparser import filecmp @@ -85,12 +86,22 @@ class ChannelTableEntry(types.SimpleNamespace): url: str -class SearchPath(types.SimpleNamespace): +class SearchPath(types.SimpleNamespace, ABC): release_name: str + @abstractmethod + def pin(self, v: Verification, conf: configparser.SectionProxy) -> None: + pass -class Channel(SearchPath): + +class AliasSearchPath(SearchPath): alias_of: str + + def pin(self, v: Verification, conf: configparser.SectionProxy) -> None: + assert not hasattr(self, 'git_repo') + + +class Channel(SearchPath): channel_html: bytes channel_url: str forwarded_url: str @@ -101,10 +112,6 @@ class Channel(SearchPath): 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 @@ -528,6 +535,8 @@ def git_revision_name(v: Verification, channel: Channel) -> str: def read_search_path(conf: configparser.SectionProxy) -> SearchPath: + if 'alias_of' in conf: + return AliasSearchPath(**dict(conf.items())) return Channel(**dict(conf.items())) @@ -537,6 +546,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) @@ -554,28 +575,21 @@ def pin(args: argparse.Namespace) -> None: 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 - 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] = ( - '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',