summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEdward Thomson <ethomson@edwardthomson.com>2019-04-04 14:04:59 -0700
committerGitHub <noreply@github.com>2019-04-04 14:04:59 -0700
commit6bcb7357eccdab4de948af55836ce25f76dd7270 (patch)
treef59a2f5076ebcfef5fa0a559f0ac474dcf43d5f5
parent18e836cbf3f01d1aaa839315efb2c0cf0e6b2204 (diff)
parent9d65360b4eaa402c8f137684577d0131a861ce8b (diff)
downloadlibgit2-6bcb7357eccdab4de948af55836ce25f76dd7270.tar.gz
Merge pull request #5035 from pks-t/pks/diff-with-space-in-filenames
patch_parse: fix parsing addition/deletion of file with space
-rw-r--r--src/patch_parse.c30
-rw-r--r--tests/diff/parse.c18
-rw-r--r--tests/patch/patch_common.h9
3 files changed, 39 insertions, 18 deletions
diff --git a/src/patch_parse.c b/src/patch_parse.c
index 647929fd5..545f1ca9e 100644
--- a/src/patch_parse.c
+++ b/src/patch_parse.c
@@ -921,21 +921,15 @@ static int check_filenames(git_patch_parsed *patch)
return git_parse_err("missing old path");
/* Ensure (non-renamed) paths match */
- if (check_header_names(
- patch->header_old_path, patch->old_path, "old", added) < 0 ||
- check_header_names(
- patch->header_new_path, patch->new_path, "new", deleted) < 0)
+ if (check_header_names(patch->header_old_path, patch->old_path, "old", added) < 0 ||
+ check_header_names(patch->header_new_path, patch->new_path, "new", deleted) < 0)
return -1;
- prefixed_old = (!added && patch->old_path) ? patch->old_path :
- patch->header_old_path;
- prefixed_new = (!deleted && patch->new_path) ? patch->new_path :
- patch->header_new_path;
+ prefixed_old = (!added && patch->old_path) ? patch->old_path : patch->header_old_path;
+ prefixed_new = (!deleted && patch->new_path) ? patch->new_path : patch->header_new_path;
- if (check_prefix(
- &patch->old_prefix, &old_prefixlen, patch, prefixed_old) < 0 ||
- check_prefix(
- &patch->new_prefix, &new_prefixlen, patch, prefixed_new) < 0)
+ if ((prefixed_old && check_prefix(&patch->old_prefix, &old_prefixlen, patch, prefixed_old) < 0) ||
+ (prefixed_new && check_prefix(&patch->new_prefix, &new_prefixlen, patch, prefixed_new) < 0))
return -1;
/* Prefer the rename filenames as they are unambiguous and unprefixed */
@@ -950,7 +944,7 @@ static int check_filenames(git_patch_parsed *patch)
patch->base.delta->new_file.path = prefixed_new + new_prefixlen;
if (!patch->base.delta->old_file.path &&
- !patch->base.delta->new_file.path)
+ !patch->base.delta->new_file.path)
return git_parse_err("git diff header lacks old / new paths");
return 0;
@@ -964,14 +958,14 @@ static int check_patch(git_patch_parsed *patch)
return -1;
if (delta->old_file.path &&
- delta->status != GIT_DELTA_DELETED &&
- !delta->new_file.mode)
+ delta->status != GIT_DELTA_DELETED &&
+ !delta->new_file.mode)
delta->new_file.mode = delta->old_file.mode;
if (delta->status == GIT_DELTA_MODIFIED &&
- !(delta->flags & GIT_DIFF_FLAG_BINARY) &&
- delta->new_file.mode == delta->old_file.mode &&
- git_array_size(patch->base.hunks) == 0)
+ !(delta->flags & GIT_DIFF_FLAG_BINARY) &&
+ delta->new_file.mode == delta->old_file.mode &&
+ git_array_size(patch->base.hunks) == 0)
return git_parse_err("patch with no hunks");
if (delta->status == GIT_DELTA_ADDED) {
diff --git a/tests/diff/parse.c b/tests/diff/parse.c
index 9cdaa92fb..7cc468245 100644
--- a/tests/diff/parse.c
+++ b/tests/diff/parse.c
@@ -359,3 +359,21 @@ void test_diff_parse__lineinfo(void)
git_patch_free(patch);
git_diff_free(diff);
}
+
+void test_diff_parse__new_file_with_space(void)
+{
+ const char *content = PATCH_ORIGINAL_NEW_FILE_WITH_SPACE;
+ git_patch *patch;
+ git_diff *diff;
+
+ cl_git_pass(git_diff_from_buffer(&diff, content, strlen(content)));
+ cl_git_pass(git_patch_from_diff((git_patch **) &patch, diff, 0));
+
+ cl_assert_equal_p(patch->diff_opts.old_prefix, NULL);
+ cl_assert_equal_p(patch->delta->old_file.path, NULL);
+ cl_assert_equal_s(patch->diff_opts.new_prefix, "b/");
+ cl_assert_equal_s(patch->delta->new_file.path, "sp ace.txt");
+
+ git_patch_free(patch);
+ git_diff_free(diff);
+}
diff --git a/tests/patch/patch_common.h b/tests/patch/patch_common.h
index 3f2668ddc..75aab4453 100644
--- a/tests/patch/patch_common.h
+++ b/tests/patch/patch_common.h
@@ -841,3 +841,12 @@
"diff --git a/binary.bin b/binary.bin\n" \
"index 27184d9..7c94f9e 100644\n" \
"Binary files a/binary.bin and b/binary.bin differ\n"
+
+#define PATCH_ORIGINAL_NEW_FILE_WITH_SPACE \
+ "diff --git a/sp ace.txt b/sp ace.txt\n" \
+ "new file mode 100644\n" \
+ "index 000000000..789819226\n" \
+ "--- /dev/null\n" \
+ "+++ b/sp ace.txt\n" \
+ "@@ -0,0 +1 @@\n" \
+ "+a\n"