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