Re: [PATCH v2] Fix safe_create_leading_directories() for Windows
- From
Junio C Hamano <gitster@pobox.com>
- Date
- Jan 2, 2014, 21:24 UTC
- Message-ID
- <xmqq8uuyoz5g.fsf@gitster.dls.corp.google.com>
- In-Reply-To
- <52C5D201.5070008@gmail.com>
Sebastian Schuberth <sschuberth@gmail.com> writes:
Show 40 quoted lines
> 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().
>
> Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
> Signed-off-by: Sebastian Schuberth <sschuberth@gmail.com>
> ---
> sha1_file.c | 15 +++++++++------
> 1 file changed, 9 insertions(+), 6 deletions(-)
>
> diff --git a/sha1_file.c b/sha1_file.c
> index 760dd60..2114c58 100644
> --- a/sha1_file.c
> +++ b/sha1_file.c
> @@ -110,12 +110,15 @@ int safe_create_leading_directories(char *path)
> char *pos = path + offset_1st_component(path);
> struct stat st;
>
> - while (pos) {
> - pos = strchr(pos, '/');
> - if (!pos)
> - break;
> - while (*++pos == '/')
> - ;
> + while (*pos) {
> + while (!is_dir_sep(*pos)) {
> + ++pos;
> + if (!*pos)
> + break;
> + }
> + /* skip consecutive directory separators */
> + while (is_dir_sep(*pos))
> + ++pos;
> if (!*pos)
> break;
> *--pos = '\0';This has a bit of conflict with another topic in flight; I think I resolved it correctly, but please double check. The following is how it would apply on top of 'pu'.
sha1_file.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/sha1_file.c b/sha1_file.c index 131ca97..9e686eb 100644 --- a/sha1_file.c +++ b/sha1_file.c @@ -113,11 +113,12 @@ int safe_create_leading_directories(char *path) while (!retval && next_component) { struct stat st; - char *slash = strchr(next_component, '/'); - - if (!slash) + char *slash = next_component; + while (!is_dir_sep(*slash)) + ++slash; + if (!*slash) return 0; - while (*(slash + 1) == '/') + while (is_dir_sep(*(slash + 1))) slash++; next_component = slash + 1; if (!*next_component)