From 565c419972343c6e34dbf24f3d98bbb34b99d20a Mon Sep 17 00:00:00 2001 From: Edward Thomson Date: Mon, 7 Mar 2016 17:04:32 -0500 Subject: [PATCH] index::nsec: don't expect shit filesystems to not suck If the underlying filesystem doesn't support better than one second resolution, then don't expect that turning on `GIT_USE_NSEC` does anything magical to change that. --- tests/index/nsec.c | 60 +++++++++++++++++++++++++++++++++++++++------- 1 file changed, 51 insertions(+), 9 deletions(-) diff --git a/tests/index/nsec.c b/tests/index/nsec.c index 244ab6362..326b19540 100644 --- a/tests/index/nsec.c +++ b/tests/index/nsec.c @@ -24,6 +24,43 @@ void test_index_nsec__cleanup(void) cl_git_sandbox_cleanup(); } +static bool try_create_file_with_nsec_timestamp(const char *path) +{ + struct stat st; + int try; + + /* retry a few times to avoid nanos *actually* equal 0 race condition */ + for (try = 0; try < 3; try++) { + cl_git_mkfile(path, "This is hopefully a file with nanoseconds!"); + + cl_must_pass(p_stat(path, &st)); + + if (st.st_ctime_nsec && st.st_mtime_nsec) + return true; + } + + return false; +} + +/* try to determine if the underlying filesystem supports a resolution + * higher than a single second. (i'm looking at you, hfs+) + */ +static bool should_expect_nsecs(void) +{ + git_buf nsec_path = GIT_BUF_INIT; + bool expect; + + git_buf_joinpath(&nsec_path, clar_sandbox_path(), "nsec_test"); + + expect = try_create_file_with_nsec_timestamp(nsec_path.ptr); + + p_unlink(nsec_path.ptr); + + git_buf_clear(&nsec_path); + + return expect; +} + static bool has_nsecs(void) { const git_index_entry *entry; @@ -50,8 +87,13 @@ void test_index_nsec__has_nanos(void) void test_index_nsec__staging_maintains_other_nanos(void) { const git_index_entry *entry; + bool expect_nsec, test_file_has_nsec; + + expect_nsec = should_expect_nsecs(); + test_file_has_nsec = try_create_file_with_nsec_timestamp("nsecs/a.txt"); + + cl_assert_equal_b(expect_nsec, test_file_has_nsec); - cl_git_rewritefile("nsecs/a.txt", "This is file A"); cl_git_pass(git_index_add_bypath(repo_index, "a.txt")); cl_git_pass(git_index_write(repo_index)); @@ -63,15 +105,15 @@ void test_index_nsec__staging_maintains_other_nanos(void) cl_assert((entry = git_index_get_bypath(repo_index, "a.txt", 0))); /* if we are writing nanoseconds to the index, expect them to be - * nonzero. if we are *not*, expect that we truncated the entry. + * nonzero. */ -#ifdef GIT_USE_NSEC - cl_assert(entry->ctime.nanoseconds != 0); - cl_assert(entry->mtime.nanoseconds != 0); -#else - cl_assert_equal_i(0, entry->ctime.nanoseconds); - cl_assert_equal_i(0, entry->mtime.nanoseconds); -#endif + if (expect_nsec) { + cl_assert(entry->ctime.nanoseconds != 0); + cl_assert(entry->mtime.nanoseconds != 0); + } else { + cl_assert_equal_i(0, entry->ctime.nanoseconds); + cl_assert_equal_i(0, entry->mtime.nanoseconds); + } } void test_index_nsec__status_doesnt_clear_nsecs(void)