diff-cover 9.1.0__tar.gz → 9.1.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (134) hide show
  1. {diff_cover-9.1.0 → diff_cover-9.1.1}/PKG-INFO +1 -1
  2. {diff_cover-9.1.0 → diff_cover-9.1.1}/diff_cover/diff_reporter.py +48 -19
  3. {diff_cover-9.1.0 → diff_cover-9.1.1}/pyproject.toml +2 -2
  4. {diff_cover-9.1.0 → diff_cover-9.1.1}/tests/test_diff_reporter.py +51 -4
  5. {diff_cover-9.1.0 → diff_cover-9.1.1}/LICENSE +0 -0
  6. {diff_cover-9.1.0 → diff_cover-9.1.1}/README.rst +0 -0
  7. {diff_cover-9.1.0 → diff_cover-9.1.1}/diff_cover/__init__.py +0 -0
  8. {diff_cover-9.1.0 → diff_cover-9.1.1}/diff_cover/command_runner.py +0 -0
  9. {diff_cover-9.1.0 → diff_cover-9.1.1}/diff_cover/config_parser.py +0 -0
  10. {diff_cover-9.1.0 → diff_cover-9.1.1}/diff_cover/diff_cover_tool.py +0 -0
  11. {diff_cover-9.1.0 → diff_cover-9.1.1}/diff_cover/diff_quality_tool.py +0 -0
  12. {diff_cover-9.1.0 → diff_cover-9.1.1}/diff_cover/git_diff.py +0 -0
  13. {diff_cover-9.1.0 → diff_cover-9.1.1}/diff_cover/git_path.py +0 -0
  14. {diff_cover-9.1.0 → diff_cover-9.1.1}/diff_cover/hook.py +0 -0
  15. {diff_cover-9.1.0 → diff_cover-9.1.1}/diff_cover/hookspecs.py +0 -0
  16. {diff_cover-9.1.0 → diff_cover-9.1.1}/diff_cover/report_generator.py +0 -0
  17. {diff_cover-9.1.0 → diff_cover-9.1.1}/diff_cover/snippets.py +0 -0
  18. {diff_cover-9.1.0 → diff_cover-9.1.1}/diff_cover/templates/console_coverage_report.txt +0 -0
  19. {diff_cover-9.1.0 → diff_cover-9.1.1}/diff_cover/templates/console_quality_report.txt +0 -0
  20. {diff_cover-9.1.0 → diff_cover-9.1.1}/diff_cover/templates/external_style.css +0 -0
  21. {diff_cover-9.1.0 → diff_cover-9.1.1}/diff_cover/templates/html_coverage_report.html +0 -0
  22. {diff_cover-9.1.0 → diff_cover-9.1.1}/diff_cover/templates/html_quality_report.html +0 -0
  23. {diff_cover-9.1.0 → diff_cover-9.1.1}/diff_cover/templates/markdown_coverage_report.md +0 -0
  24. {diff_cover-9.1.0 → diff_cover-9.1.1}/diff_cover/templates/markdown_quality_report.md +0 -0
  25. {diff_cover-9.1.0 → diff_cover-9.1.1}/diff_cover/templates/snippet_content.html +0 -0
  26. {diff_cover-9.1.0 → diff_cover-9.1.1}/diff_cover/templates/snippet_content.md +0 -0
  27. {diff_cover-9.1.0 → diff_cover-9.1.1}/diff_cover/templates/snippet_content.txt +0 -0
  28. {diff_cover-9.1.0 → diff_cover-9.1.1}/diff_cover/templates/snippet_style.html +0 -0
  29. {diff_cover-9.1.0 → diff_cover-9.1.1}/diff_cover/util.py +0 -0
  30. {diff_cover-9.1.0 → diff_cover-9.1.1}/diff_cover/violationsreporters/__init__.py +0 -0
  31. {diff_cover-9.1.0 → diff_cover-9.1.1}/diff_cover/violationsreporters/base.py +0 -0
  32. {diff_cover-9.1.0 → diff_cover-9.1.1}/diff_cover/violationsreporters/java_violations_reporter.py +0 -0
  33. {diff_cover-9.1.0 → diff_cover-9.1.1}/diff_cover/violationsreporters/violations_reporter.py +0 -0
  34. {diff_cover-9.1.0 → diff_cover-9.1.1}/tests/__init__.py +0 -0
  35. {diff_cover-9.1.0 → diff_cover-9.1.1}/tests/fixtures/add_console_report.txt +0 -0
  36. {diff_cover-9.1.0 → diff_cover-9.1.1}/tests/fixtures/add_html_report.html +0 -0
  37. {diff_cover-9.1.0 → diff_cover-9.1.1}/tests/fixtures/changed_console_report.txt +0 -0
  38. {diff_cover-9.1.0 → diff_cover-9.1.1}/tests/fixtures/changed_html_report.html +0 -0
  39. {diff_cover-9.1.0 → diff_cover-9.1.1}/tests/fixtures/coverage.xml +0 -0
  40. {diff_cover-9.1.0 → diff_cover-9.1.1}/tests/fixtures/coverage1.xml +0 -0
  41. {diff_cover-9.1.0 → diff_cover-9.1.1}/tests/fixtures/coverage2.xml +0 -0
  42. {diff_cover-9.1.0 → diff_cover-9.1.1}/tests/fixtures/delete_console_report.txt +0 -0
  43. {diff_cover-9.1.0 → diff_cover-9.1.1}/tests/fixtures/delete_html_report.html +0 -0
  44. {diff_cover-9.1.0 → diff_cover-9.1.1}/tests/fixtures/dotnet_coverage.xml +0 -0
  45. {diff_cover-9.1.0 → diff_cover-9.1.1}/tests/fixtures/dotnet_coverage_console_report.txt +0 -0
  46. {diff_cover-9.1.0 → diff_cover-9.1.1}/tests/fixtures/empty.txt +0 -0
  47. {diff_cover-9.1.0 → diff_cover-9.1.1}/tests/fixtures/empty_pycodestyle_violations.txt +0 -0
  48. {diff_cover-9.1.0 → diff_cover-9.1.1}/tests/fixtures/external_css_html_report.html +0 -0
  49. {diff_cover-9.1.0 → diff_cover-9.1.1}/tests/fixtures/external_style.css +0 -0
  50. {diff_cover-9.1.0 → diff_cover-9.1.1}/tests/fixtures/git_diff_add.txt +0 -0
  51. {diff_cover-9.1.0 → diff_cover-9.1.1}/tests/fixtures/git_diff_changed.txt +0 -0
  52. {diff_cover-9.1.0 → diff_cover-9.1.1}/tests/fixtures/git_diff_code_dupe.txt +0 -0
  53. {diff_cover-9.1.0 → diff_cover-9.1.1}/tests/fixtures/git_diff_delete.txt +0 -0
  54. {diff_cover-9.1.0 → diff_cover-9.1.1}/tests/fixtures/git_diff_dotnet.txt +0 -0
  55. {diff_cover-9.1.0 → diff_cover-9.1.1}/tests/fixtures/git_diff_external_css.txt +0 -0
  56. {diff_cover-9.1.0 → diff_cover-9.1.1}/tests/fixtures/git_diff_lua.txt +0 -0
  57. {diff_cover-9.1.0 → diff_cover-9.1.1}/tests/fixtures/git_diff_moved.txt +0 -0
  58. {diff_cover-9.1.0 → diff_cover-9.1.1}/tests/fixtures/git_diff_mult.txt +0 -0
  59. {diff_cover-9.1.0 → diff_cover-9.1.1}/tests/fixtures/git_diff_subdir.txt +0 -0
  60. {diff_cover-9.1.0 → diff_cover-9.1.1}/tests/fixtures/git_diff_unicode.txt +0 -0
  61. {diff_cover-9.1.0 → diff_cover-9.1.1}/tests/fixtures/git_diff_violations.txt +0 -0
  62. {diff_cover-9.1.0 → diff_cover-9.1.1}/tests/fixtures/git_diff_violations_two_files.txt +0 -0
  63. {diff_cover-9.1.0 → diff_cover-9.1.1}/tests/fixtures/hello.py +0 -0
  64. {diff_cover-9.1.0 → diff_cover-9.1.1}/tests/fixtures/hi.py +0 -0
  65. {diff_cover-9.1.0 → diff_cover-9.1.1}/tests/fixtures/html_report.html +0 -0
  66. {diff_cover-9.1.0 → diff_cover-9.1.1}/tests/fixtures/html_report_empty.html +0 -0
  67. {diff_cover-9.1.0 → diff_cover-9.1.1}/tests/fixtures/html_report_one_snippet.html +0 -0
  68. {diff_cover-9.1.0 → diff_cover-9.1.1}/tests/fixtures/html_report_two_snippets.html +0 -0
  69. {diff_cover-9.1.0 → diff_cover-9.1.1}/tests/fixtures/lcov.info +0 -0
  70. {diff_cover-9.1.0 → diff_cover-9.1.1}/tests/fixtures/lua_console_report.txt +0 -0
  71. {diff_cover-9.1.0 → diff_cover-9.1.1}/tests/fixtures/luacoverage.xml +0 -0
  72. {diff_cover-9.1.0 → diff_cover-9.1.1}/tests/fixtures/markdown_report_one_snippet.md +0 -0
  73. {diff_cover-9.1.0 → diff_cover-9.1.1}/tests/fixtures/markdown_report_two_snippets.md +0 -0
  74. {diff_cover-9.1.0 → diff_cover-9.1.1}/tests/fixtures/moved_console_report.txt +0 -0
  75. {diff_cover-9.1.0 → diff_cover-9.1.1}/tests/fixtures/moved_coverage.xml +0 -0
  76. {diff_cover-9.1.0 → diff_cover-9.1.1}/tests/fixtures/moved_html_report.html +0 -0
  77. {diff_cover-9.1.0 → diff_cover-9.1.1}/tests/fixtures/mult_inputs_console_report.txt +0 -0
  78. {diff_cover-9.1.0 → diff_cover-9.1.1}/tests/fixtures/mult_inputs_html_report.html +0 -0
  79. {diff_cover-9.1.0 → diff_cover-9.1.1}/tests/fixtures/pycodestyle_report.txt +0 -0
  80. {diff_cover-9.1.0 → diff_cover-9.1.1}/tests/fixtures/pycodestyle_violations_report.html +0 -0
  81. {diff_cover-9.1.0 → diff_cover-9.1.1}/tests/fixtures/pycodestyle_violations_report.txt +0 -0
  82. {diff_cover-9.1.0 → diff_cover-9.1.1}/tests/fixtures/pycodestyle_violations_report_external_css.html +0 -0
  83. {diff_cover-9.1.0 → diff_cover-9.1.1}/tests/fixtures/pyflakes_two_files.txt +0 -0
  84. {diff_cover-9.1.0 → diff_cover-9.1.1}/tests/fixtures/pyflakes_violations_report.html +0 -0
  85. {diff_cover-9.1.0 → diff_cover-9.1.1}/tests/fixtures/pyflakes_violations_report.txt +0 -0
  86. {diff_cover-9.1.0 → diff_cover-9.1.1}/tests/fixtures/pylint_dupe.txt +0 -0
  87. {diff_cover-9.1.0 → diff_cover-9.1.1}/tests/fixtures/pylint_dupe_violations_report.txt +0 -0
  88. {diff_cover-9.1.0 → diff_cover-9.1.1}/tests/fixtures/pylint_report.txt +0 -0
  89. {diff_cover-9.1.0 → diff_cover-9.1.1}/tests/fixtures/pylint_violations_console_report.txt +0 -0
  90. {diff_cover-9.1.0 → diff_cover-9.1.1}/tests/fixtures/pylint_violations_report.html +0 -0
  91. {diff_cover-9.1.0 → diff_cover-9.1.1}/tests/fixtures/pylint_violations_report.txt +0 -0
  92. {diff_cover-9.1.0 → diff_cover-9.1.1}/tests/fixtures/pylintrc +0 -0
  93. {diff_cover-9.1.0 → diff_cover-9.1.1}/tests/fixtures/show_uncovered_lines_console.txt +0 -0
  94. {diff_cover-9.1.0 → diff_cover-9.1.1}/tests/fixtures/snippet.css +0 -0
  95. {diff_cover-9.1.0 → diff_cover-9.1.1}/tests/fixtures/snippet_8859.py +0 -0
  96. {diff_cover-9.1.0 → diff_cover-9.1.1}/tests/fixtures/snippet_arabic_output.html +0 -0
  97. {diff_cover-9.1.0 → diff_cover-9.1.1}/tests/fixtures/snippet_default.html +0 -0
  98. {diff_cover-9.1.0 → diff_cover-9.1.1}/tests/fixtures/snippet_invalid_violations.html +0 -0
  99. {diff_cover-9.1.0 → diff_cover-9.1.1}/tests/fixtures/snippet_list.html +0 -0
  100. {diff_cover-9.1.0 → diff_cover-9.1.1}/tests/fixtures/snippet_list.md +0 -0
  101. {diff_cover-9.1.0 → diff_cover-9.1.1}/tests/fixtures/snippet_list2.md +0 -0
  102. {diff_cover-9.1.0 → diff_cover-9.1.1}/tests/fixtures/snippet_list3.md +0 -0
  103. {diff_cover-9.1.0 → diff_cover-9.1.1}/tests/fixtures/snippet_no_filename_ext.html +0 -0
  104. {diff_cover-9.1.0 → diff_cover-9.1.1}/tests/fixtures/snippet_src.py +0 -0
  105. {diff_cover-9.1.0 → diff_cover-9.1.1}/tests/fixtures/snippet_src2.cpp +0 -0
  106. {diff_cover-9.1.0 → diff_cover-9.1.1}/tests/fixtures/snippet_src3.cpp +0 -0
  107. {diff_cover-9.1.0 → diff_cover-9.1.1}/tests/fixtures/snippet_unicode.html +0 -0
  108. {diff_cover-9.1.0 → diff_cover-9.1.1}/tests/fixtures/snippet_unicode.py +0 -0
  109. {diff_cover-9.1.0 → diff_cover-9.1.1}/tests/fixtures/snippet_unicode_html_output.html +0 -0
  110. {diff_cover-9.1.0 → diff_cover-9.1.1}/tests/fixtures/subdir_coverage_console_report.txt +0 -0
  111. {diff_cover-9.1.0 → diff_cover-9.1.1}/tests/fixtures/subdir_coverage_html_report.html +0 -0
  112. {diff_cover-9.1.0 → diff_cover-9.1.1}/tests/fixtures/test_src.txt +0 -0
  113. {diff_cover-9.1.0 → diff_cover-9.1.1}/tests/fixtures/unicode_console_report.txt +0 -0
  114. {diff_cover-9.1.0 → diff_cover-9.1.1}/tests/fixtures/unicode_coverage.xml +0 -0
  115. {diff_cover-9.1.0 → diff_cover-9.1.1}/tests/fixtures/unicode_html_report.html +0 -0
  116. {diff_cover-9.1.0 → diff_cover-9.1.1}/tests/fixtures/unicode_test_src.txt +0 -0
  117. {diff_cover-9.1.0 → diff_cover-9.1.1}/tests/fixtures/violations_test_file.py +0 -0
  118. {diff_cover-9.1.0 → diff_cover-9.1.1}/tests/helpers.py +0 -0
  119. {diff_cover-9.1.0 → diff_cover-9.1.1}/tests/snippet_list_unicode.html +0 -0
  120. {diff_cover-9.1.0 → diff_cover-9.1.1}/tests/test_clover_violations_reporter/test.xml +0 -0
  121. {diff_cover-9.1.0 → diff_cover-9.1.1}/tests/test_clover_violations_reporter.py +0 -0
  122. {diff_cover-9.1.0 → diff_cover-9.1.1}/tests/test_config_parser.py +0 -0
  123. {diff_cover-9.1.0 → diff_cover-9.1.1}/tests/test_diff_cover_main.py +0 -0
  124. {diff_cover-9.1.0 → diff_cover-9.1.1}/tests/test_diff_cover_tool.py +0 -0
  125. {diff_cover-9.1.0 → diff_cover-9.1.1}/tests/test_diff_quality_main.py +0 -0
  126. {diff_cover-9.1.0 → diff_cover-9.1.1}/tests/test_git_diff.py +0 -0
  127. {diff_cover-9.1.0 → diff_cover-9.1.1}/tests/test_git_diff_file.py +0 -0
  128. {diff_cover-9.1.0 → diff_cover-9.1.1}/tests/test_git_path.py +0 -0
  129. {diff_cover-9.1.0 → diff_cover-9.1.1}/tests/test_integration.py +0 -0
  130. {diff_cover-9.1.0 → diff_cover-9.1.1}/tests/test_java_violations_reporter.py +0 -0
  131. {diff_cover-9.1.0 → diff_cover-9.1.1}/tests/test_report_generator.py +0 -0
  132. {diff_cover-9.1.0 → diff_cover-9.1.1}/tests/test_snippets.py +0 -0
  133. {diff_cover-9.1.0 → diff_cover-9.1.1}/tests/test_util.py +0 -0
  134. {diff_cover-9.1.0 → diff_cover-9.1.1}/tests/test_violations_reporter.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: diff_cover
3
- Version: 9.1.0
3
+ Version: 9.1.1
4
4
  Summary: Run coverage and linting reports on diffs
5
5
  Home-page: https://github.com/Bachmann1234/diff-cover
6
6
  License: Apache-2.0
@@ -165,18 +165,31 @@ class GitDiffReporter(BaseDiffReporter):
165
165
 
166
166
  # Get the diff dictionary
167
167
  diff_dict = self._git_diff()
168
-
169
168
  # include untracked files
170
169
  if self._include_untracked:
171
170
  for path in self._git_diff_tool.untracked():
172
- with open(path) as file_handle:
173
- num_lines = len(file_handle.readlines())
171
+ if not self._validate_path_to_diff(path):
172
+ continue
173
+
174
+ num_lines = self._get_file_lines(path)
174
175
  diff_dict[path] = list(range(1, num_lines + 1))
175
176
 
176
177
  # Return the changed file paths (dict keys)
177
178
  # in alphabetical order
178
179
  return sorted(diff_dict.keys(), key=lambda x: x.lower())
179
180
 
181
+ @staticmethod
182
+ def _get_file_lines(path):
183
+ """
184
+ Return the number of lines in a file.
185
+ """
186
+
187
+ try:
188
+ with open(path, encoding="utf-8") as file_handle:
189
+ return len(file_handle.readlines())
190
+ except UnicodeDecodeError:
191
+ return 0
192
+
180
193
  def lines_changed(self, src_path):
181
194
  """
182
195
  See base class docstring.
@@ -224,23 +237,16 @@ class GitDiffReporter(BaseDiffReporter):
224
237
  diff_dict = self._parse_diff_str(diff_str)
225
238
 
226
239
  for src_path, (added_lines, deleted_lines) in diff_dict.items():
227
- if self._is_path_excluded(src_path):
240
+ if not self._validate_path_to_diff(src_path):
228
241
  continue
229
- # If no _supported_extensions provided, or extension present: process
230
- _, extension = os.path.splitext(src_path)
231
- extension = extension[1:].lower()
232
- # 'not self._supported_extensions' tests for both None and empty list []
233
- if (
234
- not self._supported_extensions
235
- or extension in self._supported_extensions
236
- ):
237
- # Remove any lines from the dict that have been deleted
238
- # Include any lines that have been added
239
- result_dict[src_path] = [
240
- line
241
- for line in result_dict.get(src_path, [])
242
- if line not in deleted_lines
243
- ] + added_lines
242
+
243
+ # Remove any lines from the dict that have been deleted
244
+ # Include any lines that have been added
245
+ result_dict[src_path] = [
246
+ line
247
+ for line in result_dict.get(src_path, [])
248
+ if line not in deleted_lines
249
+ ] + added_lines
244
250
 
245
251
  # Eliminate repeats and order line numbers
246
252
  for src_path, lines in result_dict.items():
@@ -252,6 +258,29 @@ class GitDiffReporter(BaseDiffReporter):
252
258
  # Return the diff cache
253
259
  return self._diff_dict
254
260
 
261
+ def _validate_path_to_diff(self, src_path: str) -> bool:
262
+ """
263
+ Validate if a path should be included in the diff.
264
+
265
+ Returns True if the path should be included, otherwise False.
266
+
267
+ A path should be excluded if:
268
+ - If the path is excluded
269
+ - If the path has an extension that is not supported
270
+ """
271
+
272
+ if self._is_path_excluded(src_path):
273
+ return False
274
+
275
+ # If no _supported_extensions provided, or extension present: process
276
+ _, extension = os.path.splitext(src_path)
277
+ extension = extension[1:].lower()
278
+
279
+ if self._supported_extensions and extension not in self._supported_extensions:
280
+ return False
281
+
282
+ return True
283
+
255
284
  # Regular expressions used to parse the diff output
256
285
  SRC_FILE_RE = re.compile(r'^diff --git "?a/.*"? "?b/([^\n"]*)"?')
257
286
  MERGE_CONFLICT_RE = re.compile(r"^diff --cc ([^\n]*)")
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "diff_cover"
3
- version = "9.1.0"
3
+ version = "9.1.1"
4
4
  description = "Run coverage and linting reports on diffs"
5
5
  authors = ["See Contributors"]
6
6
  homepage = "https://github.com/Bachmann1234/diff-cover"
@@ -55,7 +55,7 @@ pytest-mock = "^3.14.0"
55
55
  pycodestyle = ">=2.9.1"
56
56
  flake8 = "^5.0.4"
57
57
  pyflakes = "^2.5.0"
58
- pylint = "^3.2.2"
58
+ pylint = "^3.2.5"
59
59
  pylint-pytest = "^1.1.8"
60
60
  pydocstyle = "^6.1.1"
61
61
  black = "^24.4.2"
@@ -618,16 +618,63 @@ def test_include_untracked(mocker, git_diff):
618
618
  {"subdir/file1.py": line_numbers(3, 10) + line_numbers(34, 47)}
619
619
  )
620
620
  _set_git_diff_output(
621
- reporter, git_diff, staged_diff=diff_output, untracked=["u1.py", " u2.py"]
621
+ reporter,
622
+ git_diff,
623
+ staged_diff=diff_output,
624
+ untracked=["u1.py", " u2.py", "binary1.bin"],
622
625
  )
623
626
 
624
- open_mock = mocker.mock_open(read_data="1\n2\n3\n")
625
- mocker.patch("diff_cover.diff_reporter.open", open_mock)
627
+ base_open_mock = mocker.mock_open(read_data="1\n2\n3\n")
628
+ raise_count = 0
629
+
630
+ def open_side_effect(*args, **kwargs):
631
+ if args[0] == "binary1.bin":
632
+ nonlocal raise_count
633
+ raise_count += 1
634
+
635
+ raise UnicodeDecodeError("utf-8", b"", 0, 1, "invalid start byte")
636
+ return base_open_mock(*args, **kwargs)
637
+
638
+ mocker.patch("diff_cover.diff_reporter.open", open_side_effect)
626
639
  changed = reporter.src_paths_changed()
627
640
 
628
- assert sorted(changed) == [" u2.py", "subdir/file1.py", "u1.py"]
641
+ assert sorted(changed) == [" u2.py", "binary1.bin", "subdir/file1.py", "u1.py"]
629
642
  assert reporter.lines_changed("u1.py") == [1, 2, 3]
630
643
  assert reporter.lines_changed(" u2.py") == [1, 2, 3]
644
+ assert reporter.lines_changed("binary1.bin") == []
645
+
646
+ assert raise_count == 1
647
+
648
+
649
+ @pytest.mark.parametrize(
650
+ "excluded, supported_extensions, path",
651
+ [
652
+ (["file.bin"], ["py"], "file.bin"),
653
+ ([], ["py"], "file.bin"),
654
+ ],
655
+ )
656
+ def test_include_untracked__not_valid_path__not_include_it(
657
+ git_diff, excluded, supported_extensions, path
658
+ ):
659
+ reporter = GitDiffReporter(
660
+ git_diff=git_diff,
661
+ include_untracked=True,
662
+ supported_extensions=supported_extensions,
663
+ exclude=excluded,
664
+ )
665
+ diff_output = git_diff_output(
666
+ {"subdir/file1.py": line_numbers(3, 10) + line_numbers(34, 47)}
667
+ )
668
+ _set_git_diff_output(
669
+ reporter,
670
+ git_diff,
671
+ staged_diff=diff_output,
672
+ untracked=[path],
673
+ )
674
+
675
+ changed = reporter.src_paths_changed()
676
+
677
+ assert sorted(changed) == ["subdir/file1.py"]
631
678
 
632
679
 
633
680
  def _set_git_diff_output(
File without changes
File without changes
File without changes
File without changes