summaryrefslogtreecommitdiff
path: root/tests-clar/diff/tree.c
diff options
context:
space:
mode:
authorRussell Belfer <rb@github.com>2012-07-19 10:23:45 -0700
committerRussell Belfer <rb@github.com>2012-07-19 10:23:45 -0700
commit71d273583755c0a2b7f5d608f017f4586add51e4 (patch)
tree9a70607c88d126591a5fc7241987e5d410e3bf0f /tests-clar/diff/tree.c
parent5a8204f8a88c59c2cb07b93930834ef0a5aaf1fc (diff)
downloadlibgit2-71d273583755c0a2b7f5d608f017f4586add51e4.tar.gz
Fix bug with merging diffs with null options
A diff that is created with a NULL options parameter could result in a NULL prefix string, but diff merge was unconditionally strdup'ing it. I added a test to replicate the issue and then a new method that does the right thing with NULL values.
Diffstat (limited to 'tests-clar/diff/tree.c')
-rw-r--r--tests-clar/diff/tree.c48
1 files changed, 48 insertions, 0 deletions
diff --git a/tests-clar/diff/tree.c b/tests-clar/diff/tree.c
index 4201ad2a7..be9eb6c13 100644
--- a/tests-clar/diff/tree.c
+++ b/tests-clar/diff/tree.c
@@ -208,3 +208,51 @@ void test_diff_tree__bare(void)
git_tree_free(a);
git_tree_free(b);
}
+
+void test_diff_tree__merge(void)
+{
+ /* grabbed a couple of commit oids from the history of the attr repo */
+ const char *a_commit = "605812a";
+ const char *b_commit = "370fe9ec22";
+ const char *c_commit = "f5b0af1fb4f5c";
+ git_tree *a, *b, *c;
+ git_diff_list *diff1 = NULL, *diff2 = NULL;
+ diff_expects exp;
+
+ g_repo = cl_git_sandbox_init("attr");
+
+ cl_assert((a = resolve_commit_oid_to_tree(g_repo, a_commit)) != NULL);
+ cl_assert((b = resolve_commit_oid_to_tree(g_repo, b_commit)) != NULL);
+ cl_assert((c = resolve_commit_oid_to_tree(g_repo, c_commit)) != NULL);
+
+ cl_git_pass(git_diff_tree_to_tree(g_repo, NULL, a, b, &diff1));
+
+ cl_git_pass(git_diff_tree_to_tree(g_repo, NULL, c, b, &diff2));
+
+ git_tree_free(a);
+ git_tree_free(b);
+ git_tree_free(c);
+
+ cl_git_pass(git_diff_merge(diff1, diff2));
+
+ git_diff_list_free(diff2);
+
+ memset(&exp, 0, sizeof(exp));
+
+ cl_git_pass(git_diff_foreach(
+ diff1, &exp, diff_file_fn, diff_hunk_fn, diff_line_fn));
+
+ cl_assert(exp.files == 6);
+ cl_assert(exp.file_adds == 2);
+ cl_assert(exp.file_dels == 1);
+ cl_assert(exp.file_mods == 3);
+
+ cl_assert(exp.hunks == 6);
+
+ cl_assert(exp.lines == 59);
+ cl_assert(exp.line_ctxt == 1);
+ cl_assert(exp.line_adds == 36);
+ cl_assert(exp.line_dels == 22);
+
+ git_diff_list_free(diff1);
+}