diff options
author | Michal Marek <mmarek@suse.cz> | 2009-05-21 14:25:11 +0200 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2009-05-24 13:52:13 -0700 |
commit | 33eb4dd9fce3b46b6962b46213d6f222bcd0cb3a (patch) | |
tree | c09e8c7fc01526039d78d91865e4f0341f83aad0 | |
parent | 7a7eb5173d4e16f0323b2c4078e88fc0a40c38b6 (diff) | |
download | git-33eb4dd9fce3b46b6962b46213d6f222bcd0cb3a.tar.gz git-33eb4dd9fce3b46b6962b46213d6f222bcd0cb3a.tar.xz |
apply: handle filenames with double slashes better
When there are duplicated slashes in pathnames, like this:
--- a/perl//Git.pm
+++ b/perl//Git.pm
@@ -1358,3 +1358,4 @@
1; # Famous last words
+# test
the paths gleaned from the patch header won't be found in the index and
cause "apply --index" and "apply --cached" to fail.
Fix this by squashing the duplicated slashes upon input.
Signed-off-by: Michal Marek <mmarek@suse.cz>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r-- | builtin-apply.c | 26 |
1 files changed, 20 insertions, 6 deletions
diff --git a/builtin-apply.c b/builtin-apply.c index 8a3771e87..660aab95d 100644 --- a/builtin-apply.c +++ b/builtin-apply.c @@ -320,6 +320,20 @@ static int name_terminate(const char *name, int namelen, int c, int terminate) return 1; } +/* remove double slashes to make --index work with such filenames */ +static char *squash_slash(char *name) +{ + int i = 0, j = 0; + + while (name[i]) { + if ((name[j++] = name[i++]) == '/') + while (name[i] == '/') + i++; + } + name[j] = '\0'; + return name; +} + static char *find_name(const char *line, char *def, int p_value, int terminate) { int len; @@ -349,7 +363,7 @@ static char *find_name(const char *line, char *def, int p_value, int terminate) free(def); if (root) strbuf_insert(&name, 0, root, root_len); - return strbuf_detach(&name, NULL); + return squash_slash(strbuf_detach(&name, NULL)); } } strbuf_release(&name); @@ -369,10 +383,10 @@ static char *find_name(const char *line, char *def, int p_value, int terminate) start = line; } if (!start) - return def; + return squash_slash(def); len = line - start; if (!len) - return def; + return squash_slash(def); /* * Generally we prefer the shorter name, especially @@ -383,7 +397,7 @@ static char *find_name(const char *line, char *def, int p_value, int terminate) if (def) { int deflen = strlen(def); if (deflen < len && !strncmp(start, def, deflen)) - return def; + return squash_slash(def); free(def); } @@ -392,10 +406,10 @@ static char *find_name(const char *line, char *def, int p_value, int terminate) strcpy(ret, root); memcpy(ret + root_len, start, len); ret[root_len + len] = '\0'; - return ret; + return squash_slash(ret); } - return xmemdupz(start, len); + return squash_slash(xmemdupz(start, len)); } static int count_slashes(const char *cp) |