From ac38f5a21500ad0e7fd8dac229a6dbadc9a14bfa Mon Sep 17 00:00:00 2001 From: Scott Worley Date: Wed, 24 Jan 2024 19:18:18 -0800 Subject: [PATCH] Allow identically-broken symlinks --- Changelog | 2 +- pinch.py | 31 ++++++++++++++++--------------- 2 files changed, 17 insertions(+), 16 deletions(-) diff --git a/Changelog b/Changelog index 4507467..e4989b4 100644 --- a/Changelog +++ b/Changelog @@ -1,5 +1,5 @@ ## [Unreleased] -- Allow nixpkgs' additional new intentionally-invalid symlinks +- Allow identical broken symlinks ## [3.0.12] - 2023-12-07 diff --git a/pinch.py b/pinch.py index e20d5d1..9e80c01 100644 --- a/pinch.py +++ b/pinch.py @@ -414,14 +414,24 @@ def verify_git_ancestry( v.result(process.returncode == 0) +def broken_symlinks_are_identical(root1: str, root2: str, path: str) -> bool: + a = os.path.join(root1, path) + b = os.path.join(root2, path) + return (os.path.islink(a) + and os.path.islink(b) + and not os.path.exists(a) + and not os.path.exists(b) + and os.readlink(a) == os.readlink(b)) + + def compare_tarball_and_git( v: Verification, pin: GitPin, channel_contents: str, git_contents: str) -> None: v.status('Comparing channel tarball with git checkout') - match, mismatch, errors = compare(os.path.join( - channel_contents, pin.release_name), git_contents) + tarball_contents = os.path.join(channel_contents, pin.release_name) + match, mismatch, errors = compare(tarball_contents, git_contents) v.ok() v.check(f'{len(match)} files match', len(match) > 0) v.check(f'{len(mismatch)} files differ', len(mismatch) == 0) @@ -431,30 +441,21 @@ def compare_tarball_and_git( 'nixpkgs', 'programs.sqlite', 'svn-revision'] - permitted_errors = [ - 'pkgs/test/nixpkgs-check-by-name/tests/multiple-failures/pkgs/by-name/A/fo@/foo', - 'pkgs/test/nixpkgs-check-by-name/tests/symlink-invalid/pkgs/by-name/fo/foo/foo', - '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_expected_errors.append(ee) - for pe in permitted_errors: - if pe in errors: - errors.remove(pe) - benign_permitted_errors.append(ee) + errors = [ + e for e in errors + if not broken_symlinks_are_identical(tarball_contents, git_contents, e) + ] 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_permitted_errors)} of {len(permitted_errors)} permitted incomparable files)', - len(benign_permitted_errors) <= len(permitted_errors)) def extract_tarball( -- 2.44.1