Merge branch 'mm/apply-double-slash'

* mm/apply-double-slash:
  apply: handle filenames with double slashes better
maint
Junio C Hamano 2009-05-31 16:17:46 -07:00
commit 919cc4d068
1 changed files with 20 additions and 6 deletions

View File

@ -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)