mirror of
https://github.com/git-for-windows/git.git
synced 2026-05-01 12:09:39 -05:00
apply: report the location of corrupt patches
When parsing a corrupt patch, git apply reports only the line number. That does not tell the user which input the line number refers to. Include the patch input path in the error message so the reported location is easier to use. Reset the line number for each patch input so the reported location stays correct when multiple input files are provided. Add tests for file input, standard input, multiple patch inputs, and existing binary-diff corrupt patch cases. Signed-off-by: Jialong Wang <jerrywang183@yahoo.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
committed by
Junio C Hamano
parent
dc6ecd5354
commit
c5e15c9a58
4
apply.c
4
apply.c
@@ -1875,7 +1875,8 @@ static int parse_single_patch(struct apply_state *state,
|
||||
len = parse_fragment(state, line, size, patch, fragment);
|
||||
if (len <= 0) {
|
||||
free(fragment);
|
||||
return error(_("corrupt patch at line %d"), state->linenr);
|
||||
return error(_("corrupt patch at %s:%d"),
|
||||
state->patch_input_file, state->linenr);
|
||||
}
|
||||
fragment->patch = line;
|
||||
fragment->size = len;
|
||||
@@ -4825,6 +4826,7 @@ static int apply_patch(struct apply_state *state,
|
||||
int flush_attributes = 0;
|
||||
|
||||
state->patch_input_file = filename;
|
||||
state->linenr = 1;
|
||||
if (read_patch_file(&buf, fd) < 0)
|
||||
return -128;
|
||||
offset = 0;
|
||||
|
||||
@@ -68,7 +68,7 @@ test_expect_success 'apply detecting corrupt patch correctly' '
|
||||
sed -e "s/-CIT/xCIT/" <output >broken &&
|
||||
test_must_fail git apply --stat --summary broken 2>detected &&
|
||||
detected=$(cat detected) &&
|
||||
detected=$(expr "$detected" : "error.*at line \\([0-9]*\\)\$") &&
|
||||
detected=$(expr "$detected" : "error.*broken:\\([0-9]*\\)\$") &&
|
||||
detected=$(sed -ne "${detected}p" broken) &&
|
||||
test "$detected" = xCIT
|
||||
'
|
||||
@@ -77,7 +77,7 @@ test_expect_success 'apply detecting corrupt patch correctly' '
|
||||
git diff --binary | sed -e "s/-CIT/xCIT/" >broken &&
|
||||
test_must_fail git apply --stat --summary broken 2>detected &&
|
||||
detected=$(cat detected) &&
|
||||
detected=$(expr "$detected" : "error.*at line \\([0-9]*\\)\$") &&
|
||||
detected=$(expr "$detected" : "error.*broken:\\([0-9]*\\)\$") &&
|
||||
detected=$(sed -ne "${detected}p" broken) &&
|
||||
test "$detected" = xCIT
|
||||
'
|
||||
|
||||
@@ -48,7 +48,43 @@ test_expect_success 'applying a hunk header which overflows fails' '
|
||||
+b
|
||||
EOF
|
||||
test_must_fail git apply patch 2>err &&
|
||||
echo "error: corrupt patch at line 4" >expect &&
|
||||
echo "error: corrupt patch at patch:4" >expect &&
|
||||
test_cmp expect err
|
||||
'
|
||||
|
||||
test_expect_success 'applying a hunk header which overflows from stdin fails' '
|
||||
cat >patch <<-\EOF &&
|
||||
diff -u a/file b/file
|
||||
--- a/file
|
||||
+++ b/file
|
||||
@@ -98765432109876543210 +98765432109876543210 @@
|
||||
-a
|
||||
+b
|
||||
EOF
|
||||
test_must_fail git apply <patch 2>err &&
|
||||
echo "error: corrupt patch at <stdin>:4" >expect &&
|
||||
test_cmp expect err
|
||||
'
|
||||
|
||||
test_expect_success 'applying multiple patches reports the corrupted input' '
|
||||
cat >good.patch <<-\EOF &&
|
||||
diff -u a/file b/file
|
||||
--- a/file
|
||||
+++ b/file
|
||||
@@ -1 +1 @@
|
||||
-a
|
||||
+b
|
||||
EOF
|
||||
cat >bad.patch <<-\EOF &&
|
||||
diff -u a/file b/file
|
||||
--- a/file
|
||||
+++ b/file
|
||||
@@ -98765432109876543210 +98765432109876543210 @@
|
||||
-a
|
||||
+b
|
||||
EOF
|
||||
test_must_fail git apply --stat --summary good.patch bad.patch 2>err &&
|
||||
echo "error: corrupt patch at bad.patch:4" >expect &&
|
||||
test_cmp expect err
|
||||
'
|
||||
test_done
|
||||
|
||||
Reference in New Issue
Block a user