1 #include "clar_libgit2.h"
2 #include "git2/sys/repository.h"
5 #include "repository.h"
8 #include "../patch/patch_common.h"
10 static git_repository
*repo
= NULL
;
12 void test_apply_partial__initialize(void)
14 repo
= cl_git_sandbox_init("renames");
17 void test_apply_partial__cleanup(void)
19 cl_git_sandbox_cleanup();
22 static int skip_addition(
23 const git_diff_hunk
*hunk
,
28 return (hunk
->new_lines
> hunk
->old_lines
) ? 1 : 0;
31 static int skip_deletion(
32 const git_diff_hunk
*hunk
,
37 return (hunk
->new_lines
< hunk
->old_lines
) ? 1 : 0;
40 static int skip_change(
41 const git_diff_hunk
*hunk
,
46 return (hunk
->new_lines
== hunk
->old_lines
) ? 1 : 0;
49 static int abort_addition(
50 const git_diff_hunk
*hunk
,
55 return (hunk
->new_lines
> hunk
->old_lines
) ? GIT_EUSER
: 0;
58 static int abort_deletion(
59 const git_diff_hunk
*hunk
,
64 return (hunk
->new_lines
< hunk
->old_lines
) ? GIT_EUSER
: 0;
67 static int abort_change(
68 const git_diff_hunk
*hunk
,
73 return (hunk
->new_lines
== hunk
->old_lines
) ? GIT_EUSER
: 0;
82 const git_diff_options
*diff_opts
,
83 git_apply_hunk_cb hunk_cb
,
87 git_buf result
= GIT_BUF_INIT
;
88 git_buf patchbuf
= GIT_BUF_INIT
;
89 git_apply_options opts
= GIT_APPLY_OPTIONS_INIT
;
93 size_t oldsize
= strlen(old
);
94 size_t newsize
= strlen(new);
96 opts
.hunk_cb
= hunk_cb
;
97 opts
.payload
= payload
;
99 cl_git_pass(git_patch_from_buffers(&patch
, old
, oldsize
, oldname
, new, newsize
, newname
, diff_opts
));
100 if ((error
= git_apply__patch(&result
, &filename
, &mode
, old
, oldsize
, patch
, &opts
)) == 0) {
101 cl_assert_equal_s(expected
, result
.ptr
);
102 cl_assert_equal_s(newname
, filename
);
103 cl_assert_equal_i(0100644, mode
);
107 git_buf_dispose(&result
);
108 git_buf_dispose(&patchbuf
);
109 git_patch_free(patch
);
114 void test_apply_partial__prepend_and_change_skip_addition(void)
116 cl_git_pass(apply_buf(
117 FILE_ORIGINAL
, "file.txt",
118 FILE_PREPEND_AND_CHANGE
, "file.txt",
119 FILE_ORIGINAL
, NULL
, skip_addition
, NULL
));
122 void test_apply_partial__prepend_and_change_nocontext_skip_addition(void)
124 git_diff_options diff_opts
= GIT_DIFF_OPTIONS_INIT
;
125 diff_opts
.context_lines
= 0;
127 cl_git_pass(apply_buf(
128 FILE_ORIGINAL
, "file.txt",
129 FILE_PREPEND_AND_CHANGE
, "file.txt",
130 FILE_CHANGE_MIDDLE
, &diff_opts
, skip_addition
, NULL
));
133 void test_apply_partial__prepend_and_change_nocontext_abort_addition(void)
135 git_diff_options diff_opts
= GIT_DIFF_OPTIONS_INIT
;
136 diff_opts
.context_lines
= 0;
138 cl_git_fail(apply_buf(
139 FILE_ORIGINAL
, "file.txt",
140 FILE_PREPEND_AND_CHANGE
, "file.txt",
141 FILE_ORIGINAL
, &diff_opts
, abort_addition
, NULL
));
144 void test_apply_partial__prepend_and_change_skip_change(void)
146 cl_git_pass(apply_buf(
147 FILE_ORIGINAL
, "file.txt",
148 FILE_PREPEND_AND_CHANGE
, "file.txt",
149 FILE_PREPEND_AND_CHANGE
, NULL
, skip_change
, NULL
));
152 void test_apply_partial__prepend_and_change_nocontext_skip_change(void)
154 git_diff_options diff_opts
= GIT_DIFF_OPTIONS_INIT
;
155 diff_opts
.context_lines
= 0;
157 cl_git_pass(apply_buf(
158 FILE_ORIGINAL
, "file.txt",
159 FILE_PREPEND_AND_CHANGE
, "file.txt",
160 FILE_PREPEND
, &diff_opts
, skip_change
, NULL
));
163 void test_apply_partial__prepend_and_change_nocontext_abort_change(void)
165 git_diff_options diff_opts
= GIT_DIFF_OPTIONS_INIT
;
166 diff_opts
.context_lines
= 0;
168 cl_git_fail(apply_buf(
169 FILE_ORIGINAL
, "file.txt",
170 FILE_PREPEND_AND_CHANGE
, "file.txt",
171 FILE_PREPEND
, &diff_opts
, abort_change
, NULL
));
174 void test_apply_partial__delete_and_change_skip_deletion(void)
176 cl_git_pass(apply_buf(
177 FILE_ORIGINAL
, "file.txt",
178 FILE_DELETE_AND_CHANGE
, "file.txt",
179 FILE_ORIGINAL
, NULL
, skip_deletion
, NULL
));
182 void test_apply_partial__delete_and_change_nocontext_skip_deletion(void)
184 git_diff_options diff_opts
= GIT_DIFF_OPTIONS_INIT
;
185 diff_opts
.context_lines
= 0;
187 cl_git_pass(apply_buf(
188 FILE_ORIGINAL
, "file.txt",
189 FILE_DELETE_AND_CHANGE
, "file.txt",
190 FILE_CHANGE_MIDDLE
, &diff_opts
, skip_deletion
, NULL
));
193 void test_apply_partial__delete_and_change_nocontext_abort_deletion(void)
195 git_diff_options diff_opts
= GIT_DIFF_OPTIONS_INIT
;
196 diff_opts
.context_lines
= 0;
198 cl_git_fail(apply_buf(
199 FILE_ORIGINAL
, "file.txt",
200 FILE_DELETE_AND_CHANGE
, "file.txt",
201 FILE_ORIGINAL
, &diff_opts
, abort_deletion
, NULL
));
204 void test_apply_partial__delete_and_change_skip_change(void)
206 cl_git_pass(apply_buf(
207 FILE_ORIGINAL
, "file.txt",
208 FILE_DELETE_AND_CHANGE
, "file.txt",
209 FILE_DELETE_AND_CHANGE
, NULL
, skip_change
, NULL
));
212 void test_apply_partial__delete_and_change_nocontext_skip_change(void)
214 git_diff_options diff_opts
= GIT_DIFF_OPTIONS_INIT
;
215 diff_opts
.context_lines
= 0;
217 cl_git_pass(apply_buf(
218 FILE_ORIGINAL
, "file.txt",
219 FILE_DELETE_AND_CHANGE
, "file.txt",
220 FILE_DELETE_FIRSTLINE
, &diff_opts
, skip_change
, NULL
));
223 void test_apply_partial__delete_and_change_nocontext_abort_change(void)
225 git_diff_options diff_opts
= GIT_DIFF_OPTIONS_INIT
;
226 diff_opts
.context_lines
= 0;
228 cl_git_fail(apply_buf(
229 FILE_ORIGINAL
, "file.txt",
230 FILE_DELETE_AND_CHANGE
, "file.txt",
231 FILE_DELETE_FIRSTLINE
, &diff_opts
, abort_change
, NULL
));