mirror of
https://git.proxmox.com/git/libgit2
synced 2025-05-08 19:51:31 +00:00
302 lines
7.6 KiB
C
302 lines
7.6 KiB
C
#include "clar_libgit2.h"
|
|
#include "git2/sys/repository.h"
|
|
|
|
#include "apply.h"
|
|
#include "repository.h"
|
|
#include "buf_text.h"
|
|
|
|
#include "apply_common.h"
|
|
|
|
static git_repository *repo = NULL;
|
|
|
|
void test_apply_fromfile__initialize(void)
|
|
{
|
|
repo = cl_git_sandbox_init("renames");
|
|
}
|
|
|
|
void test_apply_fromfile__cleanup(void)
|
|
{
|
|
cl_git_sandbox_cleanup();
|
|
}
|
|
|
|
static int apply_patchfile(
|
|
const char *old,
|
|
const char *new,
|
|
const char *patchfile,
|
|
const char *filename_expected,
|
|
unsigned int mode_expected)
|
|
{
|
|
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_patchfile(&patch, patchfile, strlen(patchfile)));
|
|
|
|
error = git_apply__patch(&result, &filename, &mode, old, old ? strlen(old) : 0, patch);
|
|
|
|
if (error == 0) {
|
|
if (new == NULL)
|
|
cl_assert_equal_i(0, result.size);
|
|
else
|
|
cl_assert_equal_s(new, result.ptr);
|
|
|
|
cl_assert_equal_s(filename_expected, filename);
|
|
cl_assert_equal_i(mode_expected, mode);
|
|
}
|
|
|
|
git__free(filename);
|
|
git_buf_free(&result);
|
|
git_buf_free(&patchbuf);
|
|
git_patch_free(patch);
|
|
|
|
return error;
|
|
}
|
|
|
|
static int validate_and_apply_patchfile(
|
|
const char *old,
|
|
const char *new,
|
|
const char *patchfile,
|
|
const git_diff_options *diff_opts,
|
|
const char *filename_expected,
|
|
unsigned int mode_expected)
|
|
{
|
|
git_patch *patch_fromdiff;
|
|
git_buf validated = GIT_BUF_INIT;
|
|
int error;
|
|
|
|
cl_git_pass(git_patch_from_buffers(&patch_fromdiff,
|
|
old, old ? strlen(old) : 0, "file.txt",
|
|
new, new ? strlen(new) : 0, "file.txt",
|
|
diff_opts));
|
|
cl_git_pass(git_patch_to_buf(&validated, patch_fromdiff));
|
|
|
|
cl_assert_equal_s(patchfile, validated.ptr);
|
|
|
|
error = apply_patchfile(old, new, patchfile, filename_expected, mode_expected);
|
|
|
|
git_buf_free(&validated);
|
|
git_patch_free(patch_fromdiff);
|
|
|
|
return error;
|
|
}
|
|
|
|
void test_apply_fromfile__change_middle(void)
|
|
{
|
|
cl_git_pass(validate_and_apply_patchfile(FILE_ORIGINAL,
|
|
FILE_CHANGE_MIDDLE, PATCH_ORIGINAL_TO_CHANGE_MIDDLE, NULL,
|
|
"b/file.txt", 0100644));
|
|
}
|
|
|
|
void test_apply_fromfile__change_middle_nocontext(void)
|
|
{
|
|
git_diff_options diff_opts = GIT_DIFF_OPTIONS_INIT;
|
|
diff_opts.context_lines = 0;
|
|
|
|
cl_git_pass(validate_and_apply_patchfile(FILE_ORIGINAL,
|
|
FILE_CHANGE_MIDDLE, PATCH_ORIGINAL_TO_CHANGE_MIDDLE_NOCONTEXT,
|
|
&diff_opts, "b/file.txt", 0100644));
|
|
}
|
|
|
|
void test_apply_fromfile__change_firstline(void)
|
|
{
|
|
cl_git_pass(validate_and_apply_patchfile(FILE_ORIGINAL,
|
|
FILE_CHANGE_FIRSTLINE, PATCH_ORIGINAL_TO_CHANGE_FIRSTLINE, NULL,
|
|
"b/file.txt", 0100644));
|
|
}
|
|
|
|
void test_apply_fromfile__lastline(void)
|
|
{
|
|
cl_git_pass(validate_and_apply_patchfile(FILE_ORIGINAL,
|
|
FILE_CHANGE_LASTLINE, PATCH_ORIGINAL_TO_CHANGE_LASTLINE, NULL,
|
|
"b/file.txt", 0100644));
|
|
}
|
|
|
|
void test_apply_fromfile__prepend(void)
|
|
{
|
|
cl_git_pass(validate_and_apply_patchfile(FILE_ORIGINAL, FILE_PREPEND,
|
|
PATCH_ORIGINAL_TO_PREPEND, NULL, "b/file.txt", 0100644));
|
|
}
|
|
|
|
void test_apply_fromfile__prepend_nocontext(void)
|
|
{
|
|
git_diff_options diff_opts = GIT_DIFF_OPTIONS_INIT;
|
|
diff_opts.context_lines = 0;
|
|
|
|
cl_git_pass(validate_and_apply_patchfile(FILE_ORIGINAL, FILE_PREPEND,
|
|
PATCH_ORIGINAL_TO_PREPEND_NOCONTEXT, &diff_opts,
|
|
"b/file.txt", 0100644));
|
|
}
|
|
|
|
void test_apply_fromfile__append(void)
|
|
{
|
|
cl_git_pass(validate_and_apply_patchfile(FILE_ORIGINAL, FILE_APPEND,
|
|
PATCH_ORIGINAL_TO_APPEND, NULL, "b/file.txt", 0100644));
|
|
}
|
|
|
|
void test_apply_fromfile__append_nocontext(void)
|
|
{
|
|
git_diff_options diff_opts = GIT_DIFF_OPTIONS_INIT;
|
|
diff_opts.context_lines = 0;
|
|
|
|
cl_git_pass(validate_and_apply_patchfile(FILE_ORIGINAL, FILE_APPEND,
|
|
PATCH_ORIGINAL_TO_APPEND_NOCONTEXT, &diff_opts,
|
|
"b/file.txt", 0100644));
|
|
}
|
|
|
|
void test_apply_fromfile__prepend_and_append(void)
|
|
{
|
|
cl_git_pass(validate_and_apply_patchfile(FILE_ORIGINAL,
|
|
FILE_PREPEND_AND_APPEND, PATCH_ORIGINAL_TO_PREPEND_AND_APPEND, NULL,
|
|
"b/file.txt", 0100644));
|
|
}
|
|
|
|
void test_apply_fromfile__to_empty_file(void)
|
|
{
|
|
cl_git_pass(validate_and_apply_patchfile(FILE_ORIGINAL, "",
|
|
PATCH_ORIGINAL_TO_EMPTY_FILE, NULL, "b/file.txt", 0100644));
|
|
}
|
|
|
|
void test_apply_fromfile__from_empty_file(void)
|
|
{
|
|
cl_git_pass(validate_and_apply_patchfile("", FILE_ORIGINAL,
|
|
PATCH_EMPTY_FILE_TO_ORIGINAL, NULL, "b/file.txt", 0100644));
|
|
}
|
|
|
|
void test_apply_fromfile__add(void)
|
|
{
|
|
cl_git_pass(validate_and_apply_patchfile(NULL, FILE_ORIGINAL,
|
|
PATCH_ADD_ORIGINAL, NULL, "b/file.txt", 0100644));
|
|
}
|
|
|
|
void test_apply_fromfile__delete(void)
|
|
{
|
|
cl_git_pass(validate_and_apply_patchfile(FILE_ORIGINAL, NULL,
|
|
PATCH_DELETE_ORIGINAL, NULL, NULL, 0));
|
|
}
|
|
|
|
|
|
void test_apply_fromfile__rename_exact(void)
|
|
{
|
|
cl_git_pass(apply_patchfile(FILE_ORIGINAL, FILE_ORIGINAL,
|
|
PATCH_RENAME_EXACT, "b/newfile.txt", 0100644));
|
|
}
|
|
|
|
void test_apply_fromfile__rename_similar(void)
|
|
{
|
|
cl_git_pass(apply_patchfile(FILE_ORIGINAL, FILE_CHANGE_MIDDLE,
|
|
PATCH_RENAME_SIMILAR, "b/newfile.txt", 0100644));
|
|
}
|
|
|
|
void test_apply_fromfile__rename_similar_quotedname(void)
|
|
{
|
|
cl_git_pass(apply_patchfile(FILE_ORIGINAL, FILE_CHANGE_MIDDLE,
|
|
PATCH_RENAME_SIMILAR_QUOTEDNAME, "b/foo\"bar.txt", 0100644));
|
|
}
|
|
|
|
void test_apply_fromfile__modechange(void)
|
|
{
|
|
cl_git_pass(apply_patchfile(FILE_ORIGINAL, FILE_ORIGINAL,
|
|
PATCH_MODECHANGE_UNCHANGED, "b/file.txt", 0100755));
|
|
}
|
|
|
|
void test_apply_fromfile__modechange_with_modification(void)
|
|
{
|
|
cl_git_pass(apply_patchfile(FILE_ORIGINAL, FILE_CHANGE_MIDDLE,
|
|
PATCH_MODECHANGE_MODIFIED, "b/file.txt", 0100755));
|
|
}
|
|
|
|
void test_apply_fromfile__noisy(void)
|
|
{
|
|
cl_git_pass(apply_patchfile(FILE_ORIGINAL, FILE_CHANGE_MIDDLE,
|
|
PATCH_NOISY, "b/file.txt", 0100644));
|
|
}
|
|
|
|
void test_apply_fromfile__noisy_nocontext(void)
|
|
{
|
|
cl_git_pass(apply_patchfile(FILE_ORIGINAL, FILE_CHANGE_MIDDLE,
|
|
PATCH_NOISY_NOCONTEXT, "b/file.txt", 0100644));
|
|
}
|
|
|
|
void test_apply_fromfile__fail_truncated_1(void)
|
|
{
|
|
git_patch *patch;
|
|
cl_git_fail(git_patch_from_patchfile(&patch, PATCH_TRUNCATED_1,
|
|
strlen(PATCH_TRUNCATED_1)));
|
|
}
|
|
|
|
void test_apply_fromfile__fail_truncated_2(void)
|
|
{
|
|
git_patch *patch;
|
|
cl_git_fail(git_patch_from_patchfile(&patch, PATCH_TRUNCATED_2,
|
|
strlen(PATCH_TRUNCATED_2)));
|
|
}
|
|
|
|
void test_apply_fromfile__fail_truncated_3(void)
|
|
{
|
|
git_patch *patch;
|
|
cl_git_fail(git_patch_from_patchfile(&patch, PATCH_TRUNCATED_3,
|
|
strlen(PATCH_TRUNCATED_3)));
|
|
}
|
|
|
|
void test_apply_fromfile__fail_corrupt_githeader(void)
|
|
{
|
|
git_patch *patch;
|
|
cl_git_fail(git_patch_from_patchfile(&patch, PATCH_CORRUPT_GIT_HEADER,
|
|
strlen(PATCH_CORRUPT_GIT_HEADER)));
|
|
}
|
|
|
|
void test_apply_fromfile__empty_context(void)
|
|
{
|
|
cl_git_pass(apply_patchfile(FILE_EMPTY_CONTEXT_ORIGINAL,
|
|
FILE_EMPTY_CONTEXT_MODIFIED, PATCH_EMPTY_CONTEXT,
|
|
"b/file.txt", 0100644));
|
|
}
|
|
|
|
void test_apply_fromfile__append_no_nl(void)
|
|
{
|
|
cl_git_pass(validate_and_apply_patchfile(
|
|
FILE_ORIGINAL, FILE_APPEND_NO_NL, PATCH_APPEND_NO_NL, NULL, "b/file.txt", 0100644));
|
|
}
|
|
|
|
void test_apply_fromfile__fail_missing_new_file(void)
|
|
{
|
|
git_patch *patch;
|
|
cl_git_fail(git_patch_from_patchfile(&patch,
|
|
PATCH_CORRUPT_MISSING_NEW_FILE,
|
|
strlen(PATCH_CORRUPT_MISSING_NEW_FILE)));
|
|
}
|
|
|
|
void test_apply_fromfile__fail_missing_old_file(void)
|
|
{
|
|
git_patch *patch;
|
|
cl_git_fail(git_patch_from_patchfile(&patch,
|
|
PATCH_CORRUPT_MISSING_OLD_FILE,
|
|
strlen(PATCH_CORRUPT_MISSING_OLD_FILE)));
|
|
}
|
|
|
|
void test_apply_fromfile__fail_no_changes(void)
|
|
{
|
|
git_patch *patch;
|
|
cl_git_fail(git_patch_from_patchfile(&patch,
|
|
PATCH_CORRUPT_NO_CHANGES,
|
|
strlen(PATCH_CORRUPT_NO_CHANGES)));
|
|
}
|
|
|
|
void test_apply_fromfile__fail_missing_hunk_header(void)
|
|
{
|
|
git_patch *patch;
|
|
cl_git_fail(git_patch_from_patchfile(&patch,
|
|
PATCH_CORRUPT_MISSING_HUNK_HEADER,
|
|
strlen(PATCH_CORRUPT_MISSING_HUNK_HEADER)));
|
|
}
|
|
|
|
void test_apply_fromfile__fail_not_a_patch(void)
|
|
{
|
|
git_patch *patch;
|
|
cl_git_fail(git_patch_from_patchfile(&patch, PATCH_NOT_A_PATCH,
|
|
strlen(PATCH_NOT_A_PATCH)));
|
|
}
|