Blame tests/diff/diffiter.c

Packit Service 20376f
#include "clar_libgit2.h"
Packit Service 20376f
#include "diff_helpers.h"
Packit Service 20376f
Packit Service 20376f
void test_diff_diffiter__initialize(void)
Packit Service 20376f
{
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_diff_diffiter__cleanup(void)
Packit Service 20376f
{
Packit Service 20376f
	cl_git_sandbox_cleanup();
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_diff_diffiter__create(void)
Packit Service 20376f
{
Packit Service 20376f
	git_repository *repo = cl_git_sandbox_init("attr");
Packit Service 20376f
	git_diff *diff;
Packit Service 20376f
	size_t d, num_d;
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_diff_index_to_workdir(&diff, repo, NULL, NULL));
Packit Service 20376f
Packit Service 20376f
	num_d = git_diff_num_deltas(diff);
Packit Service 20376f
	for (d = 0; d < num_d; ++d) {
Packit Service 20376f
		const git_diff_delta *delta = git_diff_get_delta(diff, d);
Packit Service 20376f
		cl_assert(delta != NULL);
Packit Service 20376f
	}
Packit Service 20376f
Packit Service 20376f
	cl_assert(!git_diff_get_delta(diff, num_d));
Packit Service 20376f
Packit Service 20376f
	git_diff_free(diff);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_diff_diffiter__iterate_files_1(void)
Packit Service 20376f
{
Packit Service 20376f
	git_repository *repo = cl_git_sandbox_init("attr");
Packit Service 20376f
	git_diff *diff;
Packit Service 20376f
	size_t d, num_d;
Packit Service 20376f
	diff_expects exp = { 0 };
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_diff_index_to_workdir(&diff, repo, NULL, NULL));
Packit Service 20376f
Packit Service 20376f
	num_d = git_diff_num_deltas(diff);
Packit Service 20376f
Packit Service 20376f
	for (d = 0; d < num_d; ++d) {
Packit Service 20376f
		const git_diff_delta *delta = git_diff_get_delta(diff, d);
Packit Service 20376f
		cl_assert(delta != NULL);
Packit Service 20376f
Packit Service 20376f
		diff_file_cb(delta, (float)d / (float)num_d, &exp);
Packit Service 20376f
	}
Packit Service 20376f
	cl_assert_equal_sz(6, exp.files);
Packit Service 20376f
Packit Service 20376f
	git_diff_free(diff);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_diff_diffiter__iterate_files_2(void)
Packit Service 20376f
{
Packit Service 20376f
	git_repository *repo = cl_git_sandbox_init("status");
Packit Service 20376f
	git_diff *diff;
Packit Service 20376f
	size_t d, num_d;
Packit Service 20376f
	int count = 0;
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_diff_index_to_workdir(&diff, repo, NULL, NULL));
Packit Service 20376f
Packit Service 20376f
	num_d = git_diff_num_deltas(diff);
Packit Service 20376f
	cl_assert_equal_i(8, (int)num_d);
Packit Service 20376f
Packit Service 20376f
	for (d = 0; d < num_d; ++d) {
Packit Service 20376f
		const git_diff_delta *delta = git_diff_get_delta(diff, d);
Packit Service 20376f
		cl_assert(delta != NULL);
Packit Service 20376f
		count++;
Packit Service 20376f
	}
Packit Service 20376f
	cl_assert_equal_i(8, count);
Packit Service 20376f
Packit Service 20376f
	git_diff_free(diff);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_diff_diffiter__iterate_files_and_hunks(void)
Packit Service 20376f
{
Packit Service 20376f
	git_repository *repo = cl_git_sandbox_init("status");
Packit Service 20376f
	git_diff_options opts = GIT_DIFF_OPTIONS_INIT;
Packit Service 20376f
	git_diff *diff = NULL;
Packit Service 20376f
	size_t d, num_d;
Packit Service 20376f
	int file_count = 0, hunk_count = 0;
Packit Service 20376f
Packit Service 20376f
	opts.context_lines = 3;
Packit Service 20376f
	opts.interhunk_lines = 1;
Packit Service 20376f
	opts.flags |= GIT_DIFF_INCLUDE_IGNORED | GIT_DIFF_INCLUDE_UNTRACKED;
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_diff_index_to_workdir(&diff, repo, NULL, &opts));
Packit Service 20376f
Packit Service 20376f
	num_d = git_diff_num_deltas(diff);
Packit Service 20376f
Packit Service 20376f
	for (d = 0; d < num_d; ++d) {
Packit Service 20376f
		git_patch *patch;
Packit Service 20376f
		size_t h, num_h;
Packit Service 20376f
Packit Service 20376f
		cl_git_pass(git_patch_from_diff(&patch, diff, d));
Packit Service 20376f
		cl_assert(patch);
Packit Service 20376f
Packit Service 20376f
		file_count++;
Packit Service 20376f
Packit Service 20376f
		num_h = git_patch_num_hunks(patch);
Packit Service 20376f
Packit Service 20376f
		for (h = 0; h < num_h; h++) {
Packit Service 20376f
			const git_diff_hunk *hunk;
Packit Service 20376f
Packit Service 20376f
			cl_git_pass(git_patch_get_hunk(&hunk, NULL, patch, h));
Packit Service 20376f
			cl_assert(hunk);
Packit Service 20376f
Packit Service 20376f
			hunk_count++;
Packit Service 20376f
		}
Packit Service 20376f
Packit Service 20376f
		git_patch_free(patch);
Packit Service 20376f
	}
Packit Service 20376f
Packit Service 20376f
	cl_assert_equal_i(13, file_count);
Packit Service 20376f
	cl_assert_equal_i(8, hunk_count);
Packit Service 20376f
Packit Service 20376f
	git_diff_free(diff);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_diff_diffiter__max_size_threshold(void)
Packit Service 20376f
{
Packit Service 20376f
	git_repository *repo = cl_git_sandbox_init("status");
Packit Service 20376f
	git_diff_options opts = GIT_DIFF_OPTIONS_INIT;
Packit Service 20376f
	git_diff *diff = NULL;
Packit Service 20376f
	int file_count = 0, binary_count = 0, hunk_count = 0;
Packit Service 20376f
	size_t d, num_d;
Packit Service 20376f
Packit Service 20376f
	opts.context_lines = 3;
Packit Service 20376f
	opts.interhunk_lines = 1;
Packit Service 20376f
	opts.flags |= GIT_DIFF_INCLUDE_IGNORED | GIT_DIFF_INCLUDE_UNTRACKED;
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_diff_index_to_workdir(&diff, repo, NULL, &opts));
Packit Service 20376f
	num_d = git_diff_num_deltas(diff);
Packit Service 20376f
Packit Service 20376f
	for (d = 0; d < num_d; ++d) {
Packit Service 20376f
		git_patch *patch;
Packit Service 20376f
		const git_diff_delta *delta;
Packit Service 20376f
Packit Service 20376f
		cl_git_pass(git_patch_from_diff(&patch, diff, d));
Packit Service 20376f
		cl_assert(patch);
Packit Service 20376f
		delta = git_patch_get_delta(patch);
Packit Service 20376f
		cl_assert(delta);
Packit Service 20376f
Packit Service 20376f
		file_count++;
Packit Service 20376f
		hunk_count += (int)git_patch_num_hunks(patch);
Packit Service 20376f
Packit Service 20376f
		assert((delta->flags & (GIT_DIFF_FLAG_BINARY|GIT_DIFF_FLAG_NOT_BINARY)) != 0);
Packit Service 20376f
		binary_count += ((delta->flags & GIT_DIFF_FLAG_BINARY) != 0);
Packit Service 20376f
Packit Service 20376f
		git_patch_free(patch);
Packit Service 20376f
	}
Packit Service 20376f
Packit Service 20376f
	cl_assert_equal_i(13, file_count);
Packit Service 20376f
	cl_assert_equal_i(0, binary_count);
Packit Service 20376f
	cl_assert_equal_i(8, hunk_count);
Packit Service 20376f
Packit Service 20376f
	git_diff_free(diff);
Packit Service 20376f
Packit Service 20376f
	/* try again with low file size threshold */
Packit Service 20376f
Packit Service 20376f
	file_count = binary_count = hunk_count = 0;
Packit Service 20376f
Packit Service 20376f
	opts.context_lines = 3;
Packit Service 20376f
	opts.interhunk_lines = 1;
Packit Service 20376f
	opts.flags |= GIT_DIFF_INCLUDE_IGNORED | GIT_DIFF_INCLUDE_UNTRACKED;
Packit Service 20376f
	opts.max_size = 50; /* treat anything over 50 bytes as binary! */
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_diff_index_to_workdir(&diff, repo, NULL, &opts));
Packit Service 20376f
	num_d = git_diff_num_deltas(diff);
Packit Service 20376f
Packit Service 20376f
	for (d = 0; d < num_d; ++d) {
Packit Service 20376f
		git_patch *patch;
Packit Service 20376f
		const git_diff_delta *delta;
Packit Service 20376f
Packit Service 20376f
		cl_git_pass(git_patch_from_diff(&patch, diff, d));
Packit Service 20376f
		delta = git_patch_get_delta(patch);
Packit Service 20376f
Packit Service 20376f
		file_count++;
Packit Service 20376f
		hunk_count += (int)git_patch_num_hunks(patch);
Packit Service 20376f
Packit Service 20376f
		assert((delta->flags & (GIT_DIFF_FLAG_BINARY|GIT_DIFF_FLAG_NOT_BINARY)) != 0);
Packit Service 20376f
		binary_count += ((delta->flags & GIT_DIFF_FLAG_BINARY) != 0);
Packit Service 20376f
Packit Service 20376f
		git_patch_free(patch);
Packit Service 20376f
	}
Packit Service 20376f
Packit Service 20376f
	cl_assert_equal_i(13, file_count);
Packit Service 20376f
	/* Three files are over the 50 byte threshold:
Packit Service 20376f
	 * - staged_changes_file_deleted
Packit Service 20376f
	 * - staged_changes_modified_file
Packit Service 20376f
	 * - staged_new_file_modified_file
Packit Service 20376f
	 */
Packit Service 20376f
	cl_assert_equal_i(3, binary_count);
Packit Service 20376f
	cl_assert_equal_i(5, hunk_count);
Packit Service 20376f
Packit Service 20376f
	git_diff_free(diff);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
Packit Service 20376f
void test_diff_diffiter__iterate_all(void)
Packit Service 20376f
{
Packit Service 20376f
	git_repository *repo = cl_git_sandbox_init("status");
Packit Service 20376f
	git_diff_options opts = GIT_DIFF_OPTIONS_INIT;
Packit Service 20376f
	git_diff *diff = NULL;
Packit Service 20376f
	diff_expects exp = {0};
Packit Service 20376f
	size_t d, num_d;
Packit Service 20376f
Packit Service 20376f
	opts.context_lines = 3;
Packit Service 20376f
	opts.interhunk_lines = 1;
Packit Service 20376f
	opts.flags |= GIT_DIFF_INCLUDE_IGNORED | GIT_DIFF_INCLUDE_UNTRACKED;
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_diff_index_to_workdir(&diff, repo, NULL, &opts));
Packit Service 20376f
Packit Service 20376f
	num_d = git_diff_num_deltas(diff);
Packit Service 20376f
	for (d = 0; d < num_d; ++d) {
Packit Service 20376f
		git_patch *patch;
Packit Service 20376f
		size_t h, num_h;
Packit Service 20376f
Packit Service 20376f
		cl_git_pass(git_patch_from_diff(&patch, diff, d));
Packit Service 20376f
		cl_assert(patch);
Packit Service 20376f
		exp.files++;
Packit Service 20376f
Packit Service 20376f
		num_h = git_patch_num_hunks(patch);
Packit Service 20376f
		for (h = 0; h < num_h; h++) {
Packit Service 20376f
			const git_diff_hunk *range;
Packit Service 20376f
			size_t l, num_l;
Packit Service 20376f
Packit Service 20376f
			cl_git_pass(git_patch_get_hunk(&range, &num_l, patch, h));
Packit Service 20376f
			cl_assert(range);
Packit Service 20376f
			exp.hunks++;
Packit Service 20376f
Packit Service 20376f
			for (l = 0; l < num_l; ++l) {
Packit Service 20376f
				const git_diff_line *line;
Packit Service 20376f
Packit Service 20376f
				cl_git_pass(git_patch_get_line_in_hunk(&line, patch, h, l));
Packit Service 20376f
				cl_assert(line && line->content);
Packit Service 20376f
				exp.lines++;
Packit Service 20376f
			}
Packit Service 20376f
		}
Packit Service 20376f
Packit Service 20376f
		git_patch_free(patch);
Packit Service 20376f
	}
Packit Service 20376f
Packit Service 20376f
	cl_assert_equal_i(13, exp.files);
Packit Service 20376f
	cl_assert_equal_i(8, exp.hunks);
Packit Service 20376f
	cl_assert_equal_i(14, exp.lines);
Packit Service 20376f
Packit Service 20376f
	git_diff_free(diff);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
static void iterate_over_patch(git_patch *patch, diff_expects *exp)
Packit Service 20376f
{
Packit Service 20376f
	size_t h, num_h = git_patch_num_hunks(patch), num_l;
Packit Service 20376f
Packit Service 20376f
	exp->files++;
Packit Service 20376f
	exp->hunks += (int)num_h;
Packit Service 20376f
Packit Service 20376f
	/* let's iterate in reverse, just because we can! */
Packit Service 20376f
	for (h = 1, num_l = 0; h <= num_h; ++h)
Packit Service 20376f
		num_l += git_patch_num_lines_in_hunk(patch, num_h - h);
Packit Service 20376f
Packit Service 20376f
	exp->lines += (int)num_l;
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
#define PATCH_CACHE 5
Packit Service 20376f
Packit Service 20376f
void test_diff_diffiter__iterate_randomly_while_saving_state(void)
Packit Service 20376f
{
Packit Service 20376f
	git_repository *repo = cl_git_sandbox_init("status");
Packit Service 20376f
	git_diff_options opts = GIT_DIFF_OPTIONS_INIT;
Packit Service 20376f
	git_diff *diff = NULL;
Packit Service 20376f
	diff_expects exp = {0};
Packit Service 20376f
	git_patch *patches[PATCH_CACHE];
Packit Service 20376f
	size_t p, d, num_d;
Packit Service 20376f
Packit Service 20376f
	memset(patches, 0, sizeof(patches));
Packit Service 20376f
Packit Service 20376f
	opts.context_lines = 3;
Packit Service 20376f
	opts.interhunk_lines = 1;
Packit Service 20376f
	opts.flags |= GIT_DIFF_INCLUDE_IGNORED | GIT_DIFF_INCLUDE_UNTRACKED;
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_diff_index_to_workdir(&diff, repo, NULL, &opts));
Packit Service 20376f
Packit Service 20376f
	num_d = git_diff_num_deltas(diff);
Packit Service 20376f
Packit Service 20376f
	/* To make sure that references counts work for diff and patch objects,
Packit Service 20376f
	 * this generates patches and randomly caches them.  Only when the patch
Packit Service 20376f
	 * is removed from the cache are hunks and lines counted.  At the end,
Packit Service 20376f
	 * there are still patches in the cache, so free the diff and try to
Packit Service 20376f
	 * process remaining patches after the diff is freed.
Packit Service 20376f
	 */
Packit Service 20376f
Packit Service 20376f
	srand(121212);
Packit Service 20376f
	p = rand() % PATCH_CACHE;
Packit Service 20376f
Packit Service 20376f
	for (d = 0; d < num_d; ++d) {
Packit Service 20376f
		/* take old patch */
Packit Service 20376f
		git_patch *patch = patches[p];
Packit Service 20376f
		patches[p] = NULL;
Packit Service 20376f
Packit Service 20376f
		/* cache new patch */
Packit Service 20376f
		cl_git_pass(git_patch_from_diff(&patches[p], diff, d));
Packit Service 20376f
		cl_assert(patches[p] != NULL);
Packit Service 20376f
Packit Service 20376f
		/* process old patch if non-NULL */
Packit Service 20376f
		if (patch != NULL) {
Packit Service 20376f
			iterate_over_patch(patch, &exp);
Packit Service 20376f
			git_patch_free(patch);
Packit Service 20376f
		}
Packit Service 20376f
Packit Service 20376f
		p = rand() % PATCH_CACHE;
Packit Service 20376f
	}
Packit Service 20376f
Packit Service 20376f
	/* free diff list now - refcounts should keep things safe */
Packit Service 20376f
	git_diff_free(diff);
Packit Service 20376f
Packit Service 20376f
	/* process remaining unprocessed patches */
Packit Service 20376f
	for (p = 0; p < PATCH_CACHE; p++) {
Packit Service 20376f
		git_patch *patch = patches[p];
Packit Service 20376f
Packit Service 20376f
		if (patch != NULL) {
Packit Service 20376f
			iterate_over_patch(patch, &exp);
Packit Service 20376f
			git_patch_free(patch);
Packit Service 20376f
		}
Packit Service 20376f
	}
Packit Service 20376f
Packit Service 20376f
	/* hopefully it all still added up right */
Packit Service 20376f
	cl_assert_equal_i(13, exp.files);
Packit Service 20376f
	cl_assert_equal_i(8, exp.hunks);
Packit Service 20376f
	cl_assert_equal_i(14, exp.lines);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
/* This output is taken directly from `git diff` on the status test data */
Packit Service 20376f
static const char *expected_patch_text[8] = {
Packit Service 20376f
	/* 0 */
Packit Service 20376f
	"diff --git a/file_deleted b/file_deleted\n"
Packit Service 20376f
	"deleted file mode 100644\n"
Packit Service 20376f
	"index 5452d32..0000000\n"
Packit Service 20376f
	"--- a/file_deleted\n"
Packit Service 20376f
	"+++ /dev/null\n"
Packit Service 20376f
	"@@ -1 +0,0 @@\n"
Packit Service 20376f
	"-file_deleted\n",
Packit Service 20376f
	/* 1 */
Packit Service 20376f
	"diff --git a/modified_file b/modified_file\n"
Packit Service 20376f
	"index 452e424..0a53963 100644\n"
Packit Service 20376f
	"--- a/modified_file\n"
Packit Service 20376f
	"+++ b/modified_file\n"
Packit Service 20376f
	"@@ -1 +1,2 @@\n"
Packit Service 20376f
	" modified_file\n"
Packit Service 20376f
	"+modified_file\n",
Packit Service 20376f
	/* 2 */
Packit Service 20376f
	"diff --git a/staged_changes_file_deleted b/staged_changes_file_deleted\n"
Packit Service 20376f
	"deleted file mode 100644\n"
Packit Service 20376f
	"index a6be623..0000000\n"
Packit Service 20376f
	"--- a/staged_changes_file_deleted\n"
Packit Service 20376f
	"+++ /dev/null\n"
Packit Service 20376f
	"@@ -1,2 +0,0 @@\n"
Packit Service 20376f
	"-staged_changes_file_deleted\n"
Packit Service 20376f
	"-staged_changes_file_deleted\n",
Packit Service 20376f
	/* 3 */
Packit Service 20376f
	"diff --git a/staged_changes_modified_file b/staged_changes_modified_file\n"
Packit Service 20376f
	"index 906ee77..011c344 100644\n"
Packit Service 20376f
	"--- a/staged_changes_modified_file\n"
Packit Service 20376f
	"+++ b/staged_changes_modified_file\n"
Packit Service 20376f
	"@@ -1,2 +1,3 @@\n"
Packit Service 20376f
	" staged_changes_modified_file\n"
Packit Service 20376f
	" staged_changes_modified_file\n"
Packit Service 20376f
	"+staged_changes_modified_file\n",
Packit Service 20376f
	/* 4 */
Packit Service 20376f
	"diff --git a/staged_new_file_deleted_file b/staged_new_file_deleted_file\n"
Packit Service 20376f
	"deleted file mode 100644\n"
Packit Service 20376f
	"index 90b8c29..0000000\n"
Packit Service 20376f
	"--- a/staged_new_file_deleted_file\n"
Packit Service 20376f
	"+++ /dev/null\n"
Packit Service 20376f
	"@@ -1 +0,0 @@\n"
Packit Service 20376f
	"-staged_new_file_deleted_file\n",
Packit Service 20376f
	/* 5 */
Packit Service 20376f
	"diff --git a/staged_new_file_modified_file b/staged_new_file_modified_file\n"
Packit Service 20376f
	"index ed06290..8b090c0 100644\n"
Packit Service 20376f
	"--- a/staged_new_file_modified_file\n"
Packit Service 20376f
	"+++ b/staged_new_file_modified_file\n"
Packit Service 20376f
	"@@ -1 +1,2 @@\n"
Packit Service 20376f
	" staged_new_file_modified_file\n"
Packit Service 20376f
	"+staged_new_file_modified_file\n",
Packit Service 20376f
	/* 6 */
Packit Service 20376f
	"diff --git a/subdir/deleted_file b/subdir/deleted_file\n"
Packit Service 20376f
	"deleted file mode 100644\n"
Packit Service 20376f
	"index 1888c80..0000000\n"
Packit Service 20376f
	"--- a/subdir/deleted_file\n"
Packit Service 20376f
	"+++ /dev/null\n"
Packit Service 20376f
	"@@ -1 +0,0 @@\n"
Packit Service 20376f
	"-subdir/deleted_file\n",
Packit Service 20376f
	/* 7 */
Packit Service 20376f
	"diff --git a/subdir/modified_file b/subdir/modified_file\n"
Packit Service 20376f
	"index a619198..57274b7 100644\n"
Packit Service 20376f
	"--- a/subdir/modified_file\n"
Packit Service 20376f
	"+++ b/subdir/modified_file\n"
Packit Service 20376f
	"@@ -1 +1,2 @@\n"
Packit Service 20376f
	" subdir/modified_file\n"
Packit Service 20376f
	"+subdir/modified_file\n"
Packit Service 20376f
};
Packit Service 20376f
Packit Service 20376f
void test_diff_diffiter__iterate_and_generate_patch_text(void)
Packit Service 20376f
{
Packit Service 20376f
	git_repository *repo = cl_git_sandbox_init("status");
Packit Service 20376f
	git_diff *diff;
Packit Service 20376f
	size_t d, num_d;
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_diff_index_to_workdir(&diff, repo, NULL, NULL));
Packit Service 20376f
Packit Service 20376f
	num_d = git_diff_num_deltas(diff);
Packit Service 20376f
	cl_assert_equal_i(8, (int)num_d);
Packit Service 20376f
Packit Service 20376f
	for (d = 0; d < num_d; ++d) {
Packit Service 20376f
		git_patch *patch;
Packit Service 20376f
		git_buf buf = GIT_BUF_INIT;
Packit Service 20376f
Packit Service 20376f
		cl_git_pass(git_patch_from_diff(&patch, diff, d));
Packit Service 20376f
		cl_assert(patch != NULL);
Packit Service 20376f
Packit Service 20376f
		cl_git_pass(git_patch_to_buf(&buf, patch));
Packit Service 20376f
Packit Service 20376f
		cl_assert_equal_s(expected_patch_text[d], buf.ptr);
Packit Service 20376f
Packit Service 20376f
		git_buf_free(&buf;;
Packit Service 20376f
		git_patch_free(patch);
Packit Service 20376f
	}
Packit Service 20376f
Packit Service 20376f
	git_diff_free(diff);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_diff_diffiter__checks_options_version(void)
Packit Service 20376f
{
Packit Service 20376f
	git_repository *repo = cl_git_sandbox_init("status");
Packit Service 20376f
	git_diff_options opts = GIT_DIFF_OPTIONS_INIT;
Packit Service 20376f
	git_diff *diff = NULL;
Packit Service 20376f
	const git_error *err;
Packit Service 20376f
Packit Service 20376f
	opts.version = 0;
Packit Service 20376f
	opts.flags |= GIT_DIFF_INCLUDE_IGNORED | GIT_DIFF_INCLUDE_UNTRACKED;
Packit Service 20376f
Packit Service 20376f
	cl_git_fail(git_diff_index_to_workdir(&diff, repo, NULL, &opts));
Packit Service 20376f
	err = giterr_last();
Packit Service 20376f
	cl_assert_equal_i(GITERR_INVALID, err->klass);
Packit Service 20376f
Packit Service 20376f
	giterr_clear();
Packit Service 20376f
	opts.version = 1024;
Packit Service 20376f
	cl_git_fail(git_diff_index_to_workdir(&diff, repo, NULL, &opts));
Packit Service 20376f
	err = giterr_last();
Packit Service 20376f
	cl_assert_equal_i(GITERR_INVALID, err->klass);
Packit Service 20376f
}
Packit Service 20376f