All patches and comments are welcome. Please squash your changes to logical
commits before using git-format-patch and git-send-email to
patches@git.madduck.net.
If you'd read over the Git project's submission guidelines and adhered to them,
I'd be especially grateful.
This speeds up black by about 40% when the cache is full
<!-- Changes that improve Black's performance. -->
<!-- Changes that improve Black's performance. -->
+- Speed up _Black_ significantly when the cache is full (#3751)
- Avoid importing `IPython` in a case where we wouldn't need it (#3748)
### Output
- Avoid importing `IPython` in a case where we wouldn't need it (#3748)
### Output
return root_relative_path
return root_relative_path
-def path_is_ignored(
- path: Path, gitignore_dict: Dict[Path, PathSpec], report: Report
+def _path_is_ignored(
+ root_relative_path: str,
+ root: Path,
+ gitignore_dict: Dict[Path, PathSpec],
+ report: Report,
+ path = root / root_relative_path
+ # Note that this logic is sensitive to the ordering of gitignore_dict. Callers must
+ # ensure that gitignore_dict is ordered from least specific to most specific.
for gitignore_path, pattern in gitignore_dict.items():
for gitignore_path, pattern in gitignore_dict.items():
- relative_path = normalize_path_maybe_ignore(path, gitignore_path, report)
- if relative_path is None:
+ try:
+ relative_path = path.relative_to(gitignore_path).as_posix()
+ except ValueError:
break
if pattern.match_file(relative_path):
break
if pattern.match_file(relative_path):
- report.path_ignored(path, "matches a .gitignore file content")
+ report.path_ignored(
+ path.relative_to(root), "matches a .gitignore file content"
+ )
continue
# First ignore files matching .gitignore, if passed
continue
# First ignore files matching .gitignore, if passed
- if gitignore_dict and path_is_ignored(child, gitignore_dict, report):
+ if gitignore_dict and _path_is_ignored(
+ normalized_path, root, gitignore_dict, report
+ ):
continue
# Then ignore with `--exclude` `--extend-exclude` and `--force-exclude` options.
continue
# Then ignore with `--exclude` `--extend-exclude` and `--force-exclude` options.
"pathlib.Path.cwd", return_value=working_directory
), patch("pathlib.Path.is_dir", side_effect=mock_n_calls([True])):
ctx = FakeContext()
"pathlib.Path.cwd", return_value=working_directory
), patch("pathlib.Path.is_dir", side_effect=mock_n_calls([True])):
ctx = FakeContext()
+ # Note that the root folder (project_root) isn't the folder
+ # named "root" (aka working_directory)
ctx.obj["root"] = project_root
report = MagicMock(verbose=True)
black.get_sources(
ctx.obj["root"] = project_root
report = MagicMock(verbose=True)
black.get_sources(
for _, mock_args, _ in report.path_ignored.mock_calls
), "A symbolic link was reported."
report.path_ignored.assert_called_once_with(
for _, mock_args, _ in report.path_ignored.mock_calls
), "A symbolic link was reported."
report.path_ignored.assert_called_once_with(
- Path("child", "b.py"), "matches a .gitignore file content"
+ Path("root", "child", "b.py"), "matches a .gitignore file content"
)
def test_report_verbose(self) -> None:
)
def test_report_verbose(self) -> None: