summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/checkout.c4
-rw-r--r--src/path.c28
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;
}