]> git.proxmox.com Git - libgit2.git/commitdiff
patch: differentiate not found and invalid patches
authorEdward Thomson <ethomson@github.com>
Sun, 24 Apr 2016 20:14:25 +0000 (16:14 -0400)
committerEdward Thomson <ethomson@github.com>
Thu, 26 May 2016 18:01:08 +0000 (13:01 -0500)
src/patch_parse.c
tests/patch/parse.c

index 70acdbc22ecb30900850ea218150a05e3b9381a0..991802cb42c17bebce8f9ae7924ad70adaa38b67 100644 (file)
@@ -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;
index 92434827a5764473079c399321f702bad3c371d9..8350ac2ddfb87481cace6bd968348baf101b5cd1 100644 (file)
@@ -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));
+}
+