summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Gruenbacher <agruen@linbit.com>2012-09-13 16:13:08 +0200
committerAndreas Gruenbacher <agruen@linbit.com>2012-09-13 16:32:53 +0200
commit281537bcd92515ae3b9f154acd579ce97260f99b (patch)
treea1ddc6f6a3eb47176a08d79800db397620ef799f
parentdc3cdeebca6639aac25a7d87dea816a03ed345da (diff)
downloadpatch-281537bcd92515ae3b9f154acd579ce97260f99b.tar.gz
In a git-style diff, make sure not to unlink the original by accident
* src/patch.c (main): Fail if a file is not empty as expected. (output_files): In a git-style diff, make sure not to unlink the original when making a backup of an unmodified file. * tests/create-delete: Fix failed-file-deletion test and add successful-file-deletion test.
-rw-r--r--src/patch.c3
-rw-r--r--tests/create-delete27
2 files changed, 28 insertions, 2 deletions
diff --git a/src/patch.c b/src/patch.c
index 1c6fb4b..ce81bbe 100644
--- a/src/patch.c
+++ b/src/patch.c
@@ -508,6 +508,7 @@ main (int argc, char **argv)
&& ! (merge && somefailed))
{
mismatch = true;
+ somefailed = true;
if (verbosity != SILENT)
say ("File %s is not empty after patch, as expected\n",
quotearg (outname));
@@ -1865,7 +1866,7 @@ output_files (struct stat const *st)
output_file_now (file_to_output->from, &from_needs_removal,
from_st, file_to_output->to,
file_to_output->mode, file_to_output->backup);
- if (from_needs_removal)
+ if (file_to_output->to && from_needs_removal)
unlink (file_to_output->from);
if (st && st->st_dev == from_st->st_dev && st->st_ino == from_st->st_ino)
diff --git a/tests/create-delete b/tests/create-delete
index 9a6e1bb..7eed11f 100644
--- a/tests/create-delete
+++ b/tests/create-delete
@@ -176,12 +176,37 @@ EOF
echo data > target
cat > p.diff <<EOF
diff --git a/target b/target
-index 1..0
+deleted file mode 100644
+index 1269488..0000000
EOF
check 'patch -p1 -b < p.diff || echo status: $?' <<EOF
patching file target
File target is not empty after patch, as expected
+status: 1
+EOF
+
+check 'cat target' <<EOF
+data
+EOF
+
+# Patch creates a backup file even when the original file remains unchanged:
+check 'cat target.orig' <<EOF
+data
+EOF
+
+cat > p.diff <<EOF
+diff --git a/target b/target
+deleted file mode 100644
+index 1269488..0000000
+--- a/target
++++ /dev/null
+@@ -1 +0,0 @@
+-data
+EOF
+
+check 'patch -p1 -b -f < p.diff || echo status: $?' <<EOF
+patching file target
EOF
ncheck 'test ! -e target'