Blame tests/diff/tree.c

Packit Service 20376f
#include "clar_libgit2.h"
Packit Service 20376f
#include "diff_helpers.h"
Packit Service 20376f
Packit Service 20376f
static git_repository *g_repo = NULL;
Packit Service 20376f
static git_diff_options opts;
Packit Service 20376f
static git_diff *diff;
Packit Service 20376f
static git_tree *a, *b;
Packit Service 20376f
static diff_expects expect;
Packit Service 20376f
Packit Service 20376f
void test_diff_tree__initialize(void)
Packit Service 20376f
{
Packit Service 20376f
	cl_git_pass(git_diff_init_options(&opts, GIT_DIFF_OPTIONS_VERSION));
Packit Service 20376f
Packit Service 20376f
	memset(&expect, 0, sizeof(expect));
Packit Service 20376f
Packit Service 20376f
	diff = NULL;
Packit Service 20376f
	a = NULL;
Packit Service 20376f
	b = NULL;
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_diff_tree__cleanup(void)
Packit Service 20376f
{
Packit Service 20376f
	git_diff_free(diff);
Packit Service 20376f
	git_tree_free(a);
Packit Service 20376f
	git_tree_free(b);
Packit Service 20376f
Packit Service 20376f
	cl_git_sandbox_cleanup();
Packit Service 20376f
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_diff_tree__0(void)
Packit Service 20376f
{
Packit Service 20376f
	/* grabbed a couple of commit oids from the history of the attr repo */
Packit Service 20376f
	const char *a_commit = "605812a";
Packit Service 20376f
	const char *b_commit = "370fe9ec22";
Packit Service 20376f
	const char *c_commit = "f5b0af1fb4f5c";
Packit Service 20376f
	git_tree *c;
Packit Service 20376f
Packit Service 20376f
	g_repo = cl_git_sandbox_init("attr");
Packit Service 20376f
Packit Service 20376f
	cl_assert((a = resolve_commit_oid_to_tree(g_repo, a_commit)) != NULL);
Packit Service 20376f
	cl_assert((b = resolve_commit_oid_to_tree(g_repo, b_commit)) != NULL);
Packit Service 20376f
	cl_assert((c = resolve_commit_oid_to_tree(g_repo, c_commit)) != NULL);
Packit Service 20376f
Packit Service 20376f
	opts.context_lines = 1;
Packit Service 20376f
	opts.interhunk_lines = 1;
Packit Service 20376f
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_diff_tree_to_tree(&diff, g_repo, a, b, &opts));
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_diff_foreach(
Packit Service 20376f
		diff, diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &expect);;
Packit Service 20376f
Packit Service 20376f
	cl_assert_equal_i(5, expect.files);
Packit Service 20376f
	cl_assert_equal_i(2, expect.file_status[GIT_DELTA_ADDED]);
Packit Service 20376f
	cl_assert_equal_i(1, expect.file_status[GIT_DELTA_DELETED]);
Packit Service 20376f
	cl_assert_equal_i(2, expect.file_status[GIT_DELTA_MODIFIED]);
Packit Service 20376f
Packit Service 20376f
	cl_assert_equal_i(5, expect.hunks);
Packit Service 20376f
Packit Service 20376f
	cl_assert_equal_i(7 + 24 + 1 + 6 + 6, expect.lines);
Packit Service 20376f
	cl_assert_equal_i(1, expect.line_ctxt);
Packit Service 20376f
	cl_assert_equal_i(24 + 1 + 5 + 5, expect.line_adds);
Packit Service 20376f
	cl_assert_equal_i(7 + 1, expect.line_dels);
Packit Service 20376f
Packit Service 20376f
	git_diff_free(diff);
Packit Service 20376f
	diff = NULL;
Packit Service 20376f
Packit Service 20376f
	memset(&expect, 0, sizeof(expect));
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_diff_tree_to_tree(&diff, g_repo, c, b, &opts));
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_diff_foreach(
Packit Service 20376f
		diff, diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &expect);;
Packit Service 20376f
Packit Service 20376f
	cl_assert_equal_i(2, expect.files);
Packit Service 20376f
	cl_assert_equal_i(0, expect.file_status[GIT_DELTA_ADDED]);
Packit Service 20376f
	cl_assert_equal_i(0, expect.file_status[GIT_DELTA_DELETED]);
Packit Service 20376f
	cl_assert_equal_i(2, expect.file_status[GIT_DELTA_MODIFIED]);
Packit Service 20376f
Packit Service 20376f
	cl_assert_equal_i(2, expect.hunks);
Packit Service 20376f
Packit Service 20376f
	cl_assert_equal_i(8 + 15, expect.lines);
Packit Service 20376f
	cl_assert_equal_i(1, expect.line_ctxt);
Packit Service 20376f
	cl_assert_equal_i(1, expect.line_adds);
Packit Service 20376f
	cl_assert_equal_i(7 + 14, expect.line_dels);
Packit Service 20376f
Packit Service 20376f
	git_tree_free(c);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
#define DIFF_OPTS(FLAGS, CTXT) \
Packit Service 20376f
	{GIT_DIFF_OPTIONS_VERSION, (FLAGS), GIT_SUBMODULE_IGNORE_UNSPECIFIED, \
Packit Service 20376f
	{NULL,0}, NULL, NULL, NULL, (CTXT), 1}
Packit Service 20376f
Packit Service 20376f
void test_diff_tree__options(void)
Packit Service 20376f
{
Packit Service 20376f
	/* grabbed a couple of commit oids from the history of the attr repo */
Packit Service 20376f
	const char *a_commit = "6bab5c79cd5140d0";
Packit Service 20376f
	const char *b_commit = "605812ab7fe421fdd";
Packit Service 20376f
	const char *c_commit = "f5b0af1fb4f5";
Packit Service 20376f
	const char *d_commit = "a97cc019851";
Packit Service 20376f
	git_tree *c, *d;
Packit Service 20376f
	diff_expects actual;
Packit Service 20376f
	int test_ab_or_cd[] = { 0, 0, 0, 0, 1, 1, 1, 1, 1 };
Packit Service 20376f
	git_diff_options test_options[] = {
Packit Service 20376f
		/* a vs b tests */
Packit Service 20376f
		DIFF_OPTS(GIT_DIFF_NORMAL, 1),
Packit Service 20376f
		DIFF_OPTS(GIT_DIFF_NORMAL, 3),
Packit Service 20376f
		DIFF_OPTS(GIT_DIFF_REVERSE, 2),
Packit Service 20376f
		DIFF_OPTS(GIT_DIFF_FORCE_TEXT, 2),
Packit Service 20376f
		/* c vs d tests */
Packit Service 20376f
		DIFF_OPTS(GIT_DIFF_NORMAL, 3),
Packit Service 20376f
		DIFF_OPTS(GIT_DIFF_IGNORE_WHITESPACE, 3),
Packit Service 20376f
		DIFF_OPTS(GIT_DIFF_IGNORE_WHITESPACE_CHANGE, 3),
Packit Service 20376f
		DIFF_OPTS(GIT_DIFF_IGNORE_WHITESPACE_EOL, 3),
Packit Service 20376f
		DIFF_OPTS(GIT_DIFF_IGNORE_WHITESPACE | GIT_DIFF_REVERSE, 1),
Packit Service 20376f
	};
Packit Service 20376f
Packit Service 20376f
	/* to generate these values:
Packit Service 20376f
	 * - cd to tests/resources/attr,
Packit Service 20376f
	 * - mv .gitted .git
Packit Service 20376f
	 * - git diff [options] 6bab5c79cd5140d0 605812ab7fe421fdd
Packit Service 20376f
	 * - mv .git .gitted
Packit Service 20376f
	 */
Packit Service 20376f
#define EXPECT_STATUS_ADM(ADDS,DELS,MODS) { 0, ADDS, DELS, MODS, 0, 0, 0, 0, 0 }
Packit Service 20376f
Packit Service 20376f
	diff_expects test_expects[] = {
Packit Service 20376f
		/* a vs b tests */
Packit Service 20376f
		{ 5, 0, EXPECT_STATUS_ADM(3, 0, 2), 4, 0, 0, 51, 2, 46, 3 },
Packit Service 20376f
		{ 5, 0, EXPECT_STATUS_ADM(3, 0, 2), 4, 0, 0, 53, 4, 46, 3 },
Packit Service 20376f
		{ 5, 0, EXPECT_STATUS_ADM(0, 3, 2), 4, 0, 0, 52, 3, 3, 46 },
Packit Service 20376f
		{ 5, 0, EXPECT_STATUS_ADM(3, 0, 2), 5, 0, 0, 54, 3, 47, 4 },
Packit Service 20376f
		/* c vs d tests */
Packit Service 20376f
		{ 1, 0, EXPECT_STATUS_ADM(0, 0, 1), 1, 0, 0, 22, 9, 10, 3 },
Packit Service 20376f
		{ 1, 0, EXPECT_STATUS_ADM(0, 0, 1), 1, 0, 0, 19, 12, 7, 0 },
Packit Service 20376f
		{ 1, 0, EXPECT_STATUS_ADM(0, 0, 1), 1, 0, 0, 20, 11, 8, 1 },
Packit Service 20376f
		{ 1, 0, EXPECT_STATUS_ADM(0, 0, 1), 1, 0, 0, 20, 11, 8, 1 },
Packit Service 20376f
		{ 1, 0, EXPECT_STATUS_ADM(0, 0, 1), 1, 0, 0, 18, 11, 0, 7 },
Packit Service 20376f
		{ 0 },
Packit Service 20376f
	};
Packit Service 20376f
	diff_expects *expected;
Packit Service 20376f
	int i, j;
Packit Service 20376f
Packit Service 20376f
	g_repo = cl_git_sandbox_init("attr");
Packit Service 20376f
Packit Service 20376f
	cl_assert((a = resolve_commit_oid_to_tree(g_repo, a_commit)) != NULL);
Packit Service 20376f
	cl_assert((b = resolve_commit_oid_to_tree(g_repo, b_commit)) != NULL);
Packit Service 20376f
	cl_assert((c = resolve_commit_oid_to_tree(g_repo, c_commit)) != NULL);
Packit Service 20376f
	cl_assert((d = resolve_commit_oid_to_tree(g_repo, d_commit)) != NULL);
Packit Service 20376f
Packit Service 20376f
	for (i = 0; test_expects[i].files > 0; i++) {
Packit Service 20376f
		memset(&actual, 0, sizeof(actual)); /* clear accumulator */
Packit Service 20376f
		opts = test_options[i];
Packit Service 20376f
Packit Service 20376f
		if (test_ab_or_cd[i] == 0)
Packit Service 20376f
			cl_git_pass(git_diff_tree_to_tree(&diff, g_repo, a, b, &opts));
Packit Service 20376f
		else
Packit Service 20376f
			cl_git_pass(git_diff_tree_to_tree(&diff, g_repo, c, d, &opts));
Packit Service 20376f
Packit Service 20376f
		cl_git_pass(git_diff_foreach(
Packit Service 20376f
			diff, diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &actual));
Packit Service 20376f
Packit Service 20376f
		expected = &test_expects[i];
Packit Service 20376f
		cl_assert_equal_i(actual.files,     expected->files);
Packit Service 20376f
		for (j = GIT_DELTA_UNMODIFIED; j <= GIT_DELTA_TYPECHANGE; ++j)
Packit Service 20376f
			cl_assert_equal_i(expected->file_status[j], actual.file_status[j]);
Packit Service 20376f
		cl_assert_equal_i(actual.hunks,     expected->hunks);
Packit Service 20376f
		cl_assert_equal_i(actual.lines,     expected->lines);
Packit Service 20376f
		cl_assert_equal_i(actual.line_ctxt, expected->line_ctxt);
Packit Service 20376f
		cl_assert_equal_i(actual.line_adds, expected->line_adds);
Packit Service 20376f
		cl_assert_equal_i(actual.line_dels, expected->line_dels);
Packit Service 20376f
Packit Service 20376f
		git_diff_free(diff);
Packit Service 20376f
		diff = NULL;
Packit Service 20376f
	}
Packit Service 20376f
Packit Service 20376f
	git_tree_free(c);
Packit Service 20376f
	git_tree_free(d);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_diff_tree__bare(void)
Packit Service 20376f
{
Packit Service 20376f
	const char *a_commit = "8496071c1b46c85";
Packit Service 20376f
	const char *b_commit = "be3563ae3f79";
Packit Service 20376f
Packit Service 20376f
	g_repo = cl_git_sandbox_init("testrepo.git");
Packit Service 20376f
Packit Service 20376f
	cl_assert((a = resolve_commit_oid_to_tree(g_repo, a_commit)) != NULL);
Packit Service 20376f
	cl_assert((b = resolve_commit_oid_to_tree(g_repo, b_commit)) != NULL);
Packit Service 20376f
Packit Service 20376f
	opts.context_lines = 1;
Packit Service 20376f
	opts.interhunk_lines = 1;
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_diff_tree_to_tree(&diff, g_repo, a, b, &opts));
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_diff_foreach(
Packit Service 20376f
		diff, diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &expect);;
Packit Service 20376f
Packit Service 20376f
	cl_assert_equal_i(3, expect.files);
Packit Service 20376f
	cl_assert_equal_i(2, expect.file_status[GIT_DELTA_ADDED]);
Packit Service 20376f
	cl_assert_equal_i(0, expect.file_status[GIT_DELTA_DELETED]);
Packit Service 20376f
	cl_assert_equal_i(1, expect.file_status[GIT_DELTA_MODIFIED]);
Packit Service 20376f
Packit Service 20376f
	cl_assert_equal_i(3, expect.hunks);
Packit Service 20376f
Packit Service 20376f
	cl_assert_equal_i(4, expect.lines);
Packit Service 20376f
	cl_assert_equal_i(0, expect.line_ctxt);
Packit Service 20376f
	cl_assert_equal_i(3, expect.line_adds);
Packit Service 20376f
	cl_assert_equal_i(1, expect.line_dels);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_diff_tree__merge(void)
Packit Service 20376f
{
Packit Service 20376f
	/* grabbed a couple of commit oids from the history of the attr repo */
Packit Service 20376f
	const char *a_commit = "605812a";
Packit Service 20376f
	const char *b_commit = "370fe9ec22";
Packit Service 20376f
	const char *c_commit = "f5b0af1fb4f5c";
Packit Service 20376f
	git_tree *c;
Packit Service 20376f
	git_diff *diff1 = NULL, *diff2 = NULL;
Packit Service 20376f
Packit Service 20376f
	g_repo = cl_git_sandbox_init("attr");
Packit Service 20376f
Packit Service 20376f
	cl_assert((a = resolve_commit_oid_to_tree(g_repo, a_commit)) != NULL);
Packit Service 20376f
	cl_assert((b = resolve_commit_oid_to_tree(g_repo, b_commit)) != NULL);
Packit Service 20376f
	cl_assert((c = resolve_commit_oid_to_tree(g_repo, c_commit)) != NULL);
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_diff_tree_to_tree(&diff1, g_repo, a, b, NULL));
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_diff_tree_to_tree(&diff2, g_repo, c, b, NULL));
Packit Service 20376f
Packit Service 20376f
	git_tree_free(c);
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_diff_merge(diff1, diff2));
Packit Service 20376f
Packit Service 20376f
	git_diff_free(diff2);
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_diff_foreach(
Packit Service 20376f
		diff1, diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &expect);;
Packit Service 20376f
Packit Service 20376f
	cl_assert_equal_i(6, expect.files);
Packit Service 20376f
	cl_assert_equal_i(2, expect.file_status[GIT_DELTA_ADDED]);
Packit Service 20376f
	cl_assert_equal_i(1, expect.file_status[GIT_DELTA_DELETED]);
Packit Service 20376f
	cl_assert_equal_i(3, expect.file_status[GIT_DELTA_MODIFIED]);
Packit Service 20376f
Packit Service 20376f
	cl_assert_equal_i(6, expect.hunks);
Packit Service 20376f
Packit Service 20376f
	cl_assert_equal_i(59, expect.lines);
Packit Service 20376f
	cl_assert_equal_i(1, expect.line_ctxt);
Packit Service 20376f
	cl_assert_equal_i(36, expect.line_adds);
Packit Service 20376f
	cl_assert_equal_i(22, expect.line_dels);
Packit Service 20376f
Packit Service 20376f
	git_diff_free(diff1);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_diff_tree__larger_hunks(void)
Packit Service 20376f
{
Packit Service 20376f
	const char *a_commit = "d70d245ed97ed2aa596dd1af6536e4bfdb047b69";
Packit Service 20376f
	const char *b_commit = "7a9e0b02e63179929fed24f0a3e0f19168114d10";
Packit Service 20376f
	size_t d, num_d, h, num_h, l, num_l;
Packit Service 20376f
	git_patch *patch;
Packit Service 20376f
	const git_diff_hunk *hunk;
Packit Service 20376f
	const git_diff_line *line;
Packit Service 20376f
Packit Service 20376f
	g_repo = cl_git_sandbox_init("diff");
Packit Service 20376f
Packit Service 20376f
	cl_assert((a = resolve_commit_oid_to_tree(g_repo, a_commit)) != NULL);
Packit Service 20376f
	cl_assert((b = resolve_commit_oid_to_tree(g_repo, b_commit)) != NULL);
Packit Service 20376f
Packit Service 20376f
	opts.context_lines = 1;
Packit Service 20376f
	opts.interhunk_lines = 0;
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_diff_tree_to_tree(&diff, g_repo, a, b, &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
		cl_git_pass(git_patch_from_diff(&patch, diff, d));
Packit Service 20376f
		cl_assert(patch);
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
			cl_git_pass(git_patch_get_hunk(&hunk, &num_l, patch, h));
Packit Service 20376f
Packit Service 20376f
			for (l = 0; l < num_l; ++l) {
Packit Service 20376f
				cl_git_pass(git_patch_get_line_in_hunk(&line, patch, h, l));
Packit Service 20376f
				cl_assert(line);
Packit Service 20376f
			}
Packit Service 20376f
Packit Service 20376f
			cl_git_fail(git_patch_get_line_in_hunk(&line, patch, h, num_l));
Packit Service 20376f
		}
Packit Service 20376f
Packit Service 20376f
		cl_git_fail(git_patch_get_hunk(&hunk, &num_l, patch, num_h));
Packit Service 20376f
Packit Service 20376f
		git_patch_free(patch);
Packit Service 20376f
	}
Packit Service 20376f
Packit Service 20376f
	cl_git_fail(git_patch_from_diff(&patch, diff, num_d));
Packit Service 20376f
Packit Service 20376f
	cl_assert_equal_i(2, (int)num_d);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_diff_tree__checks_options_version(void)
Packit Service 20376f
{
Packit Service 20376f
	const char *a_commit = "8496071c1b46c85";
Packit Service 20376f
	const char *b_commit = "be3563ae3f79";
Packit Service 20376f
	const git_error *err;
Packit Service 20376f
Packit Service 20376f
	g_repo = cl_git_sandbox_init("testrepo.git");
Packit Service 20376f
Packit Service 20376f
	cl_assert((a = resolve_commit_oid_to_tree(g_repo, a_commit)) != NULL);
Packit Service 20376f
	cl_assert((b = resolve_commit_oid_to_tree(g_repo, b_commit)) != NULL);
Packit Service 20376f
Packit Service 20376f
	opts.version = 0;
Packit Service 20376f
	cl_git_fail(git_diff_tree_to_tree(&diff, g_repo, a, b, &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_tree_to_tree(&diff, g_repo, a, b, &opts));
Packit Service 20376f
	err = giterr_last();
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void process_tree_to_tree_diffing(
Packit Service 20376f
	const char *old_commit,
Packit Service 20376f
	const char *new_commit)
Packit Service 20376f
{
Packit Service 20376f
	g_repo = cl_git_sandbox_init("unsymlinked.git");
Packit Service 20376f
Packit Service 20376f
	cl_assert((a = resolve_commit_oid_to_tree(g_repo, old_commit)) != NULL);
Packit Service 20376f
	cl_assert((b = resolve_commit_oid_to_tree(g_repo, new_commit)) != NULL);
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_diff_tree_to_tree(&diff, g_repo, a, b, &opts));
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_diff_foreach(
Packit Service 20376f
		diff, diff_file_cb, NULL, NULL, NULL, &expect);;
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_diff_tree__symlink_blob_mode_changed_to_regular_file(void)
Packit Service 20376f
{
Packit Service 20376f
	/*
Packit Service 20376f
	* $ git diff  7fccd7..806999
Packit Service 20376f
	* diff --git a/include/Nu/Nu.h b/include/Nu/Nu.h
Packit Service 20376f
	* deleted file mode 120000
Packit Service 20376f
	* index 19bf568..0000000
Packit Service 20376f
	* --- a/include/Nu/Nu.h
Packit Service 20376f
	* +++ /dev/null
Packit Service 20376f
	* @@ -1 +0,0 @@
Packit Service 20376f
	* -../../objc/Nu.h
Packit Service 20376f
	* \ No newline at end of file
Packit Service 20376f
	* diff --git a/include/Nu/Nu.h b/include/Nu/Nu.h
Packit Service 20376f
	* new file mode 100644
Packit Service 20376f
	* index 0000000..f9e6561
Packit Service 20376f
	* --- /dev/null
Packit Service 20376f
	* +++ b/include/Nu/Nu.h
Packit Service 20376f
	* @@ -0,0 +1 @@
Packit Service 20376f
	* +awesome content
Packit Service 20376f
	* diff --git a/objc/Nu.h b/objc/Nu.h
Packit Service 20376f
	* deleted file mode 100644
Packit Service 20376f
	* index f9e6561..0000000
Packit Service 20376f
	* --- a/objc/Nu.h
Packit Service 20376f
	* +++ /dev/null
Packit Service 20376f
	* @@ -1 +0,0 @@
Packit Service 20376f
	* -awesome content
Packit Service 20376f
	*/
Packit Service 20376f
Packit Service 20376f
	process_tree_to_tree_diffing("7fccd7", "806999");
Packit Service 20376f
Packit Service 20376f
	cl_assert_equal_i(3, expect.files);
Packit Service 20376f
	cl_assert_equal_i(2, expect.file_status[GIT_DELTA_DELETED]);
Packit Service 20376f
	cl_assert_equal_i(0, expect.file_status[GIT_DELTA_MODIFIED]);
Packit Service 20376f
	cl_assert_equal_i(1, expect.file_status[GIT_DELTA_ADDED]);
Packit Service 20376f
	cl_assert_equal_i(0, expect.file_status[GIT_DELTA_TYPECHANGE]);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_diff_tree__symlink_blob_mode_changed_to_regular_file_as_typechange(void)
Packit Service 20376f
{
Packit Service 20376f
	/*
Packit Service 20376f
	 * $ git diff  7fccd7..a8595c
Packit Service 20376f
	 * diff --git a/include/Nu/Nu.h b/include/Nu/Nu.h
Packit Service 20376f
	 * deleted file mode 120000
Packit Service 20376f
	 * index 19bf568..0000000
Packit Service 20376f
	 * --- a/include/Nu/Nu.h
Packit Service 20376f
	 * +++ /dev/null
Packit Service 20376f
	 * @@ -1 +0,0 @@
Packit Service 20376f
	 * -../../objc/Nu.h
Packit Service 20376f
	 * \ No newline at end of file
Packit Service 20376f
	 * diff --git a/include/Nu/Nu.h b/include/Nu/Nu.h
Packit Service 20376f
	 * new file mode 100755
Packit Service 20376f
	 * index 0000000..f9e6561
Packit Service 20376f
	 * --- /dev/null
Packit Service 20376f
	 * +++ b/include/Nu/Nu.h
Packit Service 20376f
	 * @@ -0,0 +1 @@
Packit Service 20376f
	 * +awesome content
Packit Service 20376f
	 * diff --git a/objc/Nu.h b/objc/Nu.h
Packit Service 20376f
	 * deleted file mode 100644
Packit Service 20376f
	 * index f9e6561..0000000
Packit Service 20376f
	 * --- a/objc/Nu.h
Packit Service 20376f
	 * +++ /dev/null
Packit Service 20376f
	 * @@ -1 +0,0 @@
Packit Service 20376f
	 * -awesome content
Packit Service 20376f
	*/
Packit Service 20376f
Packit Service 20376f
	opts.flags = GIT_DIFF_INCLUDE_TYPECHANGE;
Packit Service 20376f
	process_tree_to_tree_diffing("7fccd7", "a8595c");
Packit Service 20376f
Packit Service 20376f
	cl_assert_equal_i(2, expect.files);
Packit Service 20376f
	cl_assert_equal_i(1, expect.file_status[GIT_DELTA_DELETED]);
Packit Service 20376f
	cl_assert_equal_i(0, expect.file_status[GIT_DELTA_MODIFIED]);
Packit Service 20376f
	cl_assert_equal_i(0, expect.file_status[GIT_DELTA_ADDED]);
Packit Service 20376f
	cl_assert_equal_i(1, expect.file_status[GIT_DELTA_TYPECHANGE]);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_diff_tree__regular_blob_mode_changed_to_executable_file(void)
Packit Service 20376f
{
Packit Service 20376f
	/*
Packit Service 20376f
	 * $ git diff 806999..a8595c
Packit Service 20376f
	 * diff --git a/include/Nu/Nu.h b/include/Nu/Nu.h
Packit Service 20376f
	 * old mode 100644
Packit Service 20376f
	 * new mode 100755
Packit Service 20376f
	 */
Packit Service 20376f
Packit Service 20376f
	process_tree_to_tree_diffing("806999", "a8595c");
Packit Service 20376f
Packit Service 20376f
	cl_assert_equal_i(1, expect.files);
Packit Service 20376f
	cl_assert_equal_i(0, expect.file_status[GIT_DELTA_DELETED]);
Packit Service 20376f
	cl_assert_equal_i(1, expect.file_status[GIT_DELTA_MODIFIED]);
Packit Service 20376f
	cl_assert_equal_i(0, expect.file_status[GIT_DELTA_ADDED]);
Packit Service 20376f
	cl_assert_equal_i(0, expect.file_status[GIT_DELTA_TYPECHANGE]);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_diff_tree__issue_1397(void)
Packit Service 20376f
{
Packit Service 20376f
	/* this test shows that it is not needed */
Packit Service 20376f
Packit Service 20376f
	g_repo = cl_git_sandbox_init("issue_1397");
Packit Service 20376f
Packit Service 20376f
	cl_repo_set_bool(g_repo, "core.autocrlf", true);
Packit Service 20376f
Packit Service 20376f
	cl_assert((a = resolve_commit_oid_to_tree(g_repo, "8a7ef04")) != NULL);
Packit Service 20376f
	cl_assert((b = resolve_commit_oid_to_tree(g_repo, "7f483a7")) != NULL);
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_diff_tree_to_tree(&diff, g_repo, a, b, &opts));
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_diff_foreach(diff,
Packit Service 20376f
		diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &expect);;
Packit Service 20376f
Packit Service 20376f
	cl_assert_equal_i(1, expect.files);
Packit Service 20376f
	cl_assert_equal_i(0, expect.file_status[GIT_DELTA_DELETED]);
Packit Service 20376f
	cl_assert_equal_i(1, expect.file_status[GIT_DELTA_MODIFIED]);
Packit Service 20376f
	cl_assert_equal_i(0, expect.file_status[GIT_DELTA_ADDED]);
Packit Service 20376f
	cl_assert_equal_i(0, expect.file_status[GIT_DELTA_TYPECHANGE]);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
static void set_config_int(git_repository *repo, const char *name, int value)
Packit Service 20376f
{
Packit Service 20376f
	git_config *cfg;
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_repository_config(&cfg, repo));
Packit Service 20376f
	cl_git_pass(git_config_set_int32(cfg, name, value));
Packit Service 20376f
	git_config_free(cfg);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_diff_tree__diff_configs(void)
Packit Service 20376f
{
Packit Service 20376f
	const char *a_commit = "d70d245e";
Packit Service 20376f
	const char *b_commit = "7a9e0b02";
Packit Service 20376f
Packit Service 20376f
	g_repo = cl_git_sandbox_init("diff");
Packit Service 20376f
Packit Service 20376f
	cl_assert((a = resolve_commit_oid_to_tree(g_repo, a_commit)) != NULL);
Packit Service 20376f
	cl_assert((b = resolve_commit_oid_to_tree(g_repo, b_commit)) != NULL);
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_diff_tree_to_tree(&diff, g_repo, a, b, NULL));
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_diff_foreach(diff, 
Packit Service 20376f
		diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &expect);;
Packit Service 20376f
Packit Service 20376f
	cl_assert_equal_i(2, expect.files);
Packit Service 20376f
	cl_assert_equal_i(2, expect.file_status[GIT_DELTA_MODIFIED]);
Packit Service 20376f
	cl_assert_equal_i(6, expect.hunks);
Packit Service 20376f
	cl_assert_equal_i(55, expect.lines);
Packit Service 20376f
	cl_assert_equal_i(33, expect.line_ctxt);
Packit Service 20376f
	cl_assert_equal_i(7, expect.line_adds);
Packit Service 20376f
	cl_assert_equal_i(15, expect.line_dels);
Packit Service 20376f
Packit Service 20376f
	git_diff_free(diff);
Packit Service 20376f
	diff = NULL;
Packit Service 20376f
Packit Service 20376f
	set_config_int(g_repo, "diff.context", 1);
Packit Service 20376f
Packit Service 20376f
	memset(&expect, 0, sizeof(expect));
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_diff_tree_to_tree(&diff, g_repo, a, b, NULL));
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_diff_foreach(diff,
Packit Service 20376f
		diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &expect);;
Packit Service 20376f
Packit Service 20376f
	cl_assert_equal_i(2, expect.files);
Packit Service 20376f
	cl_assert_equal_i(2, expect.file_status[GIT_DELTA_MODIFIED]);
Packit Service 20376f
	cl_assert_equal_i(7, expect.hunks);
Packit Service 20376f
	cl_assert_equal_i(34, expect.lines);
Packit Service 20376f
	cl_assert_equal_i(12, expect.line_ctxt);
Packit Service 20376f
	cl_assert_equal_i(7, expect.line_adds);
Packit Service 20376f
	cl_assert_equal_i(15, expect.line_dels);
Packit Service 20376f
Packit Service 20376f
	git_diff_free(diff);
Packit Service 20376f
	diff = NULL;
Packit Service 20376f
Packit Service 20376f
	set_config_int(g_repo, "diff.context", 0);
Packit Service 20376f
	set_config_int(g_repo, "diff.noprefix", 1);
Packit Service 20376f
Packit Service 20376f
	memset(&expect, 0, sizeof(expect));
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_diff_tree_to_tree(&diff, g_repo, a, b, NULL));
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_diff_foreach(diff,
Packit Service 20376f
		diff_file_cb, diff_binary_cb, diff_hunk_cb, diff_line_cb, &expect);;
Packit Service 20376f
Packit Service 20376f
	cl_assert_equal_i(2, expect.files);
Packit Service 20376f
	cl_assert_equal_i(2, expect.file_status[GIT_DELTA_MODIFIED]);
Packit Service 20376f
	cl_assert_equal_i(7, expect.hunks);
Packit Service 20376f
	cl_assert_equal_i(22, expect.lines);
Packit Service 20376f
	cl_assert_equal_i(0, expect.line_ctxt);
Packit Service 20376f
	cl_assert_equal_i(7, expect.line_adds);
Packit Service 20376f
	cl_assert_equal_i(15, expect.line_dels);
Packit Service 20376f
}