Blame tests/iterator/index.c

Packit ae9e2a
#include "clar_libgit2.h"
Packit ae9e2a
#include "iterator.h"
Packit ae9e2a
#include "repository.h"
Packit ae9e2a
#include "fileops.h"
Packit ae9e2a
#include "iterator_helpers.h"
Packit ae9e2a
#include "../submodule/submodule_helpers.h"
Packit ae9e2a
#include <stdarg.h>
Packit ae9e2a
Packit ae9e2a
static git_repository *g_repo;
Packit ae9e2a
Packit ae9e2a
void test_iterator_index__initialize(void)
Packit ae9e2a
{
Packit ae9e2a
}
Packit ae9e2a
Packit ae9e2a
void test_iterator_index__cleanup(void)
Packit ae9e2a
{
Packit ae9e2a
	cl_git_sandbox_cleanup();
Packit ae9e2a
	g_repo = NULL;
Packit ae9e2a
}
Packit ae9e2a
Packit ae9e2a
static void index_iterator_test(
Packit ae9e2a
	const char *sandbox,
Packit ae9e2a
	const char *start,
Packit ae9e2a
	const char *end,
Packit ae9e2a
	git_iterator_flag_t flags,
Packit ae9e2a
	int expected_count,
Packit ae9e2a
	const char **expected_names,
Packit ae9e2a
	const char **expected_oids)
Packit ae9e2a
{
Packit ae9e2a
	git_index *index;
Packit ae9e2a
	git_iterator *i;
Packit ae9e2a
	const git_index_entry *entry;
Packit ae9e2a
	int error, count = 0, caps;
Packit ae9e2a
	git_iterator_options iter_opts = GIT_ITERATOR_OPTIONS_INIT;
Packit ae9e2a
Packit ae9e2a
	g_repo = cl_git_sandbox_init(sandbox);
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_repository_index(&index, g_repo));
Packit ae9e2a
	caps = git_index_caps(index);
Packit ae9e2a
Packit ae9e2a
	iter_opts.flags = flags;
Packit ae9e2a
	iter_opts.start = start;
Packit ae9e2a
	iter_opts.end = end;
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_iterator_for_index(&i, g_repo, index, &iter_opts));
Packit ae9e2a
Packit ae9e2a
	while (!(error = git_iterator_advance(&entry, i))) {
Packit ae9e2a
		cl_assert(entry);
Packit ae9e2a
Packit ae9e2a
		if (expected_names != NULL)
Packit ae9e2a
			cl_assert_equal_s(expected_names[count], entry->path);
Packit ae9e2a
Packit ae9e2a
		if (expected_oids != NULL) {
Packit ae9e2a
			git_oid oid;
Packit ae9e2a
			cl_git_pass(git_oid_fromstr(&oid, expected_oids[count]));
Packit ae9e2a
			cl_assert_equal_oid(&oid, &entry->id);
Packit ae9e2a
		}
Packit ae9e2a
Packit ae9e2a
		count++;
Packit ae9e2a
	}
Packit ae9e2a
Packit ae9e2a
	cl_assert_equal_i(GIT_ITEROVER, error);
Packit ae9e2a
	cl_assert(!entry);
Packit ae9e2a
	cl_assert_equal_i(expected_count, count);
Packit ae9e2a
Packit ae9e2a
	git_iterator_free(i);
Packit ae9e2a
Packit ae9e2a
	cl_assert(caps == git_index_caps(index));
Packit ae9e2a
	git_index_free(index);
Packit ae9e2a
}
Packit ae9e2a
Packit ae9e2a
static const char *expected_index_0[] = {
Packit ae9e2a
	"attr0",
Packit ae9e2a
	"attr1",
Packit ae9e2a
	"attr2",
Packit ae9e2a
	"attr3",
Packit ae9e2a
	"binfile",
Packit ae9e2a
	"gitattributes",
Packit ae9e2a
	"macro_bad",
Packit ae9e2a
	"macro_test",
Packit ae9e2a
	"root_test1",
Packit ae9e2a
	"root_test2",
Packit ae9e2a
	"root_test3",
Packit ae9e2a
	"root_test4.txt",
Packit ae9e2a
	"sub/abc",
Packit ae9e2a
	"sub/file",
Packit ae9e2a
	"sub/sub/file",
Packit ae9e2a
	"sub/sub/subsub.txt",
Packit ae9e2a
	"sub/subdir_test1",
Packit ae9e2a
	"sub/subdir_test2.txt",
Packit ae9e2a
	"subdir/.gitattributes",
Packit ae9e2a
	"subdir/abc",
Packit ae9e2a
	"subdir/subdir_test1",
Packit ae9e2a
	"subdir/subdir_test2.txt",
Packit ae9e2a
	"subdir2/subdir2_test1",
Packit ae9e2a
};
Packit ae9e2a
Packit ae9e2a
static const char *expected_index_oids_0[] = {
Packit ae9e2a
	"556f8c827b8e4a02ad5cab77dca2bcb3e226b0b3",
Packit ae9e2a
	"3b74db7ab381105dc0d28f8295a77f6a82989292",
Packit ae9e2a
	"2c66e14f77196ea763fb1e41612c1aa2bc2d8ed2",
Packit ae9e2a
	"c485abe35abd4aa6fd83b076a78bbea9e2e7e06c",
Packit ae9e2a
	"d800886d9c86731ae5c4a62b0b77c437015e00d2",
Packit ae9e2a
	"2b40c5aca159b04ea8d20ffe36cdf8b09369b14a",
Packit ae9e2a
	"5819a185d77b03325aaf87cafc771db36f6ddca7",
Packit ae9e2a
	"ff69f8639ce2e6010b3f33a74160aad98b48da2b",
Packit ae9e2a
	"45141a79a77842c59a63229403220a4e4be74e3d",
Packit ae9e2a
	"4d713dc48e6b1bd75b0d61ad078ba9ca3a56745d",
Packit ae9e2a
	"108bb4e7fd7b16490dc33ff7d972151e73d7166e",
Packit ae9e2a
	"a0f7217ae99f5ac3e88534f5cea267febc5fa85b",
Packit ae9e2a
	"3e42ffc54a663f9401cc25843d6c0e71a33e4249",
Packit ae9e2a
	"45b983be36b73c0788dc9cbcb76cbb80fc7bb057",
Packit ae9e2a
	"45b983be36b73c0788dc9cbcb76cbb80fc7bb057",
Packit ae9e2a
	"9e5bdc47d6a80f2be0ea3049ad74231b94609242",
Packit ae9e2a
	"e563cf4758f0d646f1b14b76016aa17fa9e549a4",
Packit ae9e2a
	"fb5067b1aef3ac1ada4b379dbcb7d17255df7d78",
Packit ae9e2a
	"99eae476896f4907224978b88e5ecaa6c5bb67a9",
Packit ae9e2a
	"3e42ffc54a663f9401cc25843d6c0e71a33e4249",
Packit ae9e2a
	"e563cf4758f0d646f1b14b76016aa17fa9e549a4",
Packit ae9e2a
	"fb5067b1aef3ac1ada4b379dbcb7d17255df7d78",
Packit ae9e2a
	"dccada462d3df8ac6de596fb8c896aba9344f941"
Packit ae9e2a
};
Packit ae9e2a
Packit ae9e2a
void test_iterator_index__0(void)
Packit ae9e2a
{
Packit ae9e2a
	index_iterator_test(
Packit ae9e2a
		"attr", NULL, NULL, 0, ARRAY_SIZE(expected_index_0),
Packit ae9e2a
		expected_index_0, expected_index_oids_0);
Packit ae9e2a
}
Packit ae9e2a
Packit ae9e2a
static const char *expected_index_1[] = {
Packit ae9e2a
	"current_file",
Packit ae9e2a
	"file_deleted",
Packit ae9e2a
	"modified_file",
Packit ae9e2a
	"staged_changes",
Packit ae9e2a
	"staged_changes_file_deleted",
Packit ae9e2a
	"staged_changes_modified_file",
Packit ae9e2a
	"staged_new_file",
Packit ae9e2a
	"staged_new_file_deleted_file",
Packit ae9e2a
	"staged_new_file_modified_file",
Packit ae9e2a
	"subdir.txt",
Packit ae9e2a
	"subdir/current_file",
Packit ae9e2a
	"subdir/deleted_file",
Packit ae9e2a
	"subdir/modified_file",
Packit ae9e2a
};
Packit ae9e2a
Packit ae9e2a
static const char* expected_index_oids_1[] = {
Packit ae9e2a
	"a0de7e0ac200c489c41c59dfa910154a70264e6e",
Packit ae9e2a
	"5452d32f1dd538eb0405e8a83cc185f79e25e80f",
Packit ae9e2a
	"452e4244b5d083ddf0460acf1ecc74db9dcfa11a",
Packit ae9e2a
	"55d316c9ba708999f1918e9677d01dfcae69c6b9",
Packit ae9e2a
	"a6be623522ce87a1d862128ac42672604f7b468b",
Packit ae9e2a
	"906ee7711f4f4928ddcb2a5f8fbc500deba0d2a8",
Packit ae9e2a
	"529a16e8e762d4acb7b9636ff540a00831f9155a",
Packit ae9e2a
	"90b8c29d8ba39434d1c63e1b093daaa26e5bd972",
Packit ae9e2a
	"ed062903b8f6f3dccb2fa81117ba6590944ef9bd",
Packit ae9e2a
	"e8ee89e15bbe9b20137715232387b3de5b28972e",
Packit ae9e2a
	"53ace0d1cc1145a5f4fe4f78a186a60263190733",
Packit ae9e2a
	"1888c805345ba265b0ee9449b8877b6064592058",
Packit ae9e2a
	"a6191982709b746d5650e93c2acf34ef74e11504"
Packit ae9e2a
};
Packit ae9e2a
Packit ae9e2a
void test_iterator_index__1(void)
Packit ae9e2a
{
Packit ae9e2a
	index_iterator_test(
Packit ae9e2a
		"status", NULL, NULL, 0, ARRAY_SIZE(expected_index_1),
Packit ae9e2a
		expected_index_1, expected_index_oids_1);
Packit ae9e2a
}
Packit ae9e2a
Packit ae9e2a
static const char *expected_index_range[] = {
Packit ae9e2a
	"root_test1",
Packit ae9e2a
	"root_test2",
Packit ae9e2a
	"root_test3",
Packit ae9e2a
	"root_test4.txt",
Packit ae9e2a
};
Packit ae9e2a
Packit ae9e2a
static const char *expected_index_oids_range[] = {
Packit ae9e2a
	"45141a79a77842c59a63229403220a4e4be74e3d",
Packit ae9e2a
	"4d713dc48e6b1bd75b0d61ad078ba9ca3a56745d",
Packit ae9e2a
	"108bb4e7fd7b16490dc33ff7d972151e73d7166e",
Packit ae9e2a
	"a0f7217ae99f5ac3e88534f5cea267febc5fa85b",
Packit ae9e2a
};
Packit ae9e2a
Packit ae9e2a
void test_iterator_index__range(void)
Packit ae9e2a
{
Packit ae9e2a
	index_iterator_test(
Packit ae9e2a
		"attr", "root", "root", 0, ARRAY_SIZE(expected_index_range),
Packit ae9e2a
		expected_index_range, expected_index_oids_range);
Packit ae9e2a
}
Packit ae9e2a
Packit ae9e2a
void test_iterator_index__range_empty_0(void)
Packit ae9e2a
{
Packit ae9e2a
	index_iterator_test(
Packit ae9e2a
		"attr", "empty", "empty", 0, 0, NULL, NULL);
Packit ae9e2a
}
Packit ae9e2a
Packit ae9e2a
void test_iterator_index__range_empty_1(void)
Packit ae9e2a
{
Packit ae9e2a
	index_iterator_test(
Packit ae9e2a
		"attr", "z_empty_after", NULL, 0, 0, NULL, NULL);
Packit ae9e2a
}
Packit ae9e2a
Packit ae9e2a
void test_iterator_index__range_empty_2(void)
Packit ae9e2a
{
Packit ae9e2a
	index_iterator_test(
Packit ae9e2a
		"attr", NULL, ".aaa_empty_before", 0, 0, NULL, NULL);
Packit ae9e2a
}
Packit ae9e2a
Packit ae9e2a
static void check_index_range(
Packit ae9e2a
	git_repository *repo,
Packit ae9e2a
	const char *start,
Packit ae9e2a
	const char *end,
Packit ae9e2a
	bool ignore_case,
Packit ae9e2a
	int expected_count)
Packit ae9e2a
{
Packit ae9e2a
	git_index *index;
Packit ae9e2a
	git_iterator *i;
Packit ae9e2a
	git_iterator_options i_opts = GIT_ITERATOR_OPTIONS_INIT;
Packit ae9e2a
	int error, count, caps;
Packit ae9e2a
	bool is_ignoring_case;
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_repository_index(&index, repo));
Packit ae9e2a
Packit ae9e2a
	caps = git_index_caps(index);
Packit ae9e2a
	is_ignoring_case = ((caps & GIT_INDEXCAP_IGNORE_CASE) != 0);
Packit ae9e2a
Packit ae9e2a
	if (ignore_case != is_ignoring_case)
Packit ae9e2a
		cl_git_pass(git_index_set_caps(index, caps ^ GIT_INDEXCAP_IGNORE_CASE));
Packit ae9e2a
Packit ae9e2a
	i_opts.flags = 0;
Packit ae9e2a
	i_opts.start = start;
Packit ae9e2a
	i_opts.end = end;
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_iterator_for_index(&i, repo, index, &i_opts));
Packit ae9e2a
Packit ae9e2a
	cl_assert(git_iterator_ignore_case(i) == ignore_case);
Packit ae9e2a
Packit ae9e2a
	for (count = 0; !(error = git_iterator_advance(NULL, i)); ++count)
Packit ae9e2a
		/* count em up */;
Packit ae9e2a
Packit ae9e2a
	cl_assert_equal_i(GIT_ITEROVER, error);
Packit ae9e2a
	cl_assert_equal_i(expected_count, count);
Packit ae9e2a
Packit ae9e2a
	git_iterator_free(i);
Packit ae9e2a
	git_index_free(index);
Packit ae9e2a
}
Packit ae9e2a
Packit ae9e2a
void test_iterator_index__range_icase(void)
Packit ae9e2a
{
Packit ae9e2a
	git_index *index;
Packit ae9e2a
	git_tree *head;
Packit ae9e2a
Packit ae9e2a
	g_repo = cl_git_sandbox_init("testrepo");
Packit ae9e2a
Packit ae9e2a
	/* reset index to match HEAD */
Packit ae9e2a
	cl_git_pass(git_repository_head_tree(&head, g_repo));
Packit ae9e2a
	cl_git_pass(git_repository_index(&index, g_repo));
Packit ae9e2a
	cl_git_pass(git_index_read_tree(index, head));
Packit ae9e2a
	cl_git_pass(git_index_write(index));
Packit ae9e2a
	git_tree_free(head);
Packit ae9e2a
	git_index_free(index);
Packit ae9e2a
Packit ae9e2a
	/* do some ranged iterator checks toggling case sensitivity */
Packit ae9e2a
	check_index_range(g_repo, "B", "C", false, 0);
Packit ae9e2a
	check_index_range(g_repo, "B", "C", true, 1);
Packit ae9e2a
	check_index_range(g_repo, "a", "z", false, 3);
Packit ae9e2a
	check_index_range(g_repo, "a", "z", true, 4);
Packit ae9e2a
}
Packit ae9e2a
Packit ae9e2a
static const char *expected_index_cs[] = {
Packit ae9e2a
	"B", "D", "F", "H", "J", "L/1", "L/B", "L/D", "L/a", "L/c",
Packit ae9e2a
	"a", "c", "e", "g", "i", "k/1", "k/B", "k/D", "k/a", "k/c",
Packit ae9e2a
};
Packit ae9e2a
Packit ae9e2a
static const char *expected_index_ci[] = {
Packit ae9e2a
	"a", "B", "c", "D", "e", "F", "g", "H", "i", "J",
Packit ae9e2a
	"k/1", "k/a", "k/B", "k/c", "k/D", "L/1", "L/a", "L/B", "L/c", "L/D",
Packit ae9e2a
};
Packit ae9e2a
Packit ae9e2a
void test_iterator_index__case_folding(void)
Packit ae9e2a
{
Packit ae9e2a
	git_buf path = GIT_BUF_INIT;
Packit ae9e2a
	int fs_is_ci = 0;
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_buf_joinpath(&path, cl_fixture("icase"), ".gitted/CoNfIg"));
Packit ae9e2a
	fs_is_ci = git_path_exists(path.ptr);
Packit ae9e2a
	git_buf_free(&path);
Packit ae9e2a
Packit ae9e2a
	index_iterator_test(
Packit ae9e2a
		"icase", NULL, NULL, 0, ARRAY_SIZE(expected_index_cs),
Packit ae9e2a
		fs_is_ci ? expected_index_ci : expected_index_cs, NULL);
Packit ae9e2a
Packit ae9e2a
	cl_git_sandbox_cleanup();
Packit ae9e2a
Packit ae9e2a
	index_iterator_test(
Packit ae9e2a
		"icase", NULL, NULL, GIT_ITERATOR_IGNORE_CASE,
Packit ae9e2a
		ARRAY_SIZE(expected_index_ci), expected_index_ci, NULL);
Packit ae9e2a
Packit ae9e2a
	cl_git_sandbox_cleanup();
Packit ae9e2a
Packit ae9e2a
	index_iterator_test(
Packit ae9e2a
		"icase", NULL, NULL, GIT_ITERATOR_DONT_IGNORE_CASE,
Packit ae9e2a
		ARRAY_SIZE(expected_index_cs), expected_index_cs, NULL);
Packit ae9e2a
}
Packit ae9e2a
Packit ae9e2a
/* Index contents (including pseudotrees):
Packit ae9e2a
 *
Packit ae9e2a
 * 0: a     5: F     10: k/      16: L/
Packit ae9e2a
 * 1: B     6: g     11: k/1     17: L/1
Packit ae9e2a
 * 2: c     7: H     12: k/a     18: L/a
Packit ae9e2a
 * 3: D     8: i     13: k/B     19: L/B
Packit ae9e2a
 * 4: e     9: J     14: k/c     20: L/c
Packit ae9e2a
 *                   15: k/D     21: L/D
Packit ae9e2a
 *
Packit ae9e2a
 * 0: B     5: L/    11: a       16: k/
Packit ae9e2a
 * 1: D     6: L/1   12: c       17: k/1
Packit ae9e2a
 * 2: F     7: L/B   13: e       18: k/B
Packit ae9e2a
 * 3: H     8: L/D   14: g       19: k/D
Packit ae9e2a
 * 4: J     9: L/a   15: i       20: k/a
Packit ae9e2a
 *         10: L/c               21: k/c
Packit ae9e2a
 */
Packit ae9e2a
Packit ae9e2a
void test_iterator_index__icase_0(void)
Packit ae9e2a
{
Packit ae9e2a
	git_iterator *i;
Packit ae9e2a
	git_iterator_options i_opts = GIT_ITERATOR_OPTIONS_INIT;
Packit ae9e2a
	git_index *index;
Packit ae9e2a
Packit ae9e2a
	g_repo = cl_git_sandbox_init("icase");
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_repository_index(&index, g_repo));
Packit ae9e2a
Packit ae9e2a
	/* autoexpand with no tree entries for index */
Packit ae9e2a
	cl_git_pass(git_iterator_for_index(&i, g_repo, index, NULL));
Packit ae9e2a
	expect_iterator_items(i, 20, NULL, 20, NULL);
Packit ae9e2a
	git_iterator_free(i);
Packit ae9e2a
Packit ae9e2a
	/* auto expand with tree entries */
Packit ae9e2a
	i_opts.flags = GIT_ITERATOR_INCLUDE_TREES;
Packit ae9e2a
	cl_git_pass(git_iterator_for_index(&i, g_repo, index, &i_opts));
Packit ae9e2a
	expect_iterator_items(i, 22, NULL, 22, NULL);
Packit ae9e2a
	git_iterator_free(i);
Packit ae9e2a
Packit ae9e2a
	/* no auto expand (implies trees included) */
Packit ae9e2a
	i_opts.flags = GIT_ITERATOR_DONT_AUTOEXPAND;
Packit ae9e2a
	cl_git_pass(git_iterator_for_index(&i, g_repo, index, &i_opts));
Packit ae9e2a
	expect_iterator_items(i, 12, NULL, 22, NULL);
Packit ae9e2a
	git_iterator_free(i);
Packit ae9e2a
Packit ae9e2a
	git_index_free(index);
Packit ae9e2a
}
Packit ae9e2a
Packit ae9e2a
void test_iterator_index__icase_1(void)
Packit ae9e2a
{
Packit ae9e2a
	git_iterator *i;
Packit ae9e2a
	git_iterator_options i_opts = GIT_ITERATOR_OPTIONS_INIT;
Packit ae9e2a
	git_index *index;
Packit ae9e2a
	int caps;
Packit ae9e2a
Packit ae9e2a
	g_repo = cl_git_sandbox_init("icase");
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_repository_index(&index, g_repo));
Packit ae9e2a
	caps = git_index_caps(index);
Packit ae9e2a
Packit ae9e2a
	/* force case sensitivity */
Packit ae9e2a
	cl_git_pass(git_index_set_caps(index, caps & ~GIT_INDEXCAP_IGNORE_CASE));
Packit ae9e2a
Packit ae9e2a
	/* autoexpand with no tree entries over range */
Packit ae9e2a
	i_opts.start = "c";
Packit ae9e2a
	i_opts.end = "k/D";
Packit ae9e2a
	cl_git_pass(git_iterator_for_index(&i, g_repo, index, &i_opts));
Packit ae9e2a
	expect_iterator_items(i, 7, NULL, 7, NULL);
Packit ae9e2a
	git_iterator_free(i);
Packit ae9e2a
Packit ae9e2a
	i_opts.start = "k";
Packit ae9e2a
	i_opts.end = "k/Z";
Packit ae9e2a
	cl_git_pass(git_iterator_for_index(&i, g_repo, index, &i_opts));
Packit ae9e2a
	expect_iterator_items(i, 3, NULL, 3, NULL);
Packit ae9e2a
	git_iterator_free(i);
Packit ae9e2a
Packit ae9e2a
	/* auto expand with tree entries */
Packit ae9e2a
	i_opts.flags = GIT_ITERATOR_INCLUDE_TREES;
Packit ae9e2a
Packit ae9e2a
	i_opts.start = "c";
Packit ae9e2a
	i_opts.end = "k/D";
Packit ae9e2a
	cl_git_pass(git_iterator_for_index(&i, g_repo, index, &i_opts));
Packit ae9e2a
	expect_iterator_items(i, 8, NULL, 8, NULL);
Packit ae9e2a
	git_iterator_free(i);
Packit ae9e2a
Packit ae9e2a
	i_opts.start = "k";
Packit ae9e2a
	i_opts.end = "k/Z";
Packit ae9e2a
	cl_git_pass(git_iterator_for_index(&i, g_repo, index, &i_opts));
Packit ae9e2a
	expect_iterator_items(i, 4, NULL, 4, NULL);
Packit ae9e2a
	git_iterator_free(i);
Packit ae9e2a
Packit ae9e2a
	/* no auto expand (implies trees included) */
Packit ae9e2a
	i_opts.flags = GIT_ITERATOR_DONT_AUTOEXPAND;
Packit ae9e2a
Packit ae9e2a
	i_opts.start = "c";
Packit ae9e2a
	i_opts.end = "k/D";
Packit ae9e2a
	cl_git_pass(git_iterator_for_index(&i, g_repo, index, &i_opts));
Packit ae9e2a
	expect_iterator_items(i, 5, NULL, 8, NULL);
Packit ae9e2a
	git_iterator_free(i);
Packit ae9e2a
Packit ae9e2a
	i_opts.start = "k";
Packit ae9e2a
	i_opts.end = "k/Z";
Packit ae9e2a
	cl_git_pass(git_iterator_for_index(&i, g_repo, index, &i_opts));
Packit ae9e2a
	expect_iterator_items(i, 1, NULL, 4, NULL);
Packit ae9e2a
	git_iterator_free(i);
Packit ae9e2a
Packit ae9e2a
	/* force case insensitivity */
Packit ae9e2a
	cl_git_pass(git_index_set_caps(index, caps | GIT_INDEXCAP_IGNORE_CASE));
Packit ae9e2a
Packit ae9e2a
	/* autoexpand with no tree entries over range */
Packit ae9e2a
	i_opts.flags = 0;
Packit ae9e2a
Packit ae9e2a
	i_opts.start = "c";
Packit ae9e2a
	i_opts.end = "k/D";
Packit ae9e2a
	cl_git_pass(git_iterator_for_index(&i, g_repo, index, &i_opts));
Packit ae9e2a
	expect_iterator_items(i, 13, NULL, 13, NULL);
Packit ae9e2a
	git_iterator_free(i);
Packit ae9e2a
Packit ae9e2a
	i_opts.start = "k";
Packit ae9e2a
	i_opts.end = "k/Z";
Packit ae9e2a
	cl_git_pass(git_iterator_for_index(&i, g_repo, index, &i_opts));
Packit ae9e2a
	expect_iterator_items(i, 5, NULL, 5, NULL);
Packit ae9e2a
	git_iterator_free(i);
Packit ae9e2a
Packit ae9e2a
	/* auto expand with tree entries */
Packit ae9e2a
	i_opts.flags = GIT_ITERATOR_INCLUDE_TREES;
Packit ae9e2a
Packit ae9e2a
	i_opts.start = "c";
Packit ae9e2a
	i_opts.end = "k/D";
Packit ae9e2a
	cl_git_pass(git_iterator_for_index(&i, g_repo, index, &i_opts));
Packit ae9e2a
	expect_iterator_items(i, 14, NULL, 14, NULL);
Packit ae9e2a
	git_iterator_free(i);
Packit ae9e2a
Packit ae9e2a
	i_opts.start = "k";
Packit ae9e2a
	i_opts.end = "k/Z";
Packit ae9e2a
	cl_git_pass(git_iterator_for_index(&i, g_repo, index, &i_opts));
Packit ae9e2a
	expect_iterator_items(i, 6, NULL, 6, NULL);
Packit ae9e2a
	git_iterator_free(i);
Packit ae9e2a
Packit ae9e2a
	/* no auto expand (implies trees included) */
Packit ae9e2a
	i_opts.flags = GIT_ITERATOR_DONT_AUTOEXPAND;
Packit ae9e2a
Packit ae9e2a
	i_opts.start = "c";
Packit ae9e2a
	i_opts.end = "k/D";
Packit ae9e2a
	cl_git_pass(git_iterator_for_index(&i, g_repo, index, &i_opts));
Packit ae9e2a
	expect_iterator_items(i, 9, NULL, 14, NULL);
Packit ae9e2a
	git_iterator_free(i);
Packit ae9e2a
Packit ae9e2a
	i_opts.start = "k";
Packit ae9e2a
	i_opts.end = "k/Z";
Packit ae9e2a
	cl_git_pass(git_iterator_for_index(&i, g_repo, index, &i_opts));
Packit ae9e2a
	expect_iterator_items(i, 1, NULL, 6, NULL);
Packit ae9e2a
	git_iterator_free(i);
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_index_set_caps(index, caps));
Packit ae9e2a
	git_index_free(index);
Packit ae9e2a
}
Packit ae9e2a
Packit ae9e2a
void test_iterator_index__pathlist(void)
Packit ae9e2a
{
Packit ae9e2a
	git_iterator *i;
Packit ae9e2a
	git_iterator_options i_opts = GIT_ITERATOR_OPTIONS_INIT;
Packit ae9e2a
	git_index *index;
Packit ae9e2a
	git_vector filelist;
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_vector_init(&filelist, 100, &git__strcmp_cb));
Packit ae9e2a
	cl_git_pass(git_vector_insert(&filelist, "a"));
Packit ae9e2a
	cl_git_pass(git_vector_insert(&filelist, "B"));
Packit ae9e2a
	cl_git_pass(git_vector_insert(&filelist, "c"));
Packit ae9e2a
	cl_git_pass(git_vector_insert(&filelist, "D"));
Packit ae9e2a
	cl_git_pass(git_vector_insert(&filelist, "e"));
Packit ae9e2a
	cl_git_pass(git_vector_insert(&filelist, "k/1"));
Packit ae9e2a
	cl_git_pass(git_vector_insert(&filelist, "k/a"));
Packit ae9e2a
	cl_git_pass(git_vector_insert(&filelist, "L/1"));
Packit ae9e2a
Packit ae9e2a
	g_repo = cl_git_sandbox_init("icase");
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_repository_index(&index, g_repo));
Packit ae9e2a
Packit ae9e2a
	i_opts.pathlist.strings = (char **)filelist.contents;
Packit ae9e2a
	i_opts.pathlist.count = filelist.length;
Packit ae9e2a
Packit ae9e2a
	/* Case sensitive */
Packit ae9e2a
	{
Packit ae9e2a
		const char *expected[] = {
Packit ae9e2a
			"B", "D", "L/1", "a", "c", "e", "k/1", "k/a" };
Packit ae9e2a
		size_t expected_len = 8;
Packit ae9e2a
Packit ae9e2a
		i_opts.start = NULL;
Packit ae9e2a
		i_opts.end = NULL;
Packit ae9e2a
		i_opts.flags = GIT_ITERATOR_DONT_IGNORE_CASE;
Packit ae9e2a
Packit ae9e2a
		cl_git_pass(git_iterator_for_index(&i, g_repo, index, &i_opts));
Packit ae9e2a
		expect_iterator_items(i, expected_len, expected, expected_len, expected);
Packit ae9e2a
		git_iterator_free(i);
Packit ae9e2a
	}
Packit ae9e2a
Packit ae9e2a
	/* Case INsensitive */
Packit ae9e2a
	{
Packit ae9e2a
		const char *expected[] = {
Packit ae9e2a
			"a", "B", "c", "D", "e", "k/1", "k/a", "L/1" };
Packit ae9e2a
		size_t expected_len = 8;
Packit ae9e2a
Packit ae9e2a
		i_opts.start = NULL;
Packit ae9e2a
		i_opts.end = NULL;
Packit ae9e2a
		i_opts.flags = GIT_ITERATOR_IGNORE_CASE;
Packit ae9e2a
Packit ae9e2a
		cl_git_pass(git_iterator_for_index(&i, g_repo, index, &i_opts));
Packit ae9e2a
		expect_iterator_items(i, expected_len, expected, expected_len, expected);
Packit ae9e2a
		git_iterator_free(i);
Packit ae9e2a
	}
Packit ae9e2a
Packit ae9e2a
	/* Set a start, but no end.  Case sensitive. */
Packit ae9e2a
	{
Packit ae9e2a
		const char *expected[] = { "c", "e", "k/1", "k/a" };
Packit ae9e2a
		size_t expected_len = 4;
Packit ae9e2a
Packit ae9e2a
		i_opts.start = "c";
Packit ae9e2a
		i_opts.end = NULL;
Packit ae9e2a
		i_opts.flags = GIT_ITERATOR_DONT_IGNORE_CASE;
Packit ae9e2a
Packit ae9e2a
		cl_git_pass(git_iterator_for_index(&i, g_repo, index, &i_opts));
Packit ae9e2a
		expect_iterator_items(i, expected_len, expected, expected_len, expected);
Packit ae9e2a
		git_iterator_free(i);
Packit ae9e2a
	}
Packit ae9e2a
Packit ae9e2a
	/* Set a start, but no end.  Case INsensitive. */
Packit ae9e2a
	{
Packit ae9e2a
		const char *expected[] = { "c", "D", "e", "k/1", "k/a", "L/1" };
Packit ae9e2a
		size_t expected_len = 6;
Packit ae9e2a
Packit ae9e2a
		i_opts.start = "c";
Packit ae9e2a
		i_opts.end = NULL;
Packit ae9e2a
		i_opts.flags = GIT_ITERATOR_IGNORE_CASE;
Packit ae9e2a
Packit ae9e2a
		cl_git_pass(git_iterator_for_index(&i, g_repo, index, &i_opts));
Packit ae9e2a
		expect_iterator_items(i, expected_len, expected, expected_len, expected);
Packit ae9e2a
		git_iterator_free(i);
Packit ae9e2a
	}
Packit ae9e2a
Packit ae9e2a
	/* Set no start, but an end.  Case sensitive. */
Packit ae9e2a
	{
Packit ae9e2a
		const char *expected[] = { "B", "D", "L/1", "a", "c", "e" };
Packit ae9e2a
		size_t expected_len = 6;
Packit ae9e2a
Packit ae9e2a
		i_opts.start = NULL;
Packit ae9e2a
		i_opts.end = "e";
Packit ae9e2a
		i_opts.flags = GIT_ITERATOR_DONT_IGNORE_CASE;
Packit ae9e2a
Packit ae9e2a
		cl_git_pass(git_iterator_for_index(&i, g_repo, index, &i_opts));
Packit ae9e2a
		expect_iterator_items(i, expected_len, expected, expected_len, expected);
Packit ae9e2a
		git_iterator_free(i);
Packit ae9e2a
	}
Packit ae9e2a
Packit ae9e2a
	/* Set no start, but an end.  Case INsensitive. */
Packit ae9e2a
	{
Packit ae9e2a
		const char *expected[] = { "a", "B", "c", "D", "e" };
Packit ae9e2a
		size_t expected_len = 5;
Packit ae9e2a
Packit ae9e2a
		i_opts.start = NULL;
Packit ae9e2a
		i_opts.end = "e";
Packit ae9e2a
		i_opts.flags = GIT_ITERATOR_IGNORE_CASE;
Packit ae9e2a
Packit ae9e2a
		cl_git_pass(git_iterator_for_index(&i, g_repo, index, &i_opts));
Packit ae9e2a
		expect_iterator_items(i, expected_len, expected, expected_len, expected);
Packit ae9e2a
		git_iterator_free(i);
Packit ae9e2a
	}
Packit ae9e2a
Packit ae9e2a
	/* Start and an end, case sensitive */
Packit ae9e2a
	{
Packit ae9e2a
		const char *expected[] = { "c", "e", "k/1" };
Packit ae9e2a
		size_t expected_len = 3;
Packit ae9e2a
Packit ae9e2a
		i_opts.start = "c";
Packit ae9e2a
		i_opts.end = "k/D";
Packit ae9e2a
		i_opts.flags = GIT_ITERATOR_DONT_IGNORE_CASE;
Packit ae9e2a
Packit ae9e2a
		cl_git_pass(git_iterator_for_index(&i, g_repo, index, &i_opts));
Packit ae9e2a
		expect_iterator_items(i, expected_len, expected, expected_len, expected);
Packit ae9e2a
		git_iterator_free(i);
Packit ae9e2a
	}
Packit ae9e2a
Packit ae9e2a
	/* Start and an end, case sensitive */
Packit ae9e2a
	{
Packit ae9e2a
		const char *expected[] = { "k/1" };
Packit ae9e2a
		size_t expected_len = 1;
Packit ae9e2a
Packit ae9e2a
		i_opts.start = "k";
Packit ae9e2a
		i_opts.end = "k/D";
Packit ae9e2a
		i_opts.flags = GIT_ITERATOR_DONT_IGNORE_CASE;
Packit ae9e2a
Packit ae9e2a
		cl_git_pass(git_iterator_for_index(&i, g_repo, index, &i_opts));
Packit ae9e2a
		expect_iterator_items(i, expected_len, expected, expected_len, expected);
Packit ae9e2a
		git_iterator_free(i);
Packit ae9e2a
	}
Packit ae9e2a
Packit ae9e2a
	/* Start and an end, case INsensitive */
Packit ae9e2a
	{
Packit ae9e2a
		const char *expected[] = { "c", "D", "e", "k/1", "k/a" };
Packit ae9e2a
		size_t expected_len = 5;
Packit ae9e2a
Packit ae9e2a
		i_opts.start = "c";
Packit ae9e2a
		i_opts.end = "k/D";
Packit ae9e2a
		i_opts.flags = GIT_ITERATOR_IGNORE_CASE;
Packit ae9e2a
Packit ae9e2a
		cl_git_pass(git_iterator_for_index(&i, g_repo, index, &i_opts));
Packit ae9e2a
		expect_iterator_items(i, expected_len, expected, expected_len, expected);
Packit ae9e2a
		git_iterator_free(i);
Packit ae9e2a
	}
Packit ae9e2a
Packit ae9e2a
	/* Start and an end, case INsensitive */
Packit ae9e2a
	{
Packit ae9e2a
		const char *expected[] = { "k/1", "k/a" };
Packit ae9e2a
		size_t expected_len = 2;
Packit ae9e2a
Packit ae9e2a
		i_opts.start = "k";
Packit ae9e2a
		i_opts.end = "k/D";
Packit ae9e2a
		i_opts.flags = GIT_ITERATOR_IGNORE_CASE;
Packit ae9e2a
Packit ae9e2a
		cl_git_pass(git_iterator_for_index(&i, g_repo, index, &i_opts));
Packit ae9e2a
		expect_iterator_items(i, expected_len, expected, expected_len, expected);
Packit ae9e2a
		git_iterator_free(i);
Packit ae9e2a
	}
Packit ae9e2a
Packit ae9e2a
	git_index_free(index);
Packit ae9e2a
	git_vector_free(&filelist);
Packit ae9e2a
}
Packit ae9e2a
Packit ae9e2a
void test_iterator_index__pathlist_with_dirs(void)
Packit ae9e2a
{
Packit ae9e2a
	git_iterator *i;
Packit ae9e2a
	git_iterator_options i_opts = GIT_ITERATOR_OPTIONS_INIT;
Packit ae9e2a
	git_index *index;
Packit ae9e2a
	git_vector filelist;
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_vector_init(&filelist, 5, NULL));
Packit ae9e2a
Packit ae9e2a
	g_repo = cl_git_sandbox_init("icase");
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_repository_index(&index, g_repo));
Packit ae9e2a
Packit ae9e2a
	/* Test that a prefix `k` matches folders, even without trailing slash */
Packit ae9e2a
	{
Packit ae9e2a
		const char *expected[] = { "k/1", "k/B", "k/D", "k/a", "k/c" };
Packit ae9e2a
		size_t expected_len = 5;
Packit ae9e2a
Packit ae9e2a
		git_vector_clear(&filelist);
Packit ae9e2a
		cl_git_pass(git_vector_insert(&filelist, "k"));
Packit ae9e2a
Packit ae9e2a
		i_opts.pathlist.strings = (char **)filelist.contents;
Packit ae9e2a
		i_opts.pathlist.count = filelist.length;
Packit ae9e2a
		i_opts.flags = GIT_ITERATOR_DONT_IGNORE_CASE;
Packit ae9e2a
Packit ae9e2a
		cl_git_pass(git_iterator_for_index(&i, g_repo, index, &i_opts));
Packit ae9e2a
		expect_iterator_items(i, expected_len, expected, expected_len, expected);
Packit ae9e2a
		git_iterator_free(i);
Packit ae9e2a
	}
Packit ae9e2a
Packit ae9e2a
	/* Test that a `k/` matches a folder */
Packit ae9e2a
	{
Packit ae9e2a
		const char *expected[] = { "k/1", "k/B", "k/D", "k/a", "k/c" };
Packit ae9e2a
		size_t expected_len = 5;
Packit ae9e2a
Packit ae9e2a
		git_vector_clear(&filelist);
Packit ae9e2a
		cl_git_pass(git_vector_insert(&filelist, "k/"));
Packit ae9e2a
Packit ae9e2a
		i_opts.pathlist.strings = (char **)filelist.contents;
Packit ae9e2a
		i_opts.pathlist.count = filelist.length;
Packit ae9e2a
		i_opts.flags = GIT_ITERATOR_DONT_IGNORE_CASE;
Packit ae9e2a
Packit ae9e2a
		cl_git_pass(git_iterator_for_index(&i, g_repo, index, &i_opts));
Packit ae9e2a
		expect_iterator_items(i, expected_len, expected, expected_len, expected);
Packit ae9e2a
		git_iterator_free(i);
Packit ae9e2a
	}
Packit ae9e2a
Packit ae9e2a
	/* When the iterator is case sensitive, ensure we can't lookup the
Packit ae9e2a
	 * directory with the wrong case.
Packit ae9e2a
	 */
Packit ae9e2a
	{
Packit ae9e2a
		git_vector_clear(&filelist);
Packit ae9e2a
		cl_git_pass(git_vector_insert(&filelist, "K/"));
Packit ae9e2a
Packit ae9e2a
		i_opts.pathlist.strings = (char **)filelist.contents;
Packit ae9e2a
		i_opts.pathlist.count = filelist.length;
Packit ae9e2a
		i_opts.flags = GIT_ITERATOR_DONT_IGNORE_CASE;
Packit ae9e2a
Packit ae9e2a
		cl_git_pass(git_iterator_for_index(&i, g_repo, index, &i_opts));
Packit ae9e2a
		cl_git_fail_with(GIT_ITEROVER, git_iterator_advance(NULL, i));
Packit ae9e2a
		git_iterator_free(i);
Packit ae9e2a
	}
Packit ae9e2a
Packit ae9e2a
	/* Test that case insensitive matching works. */
Packit ae9e2a
	{
Packit ae9e2a
		const char *expected[] = { "k/1", "k/a", "k/B", "k/c", "k/D" };
Packit ae9e2a
		size_t expected_len = 5;
Packit ae9e2a
Packit ae9e2a
		git_vector_clear(&filelist);
Packit ae9e2a
		cl_git_pass(git_vector_insert(&filelist, "K/"));
Packit ae9e2a
Packit ae9e2a
		i_opts.pathlist.strings = (char **)filelist.contents;
Packit ae9e2a
		i_opts.pathlist.count = filelist.length;
Packit ae9e2a
		i_opts.flags = GIT_ITERATOR_IGNORE_CASE;
Packit ae9e2a
Packit ae9e2a
		cl_git_pass(git_iterator_for_index(&i, g_repo, index, &i_opts));
Packit ae9e2a
		expect_iterator_items(i, expected_len, expected, expected_len, expected);
Packit ae9e2a
		git_iterator_free(i);
Packit ae9e2a
	}
Packit ae9e2a
Packit ae9e2a
	/* Test that case insensitive matching works without trailing slash. */
Packit ae9e2a
	{
Packit ae9e2a
		const char *expected[] = { "k/1", "k/a", "k/B", "k/c", "k/D" };
Packit ae9e2a
		size_t expected_len = 5;
Packit ae9e2a
Packit ae9e2a
		git_vector_clear(&filelist);
Packit ae9e2a
		cl_git_pass(git_vector_insert(&filelist, "K"));
Packit ae9e2a
Packit ae9e2a
		i_opts.pathlist.strings = (char **)filelist.contents;
Packit ae9e2a
		i_opts.pathlist.count = filelist.length;
Packit ae9e2a
		i_opts.flags = GIT_ITERATOR_IGNORE_CASE;
Packit ae9e2a
Packit ae9e2a
		cl_git_pass(git_iterator_for_index(&i, g_repo, index, &i_opts));
Packit ae9e2a
		expect_iterator_items(i, expected_len, expected, expected_len, expected);
Packit ae9e2a
		git_iterator_free(i);
Packit ae9e2a
	}
Packit ae9e2a
Packit ae9e2a
	git_index_free(index);
Packit ae9e2a
	git_vector_free(&filelist);
Packit ae9e2a
}
Packit ae9e2a
Packit ae9e2a
void test_iterator_index__pathlist_with_dirs_include_trees(void)
Packit ae9e2a
{
Packit ae9e2a
	git_iterator *i;
Packit ae9e2a
	git_iterator_options i_opts = GIT_ITERATOR_OPTIONS_INIT;
Packit ae9e2a
	git_index *index;
Packit ae9e2a
	git_vector filelist;
Packit ae9e2a
Packit ae9e2a
	const char *expected[] = { "k/", "k/1", "k/B", "k/D", "k/a", "k/c" };
Packit ae9e2a
	size_t expected_len = 6;
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_vector_init(&filelist, 5, NULL));
Packit ae9e2a
Packit ae9e2a
	g_repo = cl_git_sandbox_init("icase");
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_repository_index(&index, g_repo));
Packit ae9e2a
Packit ae9e2a
	git_vector_clear(&filelist);
Packit ae9e2a
	cl_git_pass(git_vector_insert(&filelist, "k"));
Packit ae9e2a
Packit ae9e2a
	i_opts.pathlist.strings = (char **)filelist.contents;
Packit ae9e2a
	i_opts.pathlist.count = filelist.length;
Packit ae9e2a
	i_opts.flags = GIT_ITERATOR_DONT_IGNORE_CASE | GIT_ITERATOR_INCLUDE_TREES;
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_iterator_for_index(&i, g_repo, index, &i_opts));
Packit ae9e2a
	expect_iterator_items(i, expected_len, expected, expected_len, expected);
Packit ae9e2a
	git_iterator_free(i);
Packit ae9e2a
Packit ae9e2a
	git_index_free(index);
Packit ae9e2a
	git_vector_free(&filelist);
Packit ae9e2a
}
Packit ae9e2a
Packit ae9e2a
void test_iterator_index__pathlist_1(void)
Packit ae9e2a
{
Packit ae9e2a
	git_iterator *i;
Packit ae9e2a
	git_iterator_options i_opts = GIT_ITERATOR_OPTIONS_INIT;
Packit ae9e2a
	git_index *index;
Packit ae9e2a
	git_vector filelist = GIT_VECTOR_INIT;
Packit ae9e2a
	int default_icase, expect;
Packit ae9e2a
Packit ae9e2a
	g_repo = cl_git_sandbox_init("icase");
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_repository_index(&index, g_repo));
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_vector_init(&filelist, 100, &git__strcmp_cb));
Packit ae9e2a
	cl_git_pass(git_vector_insert(&filelist, "0"));
Packit ae9e2a
	cl_git_pass(git_vector_insert(&filelist, "c"));
Packit ae9e2a
	cl_git_pass(git_vector_insert(&filelist, "D"));
Packit ae9e2a
	cl_git_pass(git_vector_insert(&filelist, "e"));
Packit ae9e2a
	cl_git_pass(git_vector_insert(&filelist, "k/1"));
Packit ae9e2a
	cl_git_pass(git_vector_insert(&filelist, "k/a"));
Packit ae9e2a
Packit ae9e2a
	/* In this test we DO NOT force a case setting on the index. */
Packit ae9e2a
	default_icase = ((git_index_caps(index) & GIT_INDEXCAP_IGNORE_CASE) != 0);
Packit ae9e2a
Packit ae9e2a
	i_opts.pathlist.strings = (char **)filelist.contents;
Packit ae9e2a
	i_opts.pathlist.count = filelist.length;
Packit ae9e2a
Packit ae9e2a
	i_opts.start = "b";
Packit ae9e2a
	i_opts.end = "k/D";
Packit ae9e2a
Packit ae9e2a
	/* (c D e k/1 k/a ==> 5) vs (c e k/1 ==> 3) */
Packit ae9e2a
	expect = default_icase ? 5 : 3;
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_iterator_for_index(&i, g_repo, index, &i_opts));
Packit ae9e2a
	expect_iterator_items(i, expect, NULL, expect, NULL);
Packit ae9e2a
	git_iterator_free(i);
Packit ae9e2a
Packit ae9e2a
	git_index_free(index);
Packit ae9e2a
	git_vector_free(&filelist);
Packit ae9e2a
}
Packit ae9e2a
Packit ae9e2a
void test_iterator_index__pathlist_2(void)
Packit ae9e2a
{
Packit ae9e2a
	git_iterator *i;
Packit ae9e2a
	git_iterator_options i_opts = GIT_ITERATOR_OPTIONS_INIT;
Packit ae9e2a
	git_index *index;
Packit ae9e2a
	git_vector filelist = GIT_VECTOR_INIT;
Packit ae9e2a
	int default_icase, expect;
Packit ae9e2a
Packit ae9e2a
	g_repo = cl_git_sandbox_init("icase");
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_repository_index(&index, g_repo));
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_vector_init(&filelist, 100, &git__strcmp_cb));
Packit ae9e2a
	cl_git_pass(git_vector_insert(&filelist, "0"));
Packit ae9e2a
	cl_git_pass(git_vector_insert(&filelist, "c"));
Packit ae9e2a
	cl_git_pass(git_vector_insert(&filelist, "D"));
Packit ae9e2a
	cl_git_pass(git_vector_insert(&filelist, "e"));
Packit ae9e2a
	cl_git_pass(git_vector_insert(&filelist, "k/"));
Packit ae9e2a
	cl_git_pass(git_vector_insert(&filelist, "k.a"));
Packit ae9e2a
	cl_git_pass(git_vector_insert(&filelist, "k.b"));
Packit ae9e2a
	cl_git_pass(git_vector_insert(&filelist, "kZZZZZZZ"));
Packit ae9e2a
Packit ae9e2a
	/* In this test we DO NOT force a case setting on the index. */
Packit ae9e2a
	default_icase = ((git_index_caps(index) & GIT_INDEXCAP_IGNORE_CASE) != 0);
Packit ae9e2a
Packit ae9e2a
	i_opts.pathlist.strings = (char **)filelist.contents;
Packit ae9e2a
	i_opts.pathlist.count = filelist.length;
Packit ae9e2a
Packit ae9e2a
	i_opts.start = "b";
Packit ae9e2a
	i_opts.end = "k/D";
Packit ae9e2a
Packit ae9e2a
	/* (c D e k/1 k/a k/B k/c k/D) vs (c e k/1 k/B k/D) */
Packit ae9e2a
	expect = default_icase ? 8 : 5;
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_iterator_for_index(&i, g_repo, index, &i_opts));
Packit ae9e2a
	expect_iterator_items(i, expect, NULL, expect, NULL);
Packit ae9e2a
	git_iterator_free(i);
Packit ae9e2a
Packit ae9e2a
	git_index_free(index);
Packit ae9e2a
	git_vector_free(&filelist);
Packit ae9e2a
}
Packit ae9e2a
Packit ae9e2a
void test_iterator_index__pathlist_four(void)
Packit ae9e2a
{
Packit ae9e2a
	git_iterator *i;
Packit ae9e2a
	git_iterator_options i_opts = GIT_ITERATOR_OPTIONS_INIT;
Packit ae9e2a
	git_index *index;
Packit ae9e2a
	git_vector filelist = GIT_VECTOR_INIT;
Packit ae9e2a
	int default_icase, expect;
Packit ae9e2a
Packit ae9e2a
	g_repo = cl_git_sandbox_init("icase");
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_repository_index(&index, g_repo));
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_vector_init(&filelist, 100, &git__strcmp_cb));
Packit ae9e2a
	cl_git_pass(git_vector_insert(&filelist, "0"));
Packit ae9e2a
	cl_git_pass(git_vector_insert(&filelist, "c"));
Packit ae9e2a
	cl_git_pass(git_vector_insert(&filelist, "D"));
Packit ae9e2a
	cl_git_pass(git_vector_insert(&filelist, "e"));
Packit ae9e2a
	cl_git_pass(git_vector_insert(&filelist, "k"));
Packit ae9e2a
	cl_git_pass(git_vector_insert(&filelist, "k.a"));
Packit ae9e2a
	cl_git_pass(git_vector_insert(&filelist, "k.b"));
Packit ae9e2a
	cl_git_pass(git_vector_insert(&filelist, "kZZZZZZZ"));
Packit ae9e2a
Packit ae9e2a
	/* In this test we DO NOT force a case setting on the index. */
Packit ae9e2a
	default_icase = ((git_index_caps(index) & GIT_INDEXCAP_IGNORE_CASE) != 0);
Packit ae9e2a
Packit ae9e2a
	i_opts.pathlist.strings = (char **)filelist.contents;
Packit ae9e2a
	i_opts.pathlist.count = filelist.length;
Packit ae9e2a
Packit ae9e2a
	i_opts.start = "b";
Packit ae9e2a
	i_opts.end = "k/D";
Packit ae9e2a
Packit ae9e2a
	/* (c D e k/1 k/a k/B k/c k/D) vs (c e k/1 k/B k/D) */
Packit ae9e2a
	expect = default_icase ? 8 : 5;
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_iterator_for_index(&i, g_repo, index, &i_opts));
Packit ae9e2a
	expect_iterator_items(i, expect, NULL, expect, NULL);
Packit ae9e2a
	git_iterator_free(i);
Packit ae9e2a
Packit ae9e2a
	git_index_free(index);
Packit ae9e2a
	git_vector_free(&filelist);
Packit ae9e2a
}
Packit ae9e2a
Packit ae9e2a
void test_iterator_index__pathlist_icase(void)
Packit ae9e2a
{
Packit ae9e2a
	git_iterator *i;
Packit ae9e2a
	git_iterator_options i_opts = GIT_ITERATOR_OPTIONS_INIT;
Packit ae9e2a
	git_index *index;
Packit ae9e2a
	int caps;
Packit ae9e2a
	git_vector filelist;
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_vector_init(&filelist, 100, &git__strcmp_cb));
Packit ae9e2a
	cl_git_pass(git_vector_insert(&filelist, "a"));
Packit ae9e2a
	cl_git_pass(git_vector_insert(&filelist, "B"));
Packit ae9e2a
	cl_git_pass(git_vector_insert(&filelist, "c"));
Packit ae9e2a
	cl_git_pass(git_vector_insert(&filelist, "D"));
Packit ae9e2a
	cl_git_pass(git_vector_insert(&filelist, "e"));
Packit ae9e2a
	cl_git_pass(git_vector_insert(&filelist, "k/1"));
Packit ae9e2a
	cl_git_pass(git_vector_insert(&filelist, "k/a"));
Packit ae9e2a
	cl_git_pass(git_vector_insert(&filelist, "L/1"));
Packit ae9e2a
Packit ae9e2a
	g_repo = cl_git_sandbox_init("icase");
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_repository_index(&index, g_repo));
Packit ae9e2a
	caps = git_index_caps(index);
Packit ae9e2a
Packit ae9e2a
	/* force case sensitivity */
Packit ae9e2a
	cl_git_pass(git_index_set_caps(index, caps & ~GIT_INDEXCAP_IGNORE_CASE));
Packit ae9e2a
Packit ae9e2a
	/* All indexfilelist iterator tests are "autoexpand with no tree entries" */
Packit ae9e2a
Packit ae9e2a
	i_opts.pathlist.strings = (char **)filelist.contents;
Packit ae9e2a
	i_opts.pathlist.count = filelist.length;
Packit ae9e2a
Packit ae9e2a
	i_opts.start = "c";
Packit ae9e2a
	i_opts.end = "k/D";
Packit ae9e2a
	cl_git_pass(git_iterator_for_index(&i, g_repo, index, &i_opts));
Packit ae9e2a
	expect_iterator_items(i, 3, NULL, 3, NULL);
Packit ae9e2a
	git_iterator_free(i);
Packit ae9e2a
Packit ae9e2a
	i_opts.start = "k";
Packit ae9e2a
	i_opts.end = "k/Z";
Packit ae9e2a
	cl_git_pass(git_iterator_for_index(&i, g_repo, index, &i_opts));
Packit ae9e2a
	expect_iterator_items(i, 1, NULL, 1, NULL);
Packit ae9e2a
	git_iterator_free(i);
Packit ae9e2a
Packit ae9e2a
	/* force case insensitivity */
Packit ae9e2a
	cl_git_pass(git_index_set_caps(index, caps | GIT_INDEXCAP_IGNORE_CASE));
Packit ae9e2a
Packit ae9e2a
	i_opts.start = "c";
Packit ae9e2a
	i_opts.end = "k/D";
Packit ae9e2a
	cl_git_pass(git_iterator_for_index(&i, g_repo, index, &i_opts));
Packit ae9e2a
	expect_iterator_items(i, 5, NULL, 5, NULL);
Packit ae9e2a
	git_iterator_free(i);
Packit ae9e2a
Packit ae9e2a
	i_opts.start = "k";
Packit ae9e2a
	i_opts.end = "k/Z";
Packit ae9e2a
	cl_git_pass(git_iterator_for_index(&i, g_repo, index, &i_opts));
Packit ae9e2a
	expect_iterator_items(i, 2, NULL, 2, NULL);
Packit ae9e2a
	git_iterator_free(i);
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_index_set_caps(index, caps));
Packit ae9e2a
	git_index_free(index);
Packit ae9e2a
	git_vector_free(&filelist);
Packit ae9e2a
}
Packit ae9e2a
Packit ae9e2a
void test_iterator_index__pathlist_with_directory(void)
Packit ae9e2a
{
Packit ae9e2a
	git_iterator *i;
Packit ae9e2a
	git_iterator_options i_opts = GIT_ITERATOR_OPTIONS_INIT;
Packit ae9e2a
	git_vector filelist;
Packit ae9e2a
	git_tree *tree;
Packit ae9e2a
	git_index *index;
Packit ae9e2a
Packit ae9e2a
	g_repo = cl_git_sandbox_init("testrepo2");
Packit ae9e2a
	git_repository_head_tree(&tree, g_repo);
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_vector_init(&filelist, 100, &git__strcmp_cb));
Packit ae9e2a
	cl_git_pass(git_vector_insert(&filelist, "subdir"));
Packit ae9e2a
Packit ae9e2a
	i_opts.pathlist.strings = (char **)filelist.contents;
Packit ae9e2a
	i_opts.pathlist.count = filelist.length;
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_repository_index(&index, g_repo));
Packit ae9e2a
	cl_git_pass(git_iterator_for_index(&i, g_repo, index, &i_opts));
Packit ae9e2a
	expect_iterator_items(i, 4, NULL, 4, NULL);
Packit ae9e2a
	git_iterator_free(i);
Packit ae9e2a
Packit ae9e2a
	git_index_free(index);
Packit ae9e2a
	git_tree_free(tree);
Packit ae9e2a
	git_vector_free(&filelist);
Packit ae9e2a
}
Packit ae9e2a
Packit ae9e2a
static void create_paths(git_index *index, const char *root, int depth)
Packit ae9e2a
{
Packit ae9e2a
	git_buf fullpath = GIT_BUF_INIT;
Packit ae9e2a
	git_index_entry entry;
Packit ae9e2a
	size_t root_len;
Packit ae9e2a
	int i;
Packit ae9e2a
Packit ae9e2a
	if (root) {
Packit ae9e2a
		cl_git_pass(git_buf_puts(&fullpath, root));
Packit ae9e2a
		cl_git_pass(git_buf_putc(&fullpath, '/'));
Packit ae9e2a
	}
Packit ae9e2a
Packit ae9e2a
	root_len = fullpath.size;
Packit ae9e2a
Packit ae9e2a
	for (i = 0; i < 8; i++) {
Packit ae9e2a
		bool file = (depth == 0 || (i % 2) == 0);
Packit ae9e2a
		git_buf_truncate(&fullpath, root_len);
Packit ae9e2a
		cl_git_pass(git_buf_printf(&fullpath, "item%d", i));
Packit ae9e2a
Packit ae9e2a
		if (file) {
Packit ae9e2a
			memset(&entry, 0, sizeof(git_index_entry));
Packit ae9e2a
			entry.path = fullpath.ptr;
Packit ae9e2a
			entry.mode = GIT_FILEMODE_BLOB;
Packit ae9e2a
			git_oid_fromstr(&entry.id, "d44e18fb93b7107b5cd1b95d601591d77869a1b6");
Packit ae9e2a
Packit ae9e2a
			cl_git_pass(git_index_add(index, &entry));
Packit ae9e2a
		} else if (depth > 0) {
Packit ae9e2a
			create_paths(index, fullpath.ptr, (depth - 1));
Packit ae9e2a
		}
Packit ae9e2a
	}
Packit ae9e2a
Packit ae9e2a
	git_buf_free(&fullpath);
Packit ae9e2a
}
Packit ae9e2a
Packit ae9e2a
void test_iterator_index__pathlist_for_deeply_nested_item(void)
Packit ae9e2a
{
Packit ae9e2a
	git_iterator *i;
Packit ae9e2a
	git_iterator_options i_opts = GIT_ITERATOR_OPTIONS_INIT;
Packit ae9e2a
	git_index *index;
Packit ae9e2a
	git_vector filelist;
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_vector_init(&filelist, 5, NULL));
Packit ae9e2a
Packit ae9e2a
	g_repo = cl_git_sandbox_init("icase");
Packit ae9e2a
	cl_git_pass(git_repository_index(&index, g_repo));
Packit ae9e2a
Packit ae9e2a
	create_paths(index, NULL, 3);
Packit ae9e2a
Packit ae9e2a
	/* Ensure that we find the single path we're interested in */
Packit ae9e2a
	{
Packit ae9e2a
		const char *expected[] = { "item1/item3/item5/item7" };
Packit ae9e2a
		size_t expected_len = 1;
Packit ae9e2a
Packit ae9e2a
		git_vector_clear(&filelist);
Packit ae9e2a
		cl_git_pass(git_vector_insert(&filelist, "item1/item3/item5/item7"));
Packit ae9e2a
Packit ae9e2a
		i_opts.pathlist.strings = (char **)filelist.contents;
Packit ae9e2a
		i_opts.pathlist.count = filelist.length;
Packit ae9e2a
		i_opts.flags = GIT_ITERATOR_DONT_IGNORE_CASE;
Packit ae9e2a
Packit ae9e2a
		cl_git_pass(git_iterator_for_index(&i, g_repo, index, &i_opts));
Packit ae9e2a
		expect_iterator_items(i, expected_len, expected, expected_len, expected);
Packit ae9e2a
		git_iterator_free(i);
Packit ae9e2a
	}
Packit ae9e2a
Packit ae9e2a
	{
Packit ae9e2a
		const char *expected[] = {
Packit ae9e2a
			"item1/item3/item5/item0", "item1/item3/item5/item1",
Packit ae9e2a
			"item1/item3/item5/item2", "item1/item3/item5/item3",
Packit ae9e2a
			"item1/item3/item5/item4", "item1/item3/item5/item5",
Packit ae9e2a
			"item1/item3/item5/item6", "item1/item3/item5/item7",
Packit ae9e2a
		};
Packit ae9e2a
		size_t expected_len = 8;
Packit ae9e2a
Packit ae9e2a
		git_vector_clear(&filelist);
Packit ae9e2a
		cl_git_pass(git_vector_insert(&filelist, "item1/item3/item5/"));
Packit ae9e2a
Packit ae9e2a
		i_opts.pathlist.strings = (char **)filelist.contents;
Packit ae9e2a
		i_opts.pathlist.count = filelist.length;
Packit ae9e2a
		i_opts.flags = GIT_ITERATOR_DONT_IGNORE_CASE;
Packit ae9e2a
Packit ae9e2a
		cl_git_pass(git_iterator_for_index(&i, g_repo, index, &i_opts));
Packit ae9e2a
		expect_iterator_items(i, expected_len, expected, expected_len, expected);
Packit ae9e2a
		git_iterator_free(i);
Packit ae9e2a
	}
Packit ae9e2a
Packit ae9e2a
	{
Packit ae9e2a
		const char *expected[] = {
Packit ae9e2a
			"item1/item3/item0",
Packit ae9e2a
			"item1/item3/item1/item0", "item1/item3/item1/item1",
Packit ae9e2a
			"item1/item3/item1/item2", "item1/item3/item1/item3",
Packit ae9e2a
			"item1/item3/item1/item4", "item1/item3/item1/item5",
Packit ae9e2a
			"item1/item3/item1/item6", "item1/item3/item1/item7",
Packit ae9e2a
			"item1/item3/item2",
Packit ae9e2a
			"item1/item3/item3/item0", "item1/item3/item3/item1",
Packit ae9e2a
			"item1/item3/item3/item2", "item1/item3/item3/item3",
Packit ae9e2a
			"item1/item3/item3/item4", "item1/item3/item3/item5",
Packit ae9e2a
			"item1/item3/item3/item6", "item1/item3/item3/item7",
Packit ae9e2a
			"item1/item3/item4",
Packit ae9e2a
			"item1/item3/item5/item0", "item1/item3/item5/item1",
Packit ae9e2a
			"item1/item3/item5/item2", "item1/item3/item5/item3",
Packit ae9e2a
			"item1/item3/item5/item4", "item1/item3/item5/item5",
Packit ae9e2a
			"item1/item3/item5/item6", "item1/item3/item5/item7",
Packit ae9e2a
			"item1/item3/item6",
Packit ae9e2a
			"item1/item3/item7/item0", "item1/item3/item7/item1",
Packit ae9e2a
			"item1/item3/item7/item2", "item1/item3/item7/item3",
Packit ae9e2a
			"item1/item3/item7/item4", "item1/item3/item7/item5",
Packit ae9e2a
			"item1/item3/item7/item6", "item1/item3/item7/item7",
Packit ae9e2a
		};
Packit ae9e2a
		size_t expected_len = 36;
Packit ae9e2a
Packit ae9e2a
		git_vector_clear(&filelist);
Packit ae9e2a
		cl_git_pass(git_vector_insert(&filelist, "item1/item3/"));
Packit ae9e2a
Packit ae9e2a
		i_opts.pathlist.strings = (char **)filelist.contents;
Packit ae9e2a
		i_opts.pathlist.count = filelist.length;
Packit ae9e2a
		i_opts.flags = GIT_ITERATOR_DONT_IGNORE_CASE;
Packit ae9e2a
Packit ae9e2a
		cl_git_pass(git_iterator_for_index(&i, g_repo, index, &i_opts));
Packit ae9e2a
		expect_iterator_items(i, expected_len, expected, expected_len, expected);
Packit ae9e2a
		git_iterator_free(i);
Packit ae9e2a
	}
Packit ae9e2a
Packit ae9e2a
	/* Ensure that we find the single path we're interested in, and we find
Packit ae9e2a
	 * it efficiently, and don't stat the entire world to get there.
Packit ae9e2a
	 */
Packit ae9e2a
	{
Packit ae9e2a
		const char *expected[] = {
Packit ae9e2a
			"item0", "item1/item2", "item5/item7/item4", "item6",
Packit ae9e2a
			"item7/item3/item1/item6" };
Packit ae9e2a
		size_t expected_len = 5;
Packit ae9e2a
Packit ae9e2a
		git_vector_clear(&filelist);
Packit ae9e2a
		cl_git_pass(git_vector_insert(&filelist, "item7/item3/item1/item6"));
Packit ae9e2a
		cl_git_pass(git_vector_insert(&filelist, "item6"));
Packit ae9e2a
		cl_git_pass(git_vector_insert(&filelist, "item5/item7/item4"));
Packit ae9e2a
		cl_git_pass(git_vector_insert(&filelist, "item1/item2"));
Packit ae9e2a
		cl_git_pass(git_vector_insert(&filelist, "item0"));
Packit ae9e2a
Packit ae9e2a
		/* also add some things that don't exist or don't match the right type */
Packit ae9e2a
		cl_git_pass(git_vector_insert(&filelist, "item2/"));
Packit ae9e2a
		cl_git_pass(git_vector_insert(&filelist, "itemN"));
Packit ae9e2a
		cl_git_pass(git_vector_insert(&filelist, "item1/itemA"));
Packit ae9e2a
		cl_git_pass(git_vector_insert(&filelist, "item5/item3/item4/"));
Packit ae9e2a
Packit ae9e2a
		i_opts.pathlist.strings = (char **)filelist.contents;
Packit ae9e2a
		i_opts.pathlist.count = filelist.length;
Packit ae9e2a
		i_opts.flags = GIT_ITERATOR_DONT_IGNORE_CASE;
Packit ae9e2a
Packit ae9e2a
		cl_git_pass(git_iterator_for_index(&i, g_repo, index, &i_opts));
Packit ae9e2a
		expect_iterator_items(i, expected_len, expected, expected_len, expected);
Packit ae9e2a
		git_iterator_free(i);
Packit ae9e2a
	}
Packit ae9e2a
Packit ae9e2a
	git_index_free(index);
Packit ae9e2a
	git_vector_free(&filelist);
Packit ae9e2a
}
Packit ae9e2a
Packit ae9e2a
void test_iterator_index__advance_over(void)
Packit ae9e2a
{
Packit ae9e2a
	git_iterator *i;
Packit ae9e2a
	git_iterator_options i_opts = GIT_ITERATOR_OPTIONS_INIT;
Packit ae9e2a
	git_index *index;
Packit ae9e2a
Packit ae9e2a
	i_opts.flags |= GIT_ITERATOR_DONT_IGNORE_CASE |
Packit ae9e2a
		GIT_ITERATOR_DONT_AUTOEXPAND;
Packit ae9e2a
Packit ae9e2a
	g_repo = cl_git_sandbox_init("icase");
Packit ae9e2a
	cl_git_pass(git_repository_index(&index, g_repo));
Packit ae9e2a
Packit ae9e2a
	create_paths(index, NULL, 1);
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_iterator_for_index(&i, g_repo, index, &i_opts));
Packit ae9e2a
Packit ae9e2a
	expect_advance_over(i, "B", GIT_ITERATOR_STATUS_NORMAL);
Packit ae9e2a
	expect_advance_over(i, "D", GIT_ITERATOR_STATUS_NORMAL);
Packit ae9e2a
	expect_advance_over(i, "F", GIT_ITERATOR_STATUS_NORMAL);
Packit ae9e2a
	expect_advance_over(i, "H", GIT_ITERATOR_STATUS_NORMAL);
Packit ae9e2a
	expect_advance_over(i, "J", GIT_ITERATOR_STATUS_NORMAL);
Packit ae9e2a
	expect_advance_over(i, "L/", GIT_ITERATOR_STATUS_NORMAL);
Packit ae9e2a
	expect_advance_over(i, "a", GIT_ITERATOR_STATUS_NORMAL);
Packit ae9e2a
	expect_advance_over(i, "c", GIT_ITERATOR_STATUS_NORMAL);
Packit ae9e2a
	expect_advance_over(i, "e", GIT_ITERATOR_STATUS_NORMAL);
Packit ae9e2a
	expect_advance_over(i, "g", GIT_ITERATOR_STATUS_NORMAL);
Packit ae9e2a
	expect_advance_over(i, "i", GIT_ITERATOR_STATUS_NORMAL);
Packit ae9e2a
	expect_advance_over(i, "item0", GIT_ITERATOR_STATUS_NORMAL);
Packit ae9e2a
	expect_advance_over(i, "item1/", GIT_ITERATOR_STATUS_NORMAL);
Packit ae9e2a
	expect_advance_over(i, "item2", GIT_ITERATOR_STATUS_NORMAL);
Packit ae9e2a
	expect_advance_over(i, "item3/", GIT_ITERATOR_STATUS_NORMAL);
Packit ae9e2a
	expect_advance_over(i, "item4", GIT_ITERATOR_STATUS_NORMAL);
Packit ae9e2a
	expect_advance_over(i, "item5/", GIT_ITERATOR_STATUS_NORMAL);
Packit ae9e2a
	expect_advance_over(i, "item6", GIT_ITERATOR_STATUS_NORMAL);
Packit ae9e2a
	expect_advance_over(i, "item7/", GIT_ITERATOR_STATUS_NORMAL);
Packit ae9e2a
	expect_advance_over(i, "k/", GIT_ITERATOR_STATUS_NORMAL);
Packit ae9e2a
Packit ae9e2a
	cl_git_fail_with(GIT_ITEROVER, git_iterator_advance(NULL, i));
Packit ae9e2a
	git_iterator_free(i);
Packit ae9e2a
	git_index_free(index);
Packit ae9e2a
}
Packit ae9e2a
Packit ae9e2a
void test_iterator_index__advance_into(void)
Packit ae9e2a
{
Packit ae9e2a
	git_iterator *i;
Packit ae9e2a
	git_iterator_options i_opts = GIT_ITERATOR_OPTIONS_INIT;
Packit ae9e2a
	git_index *index;
Packit ae9e2a
Packit ae9e2a
	g_repo = cl_git_sandbox_init("icase");
Packit ae9e2a
Packit ae9e2a
	i_opts.flags |= GIT_ITERATOR_DONT_IGNORE_CASE |
Packit ae9e2a
		GIT_ITERATOR_DONT_AUTOEXPAND;
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_repository_index(&index, g_repo));
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_iterator_for_index(&i, g_repo, index, &i_opts));
Packit ae9e2a
	expect_advance_into(i, "B");
Packit ae9e2a
	expect_advance_into(i, "D");
Packit ae9e2a
	expect_advance_into(i, "F");
Packit ae9e2a
	expect_advance_into(i, "H");
Packit ae9e2a
	expect_advance_into(i, "J");
Packit ae9e2a
	expect_advance_into(i, "L/");
Packit ae9e2a
	expect_advance_into(i, "L/1");
Packit ae9e2a
	expect_advance_into(i, "L/B");
Packit ae9e2a
	expect_advance_into(i, "L/D");
Packit ae9e2a
	expect_advance_into(i, "L/a");
Packit ae9e2a
	expect_advance_into(i, "L/c");
Packit ae9e2a
	expect_advance_into(i, "a");
Packit ae9e2a
	expect_advance_into(i, "c");
Packit ae9e2a
	expect_advance_into(i, "e");
Packit ae9e2a
	expect_advance_into(i, "g");
Packit ae9e2a
	expect_advance_into(i, "i");
Packit ae9e2a
	expect_advance_into(i, "k/");
Packit ae9e2a
	expect_advance_into(i, "k/1");
Packit ae9e2a
	expect_advance_into(i, "k/B");
Packit ae9e2a
	expect_advance_into(i, "k/D");
Packit ae9e2a
	expect_advance_into(i, "k/a");
Packit ae9e2a
	expect_advance_into(i, "k/c");
Packit ae9e2a
Packit ae9e2a
	cl_git_fail_with(GIT_ITEROVER, git_iterator_advance(NULL, i));
Packit ae9e2a
	git_iterator_free(i);
Packit ae9e2a
	git_index_free(index);
Packit ae9e2a
}
Packit ae9e2a
Packit ae9e2a
void test_iterator_index__advance_into_and_over(void)
Packit ae9e2a
{
Packit ae9e2a
	git_iterator *i;
Packit ae9e2a
	git_iterator_options i_opts = GIT_ITERATOR_OPTIONS_INIT;
Packit ae9e2a
	git_index *index;
Packit ae9e2a
Packit ae9e2a
	g_repo = cl_git_sandbox_init("icase");
Packit ae9e2a
Packit ae9e2a
	i_opts.flags |= GIT_ITERATOR_DONT_IGNORE_CASE |
Packit ae9e2a
	GIT_ITERATOR_DONT_AUTOEXPAND;
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_repository_index(&index, g_repo));
Packit ae9e2a
Packit ae9e2a
	create_paths(index, NULL, 2);
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_iterator_for_index(&i, g_repo, index, &i_opts));
Packit ae9e2a
	expect_advance_into(i, "B");
Packit ae9e2a
	expect_advance_into(i, "D");
Packit ae9e2a
	expect_advance_into(i, "F");
Packit ae9e2a
	expect_advance_into(i, "H");
Packit ae9e2a
	expect_advance_into(i, "J");
Packit ae9e2a
	expect_advance_into(i, "L/");
Packit ae9e2a
	expect_advance_into(i, "L/1");
Packit ae9e2a
	expect_advance_into(i, "L/B");
Packit ae9e2a
	expect_advance_into(i, "L/D");
Packit ae9e2a
	expect_advance_into(i, "L/a");
Packit ae9e2a
	expect_advance_into(i, "L/c");
Packit ae9e2a
	expect_advance_into(i, "a");
Packit ae9e2a
	expect_advance_into(i, "c");
Packit ae9e2a
	expect_advance_into(i, "e");
Packit ae9e2a
	expect_advance_into(i, "g");
Packit ae9e2a
	expect_advance_into(i, "i");
Packit ae9e2a
	expect_advance_into(i, "item0");
Packit ae9e2a
	expect_advance_into(i, "item1/");
Packit ae9e2a
	expect_advance_into(i, "item1/item0");
Packit ae9e2a
	expect_advance_into(i, "item1/item1/");
Packit ae9e2a
	expect_advance_into(i, "item1/item1/item0");
Packit ae9e2a
	expect_advance_into(i, "item1/item1/item1");
Packit ae9e2a
	expect_advance_into(i, "item1/item1/item2");
Packit ae9e2a
	expect_advance_into(i, "item1/item1/item3");
Packit ae9e2a
	expect_advance_into(i, "item1/item1/item4");
Packit ae9e2a
	expect_advance_into(i, "item1/item1/item5");
Packit ae9e2a
	expect_advance_into(i, "item1/item1/item6");
Packit ae9e2a
	expect_advance_into(i, "item1/item1/item7");
Packit ae9e2a
	expect_advance_into(i, "item1/item2");
Packit ae9e2a
	expect_advance_over(i, "item1/item3/", GIT_ITERATOR_STATUS_NORMAL);
Packit ae9e2a
	expect_advance_over(i, "item1/item4", GIT_ITERATOR_STATUS_NORMAL);
Packit ae9e2a
	expect_advance_over(i, "item1/item5/", GIT_ITERATOR_STATUS_NORMAL);
Packit ae9e2a
	expect_advance_over(i, "item1/item6", GIT_ITERATOR_STATUS_NORMAL);
Packit ae9e2a
	expect_advance_over(i, "item1/item7/", GIT_ITERATOR_STATUS_NORMAL);
Packit ae9e2a
	expect_advance_into(i, "item2");
Packit ae9e2a
	expect_advance_over(i, "item3/", GIT_ITERATOR_STATUS_NORMAL);
Packit ae9e2a
	expect_advance_over(i, "item4", GIT_ITERATOR_STATUS_NORMAL);
Packit ae9e2a
	expect_advance_over(i, "item5/", GIT_ITERATOR_STATUS_NORMAL);
Packit ae9e2a
	expect_advance_over(i, "item6", GIT_ITERATOR_STATUS_NORMAL);
Packit ae9e2a
	expect_advance_over(i, "item7/", GIT_ITERATOR_STATUS_NORMAL);
Packit ae9e2a
	expect_advance_into(i, "k/");
Packit ae9e2a
	expect_advance_into(i, "k/1");
Packit ae9e2a
	expect_advance_into(i, "k/B");
Packit ae9e2a
	expect_advance_into(i, "k/D");
Packit ae9e2a
	expect_advance_into(i, "k/a");
Packit ae9e2a
	expect_advance_into(i, "k/c");
Packit ae9e2a
Packit ae9e2a
	cl_git_fail_with(GIT_ITEROVER, git_iterator_advance(NULL, i));
Packit ae9e2a
	git_iterator_free(i);
Packit ae9e2a
	git_index_free(index);
Packit ae9e2a
}
Packit ae9e2a
Packit ae9e2a
static void add_conflict(
Packit ae9e2a
	git_index *index,
Packit ae9e2a
	const char *ancestor_path,
Packit ae9e2a
	const char *our_path,
Packit ae9e2a
	const char *their_path)
Packit ae9e2a
{
Packit ae9e2a
	git_index_entry ancestor = {{0}}, ours = {{0}}, theirs = {{0}};
Packit ae9e2a
Packit ae9e2a
	ancestor.path = ancestor_path;
Packit ae9e2a
	ancestor.mode = GIT_FILEMODE_BLOB;
Packit ae9e2a
	git_oid_fromstr(&ancestor.id, "d44e18fb93b7107b5cd1b95d601591d77869a1b6");
Packit ae9e2a
	GIT_IDXENTRY_STAGE_SET(&ancestor, 1);
Packit ae9e2a
Packit ae9e2a
	ours.path = our_path;
Packit ae9e2a
	ours.mode = GIT_FILEMODE_BLOB;
Packit ae9e2a
	git_oid_fromstr(&ours.id, "d44e18fb93b7107b5cd1b95d601591d77869a1b6");
Packit ae9e2a
	GIT_IDXENTRY_STAGE_SET(&ours, 2);
Packit ae9e2a
Packit ae9e2a
	theirs.path = their_path;
Packit ae9e2a
	theirs.mode = GIT_FILEMODE_BLOB;
Packit ae9e2a
	git_oid_fromstr(&theirs.id, "d44e18fb93b7107b5cd1b95d601591d77869a1b6");
Packit ae9e2a
	GIT_IDXENTRY_STAGE_SET(&theirs, 3);
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_index_conflict_add(index, &ancestor, &ours, &theirs));
Packit ae9e2a
}
Packit ae9e2a
Packit ae9e2a
void test_iterator_index__include_conflicts(void)
Packit ae9e2a
{
Packit ae9e2a
	git_iterator *i;
Packit ae9e2a
	git_iterator_options i_opts = GIT_ITERATOR_OPTIONS_INIT;
Packit ae9e2a
	git_index *index;
Packit ae9e2a
Packit ae9e2a
	i_opts.flags |= GIT_ITERATOR_DONT_IGNORE_CASE |
Packit ae9e2a
		GIT_ITERATOR_DONT_AUTOEXPAND;
Packit ae9e2a
Packit ae9e2a
	g_repo = cl_git_sandbox_init("icase");
Packit ae9e2a
	cl_git_pass(git_repository_index(&index, g_repo));
Packit ae9e2a
Packit ae9e2a
	add_conflict(index, "CONFLICT1", "CONFLICT1" ,"CONFLICT1");
Packit ae9e2a
	add_conflict(index, "ZZZ-CONFLICT2.ancestor", "ZZZ-CONFLICT2.ours", "ZZZ-CONFLICT2.theirs");
Packit ae9e2a
	add_conflict(index, "ancestor.conflict3", "ours.conflict3", "theirs.conflict3");
Packit ae9e2a
	add_conflict(index, "zzz-conflict4", "zzz-conflict4", "zzz-conflict4");
Packit ae9e2a
Packit ae9e2a
	/* Iterate the index, ensuring that conflicts are not included */
Packit ae9e2a
	cl_git_pass(git_iterator_for_index(&i, g_repo, index, &i_opts));
Packit ae9e2a
Packit ae9e2a
	expect_advance_over(i, "B", GIT_ITERATOR_STATUS_NORMAL);
Packit ae9e2a
	expect_advance_over(i, "D", GIT_ITERATOR_STATUS_NORMAL);
Packit ae9e2a
	expect_advance_over(i, "F", GIT_ITERATOR_STATUS_NORMAL);
Packit ae9e2a
	expect_advance_over(i, "H", GIT_ITERATOR_STATUS_NORMAL);
Packit ae9e2a
	expect_advance_over(i, "J", GIT_ITERATOR_STATUS_NORMAL);
Packit ae9e2a
	expect_advance_over(i, "L/", GIT_ITERATOR_STATUS_NORMAL);
Packit ae9e2a
	expect_advance_over(i, "a", GIT_ITERATOR_STATUS_NORMAL);
Packit ae9e2a
	expect_advance_over(i, "c", GIT_ITERATOR_STATUS_NORMAL);
Packit ae9e2a
	expect_advance_over(i, "e", GIT_ITERATOR_STATUS_NORMAL);
Packit ae9e2a
	expect_advance_over(i, "g", GIT_ITERATOR_STATUS_NORMAL);
Packit ae9e2a
	expect_advance_over(i, "i", GIT_ITERATOR_STATUS_NORMAL);
Packit ae9e2a
	expect_advance_over(i, "k/", GIT_ITERATOR_STATUS_NORMAL);
Packit ae9e2a
Packit ae9e2a
	cl_git_fail_with(GIT_ITEROVER, git_iterator_advance(NULL, i));
Packit ae9e2a
	git_iterator_free(i);
Packit ae9e2a
Packit ae9e2a
	/* Try again, returning conflicts */
Packit ae9e2a
	i_opts.flags |= GIT_ITERATOR_INCLUDE_CONFLICTS;
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_iterator_for_index(&i, g_repo, index, &i_opts));
Packit ae9e2a
Packit ae9e2a
	expect_advance_over(i, "B", GIT_ITERATOR_STATUS_NORMAL);
Packit ae9e2a
	expect_advance_over(i, "CONFLICT1", GIT_ITERATOR_STATUS_NORMAL);
Packit ae9e2a
	expect_advance_over(i, "CONFLICT1", GIT_ITERATOR_STATUS_NORMAL);
Packit ae9e2a
	expect_advance_over(i, "CONFLICT1", GIT_ITERATOR_STATUS_NORMAL);
Packit ae9e2a
	expect_advance_over(i, "D", GIT_ITERATOR_STATUS_NORMAL);
Packit ae9e2a
	expect_advance_over(i, "F", GIT_ITERATOR_STATUS_NORMAL);
Packit ae9e2a
	expect_advance_over(i, "H", GIT_ITERATOR_STATUS_NORMAL);
Packit ae9e2a
	expect_advance_over(i, "J", GIT_ITERATOR_STATUS_NORMAL);
Packit ae9e2a
	expect_advance_over(i, "L/", GIT_ITERATOR_STATUS_NORMAL);
Packit ae9e2a
	expect_advance_over(i, "ZZZ-CONFLICT2.ancestor", GIT_ITERATOR_STATUS_NORMAL);
Packit ae9e2a
	expect_advance_over(i, "ZZZ-CONFLICT2.ours", GIT_ITERATOR_STATUS_NORMAL);
Packit ae9e2a
	expect_advance_over(i, "ZZZ-CONFLICT2.theirs", GIT_ITERATOR_STATUS_NORMAL);
Packit ae9e2a
	expect_advance_over(i, "a", GIT_ITERATOR_STATUS_NORMAL);
Packit ae9e2a
	expect_advance_over(i, "ancestor.conflict3", GIT_ITERATOR_STATUS_NORMAL);
Packit ae9e2a
	expect_advance_over(i, "c", GIT_ITERATOR_STATUS_NORMAL);
Packit ae9e2a
	expect_advance_over(i, "e", GIT_ITERATOR_STATUS_NORMAL);
Packit ae9e2a
	expect_advance_over(i, "g", GIT_ITERATOR_STATUS_NORMAL);
Packit ae9e2a
	expect_advance_over(i, "i", GIT_ITERATOR_STATUS_NORMAL);
Packit ae9e2a
	expect_advance_over(i, "k/", GIT_ITERATOR_STATUS_NORMAL);
Packit ae9e2a
	expect_advance_over(i, "ours.conflict3", GIT_ITERATOR_STATUS_NORMAL);
Packit ae9e2a
	expect_advance_over(i, "theirs.conflict3", GIT_ITERATOR_STATUS_NORMAL);
Packit ae9e2a
	expect_advance_over(i, "zzz-conflict4", GIT_ITERATOR_STATUS_NORMAL);
Packit ae9e2a
	expect_advance_over(i, "zzz-conflict4", GIT_ITERATOR_STATUS_NORMAL);
Packit ae9e2a
	expect_advance_over(i, "zzz-conflict4", GIT_ITERATOR_STATUS_NORMAL);
Packit ae9e2a
Packit ae9e2a
	cl_git_fail_with(GIT_ITEROVER, git_iterator_advance(NULL, i));
Packit ae9e2a
	git_iterator_free(i);
Packit ae9e2a
Packit ae9e2a
	git_index_free(index);
Packit ae9e2a
}