Blame tests/diff/drivers.c

Packit ae9e2a
#include "clar_libgit2.h"
Packit ae9e2a
#include "diff_helpers.h"
Packit ae9e2a
#include "repository.h"
Packit ae9e2a
#include "diff_driver.h"
Packit ae9e2a
Packit ae9e2a
static git_repository *g_repo = NULL;
Packit ae9e2a
Packit ae9e2a
void test_diff_drivers__initialize(void)
Packit ae9e2a
{
Packit ae9e2a
}
Packit ae9e2a
Packit ae9e2a
void test_diff_drivers__cleanup(void)
Packit ae9e2a
{
Packit ae9e2a
	cl_git_sandbox_cleanup();
Packit ae9e2a
	g_repo = NULL;
Packit ae9e2a
}
Packit ae9e2a
Packit ae9e2a
static void overwrite_filemode(const char *expected, git_buf *actual)
Packit ae9e2a
{
Packit ae9e2a
	size_t offset;
Packit ae9e2a
	char *found;
Packit ae9e2a
Packit ae9e2a
	found = strstr(expected, "100644");
Packit ae9e2a
	if (!found)
Packit ae9e2a
		return;
Packit ae9e2a
Packit ae9e2a
	offset = ((const char *)found) - expected;
Packit ae9e2a
	if (actual->size < offset + 6)
Packit ae9e2a
		return;
Packit ae9e2a
Packit ae9e2a
	if (memcmp(&actual->ptr[offset], "100644", 6) != 0)
Packit ae9e2a
		memcpy(&actual->ptr[offset], "100644", 6);
Packit ae9e2a
}
Packit ae9e2a
Packit ae9e2a
void test_diff_drivers__patterns(void)
Packit ae9e2a
{
Packit ae9e2a
	git_config *cfg;
Packit ae9e2a
	const char *one_sha = "19dd32dfb1520a64e5bbaae8dce6ef423dfa2f13";
Packit ae9e2a
	git_tree *one;
Packit ae9e2a
	git_diff *diff;
Packit ae9e2a
	git_patch *patch;
Packit ae9e2a
	git_buf actual = GIT_BUF_INIT;
Packit ae9e2a
	const char *expected0 = "diff --git a/untimely.txt b/untimely.txt\nindex 9a69d96..57fd0cf 100644\n--- a/untimely.txt\n+++ b/untimely.txt\n@@ -22,3 +22,5 @@ Comes through the blood of the vanguards who\n   dreamed--too soon--it had sounded.\r\n \r\n                 -- Rudyard Kipling\r\n+\r\n+Some new stuff\r\n";
Packit ae9e2a
	const char *expected1 = "diff --git a/untimely.txt b/untimely.txt\nindex 9a69d96..57fd0cf 100644\nBinary files a/untimely.txt and b/untimely.txt differ\n";
Packit ae9e2a
	const char *expected2 = "diff --git a/untimely.txt b/untimely.txt\nindex 9a69d96..57fd0cf 100644\n--- a/untimely.txt\n+++ b/untimely.txt\n@@ -22,3 +22,5 @@ Heaven delivers on earth the Hour that cannot be\n   dreamed--too soon--it had sounded.\r\n \r\n                 -- Rudyard Kipling\r\n+\r\n+Some new stuff\r\n";
Packit ae9e2a
Packit ae9e2a
	g_repo = cl_git_sandbox_init("renames");
Packit ae9e2a
Packit ae9e2a
	one = resolve_commit_oid_to_tree(g_repo, one_sha);
Packit ae9e2a
Packit ae9e2a
	/* no diff */
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_diff_tree_to_workdir(&diff, g_repo, one, NULL));
Packit ae9e2a
	cl_assert_equal_i(0, (int)git_diff_num_deltas(diff));
Packit ae9e2a
	git_diff_free(diff);
Packit ae9e2a
Packit ae9e2a
	/* default diff */
Packit ae9e2a
Packit ae9e2a
	cl_git_append2file("renames/untimely.txt", "\r\nSome new stuff\r\n");
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_diff_tree_to_workdir(&diff, g_repo, one, NULL));
Packit ae9e2a
	cl_assert_equal_i(1, (int)git_diff_num_deltas(diff));
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_patch_from_diff(&patch, diff, 0));
Packit ae9e2a
	cl_git_pass(git_patch_to_buf(&actual, patch));
Packit ae9e2a
	cl_assert_equal_s(expected0, actual.ptr);
Packit ae9e2a
Packit ae9e2a
	git_buf_free(&actual);
Packit ae9e2a
	git_patch_free(patch);
Packit ae9e2a
	git_diff_free(diff);
Packit ae9e2a
Packit ae9e2a
	/* attribute diff set to false */
Packit ae9e2a
Packit ae9e2a
	cl_git_rewritefile("renames/.gitattributes", "untimely.txt -diff\n");
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_diff_tree_to_workdir(&diff, g_repo, one, NULL));
Packit ae9e2a
	cl_assert_equal_i(1, (int)git_diff_num_deltas(diff));
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_patch_from_diff(&patch, diff, 0));
Packit ae9e2a
	cl_git_pass(git_patch_to_buf(&actual, patch));
Packit ae9e2a
	cl_assert_equal_s(expected1, actual.ptr);
Packit ae9e2a
Packit ae9e2a
	git_buf_free(&actual);
Packit ae9e2a
	git_patch_free(patch);
Packit ae9e2a
	git_diff_free(diff);
Packit ae9e2a
Packit ae9e2a
	/* attribute diff set to unconfigured value (should use default) */
Packit ae9e2a
Packit ae9e2a
	cl_git_rewritefile("renames/.gitattributes", "untimely.txt diff=kipling0\n");
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_diff_tree_to_workdir(&diff, g_repo, one, NULL));
Packit ae9e2a
	cl_assert_equal_i(1, (int)git_diff_num_deltas(diff));
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_patch_from_diff(&patch, diff, 0));
Packit ae9e2a
	cl_git_pass(git_patch_to_buf(&actual, patch));
Packit ae9e2a
	cl_assert_equal_s(expected0, actual.ptr);
Packit ae9e2a
Packit ae9e2a
	git_buf_free(&actual);
Packit ae9e2a
	git_patch_free(patch);
Packit ae9e2a
	git_diff_free(diff);
Packit ae9e2a
Packit ae9e2a
	/* let's define that driver */
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_repository_config(&cfg, g_repo));
Packit ae9e2a
	cl_git_pass(git_config_set_bool(cfg, "diff.kipling0.binary", 1));
Packit ae9e2a
	git_config_free(cfg);
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_diff_tree_to_workdir(&diff, g_repo, one, NULL));
Packit ae9e2a
	cl_assert_equal_i(1, (int)git_diff_num_deltas(diff));
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_patch_from_diff(&patch, diff, 0));
Packit ae9e2a
	cl_git_pass(git_patch_to_buf(&actual, patch));
Packit ae9e2a
	cl_assert_equal_s(expected1, actual.ptr);
Packit ae9e2a
Packit ae9e2a
	git_buf_free(&actual);
Packit ae9e2a
	git_patch_free(patch);
Packit ae9e2a
	git_diff_free(diff);
Packit ae9e2a
Packit ae9e2a
	/* let's use a real driver with some regular expressions */
Packit ae9e2a
Packit ae9e2a
	git_diff_driver_registry_free(g_repo->diff_drivers);
Packit ae9e2a
	g_repo->diff_drivers = NULL;
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_repository_config(&cfg, g_repo));
Packit ae9e2a
	cl_git_pass(git_config_set_bool(cfg, "diff.kipling0.binary", 0));
Packit ae9e2a
	cl_git_pass(git_config_set_string(cfg, "diff.kipling0.xfuncname", "^H.*$"));
Packit ae9e2a
	git_config_free(cfg);
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_diff_tree_to_workdir(&diff, g_repo, one, NULL));
Packit ae9e2a
	cl_assert_equal_i(1, (int)git_diff_num_deltas(diff));
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_patch_from_diff(&patch, diff, 0));
Packit ae9e2a
	cl_git_pass(git_patch_to_buf(&actual, patch));
Packit ae9e2a
	cl_assert_equal_s(expected2, actual.ptr);
Packit ae9e2a
Packit ae9e2a
	git_buf_free(&actual);
Packit ae9e2a
	git_patch_free(patch);
Packit ae9e2a
	git_diff_free(diff);
Packit ae9e2a
Packit ae9e2a
	git_tree_free(one);
Packit ae9e2a
}
Packit ae9e2a
Packit ae9e2a
void test_diff_drivers__long_lines(void)
Packit ae9e2a
{
Packit ae9e2a
	const char *base = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed non nisi ligula. Ut viverra enim sed lobortis suscipit.\nPhasellus eget erat odio. Praesent at est iaculis, ultricies augue vel, dignissim risus. Suspendisse at nisi quis turpis fringilla rutrum id sit amet nulla.\nNam eget dolor fermentum, aliquet nisl at, convallis tellus. Pellentesque rhoncus erat enim, id porttitor elit euismod quis.\nMauris sollicitudin magna odio, non egestas libero vehicula ut. Etiam et quam velit. Fusce eget libero rhoncus, ultricies felis sit amet, egestas purus.\nAliquam in semper tellus. Pellentesque adipiscing rutrum velit, quis malesuada lacus consequat eget.\n";
Packit ae9e2a
	git_index *idx;
Packit ae9e2a
	git_diff *diff;
Packit ae9e2a
	git_patch *patch;
Packit ae9e2a
	git_buf actual = GIT_BUF_INIT;
Packit ae9e2a
	const char *expected = "diff --git a/longlines.txt b/longlines.txt\nindex c1ce6ef..0134431 100644\n--- a/longlines.txt\n+++ b/longlines.txt\n@@ -3,3 +3,5 @@ Phasellus eget erat odio. Praesent at est iaculis, ultricies augue vel, dignissi\n Nam eget dolor fermentum, aliquet nisl at, convallis tellus. Pellentesque rhoncus erat enim, id porttitor elit euismod quis.\n Mauris sollicitudin magna odio, non egestas libero vehicula ut. Etiam et quam velit. Fusce eget libero rhoncus, ultricies felis sit amet, egestas purus.\n Aliquam in semper tellus. Pellentesque adipiscing rutrum velit, quis malesuada lacus consequat eget.\n+newline\n+newline\n";
Packit ae9e2a
Packit ae9e2a
	g_repo = cl_git_sandbox_init("empty_standard_repo");
Packit ae9e2a
Packit ae9e2a
	cl_git_mkfile("empty_standard_repo/longlines.txt", base);
Packit ae9e2a
	cl_git_pass(git_repository_index(&idx, g_repo));
Packit ae9e2a
	cl_git_pass(git_index_add_bypath(idx, "longlines.txt"));
Packit ae9e2a
	cl_git_pass(git_index_write(idx));
Packit ae9e2a
	git_index_free(idx);
Packit ae9e2a
Packit ae9e2a
	cl_git_append2file("empty_standard_repo/longlines.txt", "newline\nnewline\n");
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_diff_index_to_workdir(&diff, g_repo, NULL, NULL));
Packit ae9e2a
	cl_assert_equal_sz(1, git_diff_num_deltas(diff));
Packit ae9e2a
	cl_git_pass(git_patch_from_diff(&patch, diff, 0));
Packit ae9e2a
	cl_git_pass(git_patch_to_buf(&actual, patch));
Packit ae9e2a
Packit ae9e2a
	/* if chmod not supported, overwrite mode bits since anything is possible */
Packit ae9e2a
	overwrite_filemode(expected, &actual);
Packit ae9e2a
Packit ae9e2a
	cl_assert_equal_s(expected, actual.ptr);
Packit ae9e2a
Packit ae9e2a
	git_buf_free(&actual);
Packit ae9e2a
	git_patch_free(patch);
Packit ae9e2a
	git_diff_free(diff);
Packit ae9e2a
}
Packit ae9e2a
Packit ae9e2a
void test_diff_drivers__builtins(void)
Packit ae9e2a
{
Packit ae9e2a
	git_diff *diff;
Packit ae9e2a
	git_patch *patch;
Packit ae9e2a
	git_buf file = GIT_BUF_INIT, actual = GIT_BUF_INIT, expected = GIT_BUF_INIT;
Packit ae9e2a
	git_diff_options opts = GIT_DIFF_OPTIONS_INIT;
Packit ae9e2a
	git_vector files = GIT_VECTOR_INIT;
Packit ae9e2a
	size_t i;
Packit ae9e2a
	char *path, *extension;
Packit ae9e2a
Packit ae9e2a
	g_repo = cl_git_sandbox_init("userdiff");
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_path_dirload(&files, "userdiff/files", 9, 0));
Packit ae9e2a
Packit ae9e2a
	opts.interhunk_lines = 1;
Packit ae9e2a
	opts.context_lines = 1;
Packit ae9e2a
	opts.pathspec.count = 1;
Packit ae9e2a
Packit ae9e2a
	git_vector_foreach(&files, i, path) {
Packit ae9e2a
		if (git__prefixcmp(path, "files/file."))
Packit ae9e2a
			continue;
Packit ae9e2a
		extension = path + strlen("files/file.");
Packit ae9e2a
		opts.pathspec.strings = &pat;;
Packit ae9e2a
Packit ae9e2a
		/* do diff with no special driver */
Packit ae9e2a
Packit ae9e2a
		cl_git_pass(git_diff_index_to_workdir(&diff, g_repo, NULL, &opts));
Packit ae9e2a
		cl_assert_equal_sz(1, git_diff_num_deltas(diff));
Packit ae9e2a
		cl_git_pass(git_patch_from_diff(&patch, diff, 0));
Packit ae9e2a
		cl_git_pass(git_patch_to_buf(&actual, patch));
Packit ae9e2a
Packit ae9e2a
		git_buf_sets(&expected, "userdiff/expected/nodriver/diff.");
Packit ae9e2a
		git_buf_puts(&expected, extension);
Packit ae9e2a
		cl_git_pass(git_futils_readbuffer(&expected, expected.ptr));
Packit ae9e2a
Packit ae9e2a
		overwrite_filemode(expected.ptr, &actual);
Packit ae9e2a
Packit ae9e2a
		cl_assert_equal_s(expected.ptr, actual.ptr);
Packit ae9e2a
Packit ae9e2a
		git_buf_clear(&actual);
Packit ae9e2a
		git_patch_free(patch);
Packit ae9e2a
		git_diff_free(diff);
Packit ae9e2a
Packit ae9e2a
		/* do diff with driver */
Packit ae9e2a
Packit ae9e2a
		{
Packit ae9e2a
			FILE *fp = fopen("userdiff/.gitattributes", "w");
Packit ae9e2a
			fprintf(fp, "*.%s diff=%s\n", extension, extension);
Packit ae9e2a
			fclose(fp);
Packit ae9e2a
		}
Packit ae9e2a
Packit ae9e2a
		cl_git_pass(git_diff_index_to_workdir(&diff, g_repo, NULL, &opts));
Packit ae9e2a
		cl_assert_equal_sz(1, git_diff_num_deltas(diff));
Packit ae9e2a
		cl_git_pass(git_patch_from_diff(&patch, diff, 0));
Packit ae9e2a
		cl_git_pass(git_patch_to_buf(&actual, patch));
Packit ae9e2a
Packit ae9e2a
		git_buf_sets(&expected, "userdiff/expected/driver/diff.");
Packit ae9e2a
		git_buf_puts(&expected, extension);
Packit ae9e2a
		cl_git_pass(git_futils_readbuffer(&expected, expected.ptr));
Packit ae9e2a
Packit ae9e2a
		overwrite_filemode(expected.ptr, &actual);
Packit ae9e2a
Packit ae9e2a
		cl_assert_equal_s(expected.ptr, actual.ptr);
Packit ae9e2a
Packit ae9e2a
		git_buf_clear(&actual);
Packit ae9e2a
		git_patch_free(patch);
Packit ae9e2a
		git_diff_free(diff);
Packit ae9e2a
Packit ae9e2a
		git__free(path);
Packit ae9e2a
	}
Packit ae9e2a
Packit ae9e2a
	git_buf_free(&file;;
Packit ae9e2a
	git_buf_free(&actual);
Packit ae9e2a
	git_buf_free(&expected);
Packit ae9e2a
	git_vector_free(&files);
Packit ae9e2a
}
Packit ae9e2a
Packit ae9e2a
void test_diff_drivers__invalid_pattern(void)
Packit ae9e2a
{
Packit ae9e2a
	git_config *cfg;
Packit ae9e2a
	git_index *idx;
Packit ae9e2a
	git_diff *diff;
Packit ae9e2a
	git_patch *patch;
Packit ae9e2a
	git_diff_options opts = GIT_DIFF_OPTIONS_INIT;
Packit ae9e2a
Packit ae9e2a
	g_repo = cl_git_sandbox_init("userdiff");
Packit ae9e2a
	cl_git_mkfile("userdiff/.gitattributes", "*.storyboard diff=storyboard\n");
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_repository_config__weakptr(&cfg, g_repo));
Packit ae9e2a
	cl_git_pass(git_config_set_string(cfg, "diff.storyboard.xfuncname", ""));
Packit ae9e2a
Packit ae9e2a
	cl_git_mkfile("userdiff/dummy.storyboard", "");
Packit ae9e2a
	cl_git_pass(git_repository_index__weakptr(&idx, g_repo));
Packit ae9e2a
	cl_git_pass(git_index_add_bypath(idx, "dummy.storyboard"));
Packit ae9e2a
	cl_git_mkfile("userdiff/dummy.storyboard", "some content\n");
Packit ae9e2a
Packit ae9e2a
	cl_git_pass(git_diff_index_to_workdir(&diff, g_repo, NULL, &opts));
Packit ae9e2a
	cl_git_pass(git_patch_from_diff(&patch, diff, 0));
Packit ae9e2a
Packit ae9e2a
	git_patch_free(patch);
Packit ae9e2a
	git_diff_free(diff);
Packit ae9e2a
}