patch: make -p count path components, not slashes (think /blah//thing)
authorRob Landley <rob@landley.net>
Mon, 10 Oct 2011 17:59:38 +0000 (19:59 +0200)
committerDenys Vlasenko <vda.linux@googlemail.com>
Mon, 10 Oct 2011 17:59:38 +0000 (19:59 +0200)
Signed-off-by: Rob Landley <rob@landley.net>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
editors/patch.c
testsuite/patch.tests

index 1f2a49b66368240f89f7b077d17051d0bf3294a4..13785ef460ab45821ac6451119255707709b1a21 100644 (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)
                                // 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;
                                        empty++;
                                }
 
                                // handle -p path truncation.
-                               for (i=0, s = name; *s;) {
-                                       if ((option_mask32 & FLAG_PATHLEN) && TT.prefix == i) break;
-                                       if (*(s++)=='/') {
-                                               name = s;
-                                               i++;
-                                       }
+                               for (i = 0, s = name; *s;) {
+                                       if ((option_mask32 & FLAG_PATHLEN) && TT.prefix == i)
+                                               break;
+                                       if (*s++ != '/')
+                                               continue;
+                                       while (*s == '/')
+                                               s++;
+                                       i++;
+                                       name = s;
                                }
 
                                if (empty) {
index 8caeed5bd7c9180a2df503e3682a632fba8d6299..2759d2ad4b788cad47a5afb78c28ae2ba257222a 100755 (executable)
@@ -226,6 +226,22 @@ 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
 
 exit $FAILCOUNT