diff options
author | Rob Landley <rob@landley.net> | 2011-10-10 19:59:38 +0200 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2011-10-10 19:59:38 +0200 |
commit | 39ec6a2ad5dae93c125b766eb8e705742216797a (patch) | |
tree | 7bae67387dcebb1ad580bf8d4a4597a20d6e20c8 | |
parent | cc87588a613ce5de8cb47b04f63ba267d1ecfd1e (diff) | |
download | busybox-w32-39ec6a2ad5dae93c125b766eb8e705742216797a.tar.gz busybox-w32-39ec6a2ad5dae93c125b766eb8e705742216797a.tar.bz2 busybox-w32-39ec6a2ad5dae93c125b766eb8e705742216797a.zip |
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>
-rw-r--r-- | editors/patch.c | 18 | ||||
-rwxr-xr-x | testsuite/patch.tests | 16 |
2 files changed, 26 insertions, 8 deletions
diff --git a/editors/patch.c b/editors/patch.c index 1f2a49b66..13785ef46 100644 --- a/editors/patch.c +++ b/editors/patch.c | |||
@@ -474,19 +474,21 @@ int patch_main(int argc UNUSED_PARAM, char **argv) | |||
474 | 474 | ||
475 | // We're deleting oldname if new file is /dev/null (before -p) | 475 | // We're deleting oldname if new file is /dev/null (before -p) |
476 | // or if new hunk is empty (zero context) after patching | 476 | // or if new hunk is empty (zero context) after patching |
477 | if (!strcmp(name, "/dev/null") || !(reverse ? oldsum : newsum)) | 477 | if (!strcmp(name, "/dev/null") || !(reverse ? oldsum : newsum)) { |
478 | { | ||
479 | name = reverse ? newname : oldname; | 478 | name = reverse ? newname : oldname; |
480 | empty++; | 479 | empty++; |
481 | } | 480 | } |
482 | 481 | ||
483 | // handle -p path truncation. | 482 | // handle -p path truncation. |
484 | for (i=0, s = name; *s;) { | 483 | for (i = 0, s = name; *s;) { |
485 | if ((option_mask32 & FLAG_PATHLEN) && TT.prefix == i) break; | 484 | if ((option_mask32 & FLAG_PATHLEN) && TT.prefix == i) |
486 | if (*(s++)=='/') { | 485 | break; |
487 | name = s; | 486 | if (*s++ != '/') |
488 | i++; | 487 | continue; |
489 | } | 488 | while (*s == '/') |
489 | s++; | ||
490 | i++; | ||
491 | name = s; | ||
490 | } | 492 | } |
491 | 493 | ||
492 | if (empty) { | 494 | if (empty) { |
diff --git a/testsuite/patch.tests b/testsuite/patch.tests index 8caeed5bd..2759d2ad4 100755 --- a/testsuite/patch.tests +++ b/testsuite/patch.tests | |||
@@ -226,6 +226,22 @@ qwerty | |||
226 | +qwerty | 226 | +qwerty |
227 | " | 227 | " |
228 | 228 | ||
229 | # testing "test name" "command(s)" "expected result" "file input" "stdin" | ||
230 | testing "patch understands ...dir///dir..." \ | ||
231 | 'patch -p1 2>&1; echo $?' \ | ||
232 | "\ | ||
233 | patching file dir2///file | ||
234 | patch: can't open 'dir2///file': No such file or directory | ||
235 | 1 | ||
236 | " "" "\ | ||
237 | --- bogus_dir///dir2///file | ||
238 | +++ bogus_dir///dir2///file | ||
239 | @@ -1,2 +1,3 @@ | ||
240 | qwe | ||
241 | +asd | ||
242 | zxc | ||
243 | " | ||
244 | |||
229 | rm input.orig 2>/dev/null | 245 | rm input.orig 2>/dev/null |
230 | 246 | ||
231 | exit $FAILCOUNT | 247 | exit $FAILCOUNT |