summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Gruenbacher <agruen@linbit.com>2012-09-18 12:51:17 +0200
committerAndreas Gruenbacher <agruen@linbit.com>2012-09-18 12:53:38 +0200
commit99f2638763845d8173a0c9f9209ac2b4be947165 (patch)
treed960c30091e71dede92b64296d1e7c0f87186c60
parent0f22a35cecdaf83b8fca3cdfb5c45feb6f5e292c (diff)
downloadpatch-99f2638763845d8173a0c9f9209ac2b4be947165.tar.gz
Fix file truncation when switching from git diff to non-git diff
* src/patch.c (main): Output queued output files only when switching from a git diff to a non-git diff. This can modify the input file, so make sure to stat() it again. * tests/concat-git-diff: Add test case growing a file with a git diff and then with a non-git diff; without this fix; the result would be truncated.
-rw-r--r--src/patch.c6
-rw-r--r--tests/concat-git-diff41
2 files changed, 41 insertions, 6 deletions
diff --git a/src/patch.c b/src/patch.c
index 0bce8fb..0b0fdd4 100644
--- a/src/patch.c
+++ b/src/patch.c
@@ -196,8 +196,12 @@ main (int argc, char **argv)
if (have_git_diff != pch_git_diff ())
{
+ if (have_git_diff)
+ {
+ output_files (NULL);
+ inerrno = -1;
+ }
have_git_diff = ! have_git_diff;
- output_files (NULL);
}
if (TMPREJNAME_needs_removal)
diff --git a/tests/concat-git-diff b/tests/concat-git-diff
index 927eb5a..c78da53 100644
--- a/tests/concat-git-diff
+++ b/tests/concat-git-diff
@@ -56,11 +56,7 @@ check 'cat f' <<EOF
three
EOF
-cat > f <<EOF
-1
-2
-3
-EOF
+seq 3 > f
cat > concat2.diff <<EOF
diff --git a/f b/f
@@ -95,3 +91,38 @@ a
3
b
EOF
+
+seq 3 > f
+
+cat > concat3.diff <<EOF
+diff --git a/f b/f
+index 01e79c3..0d0b976 100644
+--- a/f
++++ b/f
+@@ -1,3 +1,4 @@
+ 1
+ 2
+ 3
++b
+diff a/f b/f
+--- a/f
++++ b/f
+@@ -1,3 +1,4 @@
++a
+ 1
+ 2
+ 3
+EOF
+
+check 'patch -p1 < concat3.diff || echo "Status: $?"' <<EOF
+patching file f
+patching file f
+EOF
+
+check 'cat f' <<EOF
+a
+1
+2
+3
+b
+EOF