]> git.proxmox.com Git - libgit2.git/blame - tests/apply/fromfile.c
New upstream version 1.3.0+dfsg.1
[libgit2.git] / tests / apply / fromfile.c
CommitLineData
d34f6826
ET
1#include "clar_libgit2.h"
2#include "git2/sys/repository.h"
3
4#include "apply.h"
440e3bae 5#include "patch.h"
17572f67 6#include "patch_parse.h"
d34f6826 7#include "repository.h"
d34f6826 8
8bca8b9e 9#include "../patch/patch_common.h"
d34f6826
ET
10
11static git_repository *repo = NULL;
12
13void test_apply_fromfile__initialize(void)
14{
15 repo = cl_git_sandbox_init("renames");
16}
17
18void test_apply_fromfile__cleanup(void)
19{
20 cl_git_sandbox_cleanup();
21}
22
23static int apply_patchfile(
24 const char *old,
5d17d726 25 size_t old_len,
d34f6826 26 const char *new,
5d17d726 27 size_t new_len,
d34f6826
ET
28 const char *patchfile,
29 const char *filename_expected,
30 unsigned int mode_expected)
31{
32 git_patch *patch;
33 git_buf result = GIT_BUF_INIT;
34 git_buf patchbuf = GIT_BUF_INIT;
35 char *filename;
36 unsigned int mode;
37 int error;
38
440e3bae 39 cl_git_pass(git_patch_from_buffer(&patch, patchfile, strlen(patchfile), NULL));
d34f6826 40
ac3d33df 41 error = git_apply__patch(&result, &filename, &mode, old, old_len, patch, NULL);
d34f6826
ET
42
43 if (error == 0) {
5d17d726 44 cl_assert_equal_i(new_len, result.size);
ac3d33df
JK
45 if (new_len)
46 cl_assert(memcmp(new, result.ptr, new_len) == 0);
d34f6826
ET
47
48 cl_assert_equal_s(filename_expected, filename);
49 cl_assert_equal_i(mode_expected, mode);
50 }
51
52 git__free(filename);
ac3d33df
JK
53 git_buf_dispose(&result);
54 git_buf_dispose(&patchbuf);
d34f6826
ET
55 git_patch_free(patch);
56
57 return error;
58}
59
60static int validate_and_apply_patchfile(
61 const char *old,
5d17d726 62 size_t old_len,
d34f6826 63 const char *new,
5d17d726 64 size_t new_len,
d34f6826
ET
65 const char *patchfile,
66 const git_diff_options *diff_opts,
67 const char *filename_expected,
68 unsigned int mode_expected)
69{
70 git_patch *patch_fromdiff;
71 git_buf validated = GIT_BUF_INIT;
72 int error;
73
74 cl_git_pass(git_patch_from_buffers(&patch_fromdiff,
5d17d726
ET
75 old, old_len, "file.txt",
76 new, new_len, "file.txt",
d34f6826
ET
77 diff_opts));
78 cl_git_pass(git_patch_to_buf(&validated, patch_fromdiff));
79
80 cl_assert_equal_s(patchfile, validated.ptr);
81
5d17d726 82 error = apply_patchfile(old, old_len, new, new_len, patchfile, filename_expected, mode_expected);
d34f6826 83
ac3d33df 84 git_buf_dispose(&validated);
d34f6826
ET
85 git_patch_free(patch_fromdiff);
86
87 return error;
88}
89
90void test_apply_fromfile__change_middle(void)
91{
5d17d726
ET
92 cl_git_pass(validate_and_apply_patchfile(
93 FILE_ORIGINAL, strlen(FILE_ORIGINAL),
94 FILE_CHANGE_MIDDLE, strlen(FILE_CHANGE_MIDDLE),
95 PATCH_ORIGINAL_TO_CHANGE_MIDDLE, NULL,
82175084 96 "file.txt", 0100644));
d34f6826
ET
97}
98
99void test_apply_fromfile__change_middle_nocontext(void)
100{
101 git_diff_options diff_opts = GIT_DIFF_OPTIONS_INIT;
102 diff_opts.context_lines = 0;
103
5d17d726
ET
104 cl_git_pass(validate_and_apply_patchfile(
105 FILE_ORIGINAL, strlen(FILE_ORIGINAL),
106 FILE_CHANGE_MIDDLE, strlen(FILE_CHANGE_MIDDLE),
107 PATCH_ORIGINAL_TO_CHANGE_MIDDLE_NOCONTEXT,
82175084 108 &diff_opts, "file.txt", 0100644));
d34f6826
ET
109}
110
804d5fe9 111
d34f6826
ET
112void test_apply_fromfile__change_firstline(void)
113{
5d17d726
ET
114 cl_git_pass(validate_and_apply_patchfile(
115 FILE_ORIGINAL, strlen(FILE_ORIGINAL),
116 FILE_CHANGE_FIRSTLINE, strlen(FILE_CHANGE_FIRSTLINE),
117 PATCH_ORIGINAL_TO_CHANGE_FIRSTLINE, NULL,
82175084 118 "file.txt", 0100644));
d34f6826
ET
119}
120
121void test_apply_fromfile__lastline(void)
122{
5d17d726
ET
123 cl_git_pass(validate_and_apply_patchfile(
124 FILE_ORIGINAL, strlen(FILE_ORIGINAL),
125 FILE_CHANGE_LASTLINE, strlen(FILE_CHANGE_LASTLINE),
126 PATCH_ORIGINAL_TO_CHANGE_LASTLINE, NULL,
82175084 127 "file.txt", 0100644));
d34f6826
ET
128}
129
0ff723cc
ET
130void test_apply_fromfile__change_middle_shrink(void)
131{
132 cl_git_pass(validate_and_apply_patchfile(
133 FILE_ORIGINAL, strlen(FILE_ORIGINAL),
134 FILE_CHANGE_MIDDLE_SHRINK, strlen(FILE_CHANGE_MIDDLE_SHRINK),
135 PATCH_ORIGINAL_TO_CHANGE_MIDDLE_SHRINK, NULL,
136 "file.txt", 0100644));
137}
138
139void test_apply_fromfile__change_middle_shrink_nocontext(void)
140{
141 git_diff_options diff_opts = GIT_DIFF_OPTIONS_INIT;
142 diff_opts.context_lines = 0;
143
144 cl_git_pass(validate_and_apply_patchfile(
145 FILE_ORIGINAL, strlen(FILE_ORIGINAL),
146 FILE_CHANGE_MIDDLE_SHRINK, strlen(FILE_CHANGE_MIDDLE_SHRINK),
147 PATCH_ORIGINAL_TO_MIDDLE_SHRINK_NOCONTEXT, &diff_opts,
148 "file.txt", 0100644));
149}
150
151void test_apply_fromfile__change_middle_grow(void)
152{
153 cl_git_pass(validate_and_apply_patchfile(
154 FILE_ORIGINAL, strlen(FILE_ORIGINAL),
155 FILE_CHANGE_MIDDLE_GROW, strlen(FILE_CHANGE_MIDDLE_GROW),
156 PATCH_ORIGINAL_TO_CHANGE_MIDDLE_GROW, NULL,
157 "file.txt", 0100644));
158}
159
160void test_apply_fromfile__change_middle_grow_nocontext(void)
161{
162 git_diff_options diff_opts = GIT_DIFF_OPTIONS_INIT;
163 diff_opts.context_lines = 0;
164
165 cl_git_pass(validate_and_apply_patchfile(
166 FILE_ORIGINAL, strlen(FILE_ORIGINAL),
167 FILE_CHANGE_MIDDLE_GROW, strlen(FILE_CHANGE_MIDDLE_GROW),
168 PATCH_ORIGINAL_TO_MIDDLE_GROW_NOCONTEXT, &diff_opts,
169 "file.txt", 0100644));
170}
171
d34f6826
ET
172void test_apply_fromfile__prepend(void)
173{
5d17d726
ET
174 cl_git_pass(validate_and_apply_patchfile(
175 FILE_ORIGINAL, strlen(FILE_ORIGINAL),
176 FILE_PREPEND, strlen(FILE_PREPEND),
82175084 177 PATCH_ORIGINAL_TO_PREPEND, NULL, "file.txt", 0100644));
d34f6826
ET
178}
179
180void test_apply_fromfile__prepend_nocontext(void)
181{
182 git_diff_options diff_opts = GIT_DIFF_OPTIONS_INIT;
183 diff_opts.context_lines = 0;
184
5d17d726
ET
185 cl_git_pass(validate_and_apply_patchfile(
186 FILE_ORIGINAL, strlen(FILE_ORIGINAL),
187 FILE_PREPEND, strlen(FILE_PREPEND),
d34f6826 188 PATCH_ORIGINAL_TO_PREPEND_NOCONTEXT, &diff_opts,
82175084 189 "file.txt", 0100644));
d34f6826
ET
190}
191
192void test_apply_fromfile__append(void)
193{
5d17d726
ET
194 cl_git_pass(validate_and_apply_patchfile(
195 FILE_ORIGINAL, strlen(FILE_ORIGINAL),
196 FILE_APPEND, strlen(FILE_APPEND),
82175084 197 PATCH_ORIGINAL_TO_APPEND, NULL, "file.txt", 0100644));
d34f6826
ET
198}
199
200void test_apply_fromfile__append_nocontext(void)
201{
202 git_diff_options diff_opts = GIT_DIFF_OPTIONS_INIT;
203 diff_opts.context_lines = 0;
204
5d17d726
ET
205 cl_git_pass(validate_and_apply_patchfile(
206 FILE_ORIGINAL, strlen(FILE_ORIGINAL),
207 FILE_APPEND, strlen(FILE_APPEND),
d34f6826 208 PATCH_ORIGINAL_TO_APPEND_NOCONTEXT, &diff_opts,
82175084 209 "file.txt", 0100644));
d34f6826
ET
210}
211
212void test_apply_fromfile__prepend_and_append(void)
213{
5d17d726
ET
214 cl_git_pass(validate_and_apply_patchfile(
215 FILE_ORIGINAL, strlen(FILE_ORIGINAL),
216 FILE_PREPEND_AND_APPEND, strlen(FILE_PREPEND_AND_APPEND),
217 PATCH_ORIGINAL_TO_PREPEND_AND_APPEND, NULL,
82175084 218 "file.txt", 0100644));
d34f6826
ET
219}
220
221void test_apply_fromfile__to_empty_file(void)
222{
5d17d726
ET
223 cl_git_pass(validate_and_apply_patchfile(
224 FILE_ORIGINAL, strlen(FILE_ORIGINAL),
225 "", 0,
82175084 226 PATCH_ORIGINAL_TO_EMPTY_FILE, NULL, "file.txt", 0100644));
d34f6826
ET
227}
228
229void test_apply_fromfile__from_empty_file(void)
230{
5d17d726
ET
231 cl_git_pass(validate_and_apply_patchfile(
232 "", 0,
233 FILE_ORIGINAL, strlen(FILE_ORIGINAL),
82175084 234 PATCH_EMPTY_FILE_TO_ORIGINAL, NULL, "file.txt", 0100644));
d34f6826
ET
235}
236
237void test_apply_fromfile__add(void)
238{
5d17d726
ET
239 cl_git_pass(validate_and_apply_patchfile(
240 NULL, 0,
241 FILE_ORIGINAL, strlen(FILE_ORIGINAL),
82175084 242 PATCH_ADD_ORIGINAL, NULL, "file.txt", 0100644));
d34f6826
ET
243}
244
245void test_apply_fromfile__delete(void)
246{
5d17d726
ET
247 cl_git_pass(validate_and_apply_patchfile(
248 FILE_ORIGINAL, strlen(FILE_ORIGINAL),
249 NULL, 0,
d34f6826
ET
250 PATCH_DELETE_ORIGINAL, NULL, NULL, 0));
251}
252
253
254void test_apply_fromfile__rename_exact(void)
255{
5d17d726
ET
256 cl_git_pass(apply_patchfile(
257 FILE_ORIGINAL, strlen(FILE_ORIGINAL),
258 FILE_ORIGINAL, strlen(FILE_ORIGINAL),
82175084 259 PATCH_RENAME_EXACT, "newfile.txt", 0100644));
d34f6826
ET
260}
261
262void test_apply_fromfile__rename_similar(void)
263{
5d17d726
ET
264 cl_git_pass(apply_patchfile(
265 FILE_ORIGINAL, strlen(FILE_ORIGINAL),
266 FILE_CHANGE_MIDDLE, strlen(FILE_CHANGE_MIDDLE),
82175084 267 PATCH_RENAME_SIMILAR, "newfile.txt", 0100644));
d34f6826
ET
268}
269
270void test_apply_fromfile__rename_similar_quotedname(void)
271{
5d17d726
ET
272 cl_git_pass(apply_patchfile(
273 FILE_ORIGINAL, strlen(FILE_ORIGINAL),
274 FILE_CHANGE_MIDDLE, strlen(FILE_CHANGE_MIDDLE),
82175084 275 PATCH_RENAME_SIMILAR_QUOTEDNAME, "foo\"bar.txt", 0100644));
d34f6826
ET
276}
277
278void test_apply_fromfile__modechange(void)
279{
5d17d726
ET
280 cl_git_pass(apply_patchfile(
281 FILE_ORIGINAL, strlen(FILE_ORIGINAL),
282 FILE_ORIGINAL, strlen(FILE_ORIGINAL),
82175084 283 PATCH_MODECHANGE_UNCHANGED, "file.txt", 0100755));
d34f6826
ET
284}
285
286void test_apply_fromfile__modechange_with_modification(void)
287{
5d17d726
ET
288 cl_git_pass(apply_patchfile(
289 FILE_ORIGINAL, strlen(FILE_ORIGINAL),
290 FILE_CHANGE_MIDDLE, strlen(FILE_CHANGE_MIDDLE),
82175084 291 PATCH_MODECHANGE_MODIFIED, "file.txt", 0100755));
d34f6826
ET
292}
293
294void test_apply_fromfile__noisy(void)
295{
5d17d726
ET
296 cl_git_pass(apply_patchfile(
297 FILE_ORIGINAL, strlen(FILE_ORIGINAL),
298 FILE_CHANGE_MIDDLE, strlen(FILE_CHANGE_MIDDLE),
82175084 299 PATCH_NOISY, "file.txt", 0100644));
d34f6826
ET
300}
301
302void test_apply_fromfile__noisy_nocontext(void)
303{
5d17d726
ET
304 cl_git_pass(apply_patchfile(
305 FILE_ORIGINAL, strlen(FILE_ORIGINAL),
306 FILE_CHANGE_MIDDLE, strlen(FILE_CHANGE_MIDDLE),
82175084 307 PATCH_NOISY_NOCONTEXT, "file.txt", 0100644));
d34f6826
ET
308}
309
310void test_apply_fromfile__fail_truncated_1(void)
311{
312 git_patch *patch;
440e3bae 313 cl_git_fail(git_patch_from_buffer(&patch, PATCH_TRUNCATED_1,
82175084 314 strlen(PATCH_TRUNCATED_1), NULL));
d34f6826
ET
315}
316
317void test_apply_fromfile__fail_truncated_2(void)
318{
319 git_patch *patch;
440e3bae 320 cl_git_fail(git_patch_from_buffer(&patch, PATCH_TRUNCATED_2,
82175084 321 strlen(PATCH_TRUNCATED_2), NULL));
d34f6826
ET
322}
323
324void test_apply_fromfile__fail_truncated_3(void)
325{
326 git_patch *patch;
440e3bae 327 cl_git_fail(git_patch_from_buffer(&patch, PATCH_TRUNCATED_3,
82175084 328 strlen(PATCH_TRUNCATED_3), NULL));
d34f6826
ET
329}
330
331void test_apply_fromfile__fail_corrupt_githeader(void)
332{
333 git_patch *patch;
440e3bae 334 cl_git_fail(git_patch_from_buffer(&patch, PATCH_CORRUPT_GIT_HEADER,
82175084 335 strlen(PATCH_CORRUPT_GIT_HEADER), NULL));
d34f6826
ET
336}
337
338void test_apply_fromfile__empty_context(void)
339{
5d17d726
ET
340 cl_git_pass(apply_patchfile(
341 FILE_EMPTY_CONTEXT_ORIGINAL, strlen(FILE_EMPTY_CONTEXT_ORIGINAL),
342 FILE_EMPTY_CONTEXT_MODIFIED, strlen(FILE_EMPTY_CONTEXT_MODIFIED),
343 PATCH_EMPTY_CONTEXT,
82175084 344 "file.txt", 0100644));
d34f6826
ET
345}
346
347void test_apply_fromfile__append_no_nl(void)
348{
349 cl_git_pass(validate_and_apply_patchfile(
5d17d726
ET
350 FILE_ORIGINAL, strlen(FILE_ORIGINAL),
351 FILE_APPEND_NO_NL, strlen(FILE_APPEND_NO_NL),
82175084 352 PATCH_APPEND_NO_NL, NULL, "file.txt", 0100644));
d34f6826
ET
353}
354
355void test_apply_fromfile__fail_missing_new_file(void)
356{
357 git_patch *patch;
440e3bae 358 cl_git_fail(git_patch_from_buffer(&patch,
d34f6826 359 PATCH_CORRUPT_MISSING_NEW_FILE,
82175084 360 strlen(PATCH_CORRUPT_MISSING_NEW_FILE), NULL));
d34f6826
ET
361}
362
363void test_apply_fromfile__fail_missing_old_file(void)
364{
365 git_patch *patch;
440e3bae 366 cl_git_fail(git_patch_from_buffer(&patch,
d34f6826 367 PATCH_CORRUPT_MISSING_OLD_FILE,
82175084 368 strlen(PATCH_CORRUPT_MISSING_OLD_FILE), NULL));
d34f6826
ET
369}
370
371void test_apply_fromfile__fail_no_changes(void)
372{
373 git_patch *patch;
440e3bae 374 cl_git_fail(git_patch_from_buffer(&patch,
d34f6826 375 PATCH_CORRUPT_NO_CHANGES,
82175084 376 strlen(PATCH_CORRUPT_NO_CHANGES), NULL));
d34f6826
ET
377}
378
379void test_apply_fromfile__fail_missing_hunk_header(void)
380{
381 git_patch *patch;
440e3bae 382 cl_git_fail(git_patch_from_buffer(&patch,
d34f6826 383 PATCH_CORRUPT_MISSING_HUNK_HEADER,
82175084 384 strlen(PATCH_CORRUPT_MISSING_HUNK_HEADER), NULL));
d34f6826
ET
385}
386
387void test_apply_fromfile__fail_not_a_patch(void)
388{
389 git_patch *patch;
440e3bae 390 cl_git_fail(git_patch_from_buffer(&patch, PATCH_NOT_A_PATCH,
82175084 391 strlen(PATCH_NOT_A_PATCH), NULL));
d34f6826 392}
3149ff6f 393
5d17d726 394void test_apply_fromfile__binary_add(void)
3149ff6f 395{
5d17d726
ET
396 cl_git_pass(apply_patchfile(
397 NULL, 0,
398 FILE_BINARY_DELTA_MODIFIED, FILE_BINARY_DELTA_MODIFIED_LEN,
82175084 399 PATCH_BINARY_ADD, "binary.bin", 0100644));
5d17d726 400}
3149ff6f 401
5d17d726
ET
402void test_apply_fromfile__binary_change_delta(void)
403{
404 cl_git_pass(apply_patchfile(
405 FILE_BINARY_DELTA_ORIGINAL, FILE_BINARY_DELTA_ORIGINAL_LEN,
406 FILE_BINARY_DELTA_MODIFIED, FILE_BINARY_DELTA_MODIFIED_LEN,
82175084 407 PATCH_BINARY_DELTA, "binary.bin", 0100644));
5d17d726 408}
3149ff6f 409
5d17d726
ET
410void test_apply_fromfile__binary_change_literal(void)
411{
412 cl_git_pass(apply_patchfile(
413 FILE_BINARY_LITERAL_ORIGINAL, FILE_BINARY_LITERAL_ORIGINAL_LEN,
414 FILE_BINARY_LITERAL_MODIFIED, FILE_BINARY_LITERAL_MODIFIED_LEN,
82175084 415 PATCH_BINARY_LITERAL, "binary.bin", 0100644));
5d17d726 416}
3149ff6f 417
5d17d726
ET
418void test_apply_fromfile__binary_delete(void)
419{
420 cl_git_pass(apply_patchfile(
421 FILE_BINARY_DELTA_MODIFIED, FILE_BINARY_DELTA_MODIFIED_LEN,
422 NULL, 0,
423 PATCH_BINARY_DELETE, NULL, 0));
424}
3149ff6f 425
5d17d726
ET
426void test_apply_fromfile__binary_change_does_not_apply(void)
427{
428 /* try to apply patch backwards, ensure it does not apply */
429 cl_git_fail(apply_patchfile(
430 FILE_BINARY_DELTA_MODIFIED, FILE_BINARY_DELTA_MODIFIED_LEN,
431 FILE_BINARY_DELTA_ORIGINAL, FILE_BINARY_DELTA_ORIGINAL_LEN,
82175084 432 PATCH_BINARY_DELTA, "binary.bin", 0100644));
5d17d726 433}
3149ff6f 434
5d17d726
ET
435void test_apply_fromfile__binary_change_must_be_reversible(void)
436{
437 cl_git_fail(apply_patchfile(
438 FILE_BINARY_DELTA_MODIFIED, FILE_BINARY_DELTA_MODIFIED_LEN,
439 NULL, 0,
440 PATCH_BINARY_NOT_REVERSIBLE, NULL, 0));
3149ff6f 441}
8d2eef27
ET
442
443void test_apply_fromfile__empty_file_not_allowed(void)
444{
445 git_patch *patch;
446
440e3bae
ET
447 cl_git_fail(git_patch_from_buffer(&patch, "", 0, NULL));
448 cl_git_fail(git_patch_from_buffer(&patch, NULL, 0, NULL));
8d2eef27 449}