Skip to content

Commit

Permalink
Fix misdetection of project root with --stdin-filename (#3216)
Browse files Browse the repository at this point in the history
There are a number of places this behaviour could be patched, for
instance, it's quite tempting to patch it in `get_sources`. However
I believe we generally have the invariant that project root contains all
files we want to format, in which case it seems prudent to keep that
invariant.

This also improves the accuracy of the "sources to be formatted" log
message with --stdin-filename.

Fixes GH-3207.
  • Loading branch information
hauntsaninja committed Aug 26, 2022
1 parent a5fde8a commit c47b91f
Show file tree
Hide file tree
Showing 4 changed files with 19 additions and 3 deletions.
2 changes: 2 additions & 0 deletions CHANGES.md
Expand Up @@ -40,6 +40,8 @@
<!-- Changes to how Black can be configured -->

- Black now uses the presence of debug f-strings to detect target version. (#3215)
- Fix misdetection of project root and verbose logging of sources in cases involving
`--stdin-filename` (#3216)

### Documentation

Expand Down
8 changes: 6 additions & 2 deletions src/black/__init__.py
Expand Up @@ -469,7 +469,9 @@ def main( # noqa: C901
out(main.get_usage(ctx) + "\n\nOne of 'SRC' or 'code' is required.")
ctx.exit(1)

root, method = find_project_root(src) if code is None else (None, None)
root, method = (
find_project_root(src, stdin_filename) if code is None else (None, None)
)
ctx.obj["root"] = root

if verbose:
Expand All @@ -480,7 +482,9 @@ def main( # noqa: C901
)

normalized = [
(normalize_path_maybe_ignore(Path(source), root), source)
(source, source)
if source == "-"
else (normalize_path_maybe_ignore(Path(source), root), source)
for source in src
]
srcs_string = ", ".join(
Expand Down
6 changes: 5 additions & 1 deletion src/black/files.py
Expand Up @@ -39,7 +39,9 @@


@lru_cache()
def find_project_root(srcs: Sequence[str]) -> Tuple[Path, str]:
def find_project_root(
srcs: Sequence[str], stdin_filename: Optional[str] = None
) -> Tuple[Path, str]:
"""Return a directory containing .git, .hg, or pyproject.toml.
That directory will be a common parent of all files and directories
Expand All @@ -52,6 +54,8 @@ def find_project_root(srcs: Sequence[str]) -> Tuple[Path, str]:
the second element as a string describing the method by which the
project root was discovered.
"""
if stdin_filename is not None:
srcs = tuple(stdin_filename if s == "-" else s for s in srcs)
if not srcs:
srcs = [str(Path.cwd().resolve())]

Expand Down
6 changes: 6 additions & 0 deletions tests/test_black.py
Expand Up @@ -1396,6 +1396,12 @@ def test_find_project_root(self) -> None:
(src_dir.resolve(), "pyproject.toml"),
)

with change_directory(test_dir):
self.assertEqual(
black.find_project_root(("-",), stdin_filename="../src/a.py"),
(src_dir.resolve(), "pyproject.toml"),
)

@patch(
"black.files.find_user_pyproject_toml",
)
Expand Down

0 comments on commit c47b91f

Please sign in to comment.