summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Martín Nieto <cmn@dwim.me>2015-06-15 09:51:34 +0200
committerCarlos Martín Nieto <cmn@dwim.me>2015-06-16 08:40:45 +0200
commit77596fcfd7cd14d0998b333af5f2d11ffea84843 (patch)
tree0f888ed8561da26782ed25d7112e3ea801bc7de1
parentb93dcd4ca423cdb31262cbdc4150dfb7d2e620b7 (diff)
downloadlibgit2-77596fcfd7cd14d0998b333af5f2d11ffea84843.tar.gz
diff: add failing test for racy-git in the index
We update the index and then immediately change the contents of the file. This makes the diff think there are no changes, as the timestamp of the file agrees with the cached data. This is however a bug, as the file has obviously changed contents. The test is a bit fragile, as it assumes that the index writing and the following modification of the file happen in the same second, but it's enough to show the issue.
-rw-r--r--tests/diff/racy.c39
1 files changed, 39 insertions, 0 deletions
diff --git a/tests/diff/racy.c b/tests/diff/racy.c
new file mode 100644
index 000000000..a109f8c3b
--- /dev/null
+++ b/tests/diff/racy.c
@@ -0,0 +1,39 @@
+#include "clar_libgit2.h"
+
+#include "buffer.h"
+
+static git_repository *g_repo;
+
+void test_diff_racy__initialize(void)
+{
+ cl_git_pass(git_repository_init(&g_repo, "diff_racy", false));
+}
+
+void test_diff_racy__cleanup(void)
+{
+ cl_git_sandbox_cleanup();
+}
+
+void test_diff_racy__diff(void)
+{
+ git_index *index;
+ git_diff *diff;
+ git_buf path = GIT_BUF_INIT;
+
+ cl_git_pass(git_buf_joinpath(&path, git_repository_workdir(g_repo), "A"));
+ cl_git_mkfile(path.ptr, "A");
+
+ /* Put 'A' into the index */
+ cl_git_pass(git_repository_index(&index, g_repo));
+ cl_git_pass(git_index_add_bypath(index, "A"));
+ cl_git_pass(git_index_write(index));
+
+ cl_git_pass(git_diff_index_to_workdir(&diff, g_repo, index, NULL));
+ cl_assert_equal_i(0, git_diff_num_deltas(diff));
+
+ /* Change its contents quickly, so we get the same timestamp */
+ cl_git_mkfile(path.ptr, "B");
+
+ cl_git_pass(git_diff_index_to_workdir(&diff, g_repo, index, NULL));
+ cl_assert_equal_i(1, git_diff_num_deltas(diff));
+}