#include "clar_libgit2.h" #include "iterator.h" #include "repository.h" #include "fileops.h" #include "iterator_helpers.h" #include static void assert_at_end(git_iterator *i, bool verbose) { const git_index_entry *end; int error = git_iterator_advance(&end, i); if (verbose && error != GIT_ITEROVER) fprintf(stderr, "Expected end of iterator, got '%s'\n", end->path); cl_git_fail_with(GIT_ITEROVER, error); } void expect_iterator_items( git_iterator *i, size_t expected_flat, const char **expected_flat_paths, size_t expected_total, const char **expected_total_paths) { const git_index_entry *entry; size_t count; int no_trees = !(git_iterator_flags(i) & GIT_ITERATOR_INCLUDE_TREES); bool v = false; int error; if (v) fprintf(stderr, "== %s ==\n", no_trees ? "notrees" : "trees"); count = 0; while (!git_iterator_advance(&entry, i)) { if (v) fprintf(stderr, " %s %07o\n", entry->path, (int)entry->mode); if (no_trees) cl_assert(entry->mode != GIT_FILEMODE_TREE); if (expected_flat_paths) { const char *expect_path = expected_flat_paths[count]; size_t expect_len = strlen(expect_path); cl_assert_equal_s(expect_path, entry->path); if (expect_path[expect_len - 1] == '/') cl_assert_equal_i(GIT_FILEMODE_TREE, entry->mode); else cl_assert(entry->mode != GIT_FILEMODE_TREE); } cl_assert(++count <= expected_flat); } assert_at_end(i, v); cl_assert_equal_i(expected_flat, count); cl_git_pass(git_iterator_reset(i)); count = 0; cl_git_pass(git_iterator_current(&entry, i)); if (v) fprintf(stderr, "-- %s --\n", no_trees ? "notrees" : "trees"); while (entry != NULL) { if (v) fprintf(stderr, " %s %07o\n", entry->path, (int)entry->mode); if (no_trees) cl_assert(entry->mode != GIT_FILEMODE_TREE); if (expected_total_paths) { const char *expect_path = expected_total_paths[count]; size_t expect_len = strlen(expect_path); cl_assert_equal_s(expect_path, entry->path); if (expect_path[expect_len - 1] == '/') cl_assert_equal_i(GIT_FILEMODE_TREE, entry->mode); else cl_assert(entry->mode != GIT_FILEMODE_TREE); } if (entry->mode == GIT_FILEMODE_TREE) { error = git_iterator_advance_into(&entry, i); /* could return NOTFOUND if directory is empty */ cl_assert(!error || error == GIT_ENOTFOUND); if (error == GIT_ENOTFOUND) { error = git_iterator_advance(&entry, i); cl_assert(!error || error == GIT_ITEROVER); } } else { error = git_iterator_advance(&entry, i); cl_assert(!error || error == GIT_ITEROVER); } if (++count >= expected_total) break; } assert_at_end(i, v); cl_assert_equal_i(expected_total, count); } void expect_advance_over( git_iterator *i, const char *expected_path, git_iterator_status_t expected_status) { const git_index_entry *entry; git_iterator_status_t status; int error; cl_git_pass(git_iterator_current(&entry, i)); cl_assert_equal_s(expected_path, entry->path); error = git_iterator_advance_over(&entry, &status, i); cl_assert(!error || error == GIT_ITEROVER); cl_assert_equal_i(expected_status, status); } void expect_advance_into( git_iterator *i, const char *expected_path) { const git_index_entry *entry; int error; cl_git_pass(git_iterator_current(&entry, i)); cl_assert_equal_s(expected_path, entry->path); if (S_ISDIR(entry->mode)) error = git_iterator_advance_into(&entry, i); else error = git_iterator_advance(&entry, i); cl_assert(!error || error == GIT_ITEROVER); }