index: test that we round-trip nsecs Test that nanoseconds are round-tripped correctly when we read an index file that contains them. We should, however, ignore them because we don't understand them, and any new entries in the index should contain a `0` nsecs field, while existing preserving entries.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162
diff --git a/tests/index/nsec.c b/tests/index/nsec.c
new file mode 100644
index 0000000..5004339
--- /dev/null
+++ b/tests/index/nsec.c
@@ -0,0 +1,78 @@
+#include "clar_libgit2.h"
+#include "index.h"
+#include "git2/sys/index.h"
+#include "git2/repository.h"
+#include "../reset/reset_helpers.h"
+
+static git_repository *repo;
+static git_index *repo_index;
+
+#define TEST_REPO_PATH "nsecs"
+
+// Fixture setup and teardown
+void test_index_nsec__initialize(void)
+{
+ repo = cl_git_sandbox_init("nsecs");
+ git_repository_index(&repo_index, repo);
+}
+
+void test_index_nsec__cleanup(void)
+{
+ git_index_free(repo_index);
+ repo_index = NULL;
+
+ cl_git_sandbox_cleanup();
+}
+
+static bool has_nsecs(void)
+{
+ const git_index_entry *entry;
+ size_t i;
+ bool has_nsecs = false;
+
+ for (i = 0; i < git_index_entrycount(repo_index); i++) {
+ entry = git_index_get_byindex(repo_index, i);
+
+ if (entry->ctime.nanoseconds || entry->mtime.nanoseconds) {
+ has_nsecs = true;
+ break;
+ }
+ }
+
+ return has_nsecs;
+}
+
+void test_index_nsec__has_nanos(void)
+{
+ cl_assert_equal_b(true, has_nsecs());
+}
+
+void test_index_nsec__staging_maintains_other_nanos(void)
+{
+ const git_index_entry *entry;
+
+ 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));
+
+ cl_git_pass(git_index_write(repo_index));
+
+ git_index_read(repo_index, 1);
+ cl_assert_equal_b(true, has_nsecs());
+
+ cl_assert((entry = git_index_get_bypath(repo_index, "a.txt", 0)));
+ 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)
+{
+ git_status_list *statuslist;
+
+ cl_git_pass(git_status_list_new(&statuslist, repo, NULL));
+
+ git_index_read(repo_index, 1);
+ cl_assert_equal_b(true, has_nsecs());
+
+ git_status_list_free(statuslist);
+}
diff --git a/tests/resources/nsecs/.gitted/HEAD b/tests/resources/nsecs/.gitted/HEAD
new file mode 100644
index 0000000..cb089cd
--- /dev/null
+++ b/tests/resources/nsecs/.gitted/HEAD
@@ -0,0 +1 @@
+ref: refs/heads/master
diff --git a/tests/resources/nsecs/.gitted/config b/tests/resources/nsecs/.gitted/config
new file mode 100644
index 0000000..78387c5
--- /dev/null
+++ b/tests/resources/nsecs/.gitted/config
@@ -0,0 +1,8 @@
+[core]
+ repositoryformatversion = 0
+ filemode = false
+ bare = false
+ logallrefupdates = true
+ symlinks = false
+ ignorecase = true
+ hideDotFiles = dotGitOnly
diff --git a/tests/resources/nsecs/.gitted/index b/tests/resources/nsecs/.gitted/index
new file mode 100644
index 0000000..9233f1b
Binary files /dev/null and b/tests/resources/nsecs/.gitted/index differ
diff --git a/tests/resources/nsecs/.gitted/objects/03/1986a8372d1442cfe9e3b54906a9aadc524a7e b/tests/resources/nsecs/.gitted/objects/03/1986a8372d1442cfe9e3b54906a9aadc524a7e
new file mode 100644
index 0000000..a813b74
--- /dev/null
+++ b/tests/resources/nsecs/.gitted/objects/03/1986a8372d1442cfe9e3b54906a9aadc524a7e
@@ -0,0 +1,2 @@
+xA
+0D]J4DMu-/"FHFf
PaʠZrnX*4kUixK-#%y Z20;Џ;
ŰJZ7FRBy?g?<^@]f˔GvܵNUOKv
\ No newline at end of file
diff --git a/tests/resources/nsecs/.gitted/objects/03/9afd91c98f82c14e425bb6796d8ca98e9c8cac b/tests/resources/nsecs/.gitted/objects/03/9afd91c98f82c14e425bb6796d8ca98e9c8cac
new file mode 100644
index 0000000..74bb7d3
Binary files /dev/null and b/tests/resources/nsecs/.gitted/objects/03/9afd91c98f82c14e425bb6796d8ca98e9c8cac differ
diff --git a/tests/resources/nsecs/.gitted/objects/6d/8b18077cc99abd8dda05a6062c646406abb2d4 b/tests/resources/nsecs/.gitted/objects/6d/8b18077cc99abd8dda05a6062c646406abb2d4
new file mode 100644
index 0000000..7bf3a95
Binary files /dev/null and b/tests/resources/nsecs/.gitted/objects/6d/8b18077cc99abd8dda05a6062c646406abb2d4 differ
diff --git a/tests/resources/nsecs/.gitted/objects/c5/12b6c64656b87ea8caf37a32bc5a562d797745 b/tests/resources/nsecs/.gitted/objects/c5/12b6c64656b87ea8caf37a32bc5a562d797745
new file mode 100644
index 0000000..dcf4c8c
Binary files /dev/null and b/tests/resources/nsecs/.gitted/objects/c5/12b6c64656b87ea8caf37a32bc5a562d797745 differ
diff --git a/tests/resources/nsecs/.gitted/objects/df/78d3d51c369e1d2f1eadb73464aadd931d56b4 b/tests/resources/nsecs/.gitted/objects/df/78d3d51c369e1d2f1eadb73464aadd931d56b4
new file mode 100644
index 0000000..df45d33
Binary files /dev/null and b/tests/resources/nsecs/.gitted/objects/df/78d3d51c369e1d2f1eadb73464aadd931d56b4 differ
diff --git a/tests/resources/nsecs/.gitted/refs/heads/master b/tests/resources/nsecs/.gitted/refs/heads/master
new file mode 100644
index 0000000..3dda65b
--- /dev/null
+++ b/tests/resources/nsecs/.gitted/refs/heads/master
@@ -0,0 +1 @@
+031986a8372d1442cfe9e3b54906a9aadc524a7e
diff --git a/tests/resources/nsecs/a.txt b/tests/resources/nsecs/a.txt
new file mode 100644
index 0000000..be4c1ee
--- /dev/null
+++ b/tests/resources/nsecs/a.txt
@@ -0,0 +1 @@
+File A
diff --git a/tests/resources/nsecs/b.txt b/tests/resources/nsecs/b.txt
new file mode 100644
index 0000000..19a0af4
--- /dev/null
+++ b/tests/resources/nsecs/b.txt
@@ -0,0 +1 @@
+File B
diff --git a/tests/resources/nsecs/c.txt b/tests/resources/nsecs/c.txt
new file mode 100644
index 0000000..31d7760
--- /dev/null
+++ b/tests/resources/nsecs/c.txt
@@ -0,0 +1 @@
+File C