X-Git-Url: http://git.scottworley.com/pinch/blobdiff_plain/cb28d8e509d0483fdfd69d4f51174127a8a56e84..b573564a47adba410749d11f28efd2a84d564bbf:/pinch.py diff --git a/pinch.py b/pinch.py index e3c7ca0..33fd9bf 100644 --- a/pinch.py +++ b/pinch.py @@ -1,3 +1,10 @@ +# pinch: PIN CHannels - a replacement for `nix-channel --update` +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation, version 3. + + import argparse import configparser import filecmp @@ -141,7 +148,6 @@ def symlink_archive(v: Verification, path: str) -> str: class AliasSearchPath(NamedTuple): alias_of: str - # pylint: disable=no-self-use def pin(self, _: Verification, __: Optional[Pin]) -> AliasPin: return AliasPin() @@ -149,7 +155,6 @@ class AliasSearchPath(NamedTuple): class SymlinkSearchPath(NamedTuple): path: str - # pylint: disable=no-self-use def pin(self, _: Verification, __: Optional[Pin]) -> SymlinkPin: return SymlinkPin() @@ -202,7 +207,6 @@ class ChannelSearchPath(NamedTuple): tarball_sha256=table['nixexprs.tar.xz'].digest, git_revision=new_gitpin.git_revision) - # pylint: disable=no-self-use def fetch(self, v: Verification, pin: Pin) -> str: assert isinstance(pin, ChannelPin) @@ -413,15 +417,28 @@ def compare_tarball_and_git( 'nixpkgs', 'programs.sqlite', 'svn-revision'] - benign_errors = [] + permitted_errors = [ + 'pkgs/test/nixpkgs-check-by-name/tests/symlink-invalid/pkgs/by-name/fo/foo/foo.nix', + ] + benign_expected_errors = [] + benign_permitted_errors = [] for ee in expected_errors: if ee in errors: errors.remove(ee) - benign_errors.append(ee) - v.check(f'{len(errors)} unexpected incomparable files', len(errors) == 0) + benign_expected_errors.append(ee) + for pe in permitted_errors: + if pe in errors: + errors.remove(pe) + benign_permitted_errors.append(ee) + v.check( + f'{len(errors)} unexpected incomparable files: {errors}', + len(errors) == 0) + v.check( + f'({len(benign_expected_errors)} of {len(expected_errors)} expected incomparable files)', + len(benign_expected_errors) == len(expected_errors)) v.check( - f'({len(benign_errors)} of {len(expected_errors)} expected incomparable files)', - len(benign_errors) == len(expected_errors)) + f'({len(benign_permitted_errors)} of {len(permitted_errors)} permitted incomparable files)', + len(benign_permitted_errors) <= len(permitted_errors)) def extract_tarball( @@ -572,7 +589,7 @@ def read_config_section( _, all_fields = filter_dict(dict(conf.items()), set(['type'])) pin_fields, remaining_fields = filter_dict(all_fields, set(P._fields)) # Error suppression works around https://github.com/python/mypy/issues/9007 - pin_present = pin_fields != {} or P._fields == () + pin_present = pin_fields or P._fields == () pin = P(**pin_fields) if pin_present else None # type: ignore return SP(**remaining_fields), pin @@ -581,7 +598,7 @@ def read_pinned_config_section( section: str, conf: configparser.SectionProxy) -> Tuple[SearchPath, Pin]: sp, pin = read_config_section(conf) if pin is None: - raise Exception( + raise RuntimeError( f'Cannot update unpinned channel "{section}" (Run "pin" before "update")') return sp, pin @@ -600,7 +617,7 @@ def read_config_files( config = read_config(file) for section in config.sections(): if section in merged_config: - raise Exception('Duplicate channel "{section}"') + raise RuntimeError('Duplicate channel "{section}"') merged_config[section] = config[section] return merged_config