"patch" works with -p1 and diffs in the following form: --- foo.orig//bar +++ foo//bar ... patch(1) says that "A sequence of one or more adjacent slashes is counted as a single slash." This patch amends git-apply's filename parsing to behave in the same way, eliminating both '/'s with -p1 in this example. Test case included. Signed-off-by: Robie Basak <robie.basak@xxxxxxxxxxxxx> --- builtin/apply.c | 8 ++++++-- t/t4153-apply-doubleslash.sh | 29 +++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 2 deletions(-) create mode 100755 t/t4153-apply-doubleslash.sh diff --git a/builtin/apply.c b/builtin/apply.c index 84a8a0b..78e25fa 100644 --- a/builtin/apply.c +++ b/builtin/apply.c @@ -627,9 +627,13 @@ static char *find_name_common(const char *line, char *def, int p_value, if (name_terminate(start, line-start, c, terminate)) break; } - line++; - if (c == '/' && !--p_value) + if (c == '/' && !--p_value) { + while (*line == '/') + line++; start = line; + } else { + line++; + } } if (!start) return squash_slash(def); diff --git a/t/t4153-apply-doubleslash.sh b/t/t4153-apply-doubleslash.sh new file mode 100755 index 0000000..1ea76b5 --- /dev/null +++ b/t/t4153-apply-doubleslash.sh @@ -0,0 +1,29 @@ +#!/bin/sh +# +# Copyright (c) 2011 Canonical Ltd. +# + +test_description='git apply filenames with double slashes + +Try to apply a patch with git-apply where the filename specified has a double +slash after the first (to-be-stripped) component' + +. ./test-lib.sh + +test_expect_success setup ' + test_commit 1 f && + cat > good.patch <<EOF +diff -u a//f b//f +--- a//f ++++ b//f +@@ -1 +1 @@ +-1 ++2 +EOF +' + +test_expect_success 'apply diff with double slashes in filenames' ' + git apply good.patch 2>err +' + +test_done -- 1.7.5.4 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html