Commit eeff96c4 by Carlos Martín Nieto

Merge pull request #3655 from ethomson/nanosecond_defaults

Enable nanosecond resolution by default
parents eee17997 53fb823b
...@@ -109,7 +109,7 @@ ELSE () ...@@ -109,7 +109,7 @@ ELSE ()
ENDIF() ENDIF()
IF (HAVE_STRUCT_STAT_NSEC OR WIN32) 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() ENDIF()
# This variable will contain the libraries we need to put into # This variable will contain the libraries we need to put into
......
...@@ -24,6 +24,43 @@ void test_index_nsec__cleanup(void) ...@@ -24,6 +24,43 @@ void test_index_nsec__cleanup(void)
cl_git_sandbox_cleanup(); 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) static bool has_nsecs(void)
{ {
const git_index_entry *entry; const git_index_entry *entry;
...@@ -50,8 +87,13 @@ void test_index_nsec__has_nanos(void) ...@@ -50,8 +87,13 @@ void test_index_nsec__has_nanos(void)
void test_index_nsec__staging_maintains_other_nanos(void) void test_index_nsec__staging_maintains_other_nanos(void)
{ {
const git_index_entry *entry; 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_add_bypath(repo_index, "a.txt"));
cl_git_pass(git_index_write(repo_index)); cl_git_pass(git_index_write(repo_index));
...@@ -63,15 +105,15 @@ void test_index_nsec__staging_maintains_other_nanos(void) ...@@ -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))); cl_assert((entry = git_index_get_bypath(repo_index, "a.txt", 0)));
/* if we are writing nanoseconds to the index, expect them to be /* 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 if (expect_nsec) {
cl_assert(entry->ctime.nanoseconds != 0); cl_assert(entry->ctime.nanoseconds != 0);
cl_assert(entry->mtime.nanoseconds != 0); cl_assert(entry->mtime.nanoseconds != 0);
#else } else {
cl_assert_equal_i(0, entry->ctime.nanoseconds); cl_assert_equal_i(0, entry->ctime.nanoseconds);
cl_assert_equal_i(0, entry->mtime.nanoseconds); cl_assert_equal_i(0, entry->mtime.nanoseconds);
#endif }
} }
void test_index_nsec__status_doesnt_clear_nsecs(void) void test_index_nsec__status_doesnt_clear_nsecs(void)
......
...@@ -105,8 +105,8 @@ static void setup_race(void) ...@@ -105,8 +105,8 @@ static void setup_race(void)
{ {
git_buf path = GIT_BUF_INIT; git_buf path = GIT_BUF_INIT;
git_index *index; git_index *index;
const git_index_entry *entry; git_index_entry *entry;
int i, found_race = 0; struct stat st;
/* Make sure we do have a timestamp */ /* Make sure we do have a timestamp */
cl_git_pass(git_repository_index__weakptr(&index, g_repo)); cl_git_pass(git_repository_index__weakptr(&index, g_repo));
...@@ -114,27 +114,20 @@ static void setup_race(void) ...@@ -114,27 +114,20 @@ static void setup_race(void)
cl_git_pass(git_buf_joinpath(&path, git_repository_workdir(g_repo), "A")); 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 */ cl_git_mkfile(path.ptr, "A");
for (i = 0; i < 10; i++) { cl_git_pass(git_index_add_bypath(index, "A"));
struct stat st;
cl_git_mkfile(path.ptr, "A");
cl_git_pass(git_index_add_bypath(index, "A")); cl_git_mkfile(path.ptr, "B");
cl_git_mkfile(path.ptr, "B"); cl_git_pass(git_index_write(index));
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_git_pass(p_stat(path.ptr, &st));
cl_assert(entry = git_index_get_bypath(index, "A", 0)); cl_assert(entry = (git_index_entry *)git_index_get_bypath(index, "A", 0));
if (entry->mtime.seconds == (int32_t) st.st_mtime) {
found_race = 1;
break;
}
}
if (!found_race) /* force a race */
cl_fail("failed to find race after 10 attempts"); entry->mtime.seconds = st.st_mtime;
entry->mtime.nanoseconds = st.st_mtime_nsec;
git_buf_free(&path); git_buf_free(&path);
} }
......
...@@ -165,8 +165,8 @@ static void hack_index(char *files[]) ...@@ -165,8 +165,8 @@ static void hack_index(char *files[])
entry->ctime.seconds = (int32_t)statbuf.st_ctime; entry->ctime.seconds = (int32_t)statbuf.st_ctime;
entry->mtime.seconds = (int32_t)statbuf.st_mtime; entry->mtime.seconds = (int32_t)statbuf.st_mtime;
#if defined(GIT_USE_NSEC) #if defined(GIT_USE_NSEC)
entry->ctime.nanoseconds = statbuf.st_ctim.tv_nsec; entry->ctime.nanoseconds = statbuf.st_ctime_nsec;
entry->mtime.nanoseconds = statbuf.st_mtim.tv_nsec; entry->mtime.nanoseconds = statbuf.st_mtime_nsec;
#else #else
entry->ctime.nanoseconds = 0; entry->ctime.nanoseconds = 0;
entry->mtime.nanoseconds = 0; entry->mtime.nanoseconds = 0;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment