safe_create_leading_directories(): on Windows, \ can separate path components
When cloning to a directory "C:\foo\bar" from Windows' cmd.exe where "foo" does not exist yet, Git would throw an error like fatal: could not create work tree dir 'c:\foo\bar'.: No such file or directory Fix this by not hard-coding a platform specific directory separator into safe_create_leading_directories(). This patch, including its entire commit message, is derived from a patch by Sebastian Schuberth. Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de> Signed-off-by: Sebastian Schuberth <sschuberth@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com> Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
08f555cb82
commit
0f5274033e
12
sha1_file.c
12
sha1_file.c
@ -112,17 +112,21 @@ enum scld_error safe_create_leading_directories(char *path)
|
|||||||
|
|
||||||
while (ret == SCLD_OK && next_component) {
|
while (ret == SCLD_OK && next_component) {
|
||||||
struct stat st;
|
struct stat st;
|
||||||
char *slash = strchr(next_component, '/');
|
char *slash = next_component, slash_character;
|
||||||
|
|
||||||
if (!slash)
|
while (*slash && !is_dir_sep(*slash))
|
||||||
|
slash++;
|
||||||
|
|
||||||
|
if (!*slash)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
next_component = slash + 1;
|
next_component = slash + 1;
|
||||||
while (*next_component == '/')
|
while (is_dir_sep(*next_component))
|
||||||
next_component++;
|
next_component++;
|
||||||
if (!*next_component)
|
if (!*next_component)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
slash_character = *slash;
|
||||||
*slash = '\0';
|
*slash = '\0';
|
||||||
if (!stat(path, &st)) {
|
if (!stat(path, &st)) {
|
||||||
/* path exists */
|
/* path exists */
|
||||||
@ -148,7 +152,7 @@ enum scld_error safe_create_leading_directories(char *path)
|
|||||||
} else if (adjust_shared_perm(path)) {
|
} else if (adjust_shared_perm(path)) {
|
||||||
ret = SCLD_PERMS;
|
ret = SCLD_PERMS;
|
||||||
}
|
}
|
||||||
*slash = '/';
|
*slash = slash_character;
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user