Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/libgit2.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEdward Thomson <ethomson@github.com>2016-03-08 01:04:32 +0300
committerEdward Thomson <ethomson@github.com>2016-03-08 01:04:32 +0300
commit565c419972343c6e34dbf24f3d98bbb34b99d20a (patch)
tree70d60ef5c8856ed18834aa5d9e4e9ef443fe7120 /tests/index
parent6abdf52d6eba71908f4389b14f9b7b3f1827f8c7 (diff)
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.
Diffstat (limited to 'tests/index')
-rw-r--r--tests/index/nsec.c60
1 files 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)