diff options
author | Edward Thomson <ethomson@github.com> | 2016-04-24 16:14:25 -0400 |
---|---|---|
committer | Edward Thomson <ethomson@github.com> | 2016-05-26 13:01:08 -0500 |
commit | 94e488a056942f1bb1ebbe7c9f0c693937726609 (patch) | |
tree | 3643c91f491d8f06c38a8289f791225956da69c5 | |
parent | 17572f67ed9a3eb57b981d97468bd216d571bf10 (diff) | |
download | libgit2-94e488a056942f1bb1ebbe7c9f0c693937726609.tar.gz |
patch: differentiate not found and invalid patches
-rw-r--r-- | src/patch_parse.c | 3 | ||||
-rw-r--r-- | tests/patch/parse.c | 81 |
2 files changed, 77 insertions, 7 deletions
diff --git a/src/patch_parse.c b/src/patch_parse.c index 70acdbc22..991802cb4 100644 --- a/src/patch_parse.c +++ b/src/patch_parse.c @@ -671,7 +671,8 @@ static int parse_patch_header( continue; } - error = parse_err("no header in patch file"); + giterr_set(GITERR_PATCH, "no patch found"); + error = GIT_ENOTFOUND; done: return error; diff --git a/tests/patch/parse.c b/tests/patch/parse.c index 92434827a..8350ac2dd 100644 --- a/tests/patch/parse.c +++ b/tests/patch/parse.c @@ -4,16 +4,11 @@ #include "patch_common.h" -void test_patch_parse__original_to_change_middle(void) +static void ensure_patch_validity(git_patch *patch) { - git_patch *patch; const git_diff_delta *delta; char idstr[GIT_OID_HEXSZ+1] = {0}; - cl_git_pass(git_patch_from_buffer( - &patch, PATCH_ORIGINAL_TO_CHANGE_MIDDLE, - strlen(PATCH_ORIGINAL_TO_CHANGE_MIDDLE), NULL)); - cl_assert((delta = git_patch_get_delta(patch)) != NULL); cl_assert_equal_i(2, delta->nfiles); @@ -30,6 +25,80 @@ void test_patch_parse__original_to_change_middle(void) git_oid_nfmt(idstr, delta->new_file.id_abbrev, &delta->new_file.id); cl_assert_equal_s(idstr, "cd8fd12"); cl_assert_equal_i(0, delta->new_file.size); +} + +void test_patch_parse__original_to_change_middle(void) +{ + git_patch *patch; + cl_git_pass(git_patch_from_buffer( + &patch, PATCH_ORIGINAL_TO_CHANGE_MIDDLE, + strlen(PATCH_ORIGINAL_TO_CHANGE_MIDDLE), NULL)); + ensure_patch_validity(patch); git_patch_free(patch); } + +void test_patch_parse__leading_and_trailing_garbage(void) +{ + git_patch *patch; + const char *leading = "This is some leading garbage.\n" + "Maybe it's email headers?\n" + "\n" + PATCH_ORIGINAL_TO_CHANGE_MIDDLE; + const char *trailing = PATCH_ORIGINAL_TO_CHANGE_MIDDLE + "\n" + "This is some trailing garbage.\n" + "Maybe it's an email signature?\n"; + const char *both = "Here's some leading garbage\n" + PATCH_ORIGINAL_TO_CHANGE_MIDDLE + "And here's some trailing.\n"; + + cl_git_pass(git_patch_from_buffer(&patch, leading, strlen(leading), + NULL)); + ensure_patch_validity(patch); + git_patch_free(patch); + + cl_git_pass(git_patch_from_buffer(&patch, trailing, strlen(trailing), + NULL)); + ensure_patch_validity(patch); + git_patch_free(patch); + + cl_git_pass(git_patch_from_buffer(&patch, both, strlen(both), + NULL)); + ensure_patch_validity(patch); + git_patch_free(patch); +} + +void test_patch_parse__nonpatches_fail_with_notfound(void) +{ + git_patch *patch; + + cl_git_fail_with(GIT_ENOTFOUND, + git_patch_from_buffer(&patch, PATCH_NOT_A_PATCH, + strlen(PATCH_NOT_A_PATCH), NULL)); +} + +void test_patch_parse__invalid_patches_fails(void) +{ + git_patch *patch; + + cl_git_fail_with(GIT_ERROR, + git_patch_from_buffer(&patch, PATCH_CORRUPT_GIT_HEADER, + strlen(PATCH_CORRUPT_GIT_HEADER), NULL)); + cl_git_fail_with(GIT_ERROR, + git_patch_from_buffer(&patch, + PATCH_CORRUPT_MISSING_NEW_FILE, + strlen(PATCH_CORRUPT_MISSING_NEW_FILE), NULL)); + cl_git_fail_with(GIT_ERROR, + git_patch_from_buffer(&patch, + PATCH_CORRUPT_MISSING_OLD_FILE, + strlen(PATCH_CORRUPT_MISSING_OLD_FILE), NULL)); + cl_git_fail_with(GIT_ERROR, + git_patch_from_buffer(&patch, PATCH_CORRUPT_NO_CHANGES, + strlen(PATCH_CORRUPT_NO_CHANGES), NULL)); + cl_git_fail_with(GIT_ERROR, + git_patch_from_buffer(&patch, + PATCH_CORRUPT_MISSING_HUNK_HEADER, + strlen(PATCH_CORRUPT_MISSING_HUNK_HEADER), NULL)); +} + |