diff options
author | Andreas Gruenbacher <agruen@gnu.org> | 2015-02-22 18:42:58 +0100 |
---|---|---|
committer | Andreas Gruenbacher <agruen@gnu.org> | 2015-02-22 18:50:16 +0100 |
commit | db9f39507e3bb739b696c523274cb34adc5e4895 (patch) | |
tree | ec35feb0099bb85e963b7585b2aeb4deca938439 | |
parent | 8d12036047eb6cba16d3ae3f6b43c789d8378462 (diff) | |
download | patch-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.c | 12 | ||||
-rw-r--r-- | tests/copy-rename | 24 |
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 |