Skip to content

Commit

Permalink
Apply force exclude logic before symlink resolution
Browse files Browse the repository at this point in the history
  • Loading branch information
hauntsaninja committed Nov 1, 2023
1 parent e2f2bd0 commit 1bf22a0
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 11 deletions.
24 changes: 13 additions & 11 deletions src/black/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -639,25 +639,25 @@ def get_sources(
path = Path(s)
is_stdin = False

# Compare the logic here to the logic in `gen_python_files`.
if is_stdin or path.is_file():
normalized_path: Optional[str] = normalize_path_maybe_ignore(
path, root, report
)
if normalized_path is None:
if verbose:
out(f'Skipping invalid source: "{normalized_path}"', fg="red")
continue
if verbose:
out(f'Found input source: "{normalized_path}"', fg="blue")
root_relative_path = path.absolute().relative_to(root).as_posix()

root_relative_path = "/" + root_relative_path

normalized_path = "/" + normalized_path
# Hard-exclude any files that matches the `--force-exclude` regex.
if path_is_excluded(normalized_path, force_exclude):
if path_is_excluded(root_relative_path, force_exclude):
report.path_ignored(
path, "matches the --force-exclude regular expression"
)
continue

normalized_path = normalize_path_maybe_ignore(path, root, report)
if normalized_path is None:
if verbose:
out(f'Skipping invalid source: "{normalized_path}"', fg="red")
continue

if is_stdin:
path = Path(f"{STDIN_PLACEHOLDER}{str(path)}")

Expand All @@ -666,6 +666,8 @@ def get_sources(
):
continue

if verbose:
out(f'Found input source: "{normalized_path}"', fg="blue")
sources.add(path)
elif path.is_dir():
path = root / (path.resolve().relative_to(root))
Expand Down
17 changes: 17 additions & 0 deletions tests/test_black.py
Original file line number Diff line number Diff line change
Expand Up @@ -2552,6 +2552,23 @@ def test_get_sources_with_stdin_filename_and_force_exclude(self) -> None:
stdin_filename=stdin_filename,
)

@patch("black.find_project_root", lambda *args: (THIS_DIR.resolve(), None))
def test_get_sources_with_stdin_filename_and_force_exclude_and_symlink(
self,
) -> None:
# Force exclude should exclude a symlink based on the symlink, not its target
path = THIS_DIR / "data" / "include_exclude_tests"
stdin_filename = str(path / "symlink.py")
expected = [f"__BLACK_STDIN_FILENAME__{stdin_filename}"]
target = path / "b/exclude/a.py"
with patch("pathlib.Path.resolve", return_value=target):
assert_collected_sources(
src=["-"],
expected=expected,
force_exclude=r"exclude/a\.py",
stdin_filename=stdin_filename,
)


class TestDeFactoAPI:
"""Test that certain symbols that are commonly used externally keep working.
Expand Down

0 comments on commit 1bf22a0

Please sign in to comment.