Fix misdetection of project root with --stdin-filename (#3216)

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.
This commit is contained in:
Shantanu 2022-08-26 14:07:25 -07:00 committed by GitHub
parent a5fde8ab9b
commit c47b91f513
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 19 additions and 3 deletions

View File

@ -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

View File

@ -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:
@ -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(

View File

@ -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
@ -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())]

View File

@ -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",
)