Skip to content

Commit bc8a9e9

Browse files
authored
Merge pull request #95 from asottile-sentry/filenames-with-spaces
fix filenames with spaces
2 parents 5294ed1 + 6bfa25c commit bc8a9e9

4 files changed

Lines changed: 24 additions & 2 deletions

File tree

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
diff --git a/has spaces/t.sql b/has spaces/t.sql
2+
new file mode 100644
3+
index 0000000..8a9b485
4+
--- /dev/null
5+
+++ b/has spaces/t.sql
6+
@@ -0,0 +1 @@
7+
+select * FROM t;

tests/test_parser.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -313,6 +313,18 @@ def test_parse_diff_git_no_prefix(self):
313313
self.assertTrue(res[2].is_added_file)
314314
self.assertEqual(res[2].path, 'file3')
315315

316+
def test_parse_filename_with_spaces(self):
317+
filename = os.path.join(self.samples_dir, 'samples/git_filenames_with_spaces.diff')
318+
with open(filename) as f:
319+
res = PatchSet(f)
320+
321+
self.assertEqual(len(res), 1)
322+
323+
self.assertEqual(res[0].source_file, '/dev/null')
324+
self.assertEqual(res[0].target_file, 'b/has spaces/t.sql')
325+
self.assertTrue(res[0].is_added_file)
326+
self.assertEqual(res[0].path, 'has spaces/t.sql')
327+
316328
def test_diff_lines_linenos(self):
317329
with open(self.sample_file, 'rb') as diff_file:
318330
res = PatchSet(diff_file, encoding='utf-8')

unidiff/constants.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,9 @@
3737

3838
# check diff git line for git renamed files support
3939
RE_DIFF_GIT_HEADER = re.compile(
40-
r'^diff --git (?P<source>(a/)?[^\t\n]+) (?P<target>(b/)?[^\t\n]+)')
40+
r'^diff --git (?P<source>a/[^\t\n]+) (?P<target>b/[^\t\n]+)')
41+
RE_DIFF_GIT_HEADER_NO_PREFIX = re.compile(
42+
r'^diff --git (?P<source>[^\t\n]+) (?P<target>[^\t\n]+)')
4143

4244
# check diff git new file marker `deleted file mode 100644`
4345
RE_DIFF_GIT_DELETED_FILE = re.compile(r'^deleted file mode \d+\n$')

unidiff/patch.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
LINE_VALUE_NO_NEWLINE,
4141
RE_DIFF_GIT_DELETED_FILE,
4242
RE_DIFF_GIT_HEADER,
43+
RE_DIFF_GIT_HEADER_NO_PREFIX,
4344
RE_DIFF_GIT_NEW_FILE,
4445
RE_HUNK_BODY_LINE,
4546
RE_HUNK_EMPTY_BODY_LINE,
@@ -478,7 +479,7 @@ def _parse(self, diff, encoding, metadata_only):
478479
line = line.decode(encoding)
479480

480481
# check for a git file rename
481-
is_diff_git_header = RE_DIFF_GIT_HEADER.match(line)
482+
is_diff_git_header = RE_DIFF_GIT_HEADER.match(line) or RE_DIFF_GIT_HEADER_NO_PREFIX.match(line)
482483
if is_diff_git_header:
483484
patch_info = PatchInfo()
484485
source_file = is_diff_git_header.group('source')

0 commit comments

Comments
 (0)