summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Gruenbacher <agruen@gnu.org>2015-02-22 18:42:58 +0100
committerAndreas Gruenbacher <agruen@gnu.org>2015-02-22 18:50:16 +0100
commitdb9f39507e3bb739b696c523274cb34adc5e4895 (patch)
treeec35feb0099bb85e963b7585b2aeb4deca938439
parent8d12036047eb6cba16d3ae3f6b43c789d8378462 (diff)
downloadpatch-db9f39507e3bb739b696c523274cb34adc5e4895.tar.gz
Fix handling of renamed files
When a file has already been renamed, make sure it is not renamed back to its old name. Reported by Guido Draheim. * src/patch.c (main): Make sure we never rename a file back to its previous name. Report when a file was renamed already. * tests/copy-rename: Add "already renamed" test cases.
-rw-r--r--src/patch.c12
-rw-r--r--tests/copy-rename24
2 files changed, 31 insertions, 5 deletions
diff --git a/src/patch.c b/src/patch.c
index 2c51f44..6b41f79 100644
--- a/src/patch.c
+++ b/src/patch.c
@@ -244,7 +244,7 @@ main (int argc, char **argv)
if (outfile)
outname = outfile;
else if (pch_copy () || pch_rename ())
- outname = pch_name (! strcmp (inname, pch_name (OLD)));
+ outname = pch_name (! reverse);
else
outname = inname;
}
@@ -351,16 +351,18 @@ main (int argc, char **argv)
if (verbosity != SILENT)
{
bool renamed = strcmp (inname, outname);
+ bool skip_rename = ! renamed && pch_rename ();
say ("%s %s %s%c",
dry_run ? "checking" : "patching",
S_ISLNK (file_type) ? "symbolic link" : "file",
- quotearg (outname), renamed ? ' ' : '\n');
- if (renamed)
- say ("(%s from %s)\n",
+ quotearg (outname), renamed || skip_rename ? ' ' : '\n');
+ if (renamed || skip_rename)
+ say ("(%s%s from %s)\n",
+ skip_rename ? "already " : "",
pch_copy () ? "copied" :
(pch_rename () ? "renamed" : "read"),
- inname);
+ ! skip_rename ? inname : pch_name (! strcmp (inname, pch_name (OLD))));
if (verbosity == VERBOSE)
say ("Using Plan %s...\n", using_plan_a ? "A" : "B");
}
diff --git a/tests/copy-rename b/tests/copy-rename
index fd5fd64..ef9bc8e 100644
--- a/tests/copy-rename
+++ b/tests/copy-rename
@@ -63,6 +63,30 @@ check 'cat h' <<EOF
new
EOF
+echo old > h
+
+check 'patch -p1 < rename.diff || echo "Status: $?"' <<EOF
+patching file h (already renamed from f)
+EOF
+
+ncheck 'test ! -e f'
+
+check 'cat h' <<EOF
+new
+EOF
+
+mv h f
+
+check 'patch -p1 -R < rename.diff || echo "Status: $?"' <<EOF
+patching file f (already renamed from h)
+EOF
+
+ncheck 'test ! -e h'
+
+check 'cat f' <<EOF
+old
+EOF
+
# --------------------------------------------------------------
# Patches with no hunks