Blame tests/apply/fromdiff.c

Packit Service 20376f
#include "clar_libgit2.h"
Packit Service 20376f
#include "git2/sys/repository.h"
Packit Service 20376f
Packit Service 20376f
#include "apply.h"
Packit Service 20376f
#include "repository.h"
Packit Service 20376f
#include "buf_text.h"
Packit Service 20376f
Packit Service 20376f
#include "../patch/patch_common.h"
Packit Service 20376f
Packit Service 20376f
static git_repository *repo = NULL;
Packit Service 20376f
static git_diff_options binary_opts = GIT_DIFF_OPTIONS_INIT;
Packit Service 20376f
Packit Service 20376f
void test_apply_fromdiff__initialize(void)
Packit Service 20376f
{
Packit Service 20376f
	repo = cl_git_sandbox_init("renames");
Packit Service 20376f
Packit Service 20376f
	binary_opts.flags |= GIT_DIFF_SHOW_BINARY;
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_apply_fromdiff__cleanup(void)
Packit Service 20376f
{
Packit Service 20376f
	cl_git_sandbox_cleanup();
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
static int apply_gitbuf(
Packit Service 20376f
	const git_buf *old,
Packit Service 20376f
	const char *oldname,
Packit Service 20376f
	const git_buf *new,
Packit Service 20376f
	const char *newname,
Packit Service 20376f
	const char *patch_expected,
Packit Service 20376f
	const git_diff_options *diff_opts)
Packit Service 20376f
{
Packit Service 20376f
	git_patch *patch;
Packit Service 20376f
	git_buf result = GIT_BUF_INIT;
Packit Service 20376f
	git_buf patchbuf = GIT_BUF_INIT;
Packit Service 20376f
	char *filename;
Packit Service 20376f
	unsigned int mode;
Packit Service 20376f
	int error;
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_patch_from_buffers(&patch,
Packit Service 20376f
		old ? old->ptr : NULL, old ? old->size : 0,
Packit Service 20376f
		oldname,
Packit Service 20376f
		new ? new->ptr : NULL, new ? new->size : 0,
Packit Service 20376f
		newname,
Packit Service 20376f
		diff_opts));
Packit Service 20376f
Packit Service 20376f
	if (patch_expected) {
Packit Service 20376f
		cl_git_pass(git_patch_to_buf(&patchbuf, patch));
Packit Service 20376f
		cl_assert_equal_s(patch_expected, patchbuf.ptr);
Packit Service 20376f
	}
Packit Service 20376f
Packit Service 20376f
	error = git_apply__patch(&result, &filename, &mode, old ? old->ptr : NULL, old ? old->size : 0, patch);
Packit Service 20376f
Packit Service 20376f
	if (error == 0 && new == NULL) {
Packit Service 20376f
		cl_assert_equal_i(0, result.size);
Packit Service 20376f
		cl_assert_equal_p(NULL, filename);
Packit Service 20376f
		cl_assert_equal_i(0, mode);
Packit Service 20376f
	}
Packit Service 20376f
	else if (error == 0) {
Packit Service 20376f
		cl_assert_equal_s(new->ptr, result.ptr);
Packit Service 20376f
		cl_assert_equal_s(newname ? newname : oldname, filename);
Packit Service 20376f
		cl_assert_equal_i(0100644, mode);
Packit Service 20376f
	}
Packit Service 20376f
Packit Service 20376f
	git__free(filename);
Packit Service 20376f
	git_buf_free(&result);
Packit Service 20376f
	git_buf_free(&patchbuf);
Packit Service 20376f
	git_patch_free(patch);
Packit Service 20376f
Packit Service 20376f
	return error;
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
static int apply_buf(
Packit Service 20376f
	const char *old,
Packit Service 20376f
	const char *oldname,
Packit Service 20376f
	const char *new,
Packit Service 20376f
	const char *newname,
Packit Service 20376f
	const char *patch_expected,
Packit Service 20376f
	const git_diff_options *diff_opts)
Packit Service 20376f
{
Packit Service 20376f
	git_buf o = GIT_BUF_INIT, n = GIT_BUF_INIT,
Packit Service 20376f
		*optr = NULL, *nptr = NULL;
Packit Service 20376f
Packit Service 20376f
	if (old) {
Packit Service 20376f
		o.ptr = (char *)old;
Packit Service 20376f
		o.size = strlen(old);
Packit Service 20376f
		optr = &o;
Packit Service 20376f
	}
Packit Service 20376f
Packit Service 20376f
	if (new) {
Packit Service 20376f
		n.ptr = (char *)new;
Packit Service 20376f
		n.size = strlen(new);
Packit Service 20376f
		nptr = &n;
Packit Service 20376f
	}
Packit Service 20376f
Packit Service 20376f
	return apply_gitbuf(optr, oldname, nptr, newname, patch_expected, diff_opts);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_apply_fromdiff__change_middle(void)
Packit Service 20376f
{
Packit Service 20376f
	cl_git_pass(apply_buf(
Packit Service 20376f
		FILE_ORIGINAL, "file.txt",
Packit Service 20376f
		FILE_CHANGE_MIDDLE, "file.txt",
Packit Service 20376f
		PATCH_ORIGINAL_TO_CHANGE_MIDDLE, NULL));
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_apply_fromdiff__change_middle_nocontext(void)
Packit Service 20376f
{
Packit Service 20376f
	git_diff_options diff_opts = GIT_DIFF_OPTIONS_INIT;
Packit Service 20376f
	diff_opts.context_lines = 0;
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(apply_buf(
Packit Service 20376f
		FILE_ORIGINAL, "file.txt",
Packit Service 20376f
		FILE_CHANGE_MIDDLE, "file.txt",
Packit Service 20376f
		PATCH_ORIGINAL_TO_CHANGE_MIDDLE_NOCONTEXT, &diff_opts));
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_apply_fromdiff__change_firstline(void)
Packit Service 20376f
{
Packit Service 20376f
	cl_git_pass(apply_buf(
Packit Service 20376f
		FILE_ORIGINAL, "file.txt",
Packit Service 20376f
		FILE_CHANGE_FIRSTLINE, "file.txt",
Packit Service 20376f
		PATCH_ORIGINAL_TO_CHANGE_FIRSTLINE, NULL));
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_apply_fromdiff__lastline(void)
Packit Service 20376f
{
Packit Service 20376f
	cl_git_pass(apply_buf(
Packit Service 20376f
		FILE_ORIGINAL, "file.txt",
Packit Service 20376f
		FILE_CHANGE_LASTLINE, "file.txt",
Packit Service 20376f
		PATCH_ORIGINAL_TO_CHANGE_LASTLINE, NULL));
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_apply_fromdiff__prepend(void)
Packit Service 20376f
{
Packit Service 20376f
	cl_git_pass(apply_buf(
Packit Service 20376f
		FILE_ORIGINAL, "file.txt",
Packit Service 20376f
		FILE_PREPEND, "file.txt",
Packit Service 20376f
		PATCH_ORIGINAL_TO_PREPEND, NULL));
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_apply_fromdiff__prepend_nocontext(void)
Packit Service 20376f
{
Packit Service 20376f
	git_diff_options diff_opts = GIT_DIFF_OPTIONS_INIT;
Packit Service 20376f
	diff_opts.context_lines = 0;
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(apply_buf(
Packit Service 20376f
		FILE_ORIGINAL, "file.txt",
Packit Service 20376f
		FILE_PREPEND, "file.txt",
Packit Service 20376f
		PATCH_ORIGINAL_TO_PREPEND_NOCONTEXT, &diff_opts));
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_apply_fromdiff__append(void)
Packit Service 20376f
{
Packit Service 20376f
	cl_git_pass(apply_buf(
Packit Service 20376f
		FILE_ORIGINAL, "file.txt",
Packit Service 20376f
		FILE_APPEND, "file.txt",
Packit Service 20376f
		PATCH_ORIGINAL_TO_APPEND, NULL));
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_apply_fromdiff__append_nocontext(void)
Packit Service 20376f
{
Packit Service 20376f
	git_diff_options diff_opts = GIT_DIFF_OPTIONS_INIT;
Packit Service 20376f
	diff_opts.context_lines = 0;
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(apply_buf(
Packit Service 20376f
		FILE_ORIGINAL, "file.txt",
Packit Service 20376f
		FILE_APPEND, "file.txt",
Packit Service 20376f
		PATCH_ORIGINAL_TO_APPEND_NOCONTEXT, &diff_opts));
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_apply_fromdiff__prepend_and_append(void)
Packit Service 20376f
{
Packit Service 20376f
	cl_git_pass(apply_buf(
Packit Service 20376f
		FILE_ORIGINAL, "file.txt",
Packit Service 20376f
		FILE_PREPEND_AND_APPEND, "file.txt",
Packit Service 20376f
		PATCH_ORIGINAL_TO_PREPEND_AND_APPEND, NULL));
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_apply_fromdiff__to_empty_file(void)
Packit Service 20376f
{
Packit Service 20376f
	cl_git_pass(apply_buf(
Packit Service 20376f
		FILE_ORIGINAL, "file.txt",
Packit Service 20376f
		"", NULL,
Packit Service 20376f
		PATCH_ORIGINAL_TO_EMPTY_FILE, NULL));
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_apply_fromdiff__from_empty_file(void)
Packit Service 20376f
{
Packit Service 20376f
	cl_git_pass(apply_buf(
Packit Service 20376f
		"", NULL,
Packit Service 20376f
		FILE_ORIGINAL, "file.txt",
Packit Service 20376f
		PATCH_EMPTY_FILE_TO_ORIGINAL, NULL));
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_apply_fromdiff__add(void)
Packit Service 20376f
{
Packit Service 20376f
	cl_git_pass(apply_buf(
Packit Service 20376f
		NULL, NULL,
Packit Service 20376f
		FILE_ORIGINAL, "file.txt",
Packit Service 20376f
		PATCH_ADD_ORIGINAL, NULL));
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_apply_fromdiff__delete(void)
Packit Service 20376f
{
Packit Service 20376f
	cl_git_pass(apply_buf(
Packit Service 20376f
		FILE_ORIGINAL, "file.txt",
Packit Service 20376f
		NULL, NULL,
Packit Service 20376f
		PATCH_DELETE_ORIGINAL, NULL));
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_apply_fromdiff__no_change(void)
Packit Service 20376f
{
Packit Service 20376f
	cl_git_pass(apply_buf(
Packit Service 20376f
		FILE_ORIGINAL, "file.txt",
Packit Service 20376f
		FILE_ORIGINAL, "file.txt",
Packit Service 20376f
		"", NULL));
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_apply_fromdiff__binary_add(void)
Packit Service 20376f
{
Packit Service 20376f
	git_buf newfile = GIT_BUF_INIT;
Packit Service 20376f
Packit Service 20376f
	newfile.ptr = FILE_BINARY_DELTA_MODIFIED;
Packit Service 20376f
	newfile.size = FILE_BINARY_DELTA_MODIFIED_LEN;
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(apply_gitbuf(
Packit Service 20376f
		NULL, NULL,
Packit Service 20376f
		&newfile, "binary.bin",
Packit Service 20376f
		NULL, &binary_opts));
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_apply_fromdiff__binary_no_change(void)
Packit Service 20376f
{
Packit Service 20376f
	git_buf original = GIT_BUF_INIT;
Packit Service 20376f
Packit Service 20376f
	original.ptr = FILE_BINARY_DELTA_ORIGINAL;
Packit Service 20376f
	original.size = FILE_BINARY_DELTA_ORIGINAL_LEN;
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(apply_gitbuf(
Packit Service 20376f
		&original, "binary.bin",
Packit Service 20376f
		&original, "binary.bin",
Packit Service 20376f
		"", &binary_opts));
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_apply_fromdiff__binary_change_delta(void)
Packit Service 20376f
{
Packit Service 20376f
	git_buf original = GIT_BUF_INIT, modified = GIT_BUF_INIT;
Packit Service 20376f
Packit Service 20376f
	original.ptr = FILE_BINARY_DELTA_ORIGINAL;
Packit Service 20376f
	original.size = FILE_BINARY_DELTA_ORIGINAL_LEN;
Packit Service 20376f
Packit Service 20376f
	modified.ptr = FILE_BINARY_DELTA_MODIFIED;
Packit Service 20376f
	modified.size = FILE_BINARY_DELTA_MODIFIED_LEN;
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(apply_gitbuf(
Packit Service 20376f
		&original, "binary.bin",
Packit Service 20376f
		&modified, "binary.bin",
Packit Service 20376f
		NULL, &binary_opts));
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_apply_fromdiff__binary_change_literal(void)
Packit Service 20376f
{
Packit Service 20376f
	git_buf original = GIT_BUF_INIT, modified = GIT_BUF_INIT;
Packit Service 20376f
Packit Service 20376f
	original.ptr = FILE_BINARY_LITERAL_ORIGINAL;
Packit Service 20376f
	original.size = FILE_BINARY_LITERAL_ORIGINAL_LEN;
Packit Service 20376f
Packit Service 20376f
	modified.ptr = FILE_BINARY_LITERAL_MODIFIED;
Packit Service 20376f
	modified.size = FILE_BINARY_LITERAL_MODIFIED_LEN;
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(apply_gitbuf(
Packit Service 20376f
		&original, "binary.bin",
Packit Service 20376f
		&modified, "binary.bin",
Packit Service 20376f
		NULL, &binary_opts));
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_apply_fromdiff__binary_delete(void)
Packit Service 20376f
{
Packit Service 20376f
	git_buf original = GIT_BUF_INIT;
Packit Service 20376f
Packit Service 20376f
	original.ptr = FILE_BINARY_DELTA_MODIFIED;
Packit Service 20376f
	original.size = FILE_BINARY_DELTA_MODIFIED_LEN;
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(apply_gitbuf(
Packit Service 20376f
		&original, "binary.bin",
Packit Service 20376f
		NULL, NULL,
Packit Service 20376f
		NULL, &binary_opts));
Packit Service 20376f
}