diff options
author | Vicent Martà <tanoku@gmail.com> | 2012-05-02 15:59:02 -0700 |
---|---|---|
committer | Vicent Martà <tanoku@gmail.com> | 2012-05-02 15:59:02 -0700 |
commit | 40879facad0337d954d4904e212af3b36cdb9465 (patch) | |
tree | aea730551948c67bb1fb88098cf8a67d3ed3211d /tests-clar/diff | |
parent | 2218fd57a50ceb851cb131939bf0747e072e40f6 (diff) | |
parent | 3fd99be98a91416dae77d65fe593965a0723fa8c (diff) | |
download | libgit2-40879facad0337d954d4904e212af3b36cdb9465.tar.gz |
Merge branch 'new-error-handling' into development
Conflicts:
.travis.yml
include/git2/diff.h
src/config_file.c
src/diff.c
src/diff_output.c
src/mwindow.c
src/path.c
tests-clar/clar_helpers.c
tests-clar/object/tree/frompath.c
tests/t00-core.c
tests/t03-objwrite.c
tests/t08-tag.c
tests/t10-refs.c
tests/t12-repo.c
tests/t18-status.c
tests/test_helpers.c
tests/test_main.c
Diffstat (limited to 'tests-clar/diff')
-rw-r--r-- | tests-clar/diff/diff_helpers.c | 28 | ||||
-rw-r--r-- | tests-clar/diff/diff_helpers.h | 1 | ||||
-rw-r--r-- | tests-clar/diff/iterator.c | 54 | ||||
-rw-r--r-- | tests-clar/diff/patch.c | 99 | ||||
-rw-r--r-- | tests-clar/diff/tree.c | 18 | ||||
-rw-r--r-- | tests-clar/diff/workdir.c | 95 |
6 files changed, 261 insertions, 34 deletions
diff --git a/tests-clar/diff/diff_helpers.c b/tests-clar/diff/diff_helpers.c index d8eca7d9b..74a44ab99 100644 --- a/tests-clar/diff/diff_helpers.c +++ b/tests-clar/diff/diff_helpers.c @@ -5,10 +5,10 @@ git_tree *resolve_commit_oid_to_tree( git_repository *repo, const char *partial_oid) { - size_t len = strlen(partial_oid); + unsigned int len = (unsigned int)strlen(partial_oid); git_oid oid; - git_object *obj; - git_tree *tree; + git_object *obj = NULL; + git_tree *tree = NULL; if (git_oid_fromstrn(&oid, partial_oid, len) == 0) git_object_lookup_prefix(&obj, repo, &oid, len, GIT_OBJ_ANY); @@ -27,7 +27,9 @@ int diff_file_fn( float progress) { diff_expects *e = cb_data; - (void)progress; + + GIT_UNUSED(progress); + e->files++; switch (delta->status) { case GIT_DELTA_ADDED: e->file_adds++; break; @@ -48,9 +50,11 @@ int diff_hunk_fn( size_t header_len) { diff_expects *e = cb_data; - (void)delta; - (void)header; - (void)header_len; + + GIT_UNUSED(delta); + GIT_UNUSED(header); + GIT_UNUSED(header_len); + e->hunks++; e->hunk_old_lines += range->old_lines; e->hunk_new_lines += range->new_lines; @@ -60,14 +64,18 @@ int diff_hunk_fn( int diff_line_fn( void *cb_data, git_diff_delta *delta, + git_diff_range *range, char line_origin, const char *content, size_t content_len) { diff_expects *e = cb_data; - (void)delta; - (void)content; - (void)content_len; + + GIT_UNUSED(delta); + GIT_UNUSED(range); + GIT_UNUSED(content); + GIT_UNUSED(content_len); + e->lines++; switch (line_origin) { case GIT_DIFF_LINE_CONTEXT: diff --git a/tests-clar/diff/diff_helpers.h b/tests-clar/diff/diff_helpers.h index 010d156fa..ca8c40177 100644 --- a/tests-clar/diff/diff_helpers.h +++ b/tests-clar/diff/diff_helpers.h @@ -37,6 +37,7 @@ extern int diff_hunk_fn( extern int diff_line_fn( void *cb_data, git_diff_delta *delta, + git_diff_range *range, char line_origin, const char *content, size_t content_len); diff --git a/tests-clar/diff/iterator.c b/tests-clar/diff/iterator.c index 3953fd83f..0ec2326eb 100644 --- a/tests-clar/diff/iterator.c +++ b/tests-clar/diff/iterator.c @@ -37,7 +37,7 @@ static void tree_iterator_test( while (entry != NULL) { if (expected_values != NULL) - cl_assert_strequal(expected_values[count], entry->path); + cl_assert_equal_s(expected_values[count], entry->path); count++; @@ -139,6 +139,40 @@ void test_diff_iterator__tree_3(void) tree_iterator_test("status", "0017bd4ab1e", 8, expected_tree_3); } +/* $ git ls-tree -r --name-only 24fa9a9fc4e202313e24b648087495441dab432b */ +const char *expected_tree_4[] = { + "attr0", + "attr1", + "attr2", + "attr3", + "binfile", + "gitattributes", + "macro_bad", + "macro_test", + "root_test1", + "root_test2", + "root_test3", + "root_test4.txt", + "sub/abc", + "sub/file", + "sub/sub/file", + "sub/sub/subsub.txt", + "sub/subdir_test1", + "sub/subdir_test2.txt", + "subdir/.gitattributes", + "subdir/abc", + "subdir/subdir_test1", + "subdir/subdir_test2.txt", + "subdir2/subdir2_test1", + NULL +}; + +void test_diff_iterator__tree_4(void) +{ + tree_iterator_test( + "attr", "24fa9a9fc4e202313e24b648087495441dab432b", + 23, expected_tree_4); +} /* -- INDEX ITERATOR TESTS -- */ @@ -158,7 +192,7 @@ static void index_iterator_test( while (entry != NULL) { if (expected_names != NULL) - cl_assert_strequal(expected_names[count], entry->path); + cl_assert_equal_s(expected_names[count], entry->path); if (expected_oids != NULL) { git_oid oid; @@ -188,6 +222,12 @@ static const char *expected_index_0[] = { "root_test2", "root_test3", "root_test4.txt", + "sub/abc", + "sub/file", + "sub/sub/file", + "sub/sub/subsub.txt", + "sub/subdir_test1", + "sub/subdir_test2.txt", "subdir/.gitattributes", "subdir/abc", "subdir/subdir_test1", @@ -208,6 +248,12 @@ static const char *expected_index_oids_0[] = { "4d713dc48e6b1bd75b0d61ad078ba9ca3a56745d", "108bb4e7fd7b16490dc33ff7d972151e73d7166e", "fe773770c5a6cc7185580c9204b1ff18a33ff3fc", + "3e42ffc54a663f9401cc25843d6c0e71a33e4249", + "45b983be36b73c0788dc9cbcb76cbb80fc7bb057", + "45b983be36b73c0788dc9cbcb76cbb80fc7bb057", + "9e5bdc47d6a80f2be0ea3049ad74231b94609242", + "e563cf4758f0d646f1b14b76016aa17fa9e549a4", + "fb5067b1aef3ac1ada4b379dbcb7d17255df7d78", "99eae476896f4907224978b88e5ecaa6c5bb67a9", "3e42ffc54a663f9401cc25843d6c0e71a33e4249", "e563cf4758f0d646f1b14b76016aa17fa9e549a4", @@ -217,7 +263,7 @@ static const char *expected_index_oids_0[] = { void test_diff_iterator__index_0(void) { - index_iterator_test("attr", 17, expected_index_0, expected_index_oids_0); + index_iterator_test("attr", 23, expected_index_0, expected_index_oids_0); } static const char *expected_index_1[] = { @@ -284,7 +330,7 @@ static void workdir_iterator_test( } if (expected_names != NULL) - cl_assert_strequal(expected_names[count_all], entry->path); + cl_assert_equal_s(expected_names[count_all], entry->path); if (an_ignored_name && strcmp(an_ignored_name,entry->path)==0) cl_assert(ignored); diff --git a/tests-clar/diff/patch.c b/tests-clar/diff/patch.c new file mode 100644 index 000000000..05e748667 --- /dev/null +++ b/tests-clar/diff/patch.c @@ -0,0 +1,99 @@ +#include "clar_libgit2.h" +#include "diff_helpers.h" + +static git_repository *g_repo = NULL; + +void test_diff_patch__initialize(void) +{ + g_repo = cl_git_sandbox_init("status"); +} + +void test_diff_patch__cleanup(void) +{ + cl_git_sandbox_cleanup(); +} + +#define EXPECTED_HEADER "diff --git a/subdir.txt b/subdir.txt\n" \ + "deleted file mode 100644\n" \ + "index e8ee89e..0000000\n" \ + "--- a/subdir.txt\n" \ + "+++ /dev/null\n" + +#define EXPECTED_HUNK "@@ -1,2 +0,0 @@\n" + +static int check_removal_cb( + void *cb_data, + git_diff_delta *delta, + git_diff_range *range, + char line_origin, + const char *formatted_output, + size_t output_len) +{ + GIT_UNUSED(cb_data); + GIT_UNUSED(output_len); + + switch (line_origin) { + case GIT_DIFF_LINE_FILE_HDR: + cl_assert_equal_s(EXPECTED_HEADER, formatted_output); + cl_assert(range == NULL); + goto check_delta; + + case GIT_DIFF_LINE_HUNK_HDR: + cl_assert_equal_s(EXPECTED_HUNK, formatted_output); + /* Fall through */ + + case GIT_DIFF_LINE_CONTEXT: + case GIT_DIFF_LINE_DELETION: + goto check_range; + + default: + /* unexpected code path */ + return -1; + } + +check_range: + cl_assert(range != NULL); + cl_assert_equal_i(1, range->old_start); + cl_assert_equal_i(2, range->old_lines); + cl_assert_equal_i(0, range->new_start); + cl_assert_equal_i(0, range->new_lines); + +check_delta: + cl_assert_equal_s("subdir.txt", delta->old_file.path); + cl_assert_equal_s("subdir.txt", delta->new_file.path); + cl_assert_equal_i(GIT_DELTA_DELETED, delta->status); + + return 0; +} + +void test_diff_patch__can_properly_display_the_removal_of_a_file(void) +{ + /* + * $ git diff 26a125e..735b6a2 + * diff --git a/subdir.txt b/subdir.txt + * deleted file mode 100644 + * index e8ee89e..0000000 + * --- a/subdir.txt + * +++ /dev/null + * @@ -1,2 +0,0 @@ + * -Is it a bird? + * -Is it a plane? + */ + + const char *one_sha = "26a125e"; + const char *another_sha = "735b6a2"; + git_tree *one, *another; + git_diff_list *diff; + + one = resolve_commit_oid_to_tree(g_repo, one_sha); + another = resolve_commit_oid_to_tree(g_repo, another_sha); + + cl_git_pass(git_diff_tree_to_tree(g_repo, NULL, one, another, &diff)); + + cl_git_pass(git_diff_print_patch(diff, NULL, check_removal_cb)); + + git_diff_list_free(diff); + + git_tree_free(another); + git_tree_free(one); +} diff --git a/tests-clar/diff/tree.c b/tests-clar/diff/tree.c index 91e1343cc..1e269ae42 100644 --- a/tests-clar/diff/tree.c +++ b/tests-clar/diff/tree.c @@ -149,15 +149,15 @@ void test_diff_tree__options(void) diff, &actual, diff_file_fn, diff_hunk_fn, diff_line_fn)); expected = &test_expects[i]; - cl_assert_intequal(actual.files, expected->files); - cl_assert_intequal(actual.file_adds, expected->file_adds); - cl_assert_intequal(actual.file_dels, expected->file_dels); - cl_assert_intequal(actual.file_mods, expected->file_mods); - cl_assert_intequal(actual.hunks, expected->hunks); - cl_assert_intequal(actual.lines, expected->lines); - cl_assert_intequal(actual.line_ctxt, expected->line_ctxt); - cl_assert_intequal(actual.line_adds, expected->line_adds); - cl_assert_intequal(actual.line_dels, expected->line_dels); + cl_assert_equal_i(actual.files, expected->files); + cl_assert_equal_i(actual.file_adds, expected->file_adds); + cl_assert_equal_i(actual.file_dels, expected->file_dels); + cl_assert_equal_i(actual.file_mods, expected->file_mods); + cl_assert_equal_i(actual.hunks, expected->hunks); + cl_assert_equal_i(actual.lines, expected->lines); + cl_assert_equal_i(actual.line_ctxt, expected->line_ctxt); + cl_assert_equal_i(actual.line_adds, expected->line_adds); + cl_assert_equal_i(actual.line_dels, expected->line_dels); git_diff_list_free(diff); diff = NULL; diff --git a/tests-clar/diff/workdir.c b/tests-clar/diff/workdir.c index 9fefdbb03..1ea1af86a 100644 --- a/tests-clar/diff/workdir.c +++ b/tests-clar/diff/workdir.c @@ -37,19 +37,19 @@ void test_diff_workdir__to_index(void) * - git diff * - mv .git .gitted */ - cl_assert_intequal(12, exp.files); - cl_assert_intequal(0, exp.file_adds); - cl_assert_intequal(4, exp.file_dels); - cl_assert_intequal(4, exp.file_mods); - cl_assert_intequal(1, exp.file_ignored); - cl_assert_intequal(3, exp.file_untracked); + cl_assert_equal_i(12, exp.files); + cl_assert_equal_i(0, exp.file_adds); + cl_assert_equal_i(4, exp.file_dels); + cl_assert_equal_i(4, exp.file_mods); + cl_assert_equal_i(1, exp.file_ignored); + cl_assert_equal_i(3, exp.file_untracked); - cl_assert_intequal(8, exp.hunks); + cl_assert_equal_i(8, exp.hunks); - cl_assert_intequal(14, exp.lines); - cl_assert_intequal(5, exp.line_ctxt); - cl_assert_intequal(4, exp.line_adds); - cl_assert_intequal(5, exp.line_dels); + cl_assert_equal_i(14, exp.lines); + cl_assert_equal_i(5, exp.line_ctxt); + cl_assert_equal_i(4, exp.line_adds); + cl_assert_equal_i(5, exp.line_dels); git_diff_list_free(diff); } @@ -164,6 +164,79 @@ void test_diff_workdir__to_tree(void) git_tree_free(b); } +void test_diff_workdir__to_index_with_pathspec(void) +{ + git_diff_options opts = {0}; + git_diff_list *diff = NULL; + diff_expects exp; + char *pathspec = NULL; + + opts.context_lines = 3; + opts.interhunk_lines = 1; + opts.flags |= GIT_DIFF_INCLUDE_IGNORED | GIT_DIFF_INCLUDE_UNTRACKED; + opts.pathspec.strings = &pathspec; + opts.pathspec.count = 1; + + memset(&exp, 0, sizeof(exp)); + + cl_git_pass(git_diff_workdir_to_index(g_repo, &opts, &diff)); + cl_git_pass(git_diff_foreach(diff, &exp, diff_file_fn, NULL, NULL)); + + cl_assert_equal_i(12, exp.files); + cl_assert_equal_i(0, exp.file_adds); + cl_assert_equal_i(4, exp.file_dels); + cl_assert_equal_i(4, exp.file_mods); + cl_assert_equal_i(1, exp.file_ignored); + cl_assert_equal_i(3, exp.file_untracked); + + git_diff_list_free(diff); + + memset(&exp, 0, sizeof(exp)); + pathspec = "modified_file"; + + cl_git_pass(git_diff_workdir_to_index(g_repo, &opts, &diff)); + cl_git_pass(git_diff_foreach(diff, &exp, diff_file_fn, NULL, NULL)); + + cl_assert_equal_i(1, exp.files); + cl_assert_equal_i(0, exp.file_adds); + cl_assert_equal_i(0, exp.file_dels); + cl_assert_equal_i(1, exp.file_mods); + cl_assert_equal_i(0, exp.file_ignored); + cl_assert_equal_i(0, exp.file_untracked); + + git_diff_list_free(diff); + + memset(&exp, 0, sizeof(exp)); + pathspec = "subdir"; + + cl_git_pass(git_diff_workdir_to_index(g_repo, &opts, &diff)); + cl_git_pass(git_diff_foreach(diff, &exp, diff_file_fn, NULL, NULL)); + + cl_assert_equal_i(3, exp.files); + cl_assert_equal_i(0, exp.file_adds); + cl_assert_equal_i(1, exp.file_dels); + cl_assert_equal_i(1, exp.file_mods); + cl_assert_equal_i(0, exp.file_ignored); + cl_assert_equal_i(1, exp.file_untracked); + + git_diff_list_free(diff); + + memset(&exp, 0, sizeof(exp)); + pathspec = "*_deleted"; + + cl_git_pass(git_diff_workdir_to_index(g_repo, &opts, &diff)); + cl_git_pass(git_diff_foreach(diff, &exp, diff_file_fn, NULL, NULL)); + + cl_assert_equal_i(2, exp.files); + cl_assert_equal_i(0, exp.file_adds); + cl_assert_equal_i(2, exp.file_dels); + cl_assert_equal_i(0, exp.file_mods); + cl_assert_equal_i(0, exp.file_ignored); + cl_assert_equal_i(0, exp.file_untracked); + + git_diff_list_free(diff); +} + /* PREPARATION OF TEST DATA * * Since there is no command line equivalent of git_diff_workdir_to_tree, |