diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/checkout.c | 4 | ||||
-rw-r--r-- | src/path.c | 28 |
2 files changed, 25 insertions, 7 deletions
diff --git a/src/checkout.c b/src/checkout.c index b9b5bc1f9..907253fec 100644 --- a/src/checkout.c +++ b/src/checkout.c @@ -36,16 +36,16 @@ static int apply_filters(git_buf *out, size_t len) { int retcode = GIT_ERROR; + git_buf origblob = GIT_BUF_INIT; git_buf_clear(out); if (!filters->length) { /* No filters to apply; just copy the result */ - git_buf_put(out, data, len); + git_buf_put(out, (const char *)data, len); return 0; } - git_buf origblob = GIT_BUF_INIT; git_buf_attach(&origblob, (char*)data, len); retcode = git_filters_apply(out, &origblob, filters); git_buf_detach(&origblob); diff --git a/src/path.c b/src/path.c index e667ec357..e6406751a 100644 --- a/src/path.c +++ b/src/path.c @@ -391,8 +391,16 @@ bool git_path_isfile(const char *path) #ifdef GIT_WIN32 +static bool is_dot_or_dotdotW(const wchar_t *name) +{ + return (name[0] == L'.' && + (name[1] == L'\0' || + (name[1] == L'.' && name[2] == L'\0'))); +} + bool git_path_is_empty_dir(const char *path) { + git_buf pathbuf = GIT_BUF_INIT; HANDLE hFind = INVALID_HANDLE_VALUE; wchar_t *wbuf; WIN32_FIND_DATAW ffd; @@ -400,13 +408,23 @@ bool git_path_is_empty_dir(const char *path) if (!git_path_isdir(path)) return false; - wbuf = gitwin_to_utf16(path); - gitwin_append_utf16(wbuf, "\\*", 2); + git_buf_printf(&pathbuf, "%s\\*", path); + wbuf = gitwin_to_utf16(git_buf_cstr(&pathbuf)); + hFind = FindFirstFileW(wbuf, &ffd); - if (INVALID_HANDLE_VALUE != hFind) { - retval = false; - FindClose(hFind); + if (INVALID_HANDLE_VALUE == hFind) { + giterr_set(GITERR_OS, "Couldn't open '%s'", path); + return false; } + + do { + if (!is_dot_or_dotdotW(ffd.cFileName)) { + retval = false; + } + } while (FindNextFileW(hFind, &ffd) != 0); + + FindClose(hFind); + git_buf_free(&pathbuf); git__free(wbuf); return retval; } |