Blame tests/stress/diff.c

Packit Service 20376f
#include "clar_libgit2.h"
Packit Service 20376f
#include "../diff/diff_helpers.h"
Packit Service 20376f
Packit Service 20376f
static git_repository *g_repo = NULL;
Packit Service 20376f
Packit Service 20376f
void test_stress_diff__initialize(void)
Packit Service 20376f
{
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_stress_diff__cleanup(void)
Packit Service 20376f
{
Packit Service 20376f
	cl_git_sandbox_cleanup();
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
#define ANOTHER_POEM \
Packit Service 20376f
"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"
Packit Service 20376f
Packit Service 20376f
static void test_with_many(int expected_new)
Packit Service 20376f
{
Packit Service 20376f
	git_index *index;
Packit Service 20376f
	git_tree *tree, *new_tree;
Packit Service 20376f
	git_diff *diff = NULL;
Packit Service 20376f
	diff_expects exp;
Packit Service 20376f
	git_diff_options diffopts = GIT_DIFF_OPTIONS_INIT;
Packit Service 20376f
	git_diff_find_options opts = GIT_DIFF_FIND_OPTIONS_INIT;
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_repository_index(&index, g_repo));
Packit Service 20376f
	cl_git_pass(
Packit Service 20376f
		git_revparse_single((git_object **)&tree, g_repo, "HEAD^{tree}"));
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(p_rename("renames/ikeepsix.txt", "renames/ikeepsix2.txt"));
Packit Service 20376f
	cl_git_pass(git_index_remove_bypath(index, "ikeepsix.txt"));
Packit Service 20376f
	cl_git_pass(git_index_add_bypath(index, "ikeepsix2.txt"));
Packit Service 20376f
	cl_git_pass(git_index_write(index));
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_diff_tree_to_index(&diff, g_repo, tree, index, &diffopts));
Packit Service 20376f
Packit Service 20376f
	memset(&exp, 0, sizeof(exp));
Packit Service 20376f
	cl_git_pass(git_diff_foreach(
Packit Service 20376f
		diff, diff_file_cb, NULL, NULL, NULL, &exp);;
Packit Service 20376f
	cl_assert_equal_i(1, exp.file_status[GIT_DELTA_DELETED]);
Packit Service 20376f
	cl_assert_equal_i(expected_new + 1, exp.file_status[GIT_DELTA_ADDED]);
Packit Service 20376f
	cl_assert_equal_i(expected_new + 2, exp.files);
Packit Service 20376f
Packit Service 20376f
	opts.flags = GIT_DIFF_FIND_ALL;
Packit Service 20376f
	cl_git_pass(git_diff_find_similar(diff, &opts));
Packit Service 20376f
Packit Service 20376f
	memset(&exp, 0, sizeof(exp));
Packit Service 20376f
	cl_git_pass(git_diff_foreach(
Packit Service 20376f
		diff, diff_file_cb, NULL, NULL, NULL, &exp);;
Packit Service 20376f
	cl_assert_equal_i(1, exp.file_status[GIT_DELTA_RENAMED]);
Packit Service 20376f
	cl_assert_equal_i(expected_new, exp.file_status[GIT_DELTA_ADDED]);
Packit Service 20376f
	cl_assert_equal_i(expected_new + 1, exp.files);
Packit Service 20376f
Packit Service 20376f
	git_diff_free(diff);
Packit Service 20376f
Packit Service 20376f
	cl_repo_commit_from_index(NULL, g_repo, NULL, 1372350000, "yoyoyo");
Packit Service 20376f
	cl_git_pass(git_revparse_single(
Packit Service 20376f
		(git_object **)&new_tree, g_repo, "HEAD^{tree}"));
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_diff_tree_to_tree(
Packit Service 20376f
		&diff, g_repo, tree, new_tree, &diffopts));
Packit Service 20376f
Packit Service 20376f
	memset(&exp, 0, sizeof(exp));
Packit Service 20376f
	cl_git_pass(git_diff_foreach(
Packit Service 20376f
		diff, diff_file_cb, NULL, NULL, NULL, &exp);;
Packit Service 20376f
	cl_assert_equal_i(1, exp.file_status[GIT_DELTA_DELETED]);
Packit Service 20376f
	cl_assert_equal_i(expected_new + 1, exp.file_status[GIT_DELTA_ADDED]);
Packit Service 20376f
	cl_assert_equal_i(expected_new + 2, exp.files);
Packit Service 20376f
Packit Service 20376f
	opts.flags = GIT_DIFF_FIND_ALL;
Packit Service 20376f
	cl_git_pass(git_diff_find_similar(diff, &opts));
Packit Service 20376f
Packit Service 20376f
	memset(&exp, 0, sizeof(exp));
Packit Service 20376f
	cl_git_pass(git_diff_foreach(
Packit Service 20376f
		diff, diff_file_cb, NULL, NULL, NULL, &exp);;
Packit Service 20376f
	cl_assert_equal_i(1, exp.file_status[GIT_DELTA_RENAMED]);
Packit Service 20376f
	cl_assert_equal_i(expected_new, exp.file_status[GIT_DELTA_ADDED]);
Packit Service 20376f
	cl_assert_equal_i(expected_new + 1, exp.files);
Packit Service 20376f
Packit Service 20376f
	git_diff_free(diff);
Packit Service 20376f
Packit Service 20376f
	git_tree_free(new_tree);
Packit Service 20376f
	git_tree_free(tree);
Packit Service 20376f
	git_index_free(index);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_stress_diff__rename_big_files(void)
Packit Service 20376f
{
Packit Service 20376f
	git_index *index;
Packit Service 20376f
	char tmp[64];
Packit Service 20376f
	int i, j;
Packit Service 20376f
	git_buf b = GIT_BUF_INIT;
Packit Service 20376f
Packit Service 20376f
	g_repo = cl_git_sandbox_init("renames");
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_repository_index(&index, g_repo));
Packit Service 20376f
Packit Service 20376f
	for (i = 0; i < 100; i += 1) {
Packit Service 20376f
		p_snprintf(tmp, sizeof(tmp), "renames/newfile%03d", i);
Packit Service 20376f
		for (j = i * 256; j > 0; --j)
Packit Service 20376f
			git_buf_printf(&b, "more content %d\n", i);
Packit Service 20376f
		cl_git_mkfile(tmp, b.ptr);
Packit Service 20376f
	}
Packit Service 20376f
Packit Service 20376f
	for (i = 0; i < 100; i += 1) {
Packit Service 20376f
		p_snprintf(tmp, sizeof(tmp), "renames/newfile%03d", i);
Packit Service 20376f
		cl_git_pass(git_index_add_bypath(index, tmp + strlen("renames/")));
Packit Service 20376f
	}
Packit Service 20376f
Packit Service 20376f
	git_buf_free(&b);
Packit Service 20376f
	git_index_free(index);
Packit Service 20376f
Packit Service 20376f
	test_with_many(100);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_stress_diff__rename_many_files(void)
Packit Service 20376f
{
Packit Service 20376f
	git_index *index;
Packit Service 20376f
	char tmp[64];
Packit Service 20376f
	int i;
Packit Service 20376f
	git_buf b = GIT_BUF_INIT;
Packit Service 20376f
Packit Service 20376f
	g_repo = cl_git_sandbox_init("renames");
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_repository_index(&index, g_repo));
Packit Service 20376f
Packit Service 20376f
	git_buf_printf(&b, "%08d\n" ANOTHER_POEM "%08d\n" ANOTHER_POEM ANOTHER_POEM, 0, 0);
Packit Service 20376f
Packit Service 20376f
	for (i = 0; i < 2500; i += 1) {
Packit Service 20376f
		p_snprintf(tmp, sizeof(tmp), "renames/newfile%03d", i);
Packit Service 20376f
		p_snprintf(b.ptr, 9, "%08d", i);
Packit Service 20376f
		b.ptr[8] = '\n';
Packit Service 20376f
		cl_git_mkfile(tmp, b.ptr);
Packit Service 20376f
	}
Packit Service 20376f
	git_buf_free(&b);
Packit Service 20376f
Packit Service 20376f
	for (i = 0; i < 2500; i += 1) {
Packit Service 20376f
		p_snprintf(tmp, sizeof(tmp), "renames/newfile%03d", i);
Packit Service 20376f
		cl_git_pass(git_index_add_bypath(index, tmp + strlen("renames/")));
Packit Service 20376f
	}
Packit Service 20376f
Packit Service 20376f
	git_index_free(index);
Packit Service 20376f
Packit Service 20376f
	test_with_many(2500);
Packit Service 20376f
}