diff options
author | Russell Belfer <rb@github.com> | 2012-07-19 10:23:45 -0700 |
---|---|---|
committer | Russell Belfer <rb@github.com> | 2012-07-19 10:23:45 -0700 |
commit | 71d273583755c0a2b7f5d608f017f4586add51e4 (patch) | |
tree | 9a70607c88d126591a5fc7241987e5d410e3bf0f /tests-clar/diff/tree.c | |
parent | 5a8204f8a88c59c2cb07b93930834ef0a5aaf1fc (diff) | |
download | libgit2-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.c | 48 |
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); +} |