diff options
author | Carlos Martín Nieto <carlosmn@github.com> | 2016-03-08 10:43:33 +0100 |
---|---|---|
committer | Carlos Martín Nieto <carlosmn@github.com> | 2016-03-08 10:43:33 +0100 |
commit | eeff96c4742fcab778a200b2385afd8cf7c85426 (patch) | |
tree | fc51a7e5aac22d685b74ee0f2b0bfecf4a6b7ce6 | |
parent | eee17997465d4053cc7a5fc44e6186c346633af2 (diff) | |
parent | 53fb823bcc4d9206a768024026b7146cb4e1e507 (diff) | |
download | libgit2-eeff96c4742fcab778a200b2385afd8cf7c85426.tar.gz |
Merge pull request #3655 from ethomson/nanosecond_defaults
Enable nanosecond resolution by default
-rw-r--r-- | CMakeLists.txt | 2 | ||||
-rw-r--r-- | tests/index/nsec.c | 60 | ||||
-rw-r--r-- | tests/index/racy.c | 31 | ||||
-rw-r--r-- | tests/merge/workdir/dirty.c | 4 |
4 files changed, 66 insertions, 31 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index f4e56e6cf..1801c938d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -109,7 +109,7 @@ ELSE () ENDIF() IF (HAVE_STRUCT_STAT_NSEC OR WIN32) - OPTION( USE_NSEC "Care about sub-second file mtimes and ctimes" OFF ) + OPTION( USE_NSEC "Care about sub-second file mtimes and ctimes" ON ) ENDIF() # This variable will contain the libraries we need to put into 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) diff --git a/tests/index/racy.c b/tests/index/racy.c index 68aa46007..1768f5efd 100644 --- a/tests/index/racy.c +++ b/tests/index/racy.c @@ -105,8 +105,8 @@ static void setup_race(void) { git_buf path = GIT_BUF_INIT; git_index *index; - const git_index_entry *entry; - int i, found_race = 0; + git_index_entry *entry; + struct stat st; /* Make sure we do have a timestamp */ cl_git_pass(git_repository_index__weakptr(&index, g_repo)); @@ -114,27 +114,20 @@ static void setup_race(void) cl_git_pass(git_buf_joinpath(&path, git_repository_workdir(g_repo), "A")); - /* Make sure writing the file, adding and rewriting happen in the same second */ - for (i = 0; i < 10; i++) { - struct stat st; - cl_git_mkfile(path.ptr, "A"); + cl_git_mkfile(path.ptr, "A"); + cl_git_pass(git_index_add_bypath(index, "A")); - cl_git_pass(git_index_add_bypath(index, "A")); - cl_git_mkfile(path.ptr, "B"); - cl_git_pass(git_index_write(index)); + cl_git_mkfile(path.ptr, "B"); + cl_git_pass(git_index_write(index)); - cl_git_mkfile(path.ptr, ""); + cl_git_mkfile(path.ptr, ""); - cl_git_pass(p_stat(path.ptr, &st)); - cl_assert(entry = git_index_get_bypath(index, "A", 0)); - if (entry->mtime.seconds == (int32_t) st.st_mtime) { - found_race = 1; - break; - } - } + cl_git_pass(p_stat(path.ptr, &st)); + cl_assert(entry = (git_index_entry *)git_index_get_bypath(index, "A", 0)); - if (!found_race) - cl_fail("failed to find race after 10 attempts"); + /* force a race */ + entry->mtime.seconds = st.st_mtime; + entry->mtime.nanoseconds = st.st_mtime_nsec; git_buf_free(&path); } diff --git a/tests/merge/workdir/dirty.c b/tests/merge/workdir/dirty.c index 99e33e0cd..a69919f53 100644 --- a/tests/merge/workdir/dirty.c +++ b/tests/merge/workdir/dirty.c @@ -165,8 +165,8 @@ static void hack_index(char *files[]) entry->ctime.seconds = (int32_t)statbuf.st_ctime; entry->mtime.seconds = (int32_t)statbuf.st_mtime; #if defined(GIT_USE_NSEC) - entry->ctime.nanoseconds = statbuf.st_ctim.tv_nsec; - entry->mtime.nanoseconds = statbuf.st_mtim.tv_nsec; + entry->ctime.nanoseconds = statbuf.st_ctime_nsec; + entry->mtime.nanoseconds = statbuf.st_mtime_nsec; #else entry->ctime.nanoseconds = 0; entry->mtime.nanoseconds = 0; |