From: Scott Worley Date: Tue, 19 May 2020 07:07:12 +0000 (-0700) Subject: Update merges multiple files X-Git-Tag: 1.2~1 X-Git-Url: http://git.scottworley.com/pinch/commitdiff_plain/01ba0eb2f8683ddb6f892c7adc98626cdba0d236?ds=inline Update merges multiple files --- diff --git a/pinch.py b/pinch.py index b147100..b044faf 100644 --- a/pinch.py +++ b/pinch.py @@ -456,10 +456,15 @@ def git_revision_name(v: Verification, channel: Channel) -> str: process.stdout.decode().strip()) +def read_config(filename: str) -> configparser.ConfigParser: + config = configparser.ConfigParser() + config.read_file(open(filename), filename) + return config + + def pin(args: argparse.Namespace) -> None: v = Verification() - config = configparser.ConfigParser() - config.read_file(open(args.channels_file), args.channels_file) + config = read_config(args.channels_file) for section in config.sections(): if args.channels and section not in args.channels: continue @@ -491,30 +496,32 @@ def pin(args: argparse.Namespace) -> None: def update(args: argparse.Namespace) -> None: v = Verification() config = configparser.ConfigParser() - config.read_file(open(args.channels_file), args.channels_file) exprs = {} - for section in config.sections(): - - if 'alias_of' in config[section]: - assert 'git_repo' not in config[section] - continue - - if 'channel_url' in config[section]: - tarball = fetch_with_nix_prefetch_url( - v, config[section]['tarball_url'], Digest16( - config[section]['tarball_sha256'])) - else: - channel = Channel(**dict(config[section].items())) - ensure_git_rev_available(v, channel) - tarball = git_get_tarball(v, channel) - - exprs[section] = ( - 'f: f { name = "%s"; channelName = "%%s"; src = builtins.storePath "%s"; }' % - (config[section]['release_name'], tarball)) - - for section in config.sections(): - if 'alias_of' in config[section]: - exprs[section] = exprs[str(config[section]['alias_of'])] + 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 + + if 'channel_url' in config[section]: + tarball = fetch_with_nix_prefetch_url( + v, config[section]['tarball_url'], Digest16( + config[section]['tarball_sha256'])) + else: + channel = Channel(**dict(config[section].items())) + ensure_git_rev_available(v, channel) + tarball = git_get_tarball(v, channel) + + 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]: + exprs[section] = exprs[str(config[section]['alias_of'])] command = [ 'nix-env', @@ -543,7 +550,7 @@ def main() -> None: parser_pin.set_defaults(func=pin) parser_update = subparsers.add_parser('update') parser_update.add_argument('--dry-run', action='store_true') - parser_update.add_argument('channels_file', type=str) + parser_update.add_argument('channels_file', type=str, nargs='+') parser_update.set_defaults(func=update) args = parser.parse_args() args.func(args) diff --git a/tests/multi-update.sh b/tests/multi-update.sh new file mode 100755 index 0000000..e7e5495 --- /dev/null +++ b/tests/multi-update.sh @@ -0,0 +1,41 @@ +#!/bin/sh + +repo_dir="`mktemp -d`" +repo="$repo_dir/repo" +git init "$repo" +( + cd "$repo" + echo Contents > test-file + git add test-file + git commit -m 'Commit message' +) + +conf1="`mktemp`" +cat > "$conf1" < "$conf2" <'\'' --install --from-expression '\''f: f \{ name = "(repo-[0-9]{10}-[0-9a-f]{11})"; channelName = "bar"; src = builtins.storePath "/nix/store/.{32}-\1.tar.xz"; \}'\'' '\''f: f \{ name = "\1"; channelName = "foo"; src = builtins.storePath "/nix/store/.{32}-\1.tar.xz"; \}'\''$' + +if echo "$actual_env_command" | egrep "$expected_env_command_RE" > /dev/null;then + echo PASS +else + echo "Output: $actual_env_command" + echo "does not match RE: $expected_env_command_RE" + exit 1 +fi