patch: make -p count path components, not slashes (think /blah//thing)

Signed-off-by: Rob Landley <rob@landley.net>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Rob Landley 2011-10-10 19:59:38 +02:00 committed by Denys Vlasenko
parent cc87588a61
commit 39ec6a2ad5
2 changed files with 26 additions and 8 deletions

View File

@ -474,19 +474,21 @@ int patch_main(int argc UNUSED_PARAM, char **argv)
// We're deleting oldname if new file is /dev/null (before -p) // We're deleting oldname if new file is /dev/null (before -p)
// or if new hunk is empty (zero context) after patching // or if new hunk is empty (zero context) after patching
if (!strcmp(name, "/dev/null") || !(reverse ? oldsum : newsum)) if (!strcmp(name, "/dev/null") || !(reverse ? oldsum : newsum)) {
{
name = reverse ? newname : oldname; name = reverse ? newname : oldname;
empty++; empty++;
} }
// handle -p path truncation. // handle -p path truncation.
for (i=0, s = name; *s;) { for (i = 0, s = name; *s;) {
if ((option_mask32 & FLAG_PATHLEN) && TT.prefix == i) break; if ((option_mask32 & FLAG_PATHLEN) && TT.prefix == i)
if (*(s++)=='/') { break;
name = s; if (*s++ != '/')
i++; continue;
} while (*s == '/')
s++;
i++;
name = s;
} }
if (empty) { if (empty) {

View File

@ -226,6 +226,22 @@ qwerty
+qwerty +qwerty
" "
# testing "test name" "command(s)" "expected result" "file input" "stdin"
testing "patch understands ...dir///dir..." \
'patch -p1 2>&1; echo $?' \
"\
patching file dir2///file
patch: can't open 'dir2///file': No such file or directory
1
" "" "\
--- bogus_dir///dir2///file
+++ bogus_dir///dir2///file
@@ -1,2 +1,3 @@
qwe
+asd
zxc
"
rm input.orig 2>/dev/null rm input.orig 2>/dev/null
exit $FAILCOUNT exit $FAILCOUNT