From 7c76d406122c0f4808e36e37c0358ddd46959945 Mon Sep 17 00:00:00 2001 From: Ilya Siamionau Date: Wed, 18 Dec 2024 15:56:15 +0100 Subject: [PATCH 1/2] CM-42771 - Fix top level `.gitignore` priorities --- cycode/cli/files_collector/walk_ignore.py | 3 ++- cycode/cli/utils/ignore_utils.py | 6 ++---- tests/cli/files_collector/test_walk_ignore.py | 16 ++++++++++++++++ 3 files changed, 20 insertions(+), 5 deletions(-) diff --git a/cycode/cli/files_collector/walk_ignore.py b/cycode/cli/files_collector/walk_ignore.py index 76d04366..93286c87 100644 --- a/cycode/cli/files_collector/walk_ignore.py +++ b/cycode/cli/files_collector/walk_ignore.py @@ -24,7 +24,8 @@ def _walk_to_top(path: str) -> Iterable[str]: def _collect_top_level_ignore_files(path: str) -> List[str]: ignore_files = [] - for dir_path in _walk_to_top(path): + top_paths = reversed(list(_walk_to_top(path))) # we must reverse it to make top levels more prioritized + for dir_path in top_paths: for ignore_file in _SUPPORTED_IGNORE_PATTERN_FILES: ignore_file_path = os.path.join(dir_path, ignore_file) if os.path.exists(ignore_file_path): diff --git a/cycode/cli/utils/ignore_utils.py b/cycode/cli/utils/ignore_utils.py index 329fa055..f44b6024 100644 --- a/cycode/cli/utils/ignore_utils.py +++ b/cycode/cli/utils/ignore_utils.py @@ -396,12 +396,10 @@ def walk(self, **kwargs) -> Generator[Tuple[str, List[str], List[str]], None, No # decrease recursion depth of os.walk() by ignoring subdirectories because of topdown=True # slicing ([:]) is mandatory to change dict in-place! - dirnames[:] = [ - dirname for dirname in dirnames if not self.is_ignored(os.path.join(rel_dirpath, dirname, '')) - ] + dirnames[:] = [d for d in dirnames if not self.is_ignored(os.path.join(rel_dirpath, d))] # remove ignored files - filenames = [os.path.basename(f) for f in filenames if not self.is_ignored(os.path.join(rel_dirpath, f))] + filenames = [f for f in filenames if not self.is_ignored(os.path.join(rel_dirpath, f))] yield dirpath, dirnames, filenames diff --git a/tests/cli/files_collector/test_walk_ignore.py b/tests/cli/files_collector/test_walk_ignore.py index fd2612d5..ed7bc8d9 100644 --- a/tests/cli/files_collector/test_walk_ignore.py +++ b/tests/cli/files_collector/test_walk_ignore.py @@ -140,3 +140,19 @@ def test_walk_ignore(fs: 'FakeFilesystem') -> None: assert normpath('/home/user/project/subproject/ignored.pyc') not in result # presented: assert normpath('/home/user/project/subproject/presented.py') in result + + +def test_walk_ignore_top_level_ignores_order(fs: 'FakeFilesystem') -> None: + fs.create_file('/home/user/.gitignore', contents='*.log') + fs.create_file('/home/user/project/.gitignore', contents='!*.log') # rollback *.log ignore for project + fs.create_dir('/home/user/project/subproject') + + fs.create_file('/home/user/ignored.log') + fs.create_file('/home/user/project/presented.log') + fs.create_file('/home/user/project/subproject/presented.log') + + results = _collect_walk_ignore_files('/home/user/project') + assert len(results) == 3 + assert normpath('/home/user/ignored.log') not in results + assert normpath('/home/user/project/presented.log') in results + assert normpath('/home/user/project/subproject/presented.log') in results From 573489dada5895c4475e994a0dbc1410f1a035d1 Mon Sep 17 00:00:00 2001 From: Ilya Siamionau Date: Wed, 18 Dec 2024 16:08:25 +0100 Subject: [PATCH 2/2] fix tests on windows --- tests/cli/files_collector/test_walk_ignore.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/tests/cli/files_collector/test_walk_ignore.py b/tests/cli/files_collector/test_walk_ignore.py index ed7bc8d9..b771cdf9 100644 --- a/tests/cli/files_collector/test_walk_ignore.py +++ b/tests/cli/files_collector/test_walk_ignore.py @@ -151,8 +151,9 @@ def test_walk_ignore_top_level_ignores_order(fs: 'FakeFilesystem') -> None: fs.create_file('/home/user/project/presented.log') fs.create_file('/home/user/project/subproject/presented.log') - results = _collect_walk_ignore_files('/home/user/project') - assert len(results) == 3 - assert normpath('/home/user/ignored.log') not in results - assert normpath('/home/user/project/presented.log') in results - assert normpath('/home/user/project/subproject/presented.log') in results + path = normpath('/home/user/project') + result = _collect_walk_ignore_files(path) + assert len(result) == 3 + assert normpath('/home/user/ignored.log') not in result + assert normpath('/home/user/project/presented.log') in result + assert normpath('/home/user/project/subproject/presented.log') in result