Commit 94e488a056942f1bb1ebbe7c9f0c693937726609

Edward Thomson 2016-04-24T16:14:25

patch: differentiate not found and invalid patches

diff --git a/src/patch_parse.c b/src/patch_parse.c
index 70acdbc..991802c 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 9243482..8350ac2 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));
+}
+