Blame tests/iterator/iterator_helpers.c

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