From 81167385e90e7059a9610e8f7f3e8201dc6d46b9 Mon Sep 17 00:00:00 2001 From: Ben Straub Date: Wed, 11 Jul 2012 15:33:19 -0700 Subject: [PATCH] Fix compile and workings on msvc. Signed-off-by: Ben Straub --- src/checkout.c | 4 ++-- src/path.c | 28 +++++++++++++++++++++++----- tests-clar/clone/clone.c | 4 ++-- 3 files changed, 27 insertions(+), 9 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; } diff --git a/tests-clar/clone/clone.c b/tests-clar/clone/clone.c index 49deeaae4..3fba91cac 100644 --- a/tests-clar/clone/clone.c +++ b/tests-clar/clone/clone.c @@ -96,10 +96,10 @@ void test_clone_clone__network_full(void) #if DO_LIVE_NETWORK_TESTS git_remote *origin; - cl_git_pass(git_clone(&g_repo, LIVE_REPO_URL, "./test", NULL)); + cl_git_pass(git_clone(&g_repo, LIVE_REPO_URL, "./test2", NULL)); cl_assert(!git_repository_is_bare(g_repo)); cl_git_pass(git_remote_load(&origin, g_repo, "origin")); - git_futils_rmdir_r("./test", GIT_DIRREMOVAL_FILES_AND_DIRS); + git_futils_rmdir_r("./test2", GIT_DIRREMOVAL_FILES_AND_DIRS); #endif }