diff options
author | Michael Haggerty <mhagger@alum.mit.edu> | 2014-01-19 00:40:44 +0100 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2014-01-22 11:00:07 -0800 |
commit | 0f5274033ecb0262dc77e4ed48fdb1ab07181bd8 (patch) | |
tree | fe2ca20b0088e4d6ed2c7fc86e181fd7f09bbc76 | |
parent | 08f555cb82f92797ca0aa0d6ba32e6872f1331e5 (diff) | |
download | git-0f5274033ecb0262dc77e4ed48fdb1ab07181bd8.tar.gz git-0f5274033ecb0262dc77e4ed48fdb1ab07181bd8.tar.xz |
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>
-rw-r--r-- | sha1_file.c | 12 |
1 files changed, 8 insertions, 4 deletions
diff --git a/sha1_file.c b/sha1_file.c index ed814e546..bba70e797 100644 --- a/sha1_file.c +++ b/sha1_file.c @@ -112,17 +112,21 @@ enum scld_error safe_create_leading_directories(char *path) while (ret == SCLD_OK && next_component) { 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; next_component = slash + 1; - while (*next_component == '/') + while (is_dir_sep(*next_component)) next_component++; if (!*next_component) break; + slash_character = *slash; *slash = '\0'; if (!stat(path, &st)) { /* path exists */ @@ -148,7 +152,7 @@ enum scld_error safe_create_leading_directories(char *path) } else if (adjust_shared_perm(path)) { ret = SCLD_PERMS; } - *slash = '/'; + *slash = slash_character; } return ret; } |