summaryrefslogtreecommitdiffstats
path: root/source/a/patch/patch.281537bcd92515ae3b9f154acd579ce97260f99b.diff
blob: b882b725cbf7c494e65fd416eb33cc01b034aed9 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
From 281537bcd92515ae3b9f154acd579ce97260f99b Mon Sep 17 00:00:00 2001
From: Andreas Gruenbacher <agruen@linbit.com>
Date: Thu, 13 Sep 2012 14:13:08 +0000
Subject: 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.
---
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'
--
cgit v0.9.0.2