diff --git a/changelog.d/20241022_155052_jonathan.griffe_gitignore_paths.md b/changelog.d/20241022_155052_jonathan.griffe_gitignore_paths.md new file mode 100644 index 0000000000..4bdb3297b5 --- /dev/null +++ b/changelog.d/20241022_155052_jonathan.griffe_gitignore_paths.md @@ -0,0 +1,3 @@ +### Changed + +- The --use-gitignore option now also applies to single files passed as argument. diff --git a/ggshield/utils/files.py b/ggshield/utils/files.py index 0c480f76f3..f39efa5531 100644 --- a/ggshield/utils/files.py +++ b/ggshield/utils/files.py @@ -54,6 +54,12 @@ def list_files( targets: Set[Path] = set() for path in paths: if path.is_file(): + if ( + list_files_mode == ListFilesMode.ALL_BUT_GITIGNORED + and is_git_dir(path.parent) + and path.name not in git_ls_unstaged(path.parent) + git_ls(path.parent) + ): + continue targets.add(path) elif path.is_dir(): _targets = set() diff --git a/tests/unit/utils/test_files.py b/tests/unit/utils/test_files.py index 3e414f8d27..41a27f228c 100644 --- a/tests/unit/utils/test_files.py +++ b/tests/unit/utils/test_files.py @@ -143,3 +143,23 @@ def test_get_ignored_files(tmp_path, file_path, expected): def test_url_for_path(path: PurePath, expected_url: str): url = url_for_path(path) assert url == expected_url + + +def test_get_gitignored_files(tmp_path): + """ + GIVEN a file, that is in the .gitignore + WHEN listing its content + THEN an empty set is returned + """ + Repository.create(tmp_path) + file_full_path = tmp_path / "file.txt" + write_text(filename=str(tmp_path / ".gitignore"), content="file.txt") + write_text(filename=str(file_full_path), content="") + + file_paths = list_files( + paths=[file_full_path], + exclusion_regexes=set(), + list_files_mode=ListFilesMode.ALL_BUT_GITIGNORED, + ) + + assert file_paths == set()