File: | merge-recursive.c |
Location: | line 907, column 6 |
Description: | Null pointer argument in call to string comparison function |
1 | /* | |||
2 | * Recursive Merge algorithm stolen from git-merge-recursive.py by | |||
3 | * Fredrik Kuivinen. | |||
4 | * The thieves were Alex Riesen and Johannes Schindelin, in June/July 2006 | |||
5 | */ | |||
6 | #include "cache.h" | |||
7 | #include "advice.h" | |||
8 | #include "lockfile.h" | |||
9 | #include "cache-tree.h" | |||
10 | #include "commit.h" | |||
11 | #include "blob.h" | |||
12 | #include "builtin.h" | |||
13 | #include "tree-walk.h" | |||
14 | #include "diff.h" | |||
15 | #include "diffcore.h" | |||
16 | #include "tag.h" | |||
17 | #include "unpack-trees.h" | |||
18 | #include "string-list.h" | |||
19 | #include "xdiff-interface.h" | |||
20 | #include "ll-merge.h" | |||
21 | #include "attr.h" | |||
22 | #include "merge-recursive.h" | |||
23 | #include "dir.h" | |||
24 | #include "submodule.h" | |||
25 | ||||
26 | static void flush_output(struct merge_options *o) | |||
27 | { | |||
28 | if (o->buffer_output < 2 && o->obuf.len) { | |||
29 | fputs(o->obuf.buf, stdout__stdoutp); | |||
30 | strbuf_reset(&o->obuf)strbuf_setlen(&o->obuf, 0); | |||
31 | } | |||
32 | } | |||
33 | ||||
34 | static int err(struct merge_options *o, const char *err, ...) | |||
35 | { | |||
36 | va_list params; | |||
37 | ||||
38 | if (o->buffer_output < 2) | |||
39 | flush_output(o); | |||
40 | else { | |||
41 | strbuf_complete(&o->obuf, '\n'); | |||
42 | strbuf_addstr(&o->obuf, "error: "); | |||
43 | } | |||
44 | va_start(params, err)__builtin_va_start(params, err); | |||
45 | strbuf_vaddf(&o->obuf, err, params); | |||
46 | va_end(params)__builtin_va_end(params); | |||
47 | if (o->buffer_output > 1) | |||
48 | strbuf_addch(&o->obuf, '\n'); | |||
49 | else { | |||
50 | error("%s", o->obuf.buf)(error("%s", o->obuf.buf), const_error()); | |||
51 | strbuf_reset(&o->obuf)strbuf_setlen(&o->obuf, 0); | |||
52 | } | |||
53 | ||||
54 | return -1; | |||
55 | } | |||
56 | ||||
57 | static struct tree *shift_tree_object(struct tree *one, struct tree *two, | |||
58 | const char *subtree_shift) | |||
59 | { | |||
60 | struct object_id shifted; | |||
61 | ||||
62 | if (!*subtree_shift) { | |||
63 | shift_tree(&one->object.oid, &two->object.oid, &shifted, 0); | |||
64 | } else { | |||
65 | shift_tree_by(&one->object.oid, &two->object.oid, &shifted, | |||
66 | subtree_shift); | |||
67 | } | |||
68 | if (!oidcmp(&two->object.oid, &shifted)) | |||
69 | return two; | |||
70 | return lookup_tree(shifted.hash); | |||
71 | } | |||
72 | ||||
73 | static struct commit *make_virtual_commit(struct tree *tree, const char *comment) | |||
74 | { | |||
75 | struct commit *commit = alloc_commit_node(); | |||
76 | ||||
77 | set_merge_remote_desc(commit, comment, (struct object *)commit); | |||
78 | commit->tree = tree; | |||
79 | commit->object.parsed = 1; | |||
80 | return commit; | |||
81 | } | |||
82 | ||||
83 | /* | |||
84 | * Since we use get_tree_entry(), which does not put the read object into | |||
85 | * the object pool, we cannot rely on a == b. | |||
86 | */ | |||
87 | static int oid_eq(const struct object_id *a, const struct object_id *b) | |||
88 | { | |||
89 | if (!a && !b) | |||
90 | return 2; | |||
91 | return a && b && oidcmp(a, b) == 0; | |||
92 | } | |||
93 | ||||
94 | enum rename_type { | |||
95 | RENAME_NORMAL = 0, | |||
96 | RENAME_DELETE, | |||
97 | RENAME_ONE_FILE_TO_ONE, | |||
98 | RENAME_ONE_FILE_TO_TWO, | |||
99 | RENAME_TWO_FILES_TO_ONE | |||
100 | }; | |||
101 | ||||
102 | struct rename_conflict_info { | |||
103 | enum rename_type rename_type; | |||
104 | struct diff_filepair *pair1; | |||
105 | struct diff_filepair *pair2; | |||
106 | const char *branch1; | |||
107 | const char *branch2; | |||
108 | struct stage_data *dst_entry1; | |||
109 | struct stage_data *dst_entry2; | |||
110 | struct diff_filespec ren1_other; | |||
111 | struct diff_filespec ren2_other; | |||
112 | }; | |||
113 | ||||
114 | /* | |||
115 | * Since we want to write the index eventually, we cannot reuse the index | |||
116 | * for these (temporary) data. | |||
117 | */ | |||
118 | struct stage_data { | |||
119 | struct { | |||
120 | unsigned mode; | |||
121 | struct object_id oid; | |||
122 | } stages[4]; | |||
123 | struct rename_conflict_info *rename_conflict_info; | |||
124 | unsigned processed:1; | |||
125 | }; | |||
126 | ||||
127 | static inline void setup_rename_conflict_info(enum rename_type rename_type, | |||
128 | struct diff_filepair *pair1, | |||
129 | struct diff_filepair *pair2, | |||
130 | const char *branch1, | |||
131 | const char *branch2, | |||
132 | struct stage_data *dst_entry1, | |||
133 | struct stage_data *dst_entry2, | |||
134 | struct merge_options *o, | |||
135 | struct stage_data *src_entry1, | |||
136 | struct stage_data *src_entry2) | |||
137 | { | |||
138 | struct rename_conflict_info *ci = xcalloc(1, sizeof(struct rename_conflict_info)); | |||
139 | ci->rename_type = rename_type; | |||
140 | ci->pair1 = pair1; | |||
141 | ci->branch1 = branch1; | |||
142 | ci->branch2 = branch2; | |||
143 | ||||
144 | ci->dst_entry1 = dst_entry1; | |||
145 | dst_entry1->rename_conflict_info = ci; | |||
146 | dst_entry1->processed = 0; | |||
147 | ||||
148 | assert(!pair2 == !dst_entry2)(__builtin_expect(!(!pair2 == !dst_entry2), 0) ? __assert_rtn (__func__, "merge-recursive.c", 148, "!pair2 == !dst_entry2") : (void)0); | |||
149 | if (dst_entry2) { | |||
150 | ci->dst_entry2 = dst_entry2; | |||
151 | ci->pair2 = pair2; | |||
152 | dst_entry2->rename_conflict_info = ci; | |||
153 | } | |||
154 | ||||
155 | if (rename_type == RENAME_TWO_FILES_TO_ONE) { | |||
156 | /* | |||
157 | * For each rename, there could have been | |||
158 | * modifications on the side of history where that | |||
159 | * file was not renamed. | |||
160 | */ | |||
161 | int ostage1 = o->branch1 == branch1 ? 3 : 2; | |||
162 | int ostage2 = ostage1 ^ 1; | |||
163 | ||||
164 | ci->ren1_other.path = pair1->one->path; | |||
165 | oidcpy(&ci->ren1_other.oid, &src_entry1->stages[ostage1].oid); | |||
166 | ci->ren1_other.mode = src_entry1->stages[ostage1].mode; | |||
167 | ||||
168 | ci->ren2_other.path = pair2->one->path; | |||
169 | oidcpy(&ci->ren2_other.oid, &src_entry2->stages[ostage2].oid); | |||
170 | ci->ren2_other.mode = src_entry2->stages[ostage2].mode; | |||
171 | } | |||
172 | } | |||
173 | ||||
174 | static int show(struct merge_options *o, int v) | |||
175 | { | |||
176 | return (!o->call_depth && o->verbosity >= v) || o->verbosity >= 5; | |||
177 | } | |||
178 | ||||
179 | __attribute__((format (printf, 3, 4))) | |||
180 | static void output(struct merge_options *o, int v, const char *fmt, ...) | |||
181 | { | |||
182 | va_list ap; | |||
183 | ||||
184 | if (!show(o, v)) | |||
185 | return; | |||
186 | ||||
187 | strbuf_addchars(&o->obuf, ' ', o->call_depth * 2); | |||
188 | ||||
189 | va_start(ap, fmt)__builtin_va_start(ap, fmt); | |||
190 | strbuf_vaddf(&o->obuf, fmt, ap); | |||
191 | va_end(ap)__builtin_va_end(ap); | |||
192 | ||||
193 | strbuf_addch(&o->obuf, '\n'); | |||
194 | if (!o->buffer_output) | |||
195 | flush_output(o); | |||
196 | } | |||
197 | ||||
198 | static void output_commit_title(struct merge_options *o, struct commit *commit) | |||
199 | { | |||
200 | strbuf_addchars(&o->obuf, ' ', o->call_depth * 2); | |||
201 | if (commit->util) | |||
202 | strbuf_addf(&o->obuf, "virtual %s\n", | |||
203 | merge_remote_util(commit)((struct merge_remote_desc *)((commit)->util))->name); | |||
204 | else { | |||
205 | strbuf_add_unique_abbrev(&o->obuf, commit->object.oid.hash, | |||
206 | DEFAULT_ABBREVdefault_abbrev); | |||
207 | strbuf_addch(&o->obuf, ' '); | |||
208 | if (parse_commit(commit) != 0) | |||
209 | strbuf_addstr(&o->obuf, _("(bad commit)\n")); | |||
210 | else { | |||
211 | const char *title; | |||
212 | const char *msg = get_commit_buffer(commit, NULL((void*)0)); | |||
213 | int len = find_commit_subject(msg, &title); | |||
214 | if (len) | |||
215 | strbuf_addf(&o->obuf, "%.*s\n", len, title); | |||
216 | unuse_commit_buffer(commit, msg); | |||
217 | } | |||
218 | } | |||
219 | flush_output(o); | |||
220 | } | |||
221 | ||||
222 | static int add_cacheinfo(struct merge_options *o, | |||
223 | unsigned int mode, const struct object_id *oid, | |||
224 | const char *path, int stage, int refresh, int options) | |||
225 | { | |||
226 | struct cache_entry *ce; | |||
227 | int ret; | |||
228 | ||||
229 | ce = make_cache_entry(mode, oid ? oid->hash : null_sha1, path, stage, 0); | |||
230 | if (!ce) | |||
231 | return err(o, _("addinfo_cache failed for path '%s'"), path); | |||
232 | ||||
233 | ret = add_cache_entry(ce, options)add_index_entry(&the_index, (ce), (options)); | |||
234 | if (refresh) { | |||
235 | struct cache_entry *nce; | |||
236 | ||||
237 | nce = refresh_cache_entry(ce, CE_MATCH_REFRESH0x10 | CE_MATCH_IGNORE_MISSING0x08); | |||
238 | if (!nce) | |||
239 | return err(o, _("addinfo_cache failed for path '%s'"), path); | |||
240 | if (nce != ce) | |||
241 | ret = add_cache_entry(nce, options)add_index_entry(&the_index, (nce), (options)); | |||
242 | } | |||
243 | return ret; | |||
244 | } | |||
245 | ||||
246 | static void init_tree_desc_from_tree(struct tree_desc *desc, struct tree *tree) | |||
247 | { | |||
248 | parse_tree(tree); | |||
249 | init_tree_desc(desc, tree->buffer, tree->size); | |||
250 | } | |||
251 | ||||
252 | static int git_merge_trees(int index_only, | |||
253 | struct tree *common, | |||
254 | struct tree *head, | |||
255 | struct tree *merge) | |||
256 | { | |||
257 | int rc; | |||
258 | struct tree_desc t[3]; | |||
259 | struct unpack_trees_options opts; | |||
260 | ||||
261 | memset(&opts, 0, sizeof(opts))__builtin___memset_chk (&opts, 0, sizeof(opts), __builtin_object_size (&opts, 0)); | |||
262 | if (index_only) | |||
263 | opts.index_only = 1; | |||
264 | else | |||
265 | opts.update = 1; | |||
266 | opts.merge = 1; | |||
267 | opts.head_idx = 2; | |||
268 | opts.fn = threeway_merge; | |||
269 | opts.src_index = &the_index; | |||
270 | opts.dst_index = &the_index; | |||
271 | setup_unpack_trees_porcelain(&opts, "merge"); | |||
272 | ||||
273 | init_tree_desc_from_tree(t+0, common); | |||
274 | init_tree_desc_from_tree(t+1, head); | |||
275 | init_tree_desc_from_tree(t+2, merge); | |||
276 | ||||
277 | rc = unpack_trees(3, t, &opts); | |||
278 | cache_tree_free(&active_cache_tree(the_index.cache_tree)); | |||
279 | return rc; | |||
280 | } | |||
281 | ||||
282 | struct tree *write_tree_from_memory(struct merge_options *o) | |||
283 | { | |||
284 | struct tree *result = NULL((void*)0); | |||
285 | ||||
286 | if (unmerged_cache()unmerged_index(&the_index)) { | |||
287 | int i; | |||
288 | fprintf(stderr__stderrp, "BUG: There are unmerged index entries:\n"); | |||
289 | for (i = 0; i < active_nr(the_index.cache_nr); i++) { | |||
290 | const struct cache_entry *ce = active_cache(the_index.cache)[i]; | |||
291 | if (ce_stage(ce)(((0x3000) & (ce)->ce_flags) >> 12)) | |||
292 | fprintf(stderr__stderrp, "BUG: %d %.*s\n", ce_stage(ce)(((0x3000) & (ce)->ce_flags) >> 12), | |||
293 | (int)ce_namelen(ce)((ce)->ce_namelen), ce->name); | |||
294 | } | |||
295 | die("BUG: unmerged index entries in merge-recursive.c"); | |||
296 | } | |||
297 | ||||
298 | if (!active_cache_tree(the_index.cache_tree)) | |||
299 | active_cache_tree(the_index.cache_tree) = cache_tree(); | |||
300 | ||||
301 | if (!cache_tree_fully_valid(active_cache_tree(the_index.cache_tree)) && | |||
302 | cache_tree_update(&the_index, 0) < 0) { | |||
303 | err(o, _("error building trees")); | |||
304 | return NULL((void*)0); | |||
305 | } | |||
306 | ||||
307 | result = lookup_tree(active_cache_tree(the_index.cache_tree)->sha1); | |||
308 | ||||
309 | return result; | |||
310 | } | |||
311 | ||||
312 | static int save_files_dirs(const unsigned char *sha1, | |||
313 | struct strbuf *base, const char *path, | |||
314 | unsigned int mode, int stage, void *context) | |||
315 | { | |||
316 | int baselen = base->len; | |||
317 | struct merge_options *o = context; | |||
318 | ||||
319 | strbuf_addstr(base, path); | |||
320 | ||||
321 | if (S_ISDIR(mode)(((mode) & 0170000) == 0040000)) | |||
322 | string_list_insert(&o->current_directory_set, base->buf); | |||
323 | else | |||
324 | string_list_insert(&o->current_file_set, base->buf); | |||
325 | ||||
326 | strbuf_setlen(base, baselen); | |||
327 | return (S_ISDIR(mode)(((mode) & 0170000) == 0040000) ? READ_TREE_RECURSIVE1 : 0); | |||
328 | } | |||
329 | ||||
330 | static int get_files_dirs(struct merge_options *o, struct tree *tree) | |||
331 | { | |||
332 | int n; | |||
333 | struct pathspec match_all; | |||
334 | memset(&match_all, 0, sizeof(match_all))__builtin___memset_chk (&match_all, 0, sizeof(match_all), __builtin_object_size (&match_all, 0)); | |||
335 | if (read_tree_recursive(tree, "", 0, 0, &match_all, save_files_dirs, o)) | |||
336 | return 0; | |||
337 | n = o->current_file_set.nr + o->current_directory_set.nr; | |||
338 | return n; | |||
339 | } | |||
340 | ||||
341 | /* | |||
342 | * Returns an index_entry instance which doesn't have to correspond to | |||
343 | * a real cache entry in Git's index. | |||
344 | */ | |||
345 | static struct stage_data *insert_stage_data(const char *path, | |||
346 | struct tree *o, struct tree *a, struct tree *b, | |||
347 | struct string_list *entries) | |||
348 | { | |||
349 | struct string_list_item *item; | |||
350 | struct stage_data *e = xcalloc(1, sizeof(struct stage_data)); | |||
351 | get_tree_entry(o->object.oid.hash, path, | |||
352 | e->stages[1].oid.hash, &e->stages[1].mode); | |||
353 | get_tree_entry(a->object.oid.hash, path, | |||
354 | e->stages[2].oid.hash, &e->stages[2].mode); | |||
355 | get_tree_entry(b->object.oid.hash, path, | |||
356 | e->stages[3].oid.hash, &e->stages[3].mode); | |||
357 | item = string_list_insert(entries, path); | |||
358 | item->util = e; | |||
359 | return e; | |||
360 | } | |||
361 | ||||
362 | /* | |||
363 | * Create a dictionary mapping file names to stage_data objects. The | |||
364 | * dictionary contains one entry for every path with a non-zero stage entry. | |||
365 | */ | |||
366 | static struct string_list *get_unmerged(void) | |||
367 | { | |||
368 | struct string_list *unmerged = xcalloc(1, sizeof(struct string_list)); | |||
369 | int i; | |||
370 | ||||
371 | unmerged->strdup_strings = 1; | |||
372 | ||||
373 | for (i = 0; i < active_nr(the_index.cache_nr); i++) { | |||
374 | struct string_list_item *item; | |||
375 | struct stage_data *e; | |||
376 | const struct cache_entry *ce = active_cache(the_index.cache)[i]; | |||
377 | if (!ce_stage(ce)(((0x3000) & (ce)->ce_flags) >> 12)) | |||
378 | continue; | |||
379 | ||||
380 | item = string_list_lookup(unmerged, ce->name); | |||
381 | if (!item) { | |||
382 | item = string_list_insert(unmerged, ce->name); | |||
383 | item->util = xcalloc(1, sizeof(struct stage_data)); | |||
384 | } | |||
385 | e = item->util; | |||
386 | e->stages[ce_stage(ce)(((0x3000) & (ce)->ce_flags) >> 12)].mode = ce->ce_mode; | |||
387 | oidcpy(&e->stages[ce_stage(ce)(((0x3000) & (ce)->ce_flags) >> 12)].oid, &ce->oid); | |||
388 | } | |||
389 | ||||
390 | return unmerged; | |||
391 | } | |||
392 | ||||
393 | static int string_list_df_name_compare(const char *one, const char *two) | |||
394 | { | |||
395 | int onelen = strlen(one); | |||
396 | int twolen = strlen(two); | |||
397 | /* | |||
398 | * Here we only care that entries for D/F conflicts are | |||
399 | * adjacent, in particular with the file of the D/F conflict | |||
400 | * appearing before files below the corresponding directory. | |||
401 | * The order of the rest of the list is irrelevant for us. | |||
402 | * | |||
403 | * To achieve this, we sort with df_name_compare and provide | |||
404 | * the mode S_IFDIR so that D/F conflicts will sort correctly. | |||
405 | * We use the mode S_IFDIR for everything else for simplicity, | |||
406 | * since in other cases any changes in their order due to | |||
407 | * sorting cause no problems for us. | |||
408 | */ | |||
409 | int cmp = df_name_compare(one, onelen, S_IFDIR0040000, | |||
410 | two, twolen, S_IFDIR0040000); | |||
411 | /* | |||
412 | * Now that 'foo' and 'foo/bar' compare equal, we have to make sure | |||
413 | * that 'foo' comes before 'foo/bar'. | |||
414 | */ | |||
415 | if (cmp) | |||
416 | return cmp; | |||
417 | return onelen - twolen; | |||
418 | } | |||
419 | ||||
420 | static void record_df_conflict_files(struct merge_options *o, | |||
421 | struct string_list *entries) | |||
422 | { | |||
423 | /* If there is a D/F conflict and the file for such a conflict | |||
424 | * currently exist in the working tree, we want to allow it to be | |||
425 | * removed to make room for the corresponding directory if needed. | |||
426 | * The files underneath the directories of such D/F conflicts will | |||
427 | * be processed before the corresponding file involved in the D/F | |||
428 | * conflict. If the D/F directory ends up being removed by the | |||
429 | * merge, then we won't have to touch the D/F file. If the D/F | |||
430 | * directory needs to be written to the working copy, then the D/F | |||
431 | * file will simply be removed (in make_room_for_path()) to make | |||
432 | * room for the necessary paths. Note that if both the directory | |||
433 | * and the file need to be present, then the D/F file will be | |||
434 | * reinstated with a new unique name at the time it is processed. | |||
435 | */ | |||
436 | struct string_list df_sorted_entries = STRING_LIST_INIT_NODUP{ ((void*)0), 0, 0, 0, ((void*)0) }; | |||
437 | const char *last_file = NULL((void*)0); | |||
438 | int last_len = 0; | |||
439 | int i; | |||
440 | ||||
441 | /* | |||
442 | * If we're merging merge-bases, we don't want to bother with | |||
443 | * any working directory changes. | |||
444 | */ | |||
445 | if (o->call_depth) | |||
446 | return; | |||
447 | ||||
448 | /* Ensure D/F conflicts are adjacent in the entries list. */ | |||
449 | for (i = 0; i < entries->nr; i++) { | |||
450 | struct string_list_item *next = &entries->items[i]; | |||
451 | string_list_append(&df_sorted_entries, next->string)->util = | |||
452 | next->util; | |||
453 | } | |||
454 | df_sorted_entries.cmp = string_list_df_name_compare; | |||
455 | string_list_sort(&df_sorted_entries); | |||
456 | ||||
457 | string_list_clear(&o->df_conflict_file_set, 1); | |||
458 | for (i = 0; i < df_sorted_entries.nr; i++) { | |||
459 | const char *path = df_sorted_entries.items[i].string; | |||
460 | int len = strlen(path); | |||
461 | struct stage_data *e = df_sorted_entries.items[i].util; | |||
462 | ||||
463 | /* | |||
464 | * Check if last_file & path correspond to a D/F conflict; | |||
465 | * i.e. whether path is last_file+'/'+<something>. | |||
466 | * If so, record that it's okay to remove last_file to make | |||
467 | * room for path and friends if needed. | |||
468 | */ | |||
469 | if (last_file && | |||
470 | len > last_len && | |||
471 | memcmp(path, last_file, last_len) == 0 && | |||
472 | path[last_len] == '/') { | |||
473 | string_list_insert(&o->df_conflict_file_set, last_file); | |||
474 | } | |||
475 | ||||
476 | /* | |||
477 | * Determine whether path could exist as a file in the | |||
478 | * working directory as a possible D/F conflict. This | |||
479 | * will only occur when it exists in stage 2 as a | |||
480 | * file. | |||
481 | */ | |||
482 | if (S_ISREG(e->stages[2].mode)(((e->stages[2].mode) & 0170000) == 0100000) || S_ISLNK(e->stages[2].mode)(((e->stages[2].mode) & 0170000) == 0120000)) { | |||
483 | last_file = path; | |||
484 | last_len = len; | |||
485 | } else { | |||
486 | last_file = NULL((void*)0); | |||
487 | } | |||
488 | } | |||
489 | string_list_clear(&df_sorted_entries, 0); | |||
490 | } | |||
491 | ||||
492 | struct rename { | |||
493 | struct diff_filepair *pair; | |||
494 | struct stage_data *src_entry; | |||
495 | struct stage_data *dst_entry; | |||
496 | unsigned processed:1; | |||
497 | }; | |||
498 | ||||
499 | /* | |||
500 | * Get information of all renames which occurred between 'o_tree' and | |||
501 | * 'tree'. We need the three trees in the merge ('o_tree', 'a_tree' and | |||
502 | * 'b_tree') to be able to associate the correct cache entries with | |||
503 | * the rename information. 'tree' is always equal to either a_tree or b_tree. | |||
504 | */ | |||
505 | static struct string_list *get_renames(struct merge_options *o, | |||
506 | struct tree *tree, | |||
507 | struct tree *o_tree, | |||
508 | struct tree *a_tree, | |||
509 | struct tree *b_tree, | |||
510 | struct string_list *entries) | |||
511 | { | |||
512 | int i; | |||
513 | struct string_list *renames; | |||
514 | struct diff_options opts; | |||
515 | ||||
516 | renames = xcalloc(1, sizeof(struct string_list)); | |||
517 | if (!o->detect_rename) | |||
518 | return renames; | |||
519 | ||||
520 | diff_setup(&opts); | |||
521 | DIFF_OPT_SET(&opts, RECURSIVE)(((&opts)->flags |= (1 << 0)),((&opts)->touched_flags |= (1 << 0))); | |||
522 | DIFF_OPT_CLR(&opts, RENAME_EMPTY)(((&opts)->flags &= ~(1 << 8)),((&opts)-> touched_flags |= (1 << 8))); | |||
523 | opts.detect_rename = DIFF_DETECT_RENAME1; | |||
524 | opts.rename_limit = o->merge_rename_limit >= 0 ? o->merge_rename_limit : | |||
525 | o->diff_rename_limit >= 0 ? o->diff_rename_limit : | |||
526 | 1000; | |||
527 | opts.rename_score = o->rename_score; | |||
528 | opts.show_rename_progress = o->show_rename_progress; | |||
529 | opts.output_format = DIFF_FORMAT_NO_OUTPUT0x0800; | |||
530 | diff_setup_done(&opts); | |||
531 | diff_tree_sha1(o_tree->object.oid.hash, tree->object.oid.hash, "", &opts); | |||
532 | diffcore_std(&opts); | |||
533 | if (opts.needed_rename_limit > o->needed_rename_limit) | |||
534 | o->needed_rename_limit = opts.needed_rename_limit; | |||
535 | for (i = 0; i < diff_queued_diff.nr; ++i) { | |||
536 | struct string_list_item *item; | |||
537 | struct rename *re; | |||
538 | struct diff_filepair *pair = diff_queued_diff.queue[i]; | |||
539 | if (pair->status != 'R') { | |||
540 | diff_free_filepair(pair); | |||
541 | continue; | |||
542 | } | |||
543 | re = xmalloc(sizeof(*re)); | |||
544 | re->processed = 0; | |||
545 | re->pair = pair; | |||
546 | item = string_list_lookup(entries, re->pair->one->path); | |||
547 | if (!item) | |||
548 | re->src_entry = insert_stage_data(re->pair->one->path, | |||
549 | o_tree, a_tree, b_tree, entries); | |||
550 | else | |||
551 | re->src_entry = item->util; | |||
552 | ||||
553 | item = string_list_lookup(entries, re->pair->two->path); | |||
554 | if (!item) | |||
555 | re->dst_entry = insert_stage_data(re->pair->two->path, | |||
556 | o_tree, a_tree, b_tree, entries); | |||
557 | else | |||
558 | re->dst_entry = item->util; | |||
559 | item = string_list_insert(renames, pair->one->path); | |||
560 | item->util = re; | |||
561 | } | |||
562 | opts.output_format = DIFF_FORMAT_NO_OUTPUT0x0800; | |||
563 | diff_queued_diff.nr = 0; | |||
564 | diff_flush(&opts); | |||
565 | return renames; | |||
566 | } | |||
567 | ||||
568 | static int update_stages(struct merge_options *opt, const char *path, | |||
569 | const struct diff_filespec *o, | |||
570 | const struct diff_filespec *a, | |||
571 | const struct diff_filespec *b) | |||
572 | { | |||
573 | ||||
574 | /* | |||
575 | * NOTE: It is usually a bad idea to call update_stages on a path | |||
576 | * before calling update_file on that same path, since it can | |||
577 | * sometimes lead to spurious "refusing to lose untracked file..." | |||
578 | * messages from update_file (via make_room_for path via | |||
579 | * would_lose_untracked). Instead, reverse the order of the calls | |||
580 | * (executing update_file first and then update_stages). | |||
581 | */ | |||
582 | int clear = 1; | |||
583 | int options = ADD_CACHE_OK_TO_ADD1 | ADD_CACHE_SKIP_DFCHECK4; | |||
584 | if (clear) | |||
585 | if (remove_file_from_cache(path)remove_file_from_index(&the_index, (path))) | |||
586 | return -1; | |||
587 | if (o) | |||
588 | if (add_cacheinfo(opt, o->mode, &o->oid, path, 1, 0, options)) | |||
589 | return -1; | |||
590 | if (a) | |||
591 | if (add_cacheinfo(opt, a->mode, &a->oid, path, 2, 0, options)) | |||
592 | return -1; | |||
593 | if (b) | |||
594 | if (add_cacheinfo(opt, b->mode, &b->oid, path, 3, 0, options)) | |||
595 | return -1; | |||
596 | return 0; | |||
597 | } | |||
598 | ||||
599 | static void update_entry(struct stage_data *entry, | |||
600 | struct diff_filespec *o, | |||
601 | struct diff_filespec *a, | |||
602 | struct diff_filespec *b) | |||
603 | { | |||
604 | entry->processed = 0; | |||
605 | entry->stages[1].mode = o->mode; | |||
606 | entry->stages[2].mode = a->mode; | |||
607 | entry->stages[3].mode = b->mode; | |||
608 | oidcpy(&entry->stages[1].oid, &o->oid); | |||
609 | oidcpy(&entry->stages[2].oid, &a->oid); | |||
610 | oidcpy(&entry->stages[3].oid, &b->oid); | |||
611 | } | |||
612 | ||||
613 | static int remove_file(struct merge_options *o, int clean, | |||
614 | const char *path, int no_wd) | |||
615 | { | |||
616 | int update_cache = o->call_depth || clean; | |||
617 | int update_working_directory = !o->call_depth && !no_wd; | |||
618 | ||||
619 | if (update_cache) { | |||
620 | if (remove_file_from_cache(path)remove_file_from_index(&the_index, (path))) | |||
621 | return -1; | |||
622 | } | |||
623 | if (update_working_directory) { | |||
624 | if (ignore_case) { | |||
625 | struct cache_entry *ce; | |||
626 | ce = cache_file_exists(path, strlen(path), ignore_case)index_file_exists(&the_index, (path), (strlen(path)), (ignore_case )); | |||
627 | if (ce && ce_stage(ce)(((0x3000) & (ce)->ce_flags) >> 12) == 0) | |||
628 | return 0; | |||
629 | } | |||
630 | if (remove_path(path)) | |||
631 | return -1; | |||
632 | } | |||
633 | return 0; | |||
634 | } | |||
635 | ||||
636 | /* add a string to a strbuf, but converting "/" to "_" */ | |||
637 | static void add_flattened_path(struct strbuf *out, const char *s) | |||
638 | { | |||
639 | size_t i = out->len; | |||
640 | strbuf_addstr(out, s); | |||
641 | for (; i < out->len; i++) | |||
642 | if (out->buf[i] == '/') | |||
643 | out->buf[i] = '_'; | |||
644 | } | |||
645 | ||||
646 | static char *unique_path(struct merge_options *o, const char *path, const char *branch) | |||
647 | { | |||
648 | struct strbuf newpath = STRBUF_INIT{ 0, 0, strbuf_slopbuf }; | |||
649 | int suffix = 0; | |||
650 | size_t base_len; | |||
651 | ||||
652 | strbuf_addf(&newpath, "%s~", path); | |||
653 | add_flattened_path(&newpath, branch); | |||
654 | ||||
655 | base_len = newpath.len; | |||
656 | while (string_list_has_string(&o->current_file_set, newpath.buf) || | |||
657 | string_list_has_string(&o->current_directory_set, newpath.buf) || | |||
658 | (!o->call_depth && file_exists(newpath.buf))) { | |||
659 | strbuf_setlen(&newpath, base_len); | |||
660 | strbuf_addf(&newpath, "_%d", suffix++); | |||
661 | } | |||
662 | ||||
663 | string_list_insert(&o->current_file_set, newpath.buf); | |||
664 | return strbuf_detach(&newpath, NULL((void*)0)); | |||
665 | } | |||
666 | ||||
667 | /** | |||
668 | * Check whether a directory in the index is in the way of an incoming | |||
669 | * file. Return 1 if so. If check_working_copy is non-zero, also | |||
670 | * check the working directory. If empty_ok is non-zero, also return | |||
671 | * 0 in the case where the working-tree dir exists but is empty. | |||
672 | */ | |||
673 | static int dir_in_way(const char *path, int check_working_copy, int empty_ok) | |||
674 | { | |||
675 | int pos; | |||
676 | struct strbuf dirpath = STRBUF_INIT{ 0, 0, strbuf_slopbuf }; | |||
677 | struct stat st; | |||
678 | ||||
679 | strbuf_addstr(&dirpath, path); | |||
680 | strbuf_addch(&dirpath, '/'); | |||
681 | ||||
682 | pos = cache_name_pos(dirpath.buf, dirpath.len)index_name_pos(&the_index,(dirpath.buf),(dirpath.len)); | |||
683 | ||||
684 | if (pos < 0) | |||
685 | pos = -1 - pos; | |||
686 | if (pos < active_nr(the_index.cache_nr) && | |||
687 | !strncmp(dirpath.buf, active_cache(the_index.cache)[pos]->name, dirpath.len)) { | |||
688 | strbuf_release(&dirpath); | |||
689 | return 1; | |||
690 | } | |||
691 | ||||
692 | strbuf_release(&dirpath); | |||
693 | return check_working_copy && !lstat(path, &st) && S_ISDIR(st.st_mode)(((st.st_mode) & 0170000) == 0040000) && | |||
694 | !(empty_ok && is_empty_dir(path)); | |||
695 | } | |||
696 | ||||
697 | static int was_tracked(const char *path) | |||
698 | { | |||
699 | int pos = cache_name_pos(path, strlen(path))index_name_pos(&the_index,(path),(strlen(path))); | |||
700 | ||||
701 | if (0 <= pos) | |||
702 | /* we have been tracking this path */ | |||
703 | return 1; | |||
704 | ||||
705 | /* | |||
706 | * Look for an unmerged entry for the path, | |||
707 | * specifically stage #2, which would indicate | |||
708 | * that "our" side before the merge started | |||
709 | * had the path tracked (and resulted in a conflict). | |||
710 | */ | |||
711 | for (pos = -1 - pos; | |||
712 | pos < active_nr(the_index.cache_nr) && !strcmp(path, active_cache(the_index.cache)[pos]->name); | |||
713 | pos++) | |||
714 | if (ce_stage(active_cache[pos])(((0x3000) & ((the_index.cache)[pos])->ce_flags) >> 12) == 2) | |||
715 | return 1; | |||
716 | return 0; | |||
717 | } | |||
718 | ||||
719 | static int would_lose_untracked(const char *path) | |||
720 | { | |||
721 | return !was_tracked(path) && file_exists(path); | |||
722 | } | |||
723 | ||||
724 | static int make_room_for_path(struct merge_options *o, const char *path) | |||
725 | { | |||
726 | int status, i; | |||
727 | const char *msg = _("failed to create path '%s'%s"); | |||
728 | ||||
729 | /* Unlink any D/F conflict files that are in the way */ | |||
730 | for (i = 0; i < o->df_conflict_file_set.nr; i++) { | |||
731 | const char *df_path = o->df_conflict_file_set.items[i].string; | |||
732 | size_t pathlen = strlen(path); | |||
733 | size_t df_pathlen = strlen(df_path); | |||
734 | if (df_pathlen < pathlen && | |||
735 | path[df_pathlen] == '/' && | |||
736 | strncmp(path, df_path, df_pathlen) == 0) { | |||
737 | output(o, 3, | |||
738 | _("Removing %s to make room for subdirectory\n"), | |||
739 | df_path); | |||
740 | unlink(df_path); | |||
741 | unsorted_string_list_delete_item(&o->df_conflict_file_set, | |||
742 | i, 0); | |||
743 | break; | |||
744 | } | |||
745 | } | |||
746 | ||||
747 | /* Make sure leading directories are created */ | |||
748 | status = safe_create_leading_directories_const(path); | |||
749 | if (status) { | |||
750 | if (status == SCLD_EXISTS) | |||
751 | /* something else exists */ | |||
752 | return err(o, msg, path, _(": perhaps a D/F conflict?")); | |||
753 | return err(o, msg, path, ""); | |||
754 | } | |||
755 | ||||
756 | /* | |||
757 | * Do not unlink a file in the work tree if we are not | |||
758 | * tracking it. | |||
759 | */ | |||
760 | if (would_lose_untracked(path)) | |||
761 | return err(o, _("refusing to lose untracked file at '%s'"), | |||
762 | path); | |||
763 | ||||
764 | /* Successful unlink is good.. */ | |||
765 | if (!unlink(path)) | |||
766 | return 0; | |||
767 | /* .. and so is no existing file */ | |||
768 | if (errno(*__error()) == ENOENT2) | |||
769 | return 0; | |||
770 | /* .. but not some other error (who really cares what?) */ | |||
771 | return err(o, msg, path, _(": perhaps a D/F conflict?")); | |||
772 | } | |||
773 | ||||
774 | static int update_file_flags(struct merge_options *o, | |||
775 | const struct object_id *oid, | |||
776 | unsigned mode, | |||
777 | const char *path, | |||
778 | int update_cache, | |||
779 | int update_wd) | |||
780 | { | |||
781 | int ret = 0; | |||
782 | ||||
783 | if (o->call_depth) | |||
784 | update_wd = 0; | |||
785 | ||||
786 | if (update_wd) { | |||
787 | enum object_type type; | |||
788 | void *buf; | |||
789 | unsigned long size; | |||
790 | ||||
791 | if (S_ISGITLINK(mode)(((mode) & 0170000) == 0160000)) { | |||
792 | /* | |||
793 | * We may later decide to recursively descend into | |||
794 | * the submodule directory and update its index | |||
795 | * and/or work tree, but we do not do that now. | |||
796 | */ | |||
797 | update_wd = 0; | |||
798 | goto update_index; | |||
799 | } | |||
800 | ||||
801 | buf = read_sha1_file(oid->hash, &type, &size); | |||
802 | if (!buf) | |||
803 | return err(o, _("cannot read object %s '%s'"), oid_to_hex(oid), path); | |||
804 | if (type != OBJ_BLOB) { | |||
805 | ret = err(o, _("blob expected for %s '%s'"), oid_to_hex(oid), path); | |||
806 | goto free_buf; | |||
807 | } | |||
808 | if (S_ISREG(mode)(((mode) & 0170000) == 0100000)) { | |||
809 | struct strbuf strbuf = STRBUF_INIT{ 0, 0, strbuf_slopbuf }; | |||
810 | if (convert_to_working_tree(path, buf, size, &strbuf)) { | |||
811 | free(buf); | |||
812 | size = strbuf.len; | |||
813 | buf = strbuf_detach(&strbuf, NULL((void*)0)); | |||
814 | } | |||
815 | } | |||
816 | ||||
817 | if (make_room_for_path(o, path) < 0) { | |||
818 | update_wd = 0; | |||
819 | goto free_buf; | |||
820 | } | |||
821 | if (S_ISREG(mode)(((mode) & 0170000) == 0100000) || (!has_symlinks && S_ISLNK(mode)(((mode) & 0170000) == 0120000))) { | |||
822 | int fd; | |||
823 | if (mode & 0100) | |||
824 | mode = 0777; | |||
825 | else | |||
826 | mode = 0666; | |||
827 | fd = open(path, O_WRONLY0x0001 | O_TRUNC0x0400 | O_CREAT0x0200, mode); | |||
828 | if (fd < 0) { | |||
829 | ret = err(o, _("failed to open '%s': %s"), | |||
830 | path, strerror(errno(*__error()))); | |||
831 | goto free_buf; | |||
832 | } | |||
833 | write_in_full(fd, buf, size); | |||
834 | close(fd); | |||
835 | } else if (S_ISLNK(mode)(((mode) & 0170000) == 0120000)) { | |||
836 | char *lnk = xmemdupz(buf, size); | |||
837 | safe_create_leading_directories_const(path); | |||
838 | unlink(path); | |||
839 | if (symlink(lnk, path)) | |||
840 | ret = err(o, _("failed to symlink '%s': %s"), | |||
841 | path, strerror(errno(*__error()))); | |||
842 | free(lnk); | |||
843 | } else | |||
844 | ret = err(o, | |||
845 | _("do not know what to do with %06o %s '%s'"), | |||
846 | mode, oid_to_hex(oid), path); | |||
847 | free_buf: | |||
848 | free(buf); | |||
849 | } | |||
850 | update_index: | |||
851 | if (!ret && update_cache) | |||
852 | add_cacheinfo(o, mode, oid, path, 0, update_wd, ADD_CACHE_OK_TO_ADD1); | |||
853 | return ret; | |||
854 | } | |||
855 | ||||
856 | static int update_file(struct merge_options *o, | |||
857 | int clean, | |||
858 | const struct object_id *oid, | |||
859 | unsigned mode, | |||
860 | const char *path) | |||
861 | { | |||
862 | return update_file_flags(o, oid, mode, path, o->call_depth || clean, !o->call_depth); | |||
863 | } | |||
864 | ||||
865 | /* Low level file merging, update and removal */ | |||
866 | ||||
867 | struct merge_file_info { | |||
868 | struct object_id oid; | |||
869 | unsigned mode; | |||
870 | unsigned clean:1, | |||
871 | merge:1; | |||
872 | }; | |||
873 | ||||
874 | static int merge_3way(struct merge_options *o, | |||
875 | mmbuffer_t *result_buf, | |||
876 | const struct diff_filespec *one, | |||
877 | const struct diff_filespec *a, | |||
878 | const struct diff_filespec *b, | |||
879 | const char *branch1, | |||
880 | const char *branch2) | |||
881 | { | |||
882 | mmfile_t orig, src1, src2; | |||
883 | struct ll_merge_options ll_opts = {0}; | |||
884 | char *base_name, *name1, *name2; | |||
885 | int merge_status; | |||
886 | ||||
887 | ll_opts.renormalize = o->renormalize; | |||
888 | ll_opts.xdl_opts = o->xdl_opts; | |||
889 | ||||
890 | if (o->call_depth) { | |||
891 | ll_opts.virtual_ancestor = 1; | |||
892 | ll_opts.variant = 0; | |||
893 | } else { | |||
894 | switch (o->recursive_variant) { | |||
895 | case MERGE_RECURSIVE_OURS: | |||
896 | ll_opts.variant = XDL_MERGE_FAVOR_OURS1; | |||
897 | break; | |||
898 | case MERGE_RECURSIVE_THEIRS: | |||
899 | ll_opts.variant = XDL_MERGE_FAVOR_THEIRS2; | |||
900 | break; | |||
901 | default: | |||
902 | ll_opts.variant = 0; | |||
903 | break; | |||
904 | } | |||
905 | } | |||
906 | ||||
907 | if (strcmp(a->path, b->path) || | |||
| ||||
908 | (o->ancestor != NULL((void*)0) && strcmp(a->path, one->path) != 0)) { | |||
909 | base_name = o->ancestor == NULL((void*)0) ? NULL((void*)0) : | |||
910 | mkpathdup("%s:%s", o->ancestor, one->path); | |||
911 | name1 = mkpathdup("%s:%s", branch1, a->path); | |||
912 | name2 = mkpathdup("%s:%s", branch2, b->path); | |||
913 | } else { | |||
914 | base_name = o->ancestor == NULL((void*)0) ? NULL((void*)0) : | |||
915 | mkpathdup("%s", o->ancestor); | |||
916 | name1 = mkpathdup("%s", branch1); | |||
917 | name2 = mkpathdup("%s", branch2); | |||
918 | } | |||
919 | ||||
920 | read_mmblob(&orig, &one->oid); | |||
921 | read_mmblob(&src1, &a->oid); | |||
922 | read_mmblob(&src2, &b->oid); | |||
923 | ||||
924 | merge_status = ll_merge(result_buf, a->path, &orig, base_name, | |||
925 | &src1, name1, &src2, name2, &ll_opts); | |||
926 | ||||
927 | free(base_name); | |||
928 | free(name1); | |||
929 | free(name2); | |||
930 | free(orig.ptr); | |||
931 | free(src1.ptr); | |||
932 | free(src2.ptr); | |||
933 | return merge_status; | |||
934 | } | |||
935 | ||||
936 | static int merge_file_1(struct merge_options *o, | |||
937 | const struct diff_filespec *one, | |||
938 | const struct diff_filespec *a, | |||
939 | const struct diff_filespec *b, | |||
940 | const char *branch1, | |||
941 | const char *branch2, | |||
942 | struct merge_file_info *result) | |||
943 | { | |||
944 | result->merge = 0; | |||
945 | result->clean = 1; | |||
946 | ||||
947 | if ((S_IFMT0170000 & a->mode) != (S_IFMT0170000 & b->mode)) { | |||
948 | result->clean = 0; | |||
949 | if (S_ISREG(a->mode)(((a->mode) & 0170000) == 0100000)) { | |||
950 | result->mode = a->mode; | |||
951 | oidcpy(&result->oid, &a->oid); | |||
952 | } else { | |||
953 | result->mode = b->mode; | |||
954 | oidcpy(&result->oid, &b->oid); | |||
955 | } | |||
956 | } else { | |||
957 | if (!oid_eq(&a->oid, &one->oid) && !oid_eq(&b->oid, &one->oid)) | |||
958 | result->merge = 1; | |||
959 | ||||
960 | /* | |||
961 | * Merge modes | |||
962 | */ | |||
963 | if (a->mode == b->mode || a->mode == one->mode) | |||
964 | result->mode = b->mode; | |||
965 | else { | |||
966 | result->mode = a->mode; | |||
967 | if (b->mode != one->mode) { | |||
968 | result->clean = 0; | |||
969 | result->merge = 1; | |||
970 | } | |||
971 | } | |||
972 | ||||
973 | if (oid_eq(&a->oid, &b->oid) || oid_eq(&a->oid, &one->oid)) | |||
974 | oidcpy(&result->oid, &b->oid); | |||
975 | else if (oid_eq(&b->oid, &one->oid)) | |||
976 | oidcpy(&result->oid, &a->oid); | |||
977 | else if (S_ISREG(a->mode)(((a->mode) & 0170000) == 0100000)) { | |||
978 | mmbuffer_t result_buf; | |||
979 | int ret = 0, merge_status; | |||
980 | ||||
981 | merge_status = merge_3way(o, &result_buf, one, a, b, | |||
982 | branch1, branch2); | |||
983 | ||||
984 | if ((merge_status < 0) || !result_buf.ptr) | |||
985 | ret = err(o, _("Failed to execute internal merge")); | |||
986 | ||||
987 | if (!ret && write_sha1_file(result_buf.ptr, result_buf.size, | |||
988 | blob_type, result->oid.hash)) | |||
989 | ret = err(o, _("Unable to add %s to database"), | |||
990 | a->path); | |||
991 | ||||
992 | free(result_buf.ptr); | |||
993 | if (ret) | |||
994 | return ret; | |||
995 | result->clean = (merge_status == 0); | |||
996 | } else if (S_ISGITLINK(a->mode)(((a->mode) & 0170000) == 0160000)) { | |||
997 | result->clean = merge_submodule(result->oid.hash, | |||
998 | one->path, | |||
999 | one->oid.hash, | |||
1000 | a->oid.hash, | |||
1001 | b->oid.hash, | |||
1002 | !o->call_depth); | |||
1003 | } else if (S_ISLNK(a->mode)(((a->mode) & 0170000) == 0120000)) { | |||
1004 | oidcpy(&result->oid, &a->oid); | |||
1005 | ||||
1006 | if (!oid_eq(&a->oid, &b->oid)) | |||
1007 | result->clean = 0; | |||
1008 | } else | |||
1009 | die("BUG: unsupported object type in the tree"); | |||
1010 | } | |||
1011 | ||||
1012 | return 0; | |||
1013 | } | |||
1014 | ||||
1015 | static int merge_file_special_markers(struct merge_options *o, | |||
1016 | const struct diff_filespec *one, | |||
1017 | const struct diff_filespec *a, | |||
1018 | const struct diff_filespec *b, | |||
1019 | const char *branch1, | |||
1020 | const char *filename1, | |||
1021 | const char *branch2, | |||
1022 | const char *filename2, | |||
1023 | struct merge_file_info *mfi) | |||
1024 | { | |||
1025 | char *side1 = NULL((void*)0); | |||
1026 | char *side2 = NULL((void*)0); | |||
1027 | int ret; | |||
1028 | ||||
1029 | if (filename1) | |||
1030 | side1 = xstrfmt("%s:%s", branch1, filename1); | |||
1031 | if (filename2) | |||
1032 | side2 = xstrfmt("%s:%s", branch2, filename2); | |||
1033 | ||||
1034 | ret = merge_file_1(o, one, a, b, | |||
1035 | side1 ? side1 : branch1, | |||
1036 | side2 ? side2 : branch2, mfi); | |||
1037 | free(side1); | |||
1038 | free(side2); | |||
1039 | return ret; | |||
1040 | } | |||
1041 | ||||
1042 | static int merge_file_one(struct merge_options *o, | |||
1043 | const char *path, | |||
1044 | const struct object_id *o_oid, int o_mode, | |||
1045 | const struct object_id *a_oid, int a_mode, | |||
1046 | const struct object_id *b_oid, int b_mode, | |||
1047 | const char *branch1, | |||
1048 | const char *branch2, | |||
1049 | struct merge_file_info *mfi) | |||
1050 | { | |||
1051 | struct diff_filespec one, a, b; | |||
1052 | ||||
1053 | one.path = a.path = b.path = (char *)path; | |||
1054 | oidcpy(&one.oid, o_oid); | |||
1055 | one.mode = o_mode; | |||
1056 | oidcpy(&a.oid, a_oid); | |||
1057 | a.mode = a_mode; | |||
1058 | oidcpy(&b.oid, b_oid); | |||
1059 | b.mode = b_mode; | |||
1060 | return merge_file_1(o, &one, &a, &b, branch1, branch2, mfi); | |||
1061 | } | |||
1062 | ||||
1063 | static int handle_change_delete(struct merge_options *o, | |||
1064 | const char *path, | |||
1065 | const struct object_id *o_oid, int o_mode, | |||
1066 | const struct object_id *a_oid, int a_mode, | |||
1067 | const struct object_id *b_oid, int b_mode, | |||
1068 | const char *change, const char *change_past) | |||
1069 | { | |||
1070 | char *renamed = NULL((void*)0); | |||
1071 | int ret = 0; | |||
1072 | if (dir_in_way(path, !o->call_depth, 0)) { | |||
1073 | renamed = unique_path(o, path, a_oid ? o->branch1 : o->branch2); | |||
1074 | } | |||
1075 | ||||
1076 | if (o->call_depth) { | |||
1077 | /* | |||
1078 | * We cannot arbitrarily accept either a_sha or b_sha as | |||
1079 | * correct; since there is no true "middle point" between | |||
1080 | * them, simply reuse the base version for virtual merge base. | |||
1081 | */ | |||
1082 | ret = remove_file_from_cache(path)remove_file_from_index(&the_index, (path)); | |||
1083 | if (!ret) | |||
1084 | ret = update_file(o, 0, o_oid, o_mode, | |||
1085 | renamed ? renamed : path); | |||
1086 | } else if (!a_oid) { | |||
1087 | if (!renamed) { | |||
1088 | output(o, 1, _("CONFLICT (%s/delete): %s deleted in %s " | |||
1089 | "and %s in %s. Version %s of %s left in tree."), | |||
1090 | change, path, o->branch1, change_past, | |||
1091 | o->branch2, o->branch2, path); | |||
1092 | ret = update_file(o, 0, b_oid, b_mode, path); | |||
1093 | } else { | |||
1094 | output(o, 1, _("CONFLICT (%s/delete): %s deleted in %s " | |||
1095 | "and %s in %s. Version %s of %s left in tree at %s."), | |||
1096 | change, path, o->branch1, change_past, | |||
1097 | o->branch2, o->branch2, path, renamed); | |||
1098 | ret = update_file(o, 0, b_oid, b_mode, renamed); | |||
1099 | } | |||
1100 | } else { | |||
1101 | if (!renamed) { | |||
1102 | output(o, 1, _("CONFLICT (%s/delete): %s deleted in %s " | |||
1103 | "and %s in %s. Version %s of %s left in tree."), | |||
1104 | change, path, o->branch2, change_past, | |||
1105 | o->branch1, o->branch1, path); | |||
1106 | } else { | |||
1107 | output(o, 1, _("CONFLICT (%s/delete): %s deleted in %s " | |||
1108 | "and %s in %s. Version %s of %s left in tree at %s."), | |||
1109 | change, path, o->branch2, change_past, | |||
1110 | o->branch1, o->branch1, path, renamed); | |||
1111 | ret = update_file(o, 0, a_oid, a_mode, renamed); | |||
1112 | } | |||
1113 | /* | |||
1114 | * No need to call update_file() on path when !renamed, since | |||
1115 | * that would needlessly touch path. We could call | |||
1116 | * update_file_flags() with update_cache=0 and update_wd=0, | |||
1117 | * but that's a no-op. | |||
1118 | */ | |||
1119 | } | |||
1120 | free(renamed); | |||
1121 | ||||
1122 | return ret; | |||
1123 | } | |||
1124 | ||||
1125 | static int conflict_rename_delete(struct merge_options *o, | |||
1126 | struct diff_filepair *pair, | |||
1127 | const char *rename_branch, | |||
1128 | const char *other_branch) | |||
1129 | { | |||
1130 | const struct diff_filespec *orig = pair->one; | |||
1131 | const struct diff_filespec *dest = pair->two; | |||
1132 | const struct object_id *a_oid = NULL((void*)0); | |||
1133 | const struct object_id *b_oid = NULL((void*)0); | |||
1134 | int a_mode = 0; | |||
1135 | int b_mode = 0; | |||
1136 | ||||
1137 | if (rename_branch == o->branch1) { | |||
1138 | a_oid = &dest->oid; | |||
1139 | a_mode = dest->mode; | |||
1140 | } else { | |||
1141 | b_oid = &dest->oid; | |||
1142 | b_mode = dest->mode; | |||
1143 | } | |||
1144 | ||||
1145 | if (handle_change_delete(o, | |||
1146 | o->call_depth ? orig->path : dest->path, | |||
1147 | &orig->oid, orig->mode, | |||
1148 | a_oid, a_mode, | |||
1149 | b_oid, b_mode, | |||
1150 | _("rename"), _("renamed"))) | |||
1151 | return -1; | |||
1152 | ||||
1153 | if (o->call_depth) | |||
1154 | return remove_file_from_cache(dest->path)remove_file_from_index(&the_index, (dest->path)); | |||
1155 | else | |||
1156 | return update_stages(o, dest->path, NULL((void*)0), | |||
1157 | rename_branch == o->branch1 ? dest : NULL((void*)0), | |||
1158 | rename_branch == o->branch1 ? NULL((void*)0) : dest); | |||
1159 | } | |||
1160 | ||||
1161 | static struct diff_filespec *filespec_from_entry(struct diff_filespec *target, | |||
1162 | struct stage_data *entry, | |||
1163 | int stage) | |||
1164 | { | |||
1165 | struct object_id *oid = &entry->stages[stage].oid; | |||
1166 | unsigned mode = entry->stages[stage].mode; | |||
1167 | if (mode == 0 || is_null_oid(oid)) | |||
1168 | return NULL((void*)0); | |||
1169 | oidcpy(&target->oid, oid); | |||
1170 | target->mode = mode; | |||
1171 | return target; | |||
1172 | } | |||
1173 | ||||
1174 | static int handle_file(struct merge_options *o, | |||
1175 | struct diff_filespec *rename, | |||
1176 | int stage, | |||
1177 | struct rename_conflict_info *ci) | |||
1178 | { | |||
1179 | char *dst_name = rename->path; | |||
1180 | struct stage_data *dst_entry; | |||
1181 | const char *cur_branch, *other_branch; | |||
1182 | struct diff_filespec other; | |||
1183 | struct diff_filespec *add; | |||
1184 | int ret; | |||
1185 | ||||
1186 | if (stage == 2) { | |||
1187 | dst_entry = ci->dst_entry1; | |||
1188 | cur_branch = ci->branch1; | |||
1189 | other_branch = ci->branch2; | |||
1190 | } else { | |||
1191 | dst_entry = ci->dst_entry2; | |||
1192 | cur_branch = ci->branch2; | |||
1193 | other_branch = ci->branch1; | |||
1194 | } | |||
1195 | ||||
1196 | add = filespec_from_entry(&other, dst_entry, stage ^ 1); | |||
1197 | if (add) { | |||
1198 | char *add_name = unique_path(o, rename->path, other_branch); | |||
1199 | if (update_file(o, 0, &add->oid, add->mode, add_name)) | |||
1200 | return -1; | |||
1201 | ||||
1202 | remove_file(o, 0, rename->path, 0); | |||
1203 | dst_name = unique_path(o, rename->path, cur_branch); | |||
1204 | } else { | |||
1205 | if (dir_in_way(rename->path, !o->call_depth, 0)) { | |||
1206 | dst_name = unique_path(o, rename->path, cur_branch); | |||
1207 | output(o, 1, _("%s is a directory in %s adding as %s instead"), | |||
1208 | rename->path, other_branch, dst_name); | |||
1209 | } | |||
1210 | } | |||
1211 | if ((ret = update_file(o, 0, &rename->oid, rename->mode, dst_name))) | |||
1212 | ; /* fall through, do allow dst_name to be released */ | |||
1213 | else if (stage == 2) | |||
1214 | ret = update_stages(o, rename->path, NULL((void*)0), rename, add); | |||
1215 | else | |||
1216 | ret = update_stages(o, rename->path, NULL((void*)0), add, rename); | |||
1217 | ||||
1218 | if (dst_name != rename->path) | |||
1219 | free(dst_name); | |||
1220 | ||||
1221 | return ret; | |||
1222 | } | |||
1223 | ||||
1224 | static int conflict_rename_rename_1to2(struct merge_options *o, | |||
1225 | struct rename_conflict_info *ci) | |||
1226 | { | |||
1227 | /* One file was renamed in both branches, but to different names. */ | |||
1228 | struct diff_filespec *one = ci->pair1->one; | |||
1229 | struct diff_filespec *a = ci->pair1->two; | |||
1230 | struct diff_filespec *b = ci->pair2->two; | |||
1231 | ||||
1232 | output(o, 1, _("CONFLICT (rename/rename): " | |||
1233 | "Rename \"%s\"->\"%s\" in branch \"%s\" " | |||
1234 | "rename \"%s\"->\"%s\" in \"%s\"%s"), | |||
1235 | one->path, a->path, ci->branch1, | |||
1236 | one->path, b->path, ci->branch2, | |||
1237 | o->call_depth ? _(" (left unresolved)") : ""); | |||
1238 | if (o->call_depth) { | |||
1239 | struct merge_file_info mfi; | |||
1240 | struct diff_filespec other; | |||
1241 | struct diff_filespec *add; | |||
1242 | if (merge_file_one(o, one->path, | |||
1243 | &one->oid, one->mode, | |||
1244 | &a->oid, a->mode, | |||
1245 | &b->oid, b->mode, | |||
1246 | ci->branch1, ci->branch2, &mfi)) | |||
1247 | return -1; | |||
1248 | ||||
1249 | /* | |||
1250 | * FIXME: For rename/add-source conflicts (if we could detect | |||
1251 | * such), this is wrong. We should instead find a unique | |||
1252 | * pathname and then either rename the add-source file to that | |||
1253 | * unique path, or use that unique path instead of src here. | |||
1254 | */ | |||
1255 | if (update_file(o, 0, &mfi.oid, mfi.mode, one->path)) | |||
1256 | return -1; | |||
1257 | ||||
1258 | /* | |||
1259 | * Above, we put the merged content at the merge-base's | |||
1260 | * path. Now we usually need to delete both a->path and | |||
1261 | * b->path. However, the rename on each side of the merge | |||
1262 | * could also be involved in a rename/add conflict. In | |||
1263 | * such cases, we should keep the added file around, | |||
1264 | * resolving the conflict at that path in its favor. | |||
1265 | */ | |||
1266 | add = filespec_from_entry(&other, ci->dst_entry1, 2 ^ 1); | |||
1267 | if (add) { | |||
1268 | if (update_file(o, 0, &add->oid, add->mode, a->path)) | |||
1269 | return -1; | |||
1270 | } | |||
1271 | else | |||
1272 | remove_file_from_cache(a->path)remove_file_from_index(&the_index, (a->path)); | |||
1273 | add = filespec_from_entry(&other, ci->dst_entry2, 3 ^ 1); | |||
1274 | if (add) { | |||
1275 | if (update_file(o, 0, &add->oid, add->mode, b->path)) | |||
1276 | return -1; | |||
1277 | } | |||
1278 | else | |||
1279 | remove_file_from_cache(b->path)remove_file_from_index(&the_index, (b->path)); | |||
1280 | } else if (handle_file(o, a, 2, ci) || handle_file(o, b, 3, ci)) | |||
1281 | return -1; | |||
1282 | ||||
1283 | return 0; | |||
1284 | } | |||
1285 | ||||
1286 | static int conflict_rename_rename_2to1(struct merge_options *o, | |||
1287 | struct rename_conflict_info *ci) | |||
1288 | { | |||
1289 | /* Two files, a & b, were renamed to the same thing, c. */ | |||
1290 | struct diff_filespec *a = ci->pair1->one; | |||
1291 | struct diff_filespec *b = ci->pair2->one; | |||
1292 | struct diff_filespec *c1 = ci->pair1->two; | |||
1293 | struct diff_filespec *c2 = ci->pair2->two; | |||
1294 | char *path = c1->path; /* == c2->path */ | |||
1295 | struct merge_file_info mfi_c1; | |||
1296 | struct merge_file_info mfi_c2; | |||
1297 | int ret; | |||
1298 | ||||
1299 | output(o, 1, _("CONFLICT (rename/rename): " | |||
1300 | "Rename %s->%s in %s. " | |||
1301 | "Rename %s->%s in %s"), | |||
1302 | a->path, c1->path, ci->branch1, | |||
1303 | b->path, c2->path, ci->branch2); | |||
1304 | ||||
1305 | remove_file(o, 1, a->path, o->call_depth || would_lose_untracked(a->path)); | |||
1306 | remove_file(o, 1, b->path, o->call_depth || would_lose_untracked(b->path)); | |||
1307 | ||||
1308 | if (merge_file_special_markers(o, a, c1, &ci->ren1_other, | |||
1309 | o->branch1, c1->path, | |||
1310 | o->branch2, ci->ren1_other.path, &mfi_c1) || | |||
1311 | merge_file_special_markers(o, b, &ci->ren2_other, c2, | |||
1312 | o->branch1, ci->ren2_other.path, | |||
1313 | o->branch2, c2->path, &mfi_c2)) | |||
1314 | return -1; | |||
1315 | ||||
1316 | if (o->call_depth) { | |||
1317 | /* | |||
1318 | * If mfi_c1.clean && mfi_c2.clean, then it might make | |||
1319 | * sense to do a two-way merge of those results. But, I | |||
1320 | * think in all cases, it makes sense to have the virtual | |||
1321 | * merge base just undo the renames; they can be detected | |||
1322 | * again later for the non-recursive merge. | |||
1323 | */ | |||
1324 | remove_file(o, 0, path, 0); | |||
1325 | ret = update_file(o, 0, &mfi_c1.oid, mfi_c1.mode, a->path); | |||
1326 | if (!ret) | |||
1327 | ret = update_file(o, 0, &mfi_c2.oid, mfi_c2.mode, | |||
1328 | b->path); | |||
1329 | } else { | |||
1330 | char *new_path1 = unique_path(o, path, ci->branch1); | |||
1331 | char *new_path2 = unique_path(o, path, ci->branch2); | |||
1332 | output(o, 1, _("Renaming %s to %s and %s to %s instead"), | |||
1333 | a->path, new_path1, b->path, new_path2); | |||
1334 | remove_file(o, 0, path, 0); | |||
1335 | ret = update_file(o, 0, &mfi_c1.oid, mfi_c1.mode, new_path1); | |||
1336 | if (!ret) | |||
1337 | ret = update_file(o, 0, &mfi_c2.oid, mfi_c2.mode, | |||
1338 | new_path2); | |||
1339 | free(new_path2); | |||
1340 | free(new_path1); | |||
1341 | } | |||
1342 | ||||
1343 | return ret; | |||
1344 | } | |||
1345 | ||||
1346 | static int process_renames(struct merge_options *o, | |||
1347 | struct string_list *a_renames, | |||
1348 | struct string_list *b_renames) | |||
1349 | { | |||
1350 | int clean_merge = 1, i, j; | |||
1351 | struct string_list a_by_dst = STRING_LIST_INIT_NODUP{ ((void*)0), 0, 0, 0, ((void*)0) }; | |||
1352 | struct string_list b_by_dst = STRING_LIST_INIT_NODUP{ ((void*)0), 0, 0, 0, ((void*)0) }; | |||
1353 | const struct rename *sre; | |||
1354 | ||||
1355 | for (i = 0; i < a_renames->nr; i++) { | |||
1356 | sre = a_renames->items[i].util; | |||
1357 | string_list_insert(&a_by_dst, sre->pair->two->path)->util | |||
1358 | = (void *)sre; | |||
1359 | } | |||
1360 | for (i = 0; i < b_renames->nr; i++) { | |||
1361 | sre = b_renames->items[i].util; | |||
1362 | string_list_insert(&b_by_dst, sre->pair->two->path)->util | |||
1363 | = (void *)sre; | |||
1364 | } | |||
1365 | ||||
1366 | for (i = 0, j = 0; i < a_renames->nr || j < b_renames->nr;) { | |||
1367 | struct string_list *renames1, *renames2Dst; | |||
1368 | struct rename *ren1 = NULL((void*)0), *ren2 = NULL((void*)0); | |||
1369 | const char *branch1, *branch2; | |||
1370 | const char *ren1_src, *ren1_dst; | |||
1371 | struct string_list_item *lookup; | |||
1372 | ||||
1373 | if (i >= a_renames->nr) { | |||
1374 | ren2 = b_renames->items[j++].util; | |||
1375 | } else if (j >= b_renames->nr) { | |||
1376 | ren1 = a_renames->items[i++].util; | |||
1377 | } else { | |||
1378 | int compare = strcmp(a_renames->items[i].string, | |||
1379 | b_renames->items[j].string); | |||
1380 | if (compare <= 0) | |||
1381 | ren1 = a_renames->items[i++].util; | |||
1382 | if (compare >= 0) | |||
1383 | ren2 = b_renames->items[j++].util; | |||
1384 | } | |||
1385 | ||||
1386 | /* TODO: refactor, so that 1/2 are not needed */ | |||
1387 | if (ren1) { | |||
1388 | renames1 = a_renames; | |||
1389 | renames2Dst = &b_by_dst; | |||
1390 | branch1 = o->branch1; | |||
1391 | branch2 = o->branch2; | |||
1392 | } else { | |||
1393 | renames1 = b_renames; | |||
1394 | renames2Dst = &a_by_dst; | |||
1395 | branch1 = o->branch2; | |||
1396 | branch2 = o->branch1; | |||
1397 | SWAP(ren2, ren1)do { void *_swap_a_ptr = &(ren2); void *_swap_b_ptr = & (ren1); unsigned char _swap_buffer[sizeof(ren2)]; __builtin___memcpy_chk (_swap_buffer, _swap_a_ptr, sizeof(ren2), __builtin_object_size (_swap_buffer, 0)); __builtin___memcpy_chk (_swap_a_ptr, _swap_b_ptr , sizeof(ren2) + (sizeof(char [1 - 2*!(sizeof(ren2) == sizeof (ren1))]) - 1), __builtin_object_size (_swap_a_ptr, 0)); __builtin___memcpy_chk (_swap_b_ptr, _swap_buffer, sizeof(ren2), __builtin_object_size (_swap_b_ptr, 0)); } while (0); | |||
1398 | } | |||
1399 | ||||
1400 | if (ren1->processed) | |||
1401 | continue; | |||
1402 | ren1->processed = 1; | |||
1403 | ren1->dst_entry->processed = 1; | |||
1404 | /* BUG: We should only mark src_entry as processed if we | |||
1405 | * are not dealing with a rename + add-source case. | |||
1406 | */ | |||
1407 | ren1->src_entry->processed = 1; | |||
1408 | ||||
1409 | ren1_src = ren1->pair->one->path; | |||
1410 | ren1_dst = ren1->pair->two->path; | |||
1411 | ||||
1412 | if (ren2) { | |||
1413 | /* One file renamed on both sides */ | |||
1414 | const char *ren2_src = ren2->pair->one->path; | |||
1415 | const char *ren2_dst = ren2->pair->two->path; | |||
1416 | enum rename_type rename_type; | |||
1417 | if (strcmp(ren1_src, ren2_src) != 0) | |||
1418 | die("BUG: ren1_src != ren2_src"); | |||
1419 | ren2->dst_entry->processed = 1; | |||
1420 | ren2->processed = 1; | |||
1421 | if (strcmp(ren1_dst, ren2_dst) != 0) { | |||
1422 | rename_type = RENAME_ONE_FILE_TO_TWO; | |||
1423 | clean_merge = 0; | |||
1424 | } else { | |||
1425 | rename_type = RENAME_ONE_FILE_TO_ONE; | |||
1426 | /* BUG: We should only remove ren1_src in | |||
1427 | * the base stage (think of rename + | |||
1428 | * add-source cases). | |||
1429 | */ | |||
1430 | remove_file(o, 1, ren1_src, 1); | |||
1431 | update_entry(ren1->dst_entry, | |||
1432 | ren1->pair->one, | |||
1433 | ren1->pair->two, | |||
1434 | ren2->pair->two); | |||
1435 | } | |||
1436 | setup_rename_conflict_info(rename_type, | |||
1437 | ren1->pair, | |||
1438 | ren2->pair, | |||
1439 | branch1, | |||
1440 | branch2, | |||
1441 | ren1->dst_entry, | |||
1442 | ren2->dst_entry, | |||
1443 | o, | |||
1444 | NULL((void*)0), | |||
1445 | NULL((void*)0)); | |||
1446 | } else if ((lookup = string_list_lookup(renames2Dst, ren1_dst))) { | |||
1447 | /* Two different files renamed to the same thing */ | |||
1448 | char *ren2_dst; | |||
1449 | ren2 = lookup->util; | |||
1450 | ren2_dst = ren2->pair->two->path; | |||
1451 | if (strcmp(ren1_dst, ren2_dst) != 0) | |||
1452 | die("BUG: ren1_dst != ren2_dst"); | |||
1453 | ||||
1454 | clean_merge = 0; | |||
1455 | ren2->processed = 1; | |||
1456 | /* | |||
1457 | * BUG: We should only mark src_entry as processed | |||
1458 | * if we are not dealing with a rename + add-source | |||
1459 | * case. | |||
1460 | */ | |||
1461 | ren2->src_entry->processed = 1; | |||
1462 | ||||
1463 | setup_rename_conflict_info(RENAME_TWO_FILES_TO_ONE, | |||
1464 | ren1->pair, | |||
1465 | ren2->pair, | |||
1466 | branch1, | |||
1467 | branch2, | |||
1468 | ren1->dst_entry, | |||
1469 | ren2->dst_entry, | |||
1470 | o, | |||
1471 | ren1->src_entry, | |||
1472 | ren2->src_entry); | |||
1473 | ||||
1474 | } else { | |||
1475 | /* Renamed in 1, maybe changed in 2 */ | |||
1476 | /* we only use sha1 and mode of these */ | |||
1477 | struct diff_filespec src_other, dst_other; | |||
1478 | int try_merge; | |||
1479 | ||||
1480 | /* | |||
1481 | * unpack_trees loads entries from common-commit | |||
1482 | * into stage 1, from head-commit into stage 2, and | |||
1483 | * from merge-commit into stage 3. We keep track | |||
1484 | * of which side corresponds to the rename. | |||
1485 | */ | |||
1486 | int renamed_stage = a_renames == renames1 ? 2 : 3; | |||
1487 | int other_stage = a_renames == renames1 ? 3 : 2; | |||
1488 | ||||
1489 | /* BUG: We should only remove ren1_src in the base | |||
1490 | * stage and in other_stage (think of rename + | |||
1491 | * add-source case). | |||
1492 | */ | |||
1493 | remove_file(o, 1, ren1_src, | |||
1494 | renamed_stage == 2 || !was_tracked(ren1_src)); | |||
1495 | ||||
1496 | oidcpy(&src_other.oid, | |||
1497 | &ren1->src_entry->stages[other_stage].oid); | |||
1498 | src_other.mode = ren1->src_entry->stages[other_stage].mode; | |||
1499 | oidcpy(&dst_other.oid, | |||
1500 | &ren1->dst_entry->stages[other_stage].oid); | |||
1501 | dst_other.mode = ren1->dst_entry->stages[other_stage].mode; | |||
1502 | try_merge = 0; | |||
1503 | ||||
1504 | if (oid_eq(&src_other.oid, &null_oid)) { | |||
1505 | setup_rename_conflict_info(RENAME_DELETE, | |||
1506 | ren1->pair, | |||
1507 | NULL((void*)0), | |||
1508 | branch1, | |||
1509 | branch2, | |||
1510 | ren1->dst_entry, | |||
1511 | NULL((void*)0), | |||
1512 | o, | |||
1513 | NULL((void*)0), | |||
1514 | NULL((void*)0)); | |||
1515 | } else if ((dst_other.mode == ren1->pair->two->mode) && | |||
1516 | oid_eq(&dst_other.oid, &ren1->pair->two->oid)) { | |||
1517 | /* | |||
1518 | * Added file on the other side identical to | |||
1519 | * the file being renamed: clean merge. | |||
1520 | * Also, there is no need to overwrite the | |||
1521 | * file already in the working copy, so call | |||
1522 | * update_file_flags() instead of | |||
1523 | * update_file(). | |||
1524 | */ | |||
1525 | if (update_file_flags(o, | |||
1526 | &ren1->pair->two->oid, | |||
1527 | ren1->pair->two->mode, | |||
1528 | ren1_dst, | |||
1529 | 1, /* update_cache */ | |||
1530 | 0 /* update_wd */)) | |||
1531 | clean_merge = -1; | |||
1532 | } else if (!oid_eq(&dst_other.oid, &null_oid)) { | |||
1533 | clean_merge = 0; | |||
1534 | try_merge = 1; | |||
1535 | output(o, 1, _("CONFLICT (rename/add): Rename %s->%s in %s. " | |||
1536 | "%s added in %s"), | |||
1537 | ren1_src, ren1_dst, branch1, | |||
1538 | ren1_dst, branch2); | |||
1539 | if (o->call_depth) { | |||
1540 | struct merge_file_info mfi; | |||
1541 | if (merge_file_one(o, ren1_dst, &null_oid, 0, | |||
1542 | &ren1->pair->two->oid, | |||
1543 | ren1->pair->two->mode, | |||
1544 | &dst_other.oid, | |||
1545 | dst_other.mode, | |||
1546 | branch1, branch2, &mfi)) { | |||
1547 | clean_merge = -1; | |||
1548 | goto cleanup_and_return; | |||
1549 | } | |||
1550 | output(o, 1, _("Adding merged %s"), ren1_dst); | |||
1551 | if (update_file(o, 0, &mfi.oid, | |||
1552 | mfi.mode, ren1_dst)) | |||
1553 | clean_merge = -1; | |||
1554 | try_merge = 0; | |||
1555 | } else { | |||
1556 | char *new_path = unique_path(o, ren1_dst, branch2); | |||
1557 | output(o, 1, _("Adding as %s instead"), new_path); | |||
1558 | if (update_file(o, 0, &dst_other.oid, | |||
1559 | dst_other.mode, new_path)) | |||
1560 | clean_merge = -1; | |||
1561 | free(new_path); | |||
1562 | } | |||
1563 | } else | |||
1564 | try_merge = 1; | |||
1565 | ||||
1566 | if (clean_merge < 0) | |||
1567 | goto cleanup_and_return; | |||
1568 | if (try_merge) { | |||
1569 | struct diff_filespec *one, *a, *b; | |||
1570 | src_other.path = (char *)ren1_src; | |||
1571 | ||||
1572 | one = ren1->pair->one; | |||
1573 | if (a_renames == renames1) { | |||
1574 | a = ren1->pair->two; | |||
1575 | b = &src_other; | |||
1576 | } else { | |||
1577 | b = ren1->pair->two; | |||
1578 | a = &src_other; | |||
1579 | } | |||
1580 | update_entry(ren1->dst_entry, one, a, b); | |||
1581 | setup_rename_conflict_info(RENAME_NORMAL, | |||
1582 | ren1->pair, | |||
1583 | NULL((void*)0), | |||
1584 | branch1, | |||
1585 | NULL((void*)0), | |||
1586 | ren1->dst_entry, | |||
1587 | NULL((void*)0), | |||
1588 | o, | |||
1589 | NULL((void*)0), | |||
1590 | NULL((void*)0)); | |||
1591 | } | |||
1592 | } | |||
1593 | } | |||
1594 | cleanup_and_return: | |||
1595 | string_list_clear(&a_by_dst, 0); | |||
1596 | string_list_clear(&b_by_dst, 0); | |||
1597 | ||||
1598 | return clean_merge; | |||
1599 | } | |||
1600 | ||||
1601 | static struct object_id *stage_oid(const struct object_id *oid, unsigned mode) | |||
1602 | { | |||
1603 | return (is_null_oid(oid) || mode == 0) ? NULL((void*)0): (struct object_id *)oid; | |||
1604 | } | |||
1605 | ||||
1606 | static int read_oid_strbuf(struct merge_options *o, | |||
1607 | const struct object_id *oid, struct strbuf *dst) | |||
1608 | { | |||
1609 | void *buf; | |||
1610 | enum object_type type; | |||
1611 | unsigned long size; | |||
1612 | buf = read_sha1_file(oid->hash, &type, &size); | |||
1613 | if (!buf) | |||
1614 | return err(o, _("cannot read object %s"), oid_to_hex(oid)); | |||
1615 | if (type != OBJ_BLOB) { | |||
1616 | free(buf); | |||
1617 | return err(o, _("object %s is not a blob"), oid_to_hex(oid)); | |||
1618 | } | |||
1619 | strbuf_attach(dst, buf, size, size + 1); | |||
1620 | return 0; | |||
1621 | } | |||
1622 | ||||
1623 | static int blob_unchanged(struct merge_options *opt, | |||
1624 | const struct object_id *o_oid, | |||
1625 | unsigned o_mode, | |||
1626 | const struct object_id *a_oid, | |||
1627 | unsigned a_mode, | |||
1628 | int renormalize, const char *path) | |||
1629 | { | |||
1630 | struct strbuf o = STRBUF_INIT{ 0, 0, strbuf_slopbuf }; | |||
1631 | struct strbuf a = STRBUF_INIT{ 0, 0, strbuf_slopbuf }; | |||
1632 | int ret = 0; /* assume changed for safety */ | |||
1633 | ||||
1634 | if (a_mode != o_mode) | |||
1635 | return 0; | |||
1636 | if (oid_eq(o_oid, a_oid)) | |||
1637 | return 1; | |||
1638 | if (!renormalize) | |||
1639 | return 0; | |||
1640 | ||||
1641 | assert(o_oid && a_oid)(__builtin_expect(!(o_oid && a_oid), 0) ? __assert_rtn (__func__, "merge-recursive.c", 1641, "o_oid && a_oid" ) : (void)0); | |||
1642 | if (read_oid_strbuf(opt, o_oid, &o) || read_oid_strbuf(opt, a_oid, &a)) | |||
1643 | goto error_return; | |||
1644 | /* | |||
1645 | * Note: binary | is used so that both renormalizations are | |||
1646 | * performed. Comparison can be skipped if both files are | |||
1647 | * unchanged since their sha1s have already been compared. | |||
1648 | */ | |||
1649 | if (renormalize_buffer(path, o.buf, o.len, &o) | | |||
1650 | renormalize_buffer(path, a.buf, a.len, &a)) | |||
1651 | ret = (o.len == a.len && !memcmp(o.buf, a.buf, o.len)); | |||
1652 | ||||
1653 | error_return: | |||
1654 | strbuf_release(&o); | |||
1655 | strbuf_release(&a); | |||
1656 | return ret; | |||
1657 | } | |||
1658 | ||||
1659 | static int handle_modify_delete(struct merge_options *o, | |||
1660 | const char *path, | |||
1661 | struct object_id *o_oid, int o_mode, | |||
1662 | struct object_id *a_oid, int a_mode, | |||
1663 | struct object_id *b_oid, int b_mode) | |||
1664 | { | |||
1665 | return handle_change_delete(o, | |||
1666 | path, | |||
1667 | o_oid, o_mode, | |||
1668 | a_oid, a_mode, | |||
1669 | b_oid, b_mode, | |||
1670 | _("modify"), _("modified")); | |||
1671 | } | |||
1672 | ||||
1673 | static int merge_content(struct merge_options *o, | |||
1674 | const char *path, | |||
1675 | struct object_id *o_oid, int o_mode, | |||
1676 | struct object_id *a_oid, int a_mode, | |||
1677 | struct object_id *b_oid, int b_mode, | |||
1678 | struct rename_conflict_info *rename_conflict_info) | |||
1679 | { | |||
1680 | const char *reason = _("content"); | |||
1681 | const char *path1 = NULL((void*)0), *path2 = NULL((void*)0); | |||
1682 | struct merge_file_info mfi; | |||
1683 | struct diff_filespec one, a, b; | |||
1684 | unsigned df_conflict_remains = 0; | |||
1685 | ||||
1686 | if (!o_oid) { | |||
1687 | reason = _("add/add"); | |||
1688 | o_oid = (struct object_id *)&null_oid; | |||
1689 | } | |||
1690 | one.path = a.path = b.path = (char *)path; | |||
1691 | oidcpy(&one.oid, o_oid); | |||
1692 | one.mode = o_mode; | |||
1693 | oidcpy(&a.oid, a_oid); | |||
1694 | a.mode = a_mode; | |||
1695 | oidcpy(&b.oid, b_oid); | |||
1696 | b.mode = b_mode; | |||
1697 | ||||
1698 | if (rename_conflict_info) { | |||
1699 | struct diff_filepair *pair1 = rename_conflict_info->pair1; | |||
1700 | ||||
1701 | path1 = (o->branch1 == rename_conflict_info->branch1) ? | |||
1702 | pair1->two->path : pair1->one->path; | |||
1703 | /* If rename_conflict_info->pair2 != NULL, we are in | |||
1704 | * RENAME_ONE_FILE_TO_ONE case. Otherwise, we have a | |||
1705 | * normal rename. | |||
1706 | */ | |||
1707 | path2 = (rename_conflict_info->pair2 || | |||
1708 | o->branch2 == rename_conflict_info->branch1) ? | |||
1709 | pair1->two->path : pair1->one->path; | |||
1710 | ||||
1711 | if (dir_in_way(path, !o->call_depth, | |||
1712 | S_ISGITLINK(pair1->two->mode)(((pair1->two->mode) & 0170000) == 0160000))) | |||
1713 | df_conflict_remains = 1; | |||
1714 | } | |||
1715 | if (merge_file_special_markers(o, &one, &a, &b, | |||
1716 | o->branch1, path1, | |||
1717 | o->branch2, path2, &mfi)) | |||
1718 | return -1; | |||
1719 | ||||
1720 | if (mfi.clean && !df_conflict_remains && | |||
1721 | oid_eq(&mfi.oid, a_oid) && mfi.mode == a_mode) { | |||
1722 | int path_renamed_outside_HEAD; | |||
1723 | output(o, 3, _("Skipped %s (merged same as existing)"), path); | |||
1724 | /* | |||
1725 | * The content merge resulted in the same file contents we | |||
1726 | * already had. We can return early if those file contents | |||
1727 | * are recorded at the correct path (which may not be true | |||
1728 | * if the merge involves a rename). | |||
1729 | */ | |||
1730 | path_renamed_outside_HEAD = !path2 || !strcmp(path, path2); | |||
1731 | if (!path_renamed_outside_HEAD) { | |||
1732 | add_cacheinfo(o, mfi.mode, &mfi.oid, path, | |||
1733 | 0, (!o->call_depth), 0); | |||
1734 | return mfi.clean; | |||
1735 | } | |||
1736 | } else | |||
1737 | output(o, 2, _("Auto-merging %s"), path); | |||
1738 | ||||
1739 | if (!mfi.clean) { | |||
1740 | if (S_ISGITLINK(mfi.mode)(((mfi.mode) & 0170000) == 0160000)) | |||
1741 | reason = _("submodule"); | |||
1742 | output(o, 1, _("CONFLICT (%s): Merge conflict in %s"), | |||
1743 | reason, path); | |||
1744 | if (rename_conflict_info && !df_conflict_remains) | |||
1745 | if (update_stages(o, path, &one, &a, &b)) | |||
1746 | return -1; | |||
1747 | } | |||
1748 | ||||
1749 | if (df_conflict_remains) { | |||
1750 | char *new_path; | |||
1751 | if (o->call_depth) { | |||
1752 | remove_file_from_cache(path)remove_file_from_index(&the_index, (path)); | |||
1753 | } else { | |||
1754 | if (!mfi.clean) { | |||
1755 | if (update_stages(o, path, &one, &a, &b)) | |||
1756 | return -1; | |||
1757 | } else { | |||
1758 | int file_from_stage2 = was_tracked(path); | |||
1759 | struct diff_filespec merged; | |||
1760 | oidcpy(&merged.oid, &mfi.oid); | |||
1761 | merged.mode = mfi.mode; | |||
1762 | ||||
1763 | if (update_stages(o, path, NULL((void*)0), | |||
1764 | file_from_stage2 ? &merged : NULL((void*)0), | |||
1765 | file_from_stage2 ? NULL((void*)0) : &merged)) | |||
1766 | return -1; | |||
1767 | } | |||
1768 | ||||
1769 | } | |||
1770 | new_path = unique_path(o, path, rename_conflict_info->branch1); | |||
1771 | output(o, 1, _("Adding as %s instead"), new_path); | |||
1772 | if (update_file(o, 0, &mfi.oid, mfi.mode, new_path)) { | |||
1773 | free(new_path); | |||
1774 | return -1; | |||
1775 | } | |||
1776 | free(new_path); | |||
1777 | mfi.clean = 0; | |||
1778 | } else if (update_file(o, mfi.clean, &mfi.oid, mfi.mode, path)) | |||
1779 | return -1; | |||
1780 | return mfi.clean; | |||
1781 | } | |||
1782 | ||||
1783 | /* Per entry merge function */ | |||
1784 | static int process_entry(struct merge_options *o, | |||
1785 | const char *path, struct stage_data *entry) | |||
1786 | { | |||
1787 | int clean_merge = 1; | |||
1788 | int normalize = o->renormalize; | |||
1789 | unsigned o_mode = entry->stages[1].mode; | |||
1790 | unsigned a_mode = entry->stages[2].mode; | |||
1791 | unsigned b_mode = entry->stages[3].mode; | |||
1792 | struct object_id *o_oid = stage_oid(&entry->stages[1].oid, o_mode); | |||
1793 | struct object_id *a_oid = stage_oid(&entry->stages[2].oid, a_mode); | |||
1794 | struct object_id *b_oid = stage_oid(&entry->stages[3].oid, b_mode); | |||
1795 | ||||
1796 | entry->processed = 1; | |||
1797 | if (entry->rename_conflict_info) { | |||
| ||||
1798 | struct rename_conflict_info *conflict_info = entry->rename_conflict_info; | |||
1799 | switch (conflict_info->rename_type) { | |||
1800 | case RENAME_NORMAL: | |||
1801 | case RENAME_ONE_FILE_TO_ONE: | |||
1802 | clean_merge = merge_content(o, path, | |||
1803 | o_oid, o_mode, a_oid, a_mode, b_oid, b_mode, | |||
1804 | conflict_info); | |||
1805 | break; | |||
1806 | case RENAME_DELETE: | |||
1807 | clean_merge = 0; | |||
1808 | if (conflict_rename_delete(o, | |||
1809 | conflict_info->pair1, | |||
1810 | conflict_info->branch1, | |||
1811 | conflict_info->branch2)) | |||
1812 | clean_merge = -1; | |||
1813 | break; | |||
1814 | case RENAME_ONE_FILE_TO_TWO: | |||
1815 | clean_merge = 0; | |||
1816 | if (conflict_rename_rename_1to2(o, conflict_info)) | |||
1817 | clean_merge = -1; | |||
1818 | break; | |||
1819 | case RENAME_TWO_FILES_TO_ONE: | |||
1820 | clean_merge = 0; | |||
1821 | if (conflict_rename_rename_2to1(o, conflict_info)) | |||
1822 | clean_merge = -1; | |||
1823 | break; | |||
1824 | default: | |||
1825 | entry->processed = 0; | |||
1826 | break; | |||
1827 | } | |||
1828 | } else if (o_oid && (!a_oid || !b_oid)) { | |||
1829 | /* Case A: Deleted in one */ | |||
1830 | if ((!a_oid && !b_oid) || | |||
1831 | (!b_oid && blob_unchanged(o, o_oid, o_mode, a_oid, a_mode, normalize, path)) || | |||
1832 | (!a_oid && blob_unchanged(o, o_oid, o_mode, b_oid, b_mode, normalize, path))) { | |||
1833 | /* Deleted in both or deleted in one and | |||
1834 | * unchanged in the other */ | |||
1835 | if (a_oid) | |||
1836 | output(o, 2, _("Removing %s"), path); | |||
1837 | /* do not touch working file if it did not exist */ | |||
1838 | remove_file(o, 1, path, !a_oid); | |||
1839 | } else { | |||
1840 | /* Modify/delete; deleted side may have put a directory in the way */ | |||
1841 | clean_merge = 0; | |||
1842 | if (handle_modify_delete(o, path, o_oid, o_mode, | |||
1843 | a_oid, a_mode, b_oid, b_mode)) | |||
1844 | clean_merge = -1; | |||
1845 | } | |||
1846 | } else if ((!o_oid && a_oid && !b_oid) || | |||
1847 | (!o_oid && !a_oid && b_oid)) { | |||
1848 | /* Case B: Added in one. */ | |||
1849 | /* [nothing|directory] -> ([nothing|directory], file) */ | |||
1850 | ||||
1851 | const char *add_branch; | |||
1852 | const char *other_branch; | |||
1853 | unsigned mode; | |||
1854 | const struct object_id *oid; | |||
1855 | const char *conf; | |||
1856 | ||||
1857 | if (a_oid) { | |||
1858 | add_branch = o->branch1; | |||
1859 | other_branch = o->branch2; | |||
1860 | mode = a_mode; | |||
1861 | oid = a_oid; | |||
1862 | conf = _("file/directory"); | |||
1863 | } else { | |||
1864 | add_branch = o->branch2; | |||
1865 | other_branch = o->branch1; | |||
1866 | mode = b_mode; | |||
1867 | oid = b_oid; | |||
1868 | conf = _("directory/file"); | |||
1869 | } | |||
1870 | if (dir_in_way(path, !o->call_depth, | |||
1871 | S_ISGITLINK(a_mode)(((a_mode) & 0170000) == 0160000))) { | |||
1872 | char *new_path = unique_path(o, path, add_branch); | |||
1873 | clean_merge = 0; | |||
1874 | output(o, 1, _("CONFLICT (%s): There is a directory with name %s in %s. " | |||
1875 | "Adding %s as %s"), | |||
1876 | conf, path, other_branch, path, new_path); | |||
1877 | if (update_file(o, 0, oid, mode, new_path)) | |||
1878 | clean_merge = -1; | |||
1879 | else if (o->call_depth) | |||
1880 | remove_file_from_cache(path)remove_file_from_index(&the_index, (path)); | |||
1881 | free(new_path); | |||
1882 | } else { | |||
1883 | output(o, 2, _("Adding %s"), path); | |||
1884 | /* do not overwrite file if already present */ | |||
1885 | if (update_file_flags(o, oid, mode, path, 1, !a_oid)) | |||
1886 | clean_merge = -1; | |||
1887 | } | |||
1888 | } else if (a_oid && b_oid) { | |||
1889 | /* Case C: Added in both (check for same permissions) and */ | |||
1890 | /* case D: Modified in both, but differently. */ | |||
1891 | clean_merge = merge_content(o, path, | |||
1892 | o_oid, o_mode, a_oid, a_mode, b_oid, b_mode, | |||
1893 | NULL((void*)0)); | |||
1894 | } else if (!o_oid && !a_oid && !b_oid) { | |||
1895 | /* | |||
1896 | * this entry was deleted altogether. a_mode == 0 means | |||
1897 | * we had that path and want to actively remove it. | |||
1898 | */ | |||
1899 | remove_file(o, 1, path, !a_mode); | |||
1900 | } else | |||
1901 | die("BUG: fatal merge failure, shouldn't happen."); | |||
1902 | ||||
1903 | return clean_merge; | |||
1904 | } | |||
1905 | ||||
1906 | int merge_trees(struct merge_options *o, | |||
1907 | struct tree *head, | |||
1908 | struct tree *merge, | |||
1909 | struct tree *common, | |||
1910 | struct tree **result) | |||
1911 | { | |||
1912 | int code, clean; | |||
1913 | ||||
1914 | if (o->subtree_shift) { | |||
1915 | merge = shift_tree_object(head, merge, o->subtree_shift); | |||
1916 | common = shift_tree_object(head, common, o->subtree_shift); | |||
1917 | } | |||
1918 | ||||
1919 | if (oid_eq(&common->object.oid, &merge->object.oid)) { | |||
1920 | output(o, 0, _("Already up-to-date!")); | |||
1921 | *result = head; | |||
1922 | return 1; | |||
1923 | } | |||
1924 | ||||
1925 | code = git_merge_trees(o->call_depth, common, head, merge); | |||
1926 | ||||
1927 | if (code != 0) { | |||
1928 | if (show(o, 4) || o->call_depth) | |||
1929 | err(o, _("merging of trees %s and %s failed"), | |||
1930 | oid_to_hex(&head->object.oid), | |||
1931 | oid_to_hex(&merge->object.oid)); | |||
1932 | return -1; | |||
1933 | } | |||
1934 | ||||
1935 | if (unmerged_cache()unmerged_index(&the_index)) { | |||
1936 | struct string_list *entries, *re_head, *re_merge; | |||
1937 | int i; | |||
1938 | string_list_clear(&o->current_file_set, 1); | |||
1939 | string_list_clear(&o->current_directory_set, 1); | |||
1940 | get_files_dirs(o, head); | |||
1941 | get_files_dirs(o, merge); | |||
1942 | ||||
1943 | entries = get_unmerged(); | |||
1944 | record_df_conflict_files(o, entries); | |||
1945 | re_head = get_renames(o, head, common, head, merge, entries); | |||
1946 | re_merge = get_renames(o, merge, common, head, merge, entries); | |||
1947 | clean = process_renames(o, re_head, re_merge); | |||
1948 | if (clean < 0) | |||
1949 | return clean; | |||
1950 | for (i = entries->nr-1; 0 <= i; i--) { | |||
1951 | const char *path = entries->items[i].string; | |||
1952 | struct stage_data *e = entries->items[i].util; | |||
1953 | if (!e->processed) { | |||
1954 | int ret = process_entry(o, path, e); | |||
1955 | if (!ret) | |||
1956 | clean = 0; | |||
1957 | else if (ret < 0) | |||
1958 | return ret; | |||
1959 | } | |||
1960 | } | |||
1961 | for (i = 0; i < entries->nr; i++) { | |||
1962 | struct stage_data *e = entries->items[i].util; | |||
1963 | if (!e->processed) | |||
1964 | die("BUG: unprocessed path??? %s", | |||
1965 | entries->items[i].string); | |||
1966 | } | |||
1967 | ||||
1968 | string_list_clear(re_merge, 0); | |||
1969 | string_list_clear(re_head, 0); | |||
1970 | string_list_clear(entries, 1); | |||
1971 | ||||
1972 | free(re_merge); | |||
1973 | free(re_head); | |||
1974 | free(entries); | |||
1975 | } | |||
1976 | else | |||
1977 | clean = 1; | |||
1978 | ||||
1979 | if (o->call_depth && !(*result = write_tree_from_memory(o))) | |||
1980 | return -1; | |||
1981 | ||||
1982 | return clean; | |||
1983 | } | |||
1984 | ||||
1985 | static struct commit_list *reverse_commit_list(struct commit_list *list) | |||
1986 | { | |||
1987 | struct commit_list *next = NULL((void*)0), *current, *backup; | |||
1988 | for (current = list; current; current = backup) { | |||
1989 | backup = current->next; | |||
1990 | current->next = next; | |||
1991 | next = current; | |||
1992 | } | |||
1993 | return next; | |||
1994 | } | |||
1995 | ||||
1996 | /* | |||
1997 | * Merge the commits h1 and h2, return the resulting virtual | |||
1998 | * commit object and a flag indicating the cleanness of the merge. | |||
1999 | */ | |||
2000 | int merge_recursive(struct merge_options *o, | |||
2001 | struct commit *h1, | |||
2002 | struct commit *h2, | |||
2003 | struct commit_list *ca, | |||
2004 | struct commit **result) | |||
2005 | { | |||
2006 | struct commit_list *iter; | |||
2007 | struct commit *merged_common_ancestors; | |||
2008 | struct tree *mrtree = mrtree; | |||
2009 | int clean; | |||
2010 | ||||
2011 | if (show(o, 4)) { | |||
2012 | output(o, 4, _("Merging:")); | |||
2013 | output_commit_title(o, h1); | |||
2014 | output_commit_title(o, h2); | |||
2015 | } | |||
2016 | ||||
2017 | if (!ca) { | |||
2018 | ca = get_merge_bases(h1, h2); | |||
2019 | ca = reverse_commit_list(ca); | |||
2020 | } | |||
2021 | ||||
2022 | if (show(o, 5)) { | |||
2023 | unsigned cnt = commit_list_count(ca); | |||
2024 | ||||
2025 | output(o, 5, Q_("found %u common ancestor:", | |||
2026 | "found %u common ancestors:", cnt), cnt); | |||
2027 | for (iter = ca; iter; iter = iter->next) | |||
2028 | output_commit_title(o, iter->item); | |||
2029 | } | |||
2030 | ||||
2031 | merged_common_ancestors = pop_commit(&ca); | |||
2032 | if (merged_common_ancestors == NULL((void*)0)) { | |||
2033 | /* if there is no common ancestor, use an empty tree */ | |||
2034 | struct tree *tree; | |||
2035 | ||||
2036 | tree = lookup_tree(EMPTY_TREE_SHA1_BIN(empty_tree_oid.hash)); | |||
2037 | merged_common_ancestors = make_virtual_commit(tree, "ancestor"); | |||
2038 | } | |||
2039 | ||||
2040 | for (iter = ca; iter; iter = iter->next) { | |||
2041 | const char *saved_b1, *saved_b2; | |||
2042 | o->call_depth++; | |||
2043 | /* | |||
2044 | * When the merge fails, the result contains files | |||
2045 | * with conflict markers. The cleanness flag is | |||
2046 | * ignored (unless indicating an error), it was never | |||
2047 | * actually used, as result of merge_trees has always | |||
2048 | * overwritten it: the committed "conflicts" were | |||
2049 | * already resolved. | |||
2050 | */ | |||
2051 | discard_cache()discard_index(&the_index); | |||
2052 | saved_b1 = o->branch1; | |||
2053 | saved_b2 = o->branch2; | |||
2054 | o->branch1 = "Temporary merge branch 1"; | |||
2055 | o->branch2 = "Temporary merge branch 2"; | |||
2056 | if (merge_recursive(o, merged_common_ancestors, iter->item, | |||
2057 | NULL((void*)0), &merged_common_ancestors) < 0) | |||
2058 | return -1; | |||
2059 | o->branch1 = saved_b1; | |||
2060 | o->branch2 = saved_b2; | |||
2061 | o->call_depth--; | |||
2062 | ||||
2063 | if (!merged_common_ancestors) | |||
2064 | return err(o, _("merge returned no commit")); | |||
2065 | } | |||
2066 | ||||
2067 | discard_cache()discard_index(&the_index); | |||
2068 | if (!o->call_depth) | |||
2069 | read_cache()read_index(&the_index); | |||
2070 | ||||
2071 | o->ancestor = "merged common ancestors"; | |||
2072 | clean = merge_trees(o, h1->tree, h2->tree, merged_common_ancestors->tree, | |||
2073 | &mrtree); | |||
2074 | if (clean < 0) { | |||
2075 | flush_output(o); | |||
2076 | return clean; | |||
2077 | } | |||
2078 | ||||
2079 | if (o->call_depth) { | |||
2080 | *result = make_virtual_commit(mrtree, "merged tree"); | |||
2081 | commit_list_insert(h1, &(*result)->parents); | |||
2082 | commit_list_insert(h2, &(*result)->parents->next); | |||
2083 | } | |||
2084 | flush_output(o); | |||
2085 | if (!o->call_depth && o->buffer_output < 2) | |||
2086 | strbuf_release(&o->obuf); | |||
2087 | if (show(o, 2)) | |||
2088 | diff_warn_rename_limit("merge.renamelimit", | |||
2089 | o->needed_rename_limit, 0); | |||
2090 | return clean; | |||
2091 | } | |||
2092 | ||||
2093 | static struct commit *get_ref(const struct object_id *oid, const char *name) | |||
2094 | { | |||
2095 | struct object *object; | |||
2096 | ||||
2097 | object = deref_tag(parse_object(oid->hash), name, strlen(name)); | |||
2098 | if (!object) | |||
2099 | return NULL((void*)0); | |||
2100 | if (object->type == OBJ_TREE) | |||
2101 | return make_virtual_commit((struct tree*)object, name); | |||
2102 | if (object->type != OBJ_COMMIT) | |||
2103 | return NULL((void*)0); | |||
2104 | if (parse_commit((struct commit *)object)) | |||
2105 | return NULL((void*)0); | |||
2106 | return (struct commit *)object; | |||
2107 | } | |||
2108 | ||||
2109 | int merge_recursive_generic(struct merge_options *o, | |||
2110 | const struct object_id *head, | |||
2111 | const struct object_id *merge, | |||
2112 | int num_base_list, | |||
2113 | const struct object_id **base_list, | |||
2114 | struct commit **result) | |||
2115 | { | |||
2116 | int clean; | |||
2117 | struct lock_file *lock = xcalloc(1, sizeof(struct lock_file)); | |||
2118 | struct commit *head_commit = get_ref(head, o->branch1); | |||
2119 | struct commit *next_commit = get_ref(merge, o->branch2); | |||
2120 | struct commit_list *ca = NULL((void*)0); | |||
2121 | ||||
2122 | if (base_list) { | |||
2123 | int i; | |||
2124 | for (i = 0; i < num_base_list; ++i) { | |||
2125 | struct commit *base; | |||
2126 | if (!(base = get_ref(base_list[i], oid_to_hex(base_list[i])))) | |||
2127 | return err(o, _("Could not parse object '%s'"), | |||
2128 | oid_to_hex(base_list[i])); | |||
2129 | commit_list_insert(base, &ca); | |||
2130 | } | |||
2131 | } | |||
2132 | ||||
2133 | hold_locked_index(lock, LOCK_DIE_ON_ERROR1); | |||
2134 | clean = merge_recursive(o, head_commit, next_commit, ca, | |||
2135 | result); | |||
2136 | if (clean < 0) | |||
2137 | return clean; | |||
2138 | ||||
2139 | if (active_cache_changed(the_index.cache_changed) && | |||
2140 | write_locked_index(&the_index, lock, COMMIT_LOCK(1 << 0))) | |||
2141 | return err(o, _("Unable to write index.")); | |||
2142 | ||||
2143 | return clean ? 0 : 1; | |||
2144 | } | |||
2145 | ||||
2146 | static void merge_recursive_config(struct merge_options *o) | |||
2147 | { | |||
2148 | git_config_get_int("merge.verbosity", &o->verbosity); | |||
2149 | git_config_get_int("diff.renamelimit", &o->diff_rename_limit); | |||
2150 | git_config_get_int("merge.renamelimit", &o->merge_rename_limit); | |||
2151 | git_config(git_xmerge_config, NULL((void*)0)); | |||
2152 | } | |||
2153 | ||||
2154 | void init_merge_options(struct merge_options *o) | |||
2155 | { | |||
2156 | memset(o, 0, sizeof(struct merge_options))__builtin___memset_chk (o, 0, sizeof(struct merge_options), __builtin_object_size (o, 0)); | |||
2157 | o->verbosity = 2; | |||
2158 | o->buffer_output = 1; | |||
2159 | o->diff_rename_limit = -1; | |||
2160 | o->merge_rename_limit = -1; | |||
2161 | o->renormalize = 0; | |||
2162 | o->detect_rename = 1; | |||
2163 | merge_recursive_config(o); | |||
2164 | if (getenv("GIT_MERGE_VERBOSITY")) | |||
2165 | o->verbosity = | |||
2166 | strtol(getenv("GIT_MERGE_VERBOSITY"), NULL((void*)0), 10); | |||
2167 | if (o->verbosity >= 5) | |||
2168 | o->buffer_output = 0; | |||
2169 | strbuf_init(&o->obuf, 0); | |||
2170 | string_list_init(&o->current_file_set, 1); | |||
2171 | string_list_init(&o->current_directory_set, 1); | |||
2172 | string_list_init(&o->df_conflict_file_set, 1); | |||
2173 | } | |||
2174 | ||||
2175 | int parse_merge_opt(struct merge_options *o, const char *s) | |||
2176 | { | |||
2177 | const char *arg; | |||
2178 | ||||
2179 | if (!s || !*s) | |||
2180 | return -1; | |||
2181 | if (!strcmp(s, "ours")) | |||
2182 | o->recursive_variant = MERGE_RECURSIVE_OURS; | |||
2183 | else if (!strcmp(s, "theirs")) | |||
2184 | o->recursive_variant = MERGE_RECURSIVE_THEIRS; | |||
2185 | else if (!strcmp(s, "subtree")) | |||
2186 | o->subtree_shift = ""; | |||
2187 | else if (skip_prefix(s, "subtree=", &arg)) | |||
2188 | o->subtree_shift = arg; | |||
2189 | else if (!strcmp(s, "patience")) | |||
2190 | o->xdl_opts = DIFF_WITH_ALG(o, PATIENCE_DIFF)(((o)->xdl_opts & ~((1 << 5) | (1 << 6))) | (1 << 5)); | |||
2191 | else if (!strcmp(s, "histogram")) | |||
2192 | o->xdl_opts = DIFF_WITH_ALG(o, HISTOGRAM_DIFF)(((o)->xdl_opts & ~((1 << 5) | (1 << 6))) | (1 << 6)); | |||
2193 | else if (skip_prefix(s, "diff-algorithm=", &arg)) { | |||
2194 | long value = parse_algorithm_value(arg); | |||
2195 | if (value < 0) | |||
2196 | return -1; | |||
2197 | /* clear out previous settings */ | |||
2198 | DIFF_XDL_CLR(o, NEED_MINIMAL)((o)->xdl_opts &= ~(1 << 1)); | |||
2199 | o->xdl_opts &= ~XDF_DIFF_ALGORITHM_MASK((1 << 5) | (1 << 6)); | |||
2200 | o->xdl_opts |= value; | |||
2201 | } | |||
2202 | else if (!strcmp(s, "ignore-space-change")) | |||
2203 | o->xdl_opts |= XDF_IGNORE_WHITESPACE_CHANGE(1 << 3); | |||
2204 | else if (!strcmp(s, "ignore-all-space")) | |||
2205 | o->xdl_opts |= XDF_IGNORE_WHITESPACE(1 << 2); | |||
2206 | else if (!strcmp(s, "ignore-space-at-eol")) | |||
2207 | o->xdl_opts |= XDF_IGNORE_WHITESPACE_AT_EOL(1 << 4); | |||
2208 | else if (!strcmp(s, "renormalize")) | |||
2209 | o->renormalize = 1; | |||
2210 | else if (!strcmp(s, "no-renormalize")) | |||
2211 | o->renormalize = 0; | |||
2212 | else if (!strcmp(s, "no-renames")) | |||
2213 | o->detect_rename = 0; | |||
2214 | else if (!strcmp(s, "find-renames")) { | |||
2215 | o->detect_rename = 1; | |||
2216 | o->rename_score = 0; | |||
2217 | } | |||
2218 | else if (skip_prefix(s, "find-renames=", &arg) || | |||
2219 | skip_prefix(s, "rename-threshold=", &arg)) { | |||
2220 | if ((o->rename_score = parse_rename_score(&arg)) == -1 || *arg != 0) | |||
2221 | return -1; | |||
2222 | o->detect_rename = 1; | |||
2223 | } | |||
2224 | else | |||
2225 | return -1; | |||
2226 | return 0; | |||
2227 | } |