From 3ac05d11493d0573dbf725a19403dbf5e8d93b50 Mon Sep 17 00:00:00 2001 From: Edward Thomson Date: Fri, 17 Feb 2017 16:48:03 +0000 Subject: [PATCH] win32: don't fsync parent directories on Windows Windows doesn't support it. --- src/fileops.c | 5 +++++ tests/pack/packbuilder.c | 11 ++++++++++- tests/refs/create.c | 15 +++++++++++++-- 3 files changed, 28 insertions(+), 3 deletions(-) diff --git a/src/fileops.c b/src/fileops.c index 881d1bed4..6565eb4bd 100644 --- a/src/fileops.c +++ b/src/fileops.c @@ -1127,6 +1127,10 @@ void git_futils_filestamp_set_from_stat( int git_futils_fsync_dir(const char *path) { +#ifdef GIT_WIN32 + GIT_UNUSED(path); + return 0; +#else int fd, error = -1; if ((fd = p_open(path, O_RDONLY)) < 0) { @@ -1139,6 +1143,7 @@ int git_futils_fsync_dir(const char *path) p_close(fd); return error; +#endif } int git_futils_fsync_parent(const char *path) diff --git a/tests/pack/packbuilder.c b/tests/pack/packbuilder.c index 96d643ab7..5cdd9a8d2 100644 --- a/tests/pack/packbuilder.c +++ b/tests/pack/packbuilder.c @@ -200,11 +200,20 @@ void test_pack_packbuilder__does_not_fsync_by_default(void) void test_pack_packbuilder__fsync_when_asked(void) { + /* We fsync the packfile and index. On non-Windows, we also fsync + * the parent directories. + */ +#ifdef GIT_WIN32 + int expected = 2; +#else + int expected = 4; +#endif + cl_git_pass(git_libgit2_opts(GIT_OPT_ENABLE_SYNCHRONOUS_OBJECT_CREATION, 1)); p_fsync__cnt = 0; seed_packbuilder(); git_packbuilder_write(_packbuilder, ".", 0666, NULL, NULL); - cl_assert_equal_sz(4, p_fsync__cnt); + cl_assert_equal_sz(expected, p_fsync__cnt); } static int foreach_cb(void *buf, size_t len, void *payload) diff --git a/tests/refs/create.c b/tests/refs/create.c index fdbef9f32..6265aee47 100644 --- a/tests/refs/create.c +++ b/tests/refs/create.c @@ -323,13 +323,24 @@ void test_refs_create__fsyncs_when_requested(void) git_refdb *refdb; git_oid id; + /* Creating a loose ref involves fsync'ing the reference, the + * reflog and (on non-Windows) the containing directories. + * Creating a packed ref involves fsync'ing the packed ref file + * and (on non-Windows) the containing directory. + */ +#ifdef GIT_WIN32 + int expected_create = 2, expected_compress = 1; +#else + int expected_create = 4, expected_compress = 2; +#endif + cl_git_pass(git_libgit2_opts(GIT_OPT_ENABLE_SYNCHRONOUS_OBJECT_CREATION, 1)); p_fsync__cnt = 0; git_oid_fromstr(&id, current_master_tip); cl_git_pass(git_reference_create(&ref, g_repo, "refs/heads/fsync_test", &id, 0, "log message")); git_reference_free(ref); - cl_assert_equal_i(4, p_fsync__cnt); + cl_assert_equal_i(expected_create, p_fsync__cnt); p_fsync__cnt = 0; @@ -337,5 +348,5 @@ void test_refs_create__fsyncs_when_requested(void) cl_git_pass(git_refdb_compress(refdb)); git_refdb_free(refdb); - cl_assert_equal_i(2, p_fsync__cnt); + cl_assert_equal_i(expected_compress, p_fsync__cnt); } -- 2.39.5