#include "clar_libgit2.h" #include "apply_helpers.h" struct iterator_compare_data { struct merge_index_entry *expected; size_t cnt; size_t idx; }; static int iterator_compare(const git_index_entry *entry, void *_data) { git_oid expected_id; struct iterator_compare_data *data = (struct iterator_compare_data *)_data; cl_assert_equal_i(GIT_INDEX_ENTRY_STAGE(entry), data->expected[data->idx].stage); cl_git_pass(git_oid_fromstr(&expected_id, data->expected[data->idx].oid_str)); cl_assert_equal_oid(&entry->id, &expected_id); cl_assert_equal_i(entry->mode, data->expected[data->idx].mode); cl_assert_equal_s(entry->path, data->expected[data->idx].path); if (data->idx >= data->cnt) return -1; data->idx++; return 0; } void validate_apply_workdir( git_repository *repo, struct merge_index_entry *workdir_entries, size_t workdir_cnt) { git_index *index; git_iterator *iterator; git_iterator_options opts = GIT_ITERATOR_OPTIONS_INIT; struct iterator_compare_data data = { workdir_entries, workdir_cnt }; opts.flags |= GIT_ITERATOR_INCLUDE_HASH; cl_git_pass(git_repository_index(&index, repo)); cl_git_pass(git_iterator_for_workdir(&iterator, repo, index, NULL, &opts)); cl_git_pass(git_iterator_foreach(iterator, iterator_compare, &data)); cl_assert_equal_i(data.idx, data.cnt); git_iterator_free(iterator); git_index_free(index); } void validate_apply_index( git_repository *repo, struct merge_index_entry *index_entries, size_t index_cnt) { git_index *index; git_iterator *iterator; struct iterator_compare_data data = { index_entries, index_cnt }; cl_git_pass(git_repository_index(&index, repo)); cl_git_pass(git_iterator_for_index(&iterator, repo, index, NULL)); cl_git_pass(git_iterator_foreach(iterator, iterator_compare, &data)); cl_assert_equal_i(data.idx, data.cnt); git_iterator_free(iterator); git_index_free(index); } static int iterator_eq(const git_index_entry **entry, void *_data) { GIT_UNUSED(_data); if (!entry[0] || !entry[1]) return -1; cl_assert_equal_i(GIT_INDEX_ENTRY_STAGE(entry[0]), GIT_INDEX_ENTRY_STAGE(entry[1])); cl_assert_equal_oid(&entry[0]->id, &entry[1]->id); cl_assert_equal_i(entry[0]->mode, entry[1]->mode); cl_assert_equal_s(entry[0]->path, entry[1]->path); return 0; } void validate_index_unchanged(git_repository *repo) { git_tree *head; git_index *index; git_iterator *head_iterator, *index_iterator, *iterators[2]; cl_git_pass(git_repository_head_tree(&head, repo)); cl_git_pass(git_repository_index(&index, repo)); cl_git_pass(git_iterator_for_tree(&head_iterator, head, NULL)); cl_git_pass(git_iterator_for_index(&index_iterator, repo, index, NULL)); iterators[0] = head_iterator; iterators[1] = index_iterator; cl_git_pass(git_iterator_walk(iterators, 2, iterator_eq, NULL)); git_iterator_free(head_iterator); git_iterator_free(index_iterator); git_tree_free(head); git_index_free(index); } void validate_workdir_unchanged(git_repository *repo) { git_tree *head; git_index *index; git_iterator *head_iterator, *workdir_iterator, *iterators[2]; git_iterator_options workdir_opts = GIT_ITERATOR_OPTIONS_INIT; cl_git_pass(git_repository_head_tree(&head, repo)); cl_git_pass(git_repository_index(&index, repo)); workdir_opts.flags |= GIT_ITERATOR_INCLUDE_HASH; cl_git_pass(git_iterator_for_tree(&head_iterator, head, NULL)); cl_git_pass(git_iterator_for_workdir(&workdir_iterator, repo, index, NULL, &workdir_opts)); iterators[0] = head_iterator; iterators[1] = workdir_iterator; cl_git_pass(git_iterator_walk(iterators, 2, iterator_eq, NULL)); git_iterator_free(head_iterator); git_iterator_free(workdir_iterator); git_tree_free(head); git_index_free(index); }