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>maint
parent
7a7eb5173d
commit
33eb4dd9fc
|
@ -320,6 +320,20 @@ static int name_terminate(const char *name, int namelen, int c, int terminate)
|
||||||
return 1;
|
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)
|
static char *find_name(const char *line, char *def, int p_value, int terminate)
|
||||||
{
|
{
|
||||||
int len;
|
int len;
|
||||||
|
@ -349,7 +363,7 @@ static char *find_name(const char *line, char *def, int p_value, int terminate)
|
||||||
free(def);
|
free(def);
|
||||||
if (root)
|
if (root)
|
||||||
strbuf_insert(&name, 0, root, root_len);
|
strbuf_insert(&name, 0, root, root_len);
|
||||||
return strbuf_detach(&name, NULL);
|
return squash_slash(strbuf_detach(&name, NULL));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
strbuf_release(&name);
|
strbuf_release(&name);
|
||||||
|
@ -369,10 +383,10 @@ static char *find_name(const char *line, char *def, int p_value, int terminate)
|
||||||
start = line;
|
start = line;
|
||||||
}
|
}
|
||||||
if (!start)
|
if (!start)
|
||||||
return def;
|
return squash_slash(def);
|
||||||
len = line - start;
|
len = line - start;
|
||||||
if (!len)
|
if (!len)
|
||||||
return def;
|
return squash_slash(def);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Generally we prefer the shorter name, especially
|
* 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) {
|
if (def) {
|
||||||
int deflen = strlen(def);
|
int deflen = strlen(def);
|
||||||
if (deflen < len && !strncmp(start, def, deflen))
|
if (deflen < len && !strncmp(start, def, deflen))
|
||||||
return def;
|
return squash_slash(def);
|
||||||
free(def);
|
free(def);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -392,10 +406,10 @@ static char *find_name(const char *line, char *def, int p_value, int terminate)
|
||||||
strcpy(ret, root);
|
strcpy(ret, root);
|
||||||
memcpy(ret + root_len, start, len);
|
memcpy(ret + root_len, start, len);
|
||||||
ret[root_len + len] = '\0';
|
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)
|
static int count_slashes(const char *cp)
|
||||||
|
|
Loading…
Reference in New Issue