diff.c 4.69 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
#include "clar_libgit2.h"
#include "../diff/diff_helpers.h"

static git_repository *g_repo = NULL;

void test_stress_diff__initialize(void)
{
}

void test_stress_diff__cleanup(void)
{
	cl_git_sandbox_cleanup();
}

#define ANOTHER_POEM \
"OH, glorious are the guarded heights\nWhere guardian souls abide—\nSelf-exiled from our gross delights—\nAbove, beyond, outside:\nAn ampler arc their spirit swings—\nCommands a juster view—\nWe have their word for all these things,\nNo doubt their words are true.\n\nYet we, the bond slaves of our day,\nWhom dirt and danger press—\nCo-heirs of insolence, delay,\nAnd leagued unfaithfulness—\nSuch is our need must seek indeed\nAnd, having found, engage\nThe men who merely do the work\nFor which they draw the wage.\n\nFrom forge and farm and mine and bench,\nDeck, altar, outpost lone—\nMill, school, battalion, counter, trench,\nRail, senate, sheepfold, throne—\nCreation's cry goes up on high\nFrom age to cheated age:\n\"Send us the men who do the work\n\"For which they draw the wage!\"\n"

18
static void test_with_many(int expected_new)
19 20 21
{
	git_index *index;
	git_tree *tree, *new_tree;
22
	git_diff *diff = NULL;
23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
	diff_expects exp;
	git_diff_options diffopts = GIT_DIFF_OPTIONS_INIT;
	git_diff_find_options opts = GIT_DIFF_FIND_OPTIONS_INIT;

	cl_git_pass(git_repository_index(&index, g_repo));
	cl_git_pass(
		git_revparse_single((git_object **)&tree, g_repo, "HEAD^{tree}"));

	cl_git_pass(p_rename("renames/ikeepsix.txt", "renames/ikeepsix2.txt"));
	cl_git_pass(git_index_remove_bypath(index, "ikeepsix.txt"));
	cl_git_pass(git_index_add_bypath(index, "ikeepsix2.txt"));
	cl_git_pass(git_index_write(index));

	cl_git_pass(git_diff_tree_to_index(&diff, g_repo, tree, index, &diffopts));

	memset(&exp, 0, sizeof(exp));
	cl_git_pass(git_diff_foreach(
40
		diff, diff_file_cb, NULL, NULL, NULL, &exp));
41 42 43 44 45 46 47 48 49
	cl_assert_equal_i(1, exp.file_status[GIT_DELTA_DELETED]);
	cl_assert_equal_i(expected_new + 1, exp.file_status[GIT_DELTA_ADDED]);
	cl_assert_equal_i(expected_new + 2, exp.files);

	opts.flags = GIT_DIFF_FIND_ALL;
	cl_git_pass(git_diff_find_similar(diff, &opts));

	memset(&exp, 0, sizeof(exp));
	cl_git_pass(git_diff_foreach(
50
		diff, diff_file_cb, NULL, NULL, NULL, &exp));
51 52 53 54
	cl_assert_equal_i(1, exp.file_status[GIT_DELTA_RENAMED]);
	cl_assert_equal_i(expected_new, exp.file_status[GIT_DELTA_ADDED]);
	cl_assert_equal_i(expected_new + 1, exp.files);

55
	git_diff_free(diff);
56

57 58 59
	cl_repo_commit_from_index(NULL, g_repo, NULL, 1372350000, "yoyoyo");
	cl_git_pass(git_revparse_single(
		(git_object **)&new_tree, g_repo, "HEAD^{tree}"));
60 61 62 63 64 65

	cl_git_pass(git_diff_tree_to_tree(
		&diff, g_repo, tree, new_tree, &diffopts));

	memset(&exp, 0, sizeof(exp));
	cl_git_pass(git_diff_foreach(
66
		diff, diff_file_cb, NULL, NULL, NULL, &exp));
67 68 69 70 71 72 73 74 75
	cl_assert_equal_i(1, exp.file_status[GIT_DELTA_DELETED]);
	cl_assert_equal_i(expected_new + 1, exp.file_status[GIT_DELTA_ADDED]);
	cl_assert_equal_i(expected_new + 2, exp.files);

	opts.flags = GIT_DIFF_FIND_ALL;
	cl_git_pass(git_diff_find_similar(diff, &opts));

	memset(&exp, 0, sizeof(exp));
	cl_git_pass(git_diff_foreach(
76
		diff, diff_file_cb, NULL, NULL, NULL, &exp));
77 78 79 80
	cl_assert_equal_i(1, exp.file_status[GIT_DELTA_RENAMED]);
	cl_assert_equal_i(expected_new, exp.file_status[GIT_DELTA_ADDED]);
	cl_assert_equal_i(expected_new + 1, exp.files);

81
	git_diff_free(diff);
82 83 84 85 86 87 88 89 90 91 92

	git_tree_free(new_tree);
	git_tree_free(tree);
	git_index_free(index);
}

void test_stress_diff__rename_big_files(void)
{
	git_index *index;
	char tmp[64];
	int i, j;
93
	git_str b = GIT_STR_INIT;
94 95 96 97 98 99

	g_repo = cl_git_sandbox_init("renames");

	cl_git_pass(git_repository_index(&index, g_repo));

	for (i = 0; i < 100; i += 1) {
100
		p_snprintf(tmp, sizeof(tmp), "renames/newfile%03d", i);
101
		for (j = i * 256; j > 0; --j)
102
			git_str_printf(&b, "more content %d\n", i);
103 104 105 106
		cl_git_mkfile(tmp, b.ptr);
	}

	for (i = 0; i < 100; i += 1) {
107
		p_snprintf(tmp, sizeof(tmp), "renames/newfile%03d", i);
108 109 110
		cl_git_pass(git_index_add_bypath(index, tmp + strlen("renames/")));
	}

111
	git_str_dispose(&b);
112 113 114 115 116 117 118 119 120 121
	git_index_free(index);

	test_with_many(100);
}

void test_stress_diff__rename_many_files(void)
{
	git_index *index;
	char tmp[64];
	int i;
122
	git_str b = GIT_STR_INIT;
123 124 125 126 127

	g_repo = cl_git_sandbox_init("renames");

	cl_git_pass(git_repository_index(&index, g_repo));

128
	git_str_printf(&b, "%08d\n" ANOTHER_POEM "%08d\n" ANOTHER_POEM ANOTHER_POEM, 0, 0);
129 130

	for (i = 0; i < 2500; i += 1) {
131 132
		p_snprintf(tmp, sizeof(tmp), "renames/newfile%03d", i);
		p_snprintf(b.ptr, 9, "%08d", i);
133 134 135
		b.ptr[8] = '\n';
		cl_git_mkfile(tmp, b.ptr);
	}
136
	git_str_dispose(&b);
137 138

	for (i = 0; i < 2500; i += 1) {
139
		p_snprintf(tmp, sizeof(tmp), "renames/newfile%03d", i);
140 141 142 143 144 145 146
		cl_git_pass(git_index_add_bypath(index, tmp + strlen("renames/")));
	}

	git_index_free(index);

	test_with_many(2500);
}