Split out merge_recursive() to merge-recursive.c
Move most of the of code from builtin-merge-recursive.c to a new file merge-recursive.c and introduce merge_recursive_setup() in there so that builtin-merge-recursive and other builtins call it. Signed-off-by: Miklos Vajna <vmiklos@frugalware.org> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Miklos Vajna committed
Aug 12, 2008 at 18:45 UTC
9047ebbc229bf5b99d6c7522293b8cbd1100b747
4 files changed
+1341
-1324
Makefile
+1
@@ -440,6 +440,7 @@ LIB_OBJS += log-tree.o
440
LIB_OBJS += mailmap.o
441
LIB_OBJS += match-trees.o
442
LIB_OBJS += merge-file.o
443
+LIB_OBJS += merge-recursive.o
444
LIB_OBJS += name-hash.o
445
LIB_OBJS += object.o
446
LIB_OBJS += pack-check.o
builtin-merge-recursive.c
+4
-1323
@@ -1,1307 +1,8 @@
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
- */
1
#include "cache.h"
7
-#include "cache-tree.h"
2
#include "commit.h"
9
-#include "blob.h"
10
-#include "builtin.h"
11
-#include "tree-walk.h"
12
-#include "diff.h"
13
-#include "diffcore.h"
3
#include "tag.h"
15
-#include "unpack-trees.h"
16
-#include "string-list.h"
17
-#include "xdiff-interface.h"
18
-#include "ll-merge.h"
19
-#include "interpolate.h"
20
-#include "attr.h"
4
#include "merge-recursive.h"
5
23
-static int subtree_merge;
24
-
25
-static struct tree *shift_tree_object(struct tree *one, struct tree *two)
26
-{
27
- unsigned char shifted[20];
28
-
29
- /*
30
- * NEEDSWORK: this limits the recursion depth to hardcoded
31
- * value '2' to avoid excessive overhead.
32
- */
33
- shift_tree(one->object.sha1, two->object.sha1, shifted, 2);
34
- if (!hashcmp(two->object.sha1, shifted))
35
- return two;
36
- return lookup_tree(shifted);
37
-}
38
-
39
-/*
40
- * A virtual commit has
41
- * - (const char *)commit->util set to the name, and
42
- * - *(int *)commit->object.sha1 set to the virtual id.
43
- */
44
-
45
-static struct commit *make_virtual_commit(struct tree *tree, const char *comment)
46
-{
47
- struct commit *commit = xcalloc(1, sizeof(struct commit));
48
- static unsigned virtual_id = 1;
49
- commit->tree = tree;
50
- commit->util = (void*)comment;
51
- *(int*)commit->object.sha1 = virtual_id++;
52
- /* avoid warnings */
53
- commit->object.parsed = 1;
54
- return commit;
55
-}
56
-
57
-/*
58
- * Since we use get_tree_entry(), which does not put the read object into
59
- * the object pool, we cannot rely on a == b.
60
- */
61
-static int sha_eq(const unsigned char *a, const unsigned char *b)
62
-{
63
- if (!a && !b)
64
- return 2;
65
- return a && b && hashcmp(a, b) == 0;
66
-}
67
-
68
-/*
69
- * Since we want to write the index eventually, we cannot reuse the index
70
- * for these (temporary) data.
71
- */
72
-struct stage_data
73
-{
74
- struct
75
- {
76
- unsigned mode;
77
- unsigned char sha[20];
78
- } stages[4];
79
- unsigned processed:1;
80
-};
81
-
82
-static struct string_list current_file_set = {NULL, 0, 0, 1};
83
-static struct string_list current_directory_set = {NULL, 0, 0, 1};
84
-
85
-static int call_depth = 0;
86
-static int verbosity = 2;
87
-static int diff_rename_limit = -1;
88
-static int merge_rename_limit = -1;
89
-static int buffer_output = 1;
90
-static struct strbuf obuf = STRBUF_INIT;
91
-
92
-static int show(int v)
93
-{
94
- return (!call_depth && verbosity >= v) || verbosity >= 5;
95
-}
96
-
97
-static void flush_output(void)
98
-{
99
- if (obuf.len) {
100
- fputs(obuf.buf, stdout);
101
- strbuf_reset(&obuf);
102
- }
103
-}
104
-
105
-static void output(int v, const char *fmt, ...)
106
-{
107
- int len;
108
- va_list ap;
109
-
110
- if (!show(v))
111
- return;
112
-
113
- strbuf_grow(&obuf, call_depth * 2 + 2);
114
- memset(obuf.buf + obuf.len, ' ', call_depth * 2);
115
- strbuf_setlen(&obuf, obuf.len + call_depth * 2);
116
-
117
- va_start(ap, fmt);
118
- len = vsnprintf(obuf.buf + obuf.len, strbuf_avail(&obuf), fmt, ap);
119
- va_end(ap);
120
-
121
- if (len < 0)
122
- len = 0;
123
- if (len >= strbuf_avail(&obuf)) {
124
- strbuf_grow(&obuf, len + 2);
125
- va_start(ap, fmt);
126
- len = vsnprintf(obuf.buf + obuf.len, strbuf_avail(&obuf), fmt, ap);
127
- va_end(ap);
128
- if (len >= strbuf_avail(&obuf)) {
129
- die("this should not happen, your snprintf is broken");
130
- }
131
- }
132
- strbuf_setlen(&obuf, obuf.len + len);
133
- strbuf_add(&obuf, "\n", 1);
134
- if (!buffer_output)
135
- flush_output();
136
-}
137
-
138
-static void output_commit_title(struct commit *commit)
139
-{
140
- int i;
141
- flush_output();
142
- for (i = call_depth; i--;)
143
- fputs(" ", stdout);
144
- if (commit->util)
145
- printf("virtual %s\n", (char *)commit->util);
146
- else {
147
- printf("%s ", find_unique_abbrev(commit->object.sha1, DEFAULT_ABBREV));
148
- if (parse_commit(commit) != 0)
149
- printf("(bad commit)\n");
150
- else {
151
- const char *s;
152
- int len;
153
- for (s = commit->buffer; *s; s++)
154
- if (*s == '\n' && s[1] == '\n') {
155
- s += 2;
156
- break;
157
- }
158
- for (len = 0; s[len] && '\n' != s[len]; len++)
159
- ; /* do nothing */
160
- printf("%.*s\n", len, s);
161
- }
162
- }
163
-}
164
-
165
-static int add_cacheinfo(unsigned int mode, const unsigned char *sha1,
166
- const char *path, int stage, int refresh, int options)
167
-{
168
- struct cache_entry *ce;
169
- ce = make_cache_entry(mode, sha1 ? sha1 : null_sha1, path, stage, refresh);
170
- if (!ce)
171
- return error("addinfo_cache failed for path '%s'", path);
172
- return add_cache_entry(ce, options);
173
-}
174
-
175
-/*
176
- * This is a global variable which is used in a number of places but
177
- * only written to in the 'merge' function.
178
- *
179
- * index_only == 1 => Don't leave any non-stage 0 entries in the cache and
180
- * don't update the working directory.
181
- * 0 => Leave unmerged entries in the cache and update
182
- * the working directory.
183
- */
184
-static int index_only = 0;
185
-
186
-static void init_tree_desc_from_tree(struct tree_desc *desc, struct tree *tree)
187
-{
188
- parse_tree(tree);
189
- init_tree_desc(desc, tree->buffer, tree->size);
190
-}
191
-
192
-static int git_merge_trees(int index_only,
193
- struct tree *common,
194
- struct tree *head,
195
- struct tree *merge)
196
-{
197
- int rc;
198
- struct tree_desc t[3];
199
- struct unpack_trees_options opts;
200
-
201
- memset(&opts, 0, sizeof(opts));
202
- if (index_only)
203
- opts.index_only = 1;
204
- else
205
- opts.update = 1;
206
- opts.merge = 1;
207
- opts.head_idx = 2;
208
- opts.fn = threeway_merge;
209
- opts.src_index = &the_index;
210
- opts.dst_index = &the_index;
211
-
212
- init_tree_desc_from_tree(t+0, common);
213
- init_tree_desc_from_tree(t+1, head);
214
- init_tree_desc_from_tree(t+2, merge);
215
-
216
- rc = unpack_trees(3, t, &opts);
217
- cache_tree_free(&active_cache_tree);
218
- return rc;
219
-}
220
-
221
-struct tree *write_tree_from_memory(void)
222
-{
223
- struct tree *result = NULL;
224
-
225
- if (unmerged_cache()) {
226
- int i;
227
- output(0, "There are unmerged index entries:");
228
- for (i = 0; i < active_nr; i++) {
229
- struct cache_entry *ce = active_cache[i];
230
- if (ce_stage(ce))
231
- output(0, "%d %.*s", ce_stage(ce), ce_namelen(ce), ce->name);
232
- }
233
- return NULL;
234
- }
235
-
236
- if (!active_cache_tree)
237
- active_cache_tree = cache_tree();
238
-
239
- if (!cache_tree_fully_valid(active_cache_tree) &&
240
- cache_tree_update(active_cache_tree,
241
- active_cache, active_nr, 0, 0) < 0)
242
- die("error building trees");
243
-
244
- result = lookup_tree(active_cache_tree->sha1);
245
-
246
- return result;
247
-}
248
-
249
-static int save_files_dirs(const unsigned char *sha1,
250
- const char *base, int baselen, const char *path,
251
- unsigned int mode, int stage, void *context)
252
-{
253
- int len = strlen(path);
254
- char *newpath = xmalloc(baselen + len + 1);
255
- memcpy(newpath, base, baselen);
256
- memcpy(newpath + baselen, path, len);
257
- newpath[baselen + len] = '\0';
258
-
259
- if (S_ISDIR(mode))
260
- string_list_insert(newpath, ¤t_directory_set);
261
- else
262
- string_list_insert(newpath, ¤t_file_set);
263
- free(newpath);
264
-
265
- return READ_TREE_RECURSIVE;
266
-}
267
-
268
-static int get_files_dirs(struct tree *tree)
269
-{
270
- int n;
271
- if (read_tree_recursive(tree, "", 0, 0, NULL, save_files_dirs, NULL))
272
- return 0;
273
- n = current_file_set.nr + current_directory_set.nr;
274
- return n;
275
-}
276
-
277
-/*
278
- * Returns an index_entry instance which doesn't have to correspond to
279
- * a real cache entry in Git's index.
280
- */
281
-static struct stage_data *insert_stage_data(const char *path,
282
- struct tree *o, struct tree *a, struct tree *b,
283
- struct string_list *entries)
284
-{
285
- struct string_list_item *item;
286
- struct stage_data *e = xcalloc(1, sizeof(struct stage_data));
287
- get_tree_entry(o->object.sha1, path,
288
- e->stages[1].sha, &e->stages[1].mode);
289
- get_tree_entry(a->object.sha1, path,
290
- e->stages[2].sha, &e->stages[2].mode);
291
- get_tree_entry(b->object.sha1, path,
292
- e->stages[3].sha, &e->stages[3].mode);
293
- item = string_list_insert(path, entries);
294
- item->util = e;
295
- return e;
296
-}
297
-
298
-/*
299
- * Create a dictionary mapping file names to stage_data objects. The
300
- * dictionary contains one entry for every path with a non-zero stage entry.
301
- */
302
-static struct string_list *get_unmerged(void)
303
-{
304
- struct string_list *unmerged = xcalloc(1, sizeof(struct string_list));
305
- int i;
306
-
307
- unmerged->strdup_strings = 1;
308
-
309
- for (i = 0; i < active_nr; i++) {
310
- struct string_list_item *item;
311
- struct stage_data *e;
312
- struct cache_entry *ce = active_cache[i];
313
- if (!ce_stage(ce))
314
- continue;
315
-
316
- item = string_list_lookup(ce->name, unmerged);
317
- if (!item) {
318
- item = string_list_insert(ce->name, unmerged);
319
- item->util = xcalloc(1, sizeof(struct stage_data));
320
- }
321
- e = item->util;
322
- e->stages[ce_stage(ce)].mode = ce->ce_mode;
323
- hashcpy(e->stages[ce_stage(ce)].sha, ce->sha1);
324
- }
325
-
326
- return unmerged;
327
-}
328
-
329
-struct rename
330
-{
331
- struct diff_filepair *pair;
332
- struct stage_data *src_entry;
333
- struct stage_data *dst_entry;
334
- unsigned processed:1;
335
-};
336
-
337
-/*
338
- * Get information of all renames which occurred between 'o_tree' and
339
- * 'tree'. We need the three trees in the merge ('o_tree', 'a_tree' and
340
- * 'b_tree') to be able to associate the correct cache entries with
341
- * the rename information. 'tree' is always equal to either a_tree or b_tree.
342
- */
343
-static struct string_list *get_renames(struct tree *tree,
344
- struct tree *o_tree,
345
- struct tree *a_tree,
346
- struct tree *b_tree,
347
- struct string_list *entries)
348
-{
349
- int i;
350
- struct string_list *renames;
351
- struct diff_options opts;
352
-
353
- renames = xcalloc(1, sizeof(struct string_list));
354
- diff_setup(&opts);
355
- DIFF_OPT_SET(&opts, RECURSIVE);
356
- opts.detect_rename = DIFF_DETECT_RENAME;
357
- opts.rename_limit = merge_rename_limit >= 0 ? merge_rename_limit :
358
- diff_rename_limit >= 0 ? diff_rename_limit :
359
- 500;
360
- opts.warn_on_too_large_rename = 1;
361
- opts.output_format = DIFF_FORMAT_NO_OUTPUT;
362
- if (diff_setup_done(&opts) < 0)
363
- die("diff setup failed");
364
- diff_tree_sha1(o_tree->object.sha1, tree->object.sha1, "", &opts);
365
- diffcore_std(&opts);
366
- for (i = 0; i < diff_queued_diff.nr; ++i) {
367
- struct string_list_item *item;
368
- struct rename *re;
369
- struct diff_filepair *pair = diff_queued_diff.queue[i];
370
- if (pair->status != 'R') {
371
- diff_free_filepair(pair);
372
- continue;
373
- }
374
- re = xmalloc(sizeof(*re));
375
- re->processed = 0;
376
- re->pair = pair;
377
- item = string_list_lookup(re->pair->one->path, entries);
378
- if (!item)
379
- re->src_entry = insert_stage_data(re->pair->one->path,
380
- o_tree, a_tree, b_tree, entries);
381
- else
382
- re->src_entry = item->util;
383
-
384
- item = string_list_lookup(re->pair->two->path, entries);
385
- if (!item)
386
- re->dst_entry = insert_stage_data(re->pair->two->path,
387
- o_tree, a_tree, b_tree, entries);
388
- else
389
- re->dst_entry = item->util;
390
- item = string_list_insert(pair->one->path, renames);
391
- item->util = re;
392
- }
393
- opts.output_format = DIFF_FORMAT_NO_OUTPUT;
394
- diff_queued_diff.nr = 0;
395
- diff_flush(&opts);
396
- return renames;
397
-}
398
-
399
-static int update_stages(const char *path, struct diff_filespec *o,
400
- struct diff_filespec *a, struct diff_filespec *b,
401
- int clear)
402
-{
403
- int options = ADD_CACHE_OK_TO_ADD | ADD_CACHE_OK_TO_REPLACE;
404
- if (clear)
405
- if (remove_file_from_cache(path))
406
- return -1;
407
- if (o)
408
- if (add_cacheinfo(o->mode, o->sha1, path, 1, 0, options))
409
- return -1;
410
- if (a)
411
- if (add_cacheinfo(a->mode, a->sha1, path, 2, 0, options))
412
- return -1;
413
- if (b)
414
- if (add_cacheinfo(b->mode, b->sha1, path, 3, 0, options))
415
- return -1;
416
- return 0;
417
-}
418
-
419
-static int remove_path(const char *name)
420
-{
421
- int ret;
422
- char *slash, *dirs;
423
-
424
- ret = unlink(name);
425
- if (ret)
426
- return ret;
427
- dirs = xstrdup(name);
428
- while ((slash = strrchr(name, '/'))) {
429
- *slash = '\0';
430
- if (rmdir(name) != 0)
431
- break;
432
- }
433
- free(dirs);
434
- return ret;
435
-}
436
-
437
-static int remove_file(int clean, const char *path, int no_wd)
438
-{
439
- int update_cache = index_only || clean;
440
- int update_working_directory = !index_only && !no_wd;
441
-
442
- if (update_cache) {
443
- if (remove_file_from_cache(path))
444
- return -1;
445
- }
446
- if (update_working_directory) {
447
- unlink(path);
448
- if (errno != ENOENT || errno != EISDIR)
449
- return -1;
450
- remove_path(path);
451
- }
452
- return 0;
453
-}
454
-
455
-static char *unique_path(const char *path, const char *branch)
456
-{
457
- char *newpath = xmalloc(strlen(path) + 1 + strlen(branch) + 8 + 1);
458
- int suffix = 0;
459
- struct stat st;
460
- char *p = newpath + strlen(path);
461
- strcpy(newpath, path);
462
- *(p++) = '~';
463
- strcpy(p, branch);
464
- for (; *p; ++p)
465
- if ('/' == *p)
466
- *p = '_';
467
- while (string_list_has_string(¤t_file_set, newpath) ||
468
- string_list_has_string(¤t_directory_set, newpath) ||
469
- lstat(newpath, &st) == 0)
470
- sprintf(p, "_%d", suffix++);
471
-
472
- string_list_insert(newpath, ¤t_file_set);
473
- return newpath;
474
-}
475
-
476
-static void flush_buffer(int fd, const char *buf, unsigned long size)
477
-{
478
- while (size > 0) {
479
- long ret = write_in_full(fd, buf, size);
480
- if (ret < 0) {
481
- /* Ignore epipe */
482
- if (errno == EPIPE)
483
- break;
484
- die("merge-recursive: %s", strerror(errno));
485
- } else if (!ret) {
486
- die("merge-recursive: disk full?");
487
- }
488
- size -= ret;
489
- buf += ret;
490
- }
491
-}
492
-
493
-static int make_room_for_path(const char *path)
494
-{
495
- int status;
496
- const char *msg = "failed to create path '%s'%s";
497
-
498
- status = safe_create_leading_directories_const(path);
499
- if (status) {
500
- if (status == -3) {
501
- /* something else exists */
502
- error(msg, path, ": perhaps a D/F conflict?");
503
- return -1;
504
- }
505
- die(msg, path, "");
506
- }
507
-
508
- /* Successful unlink is good.. */
509
- if (!unlink(path))
510
- return 0;
511
- /* .. and so is no existing file */
512
- if (errno == ENOENT)
513
- return 0;
514
- /* .. but not some other error (who really cares what?) */
515
- return error(msg, path, ": perhaps a D/F conflict?");
516
-}
517
-
518
-static void update_file_flags(const unsigned char *sha,
519
- unsigned mode,
520
- const char *path,
521
- int update_cache,
522
- int update_wd)
523
-{
524
- if (index_only)
525
- update_wd = 0;
526
-
527
- if (update_wd) {
528
- enum object_type type;
529
- void *buf;
530
- unsigned long size;
531
-
532
- if (S_ISGITLINK(mode))
533
- die("cannot read object %s '%s': It is a submodule!",
534
- sha1_to_hex(sha), path);
535
-
536
- buf = read_sha1_file(sha, &type, &size);
537
- if (!buf)
538
- die("cannot read object %s '%s'", sha1_to_hex(sha), path);
539
- if (type != OBJ_BLOB)
540
- die("blob expected for %s '%s'", sha1_to_hex(sha), path);
541
- if (S_ISREG(mode)) {
542
- struct strbuf strbuf;
543
- strbuf_init(&strbuf, 0);
544
- if (convert_to_working_tree(path, buf, size, &strbuf)) {
545
- free(buf);
546
- size = strbuf.len;
547
- buf = strbuf_detach(&strbuf, NULL);
548
- }
549
- }
550
-
551
- if (make_room_for_path(path) < 0) {
552
- update_wd = 0;
553
- free(buf);
554
- goto update_index;
555
- }
556
- if (S_ISREG(mode) || (!has_symlinks && S_ISLNK(mode))) {
557
- int fd;
558
- if (mode & 0100)
559
- mode = 0777;
560
- else
561
- mode = 0666;
562
- fd = open(path, O_WRONLY | O_TRUNC | O_CREAT, mode);
563
- if (fd < 0)
564
- die("failed to open %s: %s", path, strerror(errno));
565
- flush_buffer(fd, buf, size);
566
- close(fd);
567
- } else if (S_ISLNK(mode)) {
568
- char *lnk = xmemdupz(buf, size);
569
- safe_create_leading_directories_const(path);
570
- unlink(path);
571
- symlink(lnk, path);
572
- free(lnk);
573
- } else
574
- die("do not know what to do with %06o %s '%s'",
575
- mode, sha1_to_hex(sha), path);
576
- free(buf);
577
- }
578
- update_index:
579
- if (update_cache)
580
- add_cacheinfo(mode, sha, path, 0, update_wd, ADD_CACHE_OK_TO_ADD);
581
-}
582
-
583
-static void update_file(int clean,
584
- const unsigned char *sha,
585
- unsigned mode,
586
- const char *path)
587
-{
588
- update_file_flags(sha, mode, path, index_only || clean, !index_only);
589
-}
590
-
591
-/* Low level file merging, update and removal */
592
-
593
-struct merge_file_info
594
-{
595
- unsigned char sha[20];
596
- unsigned mode;
597
- unsigned clean:1,
598
- merge:1;
599
-};
600
-
601
-static void fill_mm(const unsigned char *sha1, mmfile_t *mm)
602
-{
603
- unsigned long size;
604
- enum object_type type;
605
-
606
- if (!hashcmp(sha1, null_sha1)) {
607
- mm->ptr = xstrdup("");
608
- mm->size = 0;
609
- return;
610
- }
611
-
612
- mm->ptr = read_sha1_file(sha1, &type, &size);
613
- if (!mm->ptr || type != OBJ_BLOB)
614
- die("unable to read blob object %s", sha1_to_hex(sha1));
615
- mm->size = size;
616
-}
617
-
618
-static int merge_3way(mmbuffer_t *result_buf,
619
- struct diff_filespec *o,
620
- struct diff_filespec *a,
621
- struct diff_filespec *b,
622
- const char *branch1,
623
- const char *branch2)
624
-{
625
- mmfile_t orig, src1, src2;
626
- char *name1, *name2;
627
- int merge_status;
628
-
629
- name1 = xstrdup(mkpath("%s:%s", branch1, a->path));
630
- name2 = xstrdup(mkpath("%s:%s", branch2, b->path));
631
-
632
- fill_mm(o->sha1, &orig);
633
- fill_mm(a->sha1, &src1);
634
- fill_mm(b->sha1, &src2);
635
-
636
- merge_status = ll_merge(result_buf, a->path, &orig,
637
- &src1, name1, &src2, name2,
638
- index_only);
639
-
640
- free(name1);
641
- free(name2);
642
- free(orig.ptr);
643
- free(src1.ptr);
644
- free(src2.ptr);
645
- return merge_status;
646
-}
647
-
648
-static struct merge_file_info merge_file(struct diff_filespec *o,
649
- struct diff_filespec *a, struct diff_filespec *b,
650
- const char *branch1, const char *branch2)
651
-{
652
- struct merge_file_info result;
653
- result.merge = 0;
654
- result.clean = 1;
655
-
656
- if ((S_IFMT & a->mode) != (S_IFMT & b->mode)) {
657
- result.clean = 0;
658
- if (S_ISREG(a->mode)) {
659
- result.mode = a->mode;
660
- hashcpy(result.sha, a->sha1);
661
- } else {
662
- result.mode = b->mode;
663
- hashcpy(result.sha, b->sha1);
664
- }
665
- } else {
666
- if (!sha_eq(a->sha1, o->sha1) && !sha_eq(b->sha1, o->sha1))
667
- result.merge = 1;
668
-
669
- /*
670
- * Merge modes
671
- */
672
- if (a->mode == b->mode || a->mode == o->mode)
673
- result.mode = b->mode;
674
- else {
675
- result.mode = a->mode;
676
- if (b->mode != o->mode) {
677
- result.clean = 0;
678
- result.merge = 1;
679
- }
680
- }
681
-
682
- if (sha_eq(a->sha1, b->sha1) || sha_eq(a->sha1, o->sha1))
683
- hashcpy(result.sha, b->sha1);
684
- else if (sha_eq(b->sha1, o->sha1))
685
- hashcpy(result.sha, a->sha1);
686
- else if (S_ISREG(a->mode)) {
687
- mmbuffer_t result_buf;
688
- int merge_status;
689
-
690
- merge_status = merge_3way(&result_buf, o, a, b,
691
- branch1, branch2);
692
-
693
- if ((merge_status < 0) || !result_buf.ptr)
694
- die("Failed to execute internal merge");
695
-
696
- if (write_sha1_file(result_buf.ptr, result_buf.size,
697
- blob_type, result.sha))
698
- die("Unable to add %s to database",
699
- a->path);
700
-
701
- free(result_buf.ptr);
702
- result.clean = (merge_status == 0);
703
- } else if (S_ISGITLINK(a->mode)) {
704
- result.clean = 0;
705
- hashcpy(result.sha, a->sha1);
706
- } else if (S_ISLNK(a->mode)) {
707
- hashcpy(result.sha, a->sha1);
708
-
709
- if (!sha_eq(a->sha1, b->sha1))
710
- result.clean = 0;
711
- } else {
712
- die("unsupported object type in the tree");
713
- }
714
- }
715
-
716
- return result;
717
-}
718
-
719
-static void conflict_rename_rename(struct rename *ren1,
720
- const char *branch1,
721
- struct rename *ren2,
722
- const char *branch2)
723
-{
724
- char *del[2];
725
- int delp = 0;
726
- const char *ren1_dst = ren1->pair->two->path;
727
- const char *ren2_dst = ren2->pair->two->path;
728
- const char *dst_name1 = ren1_dst;
729
- const char *dst_name2 = ren2_dst;
730
- if (string_list_has_string(¤t_directory_set, ren1_dst)) {
731
- dst_name1 = del[delp++] = unique_path(ren1_dst, branch1);
732
- output(1, "%s is a directory in %s adding as %s instead",
733
- ren1_dst, branch2, dst_name1);
734
- remove_file(0, ren1_dst, 0);
735
- }
736
- if (string_list_has_string(¤t_directory_set, ren2_dst)) {
737
- dst_name2 = del[delp++] = unique_path(ren2_dst, branch2);
738
- output(1, "%s is a directory in %s adding as %s instead",
739
- ren2_dst, branch1, dst_name2);
740
- remove_file(0, ren2_dst, 0);
741
- }
742
- if (index_only) {
743
- remove_file_from_cache(dst_name1);
744
- remove_file_from_cache(dst_name2);
745
- /*
746
- * Uncomment to leave the conflicting names in the resulting tree
747
- *
748
- * update_file(0, ren1->pair->two->sha1, ren1->pair->two->mode, dst_name1);
749
- * update_file(0, ren2->pair->two->sha1, ren2->pair->two->mode, dst_name2);
750
- */
751
- } else {
752
- update_stages(dst_name1, NULL, ren1->pair->two, NULL, 1);
753
- update_stages(dst_name2, NULL, NULL, ren2->pair->two, 1);
754
- }
755
- while (delp--)
756
- free(del[delp]);
757
-}
758
-
759
-static void conflict_rename_dir(struct rename *ren1,
760
- const char *branch1)
761
-{
762
- char *new_path = unique_path(ren1->pair->two->path, branch1);
763
- output(1, "Renaming %s to %s instead", ren1->pair->one->path, new_path);
764
- remove_file(0, ren1->pair->two->path, 0);
765
- update_file(0, ren1->pair->two->sha1, ren1->pair->two->mode, new_path);
766
- free(new_path);
767
-}
768
-
769
-static void conflict_rename_rename_2(struct rename *ren1,
770
- const char *branch1,
771
- struct rename *ren2,
772
- const char *branch2)
773
-{
774
- char *new_path1 = unique_path(ren1->pair->two->path, branch1);
775
- char *new_path2 = unique_path(ren2->pair->two->path, branch2);
776
- output(1, "Renaming %s to %s and %s to %s instead",
777
- ren1->pair->one->path, new_path1,
778
- ren2->pair->one->path, new_path2);
779
- remove_file(0, ren1->pair->two->path, 0);
780
- update_file(0, ren1->pair->two->sha1, ren1->pair->two->mode, new_path1);
781
- update_file(0, ren2->pair->two->sha1, ren2->pair->two->mode, new_path2);
782
- free(new_path2);
783
- free(new_path1);
784
-}
785
-
786
-static int process_renames(struct string_list *a_renames,
787
- struct string_list *b_renames,
788
- const char *a_branch,
789
- const char *b_branch)
790
-{
791
- int clean_merge = 1, i, j;
792
- struct string_list a_by_dst = {NULL, 0, 0, 0}, b_by_dst = {NULL, 0, 0, 0};
793
- const struct rename *sre;
794
-
795
- for (i = 0; i < a_renames->nr; i++) {
796
- sre = a_renames->items[i].util;
797
- string_list_insert(sre->pair->two->path, &a_by_dst)->util
798
- = sre->dst_entry;
799
- }
800
- for (i = 0; i < b_renames->nr; i++) {
801
- sre = b_renames->items[i].util;
802
- string_list_insert(sre->pair->two->path, &b_by_dst)->util
803
- = sre->dst_entry;
804
- }
805
-
806
- for (i = 0, j = 0; i < a_renames->nr || j < b_renames->nr;) {
807
- int compare;
808
- char *src;
809
- struct string_list *renames1, *renames2, *renames2Dst;
810
- struct rename *ren1 = NULL, *ren2 = NULL;
811
- const char *branch1, *branch2;
812
- const char *ren1_src, *ren1_dst;
813
-
814
- if (i >= a_renames->nr) {
815
- compare = 1;
816
- ren2 = b_renames->items[j++].util;
817
- } else if (j >= b_renames->nr) {
818
- compare = -1;
819
- ren1 = a_renames->items[i++].util;
820
- } else {
821
- compare = strcmp(a_renames->items[i].string,
822
- b_renames->items[j].string);
823
- if (compare <= 0)
824
- ren1 = a_renames->items[i++].util;
825
- if (compare >= 0)
826
- ren2 = b_renames->items[j++].util;
827
- }
828
-
829
- /* TODO: refactor, so that 1/2 are not needed */
830
- if (ren1) {
831
- renames1 = a_renames;
832
- renames2 = b_renames;
833
- renames2Dst = &b_by_dst;
834
- branch1 = a_branch;
835
- branch2 = b_branch;
836
- } else {
837
- struct rename *tmp;
838
- renames1 = b_renames;
839
- renames2 = a_renames;
840
- renames2Dst = &a_by_dst;
841
- branch1 = b_branch;
842
- branch2 = a_branch;
843
- tmp = ren2;
844
- ren2 = ren1;
845
- ren1 = tmp;
846
- }
847
- src = ren1->pair->one->path;
848
-
849
- ren1->dst_entry->processed = 1;
850
- ren1->src_entry->processed = 1;
851
-
852
- if (ren1->processed)
853
- continue;
854
- ren1->processed = 1;
855
-
856
- ren1_src = ren1->pair->one->path;
857
- ren1_dst = ren1->pair->two->path;
858
-
859
- if (ren2) {
860
- const char *ren2_src = ren2->pair->one->path;
861
- const char *ren2_dst = ren2->pair->two->path;
862
- /* Renamed in 1 and renamed in 2 */
863
- if (strcmp(ren1_src, ren2_src) != 0)
864
- die("ren1.src != ren2.src");
865
- ren2->dst_entry->processed = 1;
866
- ren2->processed = 1;
867
- if (strcmp(ren1_dst, ren2_dst) != 0) {
868
- clean_merge = 0;
869
- output(1, "CONFLICT (rename/rename): "
870
- "Rename \"%s\"->\"%s\" in branch \"%s\" "
871
- "rename \"%s\"->\"%s\" in \"%s\"%s",
872
- src, ren1_dst, branch1,
873
- src, ren2_dst, branch2,
874
- index_only ? " (left unresolved)": "");
875
- if (index_only) {
876
- remove_file_from_cache(src);
877
- update_file(0, ren1->pair->one->sha1,
878
- ren1->pair->one->mode, src);
879
- }
880
- conflict_rename_rename(ren1, branch1, ren2, branch2);
881
- } else {
882
- struct merge_file_info mfi;
883
- remove_file(1, ren1_src, 1);
884
- mfi = merge_file(ren1->pair->one,
885
- ren1->pair->two,
886
- ren2->pair->two,
887
- branch1,
888
- branch2);
889
- if (mfi.merge || !mfi.clean)
890
- output(1, "Renaming %s->%s", src, ren1_dst);
891
-
892
- if (mfi.merge)
893
- output(2, "Auto-merging %s", ren1_dst);
894
-
895
- if (!mfi.clean) {
896
- output(1, "CONFLICT (content): merge conflict in %s",
897
- ren1_dst);
898
- clean_merge = 0;
899
-
900
- if (!index_only)
901
- update_stages(ren1_dst,
902
- ren1->pair->one,
903
- ren1->pair->two,
904
- ren2->pair->two,
905
- 1 /* clear */);
906
- }
907
- update_file(mfi.clean, mfi.sha, mfi.mode, ren1_dst);
908
- }
909
- } else {
910
- /* Renamed in 1, maybe changed in 2 */
911
- struct string_list_item *item;
912
- /* we only use sha1 and mode of these */
913
- struct diff_filespec src_other, dst_other;
914
- int try_merge, stage = a_renames == renames1 ? 3: 2;
915
-
916
- remove_file(1, ren1_src, index_only || stage == 3);
917
-
918
- hashcpy(src_other.sha1, ren1->src_entry->stages[stage].sha);
919
- src_other.mode = ren1->src_entry->stages[stage].mode;
920
- hashcpy(dst_other.sha1, ren1->dst_entry->stages[stage].sha);
921
- dst_other.mode = ren1->dst_entry->stages[stage].mode;
922
-
923
- try_merge = 0;
924
-
925
- if (string_list_has_string(¤t_directory_set, ren1_dst)) {
926
- clean_merge = 0;
927
- output(1, "CONFLICT (rename/directory): Rename %s->%s in %s "
928
- " directory %s added in %s",
929
- ren1_src, ren1_dst, branch1,
930
- ren1_dst, branch2);
931
- conflict_rename_dir(ren1, branch1);
932
- } else if (sha_eq(src_other.sha1, null_sha1)) {
933
- clean_merge = 0;
934
- output(1, "CONFLICT (rename/delete): Rename %s->%s in %s "
935
- "and deleted in %s",
936
- ren1_src, ren1_dst, branch1,
937
- branch2);
938
- update_file(0, ren1->pair->two->sha1, ren1->pair->two->mode, ren1_dst);
939
- } else if (!sha_eq(dst_other.sha1, null_sha1)) {
940
- const char *new_path;
941
- clean_merge = 0;
942
- try_merge = 1;
943
- output(1, "CONFLICT (rename/add): Rename %s->%s in %s. "
944
- "%s added in %s",
945
- ren1_src, ren1_dst, branch1,
946
- ren1_dst, branch2);
947
- new_path = unique_path(ren1_dst, branch2);
948
- output(1, "Adding as %s instead", new_path);
949
- update_file(0, dst_other.sha1, dst_other.mode, new_path);
950
- } else if ((item = string_list_lookup(ren1_dst, renames2Dst))) {
951
- ren2 = item->util;
952
- clean_merge = 0;
953
- ren2->processed = 1;
954
- output(1, "CONFLICT (rename/rename): Rename %s->%s in %s. "
955
- "Rename %s->%s in %s",
956
- ren1_src, ren1_dst, branch1,
957
- ren2->pair->one->path, ren2->pair->two->path, branch2);
958
- conflict_rename_rename_2(ren1, branch1, ren2, branch2);
959
- } else
960
- try_merge = 1;
961
-
962
- if (try_merge) {
963
- struct diff_filespec *o, *a, *b;
964
- struct merge_file_info mfi;
965
- src_other.path = (char *)ren1_src;
966
-
967
- o = ren1->pair->one;
968
- if (a_renames == renames1) {
969
- a = ren1->pair->two;
970
- b = &src_other;
971
- } else {
972
- b = ren1->pair->two;
973
- a = &src_other;
974
- }
975
- mfi = merge_file(o, a, b,
976
- a_branch, b_branch);
977
-
978
- if (mfi.clean &&
979
- sha_eq(mfi.sha, ren1->pair->two->sha1) &&
980
- mfi.mode == ren1->pair->two->mode)
981
- /*
982
- * This messaged is part of
983
- * t6022 test. If you change
984
- * it update the test too.
985
- */
986
- output(3, "Skipped %s (merged same as existing)", ren1_dst);
987
- else {
988
- if (mfi.merge || !mfi.clean)
989
- output(1, "Renaming %s => %s", ren1_src, ren1_dst);
990
- if (mfi.merge)
991
- output(2, "Auto-merging %s", ren1_dst);
992
- if (!mfi.clean) {
993
- output(1, "CONFLICT (rename/modify): Merge conflict in %s",
994
- ren1_dst);
995
- clean_merge = 0;
996
-
997
- if (!index_only)
998
- update_stages(ren1_dst,
999
- o, a, b, 1);
1000
- }
1001
- update_file(mfi.clean, mfi.sha, mfi.mode, ren1_dst);
1002
- }
1003
- }
1004
- }
1005
- }
1006
- string_list_clear(&a_by_dst, 0);
1007
- string_list_clear(&b_by_dst, 0);
1008
-
1009
- return clean_merge;
1010
-}
1011
-
1012
-static unsigned char *stage_sha(const unsigned char *sha, unsigned mode)
1013
-{
1014
- return (is_null_sha1(sha) || mode == 0) ? NULL: (unsigned char *)sha;
1015
-}
1016
-
1017
-/* Per entry merge function */
1018
-static int process_entry(const char *path, struct stage_data *entry,
1019
- const char *branch1,
1020
- const char *branch2)
1021
-{
1022
- /*
1023
- printf("processing entry, clean cache: %s\n", index_only ? "yes": "no");
1024
- print_index_entry("\tpath: ", entry);
1025
- */
1026
- int clean_merge = 1;
1027
- unsigned o_mode = entry->stages[1].mode;
1028
- unsigned a_mode = entry->stages[2].mode;
1029
- unsigned b_mode = entry->stages[3].mode;
1030
- unsigned char *o_sha = stage_sha(entry->stages[1].sha, o_mode);
1031
- unsigned char *a_sha = stage_sha(entry->stages[2].sha, a_mode);
1032
- unsigned char *b_sha = stage_sha(entry->stages[3].sha, b_mode);
1033
-
1034
- if (o_sha && (!a_sha || !b_sha)) {
1035
- /* Case A: Deleted in one */
1036
- if ((!a_sha && !b_sha) ||
1037
- (sha_eq(a_sha, o_sha) && !b_sha) ||
1038
- (!a_sha && sha_eq(b_sha, o_sha))) {
1039
- /* Deleted in both or deleted in one and
1040
- * unchanged in the other */
1041
- if (a_sha)
1042
- output(2, "Removing %s", path);
1043
- /* do not touch working file if it did not exist */
1044
- remove_file(1, path, !a_sha);
1045
- } else {
1046
- /* Deleted in one and changed in the other */
1047
- clean_merge = 0;
1048
- if (!a_sha) {
1049
- output(1, "CONFLICT (delete/modify): %s deleted in %s "
1050
- "and modified in %s. Version %s of %s left in tree.",
1051
- path, branch1,
1052
- branch2, branch2, path);
1053
- update_file(0, b_sha, b_mode, path);
1054
- } else {
1055
- output(1, "CONFLICT (delete/modify): %s deleted in %s "
1056
- "and modified in %s. Version %s of %s left in tree.",
1057
- path, branch2,
1058
- branch1, branch1, path);
1059
- update_file(0, a_sha, a_mode, path);
1060
- }
1061
- }
1062
-
1063
- } else if ((!o_sha && a_sha && !b_sha) ||
1064
- (!o_sha && !a_sha && b_sha)) {
1065
- /* Case B: Added in one. */
1066
- const char *add_branch;
1067
- const char *other_branch;
1068
- unsigned mode;
1069
- const unsigned char *sha;
1070
- const char *conf;
1071
-
1072
- if (a_sha) {
1073
- add_branch = branch1;
1074
- other_branch = branch2;
1075
- mode = a_mode;
1076
- sha = a_sha;
1077
- conf = "file/directory";
1078
- } else {
1079
- add_branch = branch2;
1080
- other_branch = branch1;
1081
- mode = b_mode;
1082
- sha = b_sha;
1083
- conf = "directory/file";
1084
- }
1085
- if (string_list_has_string(¤t_directory_set, path)) {
1086
- const char *new_path = unique_path(path, add_branch);
1087
- clean_merge = 0;
1088
- output(1, "CONFLICT (%s): There is a directory with name %s in %s. "
1089
- "Adding %s as %s",
1090
- conf, path, other_branch, path, new_path);
1091
- remove_file(0, path, 0);
1092
- update_file(0, sha, mode, new_path);
1093
- } else {
1094
- output(2, "Adding %s", path);
1095
- update_file(1, sha, mode, path);
1096
- }
1097
- } else if (a_sha && b_sha) {
1098
- /* Case C: Added in both (check for same permissions) and */
1099
- /* case D: Modified in both, but differently. */
1100
- const char *reason = "content";
1101
- struct merge_file_info mfi;
1102
- struct diff_filespec o, a, b;
1103
-
1104
- if (!o_sha) {
1105
- reason = "add/add";
1106
- o_sha = (unsigned char *)null_sha1;
1107
- }
1108
- output(2, "Auto-merging %s", path);
1109
- o.path = a.path = b.path = (char *)path;
1110
- hashcpy(o.sha1, o_sha);
1111
- o.mode = o_mode;
1112
- hashcpy(a.sha1, a_sha);
1113
- a.mode = a_mode;
1114
- hashcpy(b.sha1, b_sha);
1115
- b.mode = b_mode;
1116
-
1117
- mfi = merge_file(&o, &a, &b,
1118
- branch1, branch2);
1119
-
1120
- clean_merge = mfi.clean;
1121
- if (mfi.clean)
1122
- update_file(1, mfi.sha, mfi.mode, path);
1123
- else if (S_ISGITLINK(mfi.mode))
1124
- output(1, "CONFLICT (submodule): Merge conflict in %s "
1125
- "- needs %s", path, sha1_to_hex(b.sha1));
1126
- else {
1127
- output(1, "CONFLICT (%s): Merge conflict in %s",
1128
- reason, path);
1129
-
1130
- if (index_only)
1131
- update_file(0, mfi.sha, mfi.mode, path);
1132
- else
1133
- update_file_flags(mfi.sha, mfi.mode, path,
1134
- 0 /* update_cache */, 1 /* update_working_directory */);
1135
- }
1136
- } else if (!o_sha && !a_sha && !b_sha) {
1137
- /*
1138
- * this entry was deleted altogether. a_mode == 0 means
1139
- * we had that path and want to actively remove it.
1140
- */
1141
- remove_file(1, path, !a_mode);
1142
- } else
1143
- die("Fatal merge failure, shouldn't happen.");
1144
-
1145
- return clean_merge;
1146
-}
1147
-
1148
-int merge_trees(struct tree *head,
1149
- struct tree *merge,
1150
- struct tree *common,
1151
- const char *branch1,
1152
- const char *branch2,
1153
- struct tree **result)
1154
-{
1155
- int code, clean;
1156
-
1157
- if (subtree_merge) {
1158
- merge = shift_tree_object(head, merge);
1159
- common = shift_tree_object(head, common);
1160
- }
1161
-
1162
- if (sha_eq(common->object.sha1, merge->object.sha1)) {
1163
- output(0, "Already uptodate!");
1164
- *result = head;
1165
- return 1;
1166
- }
1167
-
1168
- code = git_merge_trees(index_only, common, head, merge);
1169
-
1170
- if (code != 0)
1171
- die("merging of trees %s and %s failed",
1172
- sha1_to_hex(head->object.sha1),
1173
- sha1_to_hex(merge->object.sha1));
1174
-
1175
- if (unmerged_cache()) {
1176
- struct string_list *entries, *re_head, *re_merge;
1177
- int i;
1178
- string_list_clear(¤t_file_set, 1);
1179
- string_list_clear(¤t_directory_set, 1);
1180
- get_files_dirs(head);
1181
- get_files_dirs(merge);
1182
-
1183
- entries = get_unmerged();
1184
- re_head = get_renames(head, common, head, merge, entries);
1185
- re_merge = get_renames(merge, common, head, merge, entries);
1186
- clean = process_renames(re_head, re_merge,
1187
- branch1, branch2);
1188
- for (i = 0; i < entries->nr; i++) {
1189
- const char *path = entries->items[i].string;
1190
- struct stage_data *e = entries->items[i].util;
1191
- if (!e->processed
1192
- && !process_entry(path, e, branch1, branch2))
1193
- clean = 0;
1194
- }
1195
-
1196
- string_list_clear(re_merge, 0);
1197
- string_list_clear(re_head, 0);
1198
- string_list_clear(entries, 1);
1199
-
1200
- }
1201
- else
1202
- clean = 1;
1203
-
1204
- if (index_only)
1205
- *result = write_tree_from_memory();
1206
-
1207
- return clean;
1208
-}
1209
-
1210
-static struct commit_list *reverse_commit_list(struct commit_list *list)
1211
-{
1212
- struct commit_list *next = NULL, *current, *backup;
1213
- for (current = list; current; current = backup) {
1214
- backup = current->next;
1215
- current->next = next;
1216
- next = current;
1217
- }
1218
- return next;
1219
-}
1220
-
1221
-/*
1222
- * Merge the commits h1 and h2, return the resulting virtual
1223
- * commit object and a flag indicating the cleanness of the merge.
1224
- */
1225
-int merge_recursive(struct commit *h1,
1226
- struct commit *h2,
1227
- const char *branch1,
1228
- const char *branch2,
1229
- struct commit_list *ca,
1230
- struct commit **result)
1231
-{
1232
- struct commit_list *iter;
1233
- struct commit *merged_common_ancestors;
1234
- struct tree *mrtree = mrtree;
1235
- int clean;
1236
-
1237
- if (show(4)) {
1238
- output(4, "Merging:");
1239
- output_commit_title(h1);
1240
- output_commit_title(h2);
1241
- }
1242
-
1243
- if (!ca) {
1244
- ca = get_merge_bases(h1, h2, 1);
1245
- ca = reverse_commit_list(ca);
1246
- }
1247
-
1248
- if (show(5)) {
1249
- output(5, "found %u common ancestor(s):", commit_list_count(ca));
1250
- for (iter = ca; iter; iter = iter->next)
1251
- output_commit_title(iter->item);
1252
- }
1253
-
1254
- merged_common_ancestors = pop_commit(&ca);
1255
- if (merged_common_ancestors == NULL) {
1256
- /* if there is no common ancestor, make an empty tree */
1257
- struct tree *tree = xcalloc(1, sizeof(struct tree));
1258
-
1259
- tree->object.parsed = 1;
1260
- tree->object.type = OBJ_TREE;
1261
- pretend_sha1_file(NULL, 0, OBJ_TREE, tree->object.sha1);
1262
- merged_common_ancestors = make_virtual_commit(tree, "ancestor");
1263
- }
1264
-
1265
- for (iter = ca; iter; iter = iter->next) {
1266
- call_depth++;
1267
- /*
1268
- * When the merge fails, the result contains files
1269
- * with conflict markers. The cleanness flag is
1270
- * ignored, it was never actually used, as result of
1271
- * merge_trees has always overwritten it: the committed
1272
- * "conflicts" were already resolved.
1273
- */
1274
- discard_cache();
1275
- merge_recursive(merged_common_ancestors, iter->item,
1276
- "Temporary merge branch 1",
1277
- "Temporary merge branch 2",
1278
- NULL,
1279
- &merged_common_ancestors);
1280
- call_depth--;
1281
-
1282
- if (!merged_common_ancestors)
1283
- die("merge returned no commit");
1284
- }
1285
-
1286
- discard_cache();
1287
- if (!call_depth) {
1288
- read_cache();
1289
- index_only = 0;
1290
- } else
1291
- index_only = 1;
1292
-
1293
- clean = merge_trees(h1->tree, h2->tree, merged_common_ancestors->tree,
1294
- branch1, branch2, &mrtree);
1295
-
1296
- if (index_only) {
1297
- *result = make_virtual_commit(mrtree, "merged tree");
1298
- commit_list_insert(h1, &(*result)->parents);
1299
- commit_list_insert(h2, &(*result)->parents->next);
1300
- }
1301
- flush_output();
1302
- return clean;
1303
-}
1304
-
6
static const char *better_branch_name(const char *branch)
7
{
8
static char githead_env[8 + 40 + 1];
@@ -1334,23 +35,6 @@ static struct commit *get_ref(const char *ref)
35
return (struct commit *)object;
36
}
37
1337
-static int merge_config(const char *var, const char *value, void *cb)
1338
-{
1339
- if (!strcasecmp(var, "merge.verbosity")) {
1340
- verbosity = git_config_int(var, value);
1341
- return 0;
1342
- }
1343
- if (!strcasecmp(var, "diff.renamelimit")) {
1344
- diff_rename_limit = git_config_int(var, value);
1345
- return 0;
1346
- }
1347
- if (!strcasecmp(var, "merge.renamelimit")) {
1348
- merge_rename_limit = git_config_int(var, value);
1349
- return 0;
1350
- }
1351
- return git_default_config(var, value, cb);
1352
-}
1353
-
38
int cmd_merge_recursive(int argc, const char **argv, const char *prefix)
39
{
40
static const char *bases[20];
@@ -1361,6 +45,7 @@ int cmd_merge_recursive(int argc, const char **argv, const char *prefix)
45
struct commit_list *ca = NULL;
46
struct lock_file *lock = xcalloc(1, sizeof(struct lock_file));
47
int index_fd;
48
+ int subtree_merge = 0;
49
50
if (argv[0]) {
51
int namelen = strlen(argv[0]);
@@ -1369,10 +54,8 @@ int cmd_merge_recursive(int argc, const char **argv, const char *prefix)
54
subtree_merge = 1;
55
}
56
1372
- git_config(merge_config, NULL);
1373
- if (getenv("GIT_MERGE_VERBOSITY"))
1374
- verbosity = strtol(getenv("GIT_MERGE_VERBOSITY"), NULL, 10);
1375
-
57
+ git_config(merge_recursive_config, NULL);
58
+ merge_recursive_setup(subtree_merge);
59
if (argc < 4)
60
die("Usage: %s <base>... -- <head> <remote> ...\n", argv[0]);
61
@@ -1384,8 +67,6 @@ int cmd_merge_recursive(int argc, const char **argv, const char *prefix)
67
}
68
if (argc - i != 3) /* "--" "<head>" "<remote>" */
69
die("Not handling anything other than two heads merge.");
1387
- if (verbosity >= 5)
1388
- buffer_output = 0;
70
71
branch1 = argv[++i];
72
branch2 = argv[++i];
@@ -1396,7 +77,7 @@ int cmd_merge_recursive(int argc, const char **argv, const char *prefix)
77
branch1 = better_branch_name(branch1);
78
branch2 = better_branch_name(branch2);
79
1399
- if (show(3))
80
+ if (merge_recursive_verbosity >= 3)
81
printf("Merging %s with %s\n", branch1, branch2);
82
83
index_fd = hold_locked_index(lock, 1);
merge-recursive.c
new
+1331
@@ -0,0 +1,1331 @@
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 "cache-tree.h"
8
+#include "commit.h"
9
+#include "blob.h"
10
+#include "builtin.h"
11
+#include "tree-walk.h"
12
+#include "diff.h"
13
+#include "diffcore.h"
14
+#include "tag.h"
15
+#include "unpack-trees.h"
16
+#include "string-list.h"
17
+#include "xdiff-interface.h"
18
+#include "ll-merge.h"
19
+#include "interpolate.h"
20
+#include "attr.h"
21
+#include "merge-recursive.h"
22
+
23
+static int subtree_merge;
24
+
25
+static struct tree *shift_tree_object(struct tree *one, struct tree *two)
26
+{
27
+ unsigned char shifted[20];
28
+
29
+ /*
30
+ * NEEDSWORK: this limits the recursion depth to hardcoded
31
+ * value '2' to avoid excessive overhead.
32
+ */
33
+ shift_tree(one->object.sha1, two->object.sha1, shifted, 2);
34
+ if (!hashcmp(two->object.sha1, shifted))
35
+ return two;
36
+ return lookup_tree(shifted);
37
+}
38
+
39
+/*
40
+ * A virtual commit has
41
+ * - (const char *)commit->util set to the name, and
42
+ * - *(int *)commit->object.sha1 set to the virtual id.
43
+ */
44
+
45
+struct commit *make_virtual_commit(struct tree *tree, const char *comment)
46
+{
47
+ struct commit *commit = xcalloc(1, sizeof(struct commit));
48
+ static unsigned virtual_id = 1;
49
+ commit->tree = tree;
50
+ commit->util = (void*)comment;
51
+ *(int*)commit->object.sha1 = virtual_id++;
52
+ /* avoid warnings */
53
+ commit->object.parsed = 1;
54
+ return commit;
55
+}
56
+
57
+/*
58
+ * Since we use get_tree_entry(), which does not put the read object into
59
+ * the object pool, we cannot rely on a == b.
60
+ */
61
+static int sha_eq(const unsigned char *a, const unsigned char *b)
62
+{
63
+ if (!a && !b)
64
+ return 2;
65
+ return a && b && hashcmp(a, b) == 0;
66
+}
67
+
68
+/*
69
+ * Since we want to write the index eventually, we cannot reuse the index
70
+ * for these (temporary) data.
71
+ */
72
+struct stage_data
73
+{
74
+ struct
75
+ {
76
+ unsigned mode;
77
+ unsigned char sha[20];
78
+ } stages[4];
79
+ unsigned processed:1;
80
+};
81
+
82
+static struct string_list current_file_set = {NULL, 0, 0, 1};
83
+static struct string_list current_directory_set = {NULL, 0, 0, 1};
84
+
85
+static int call_depth = 0;
86
+int merge_recursive_verbosity = 2;
87
+static int diff_rename_limit = -1;
88
+static int merge_rename_limit = -1;
89
+static int buffer_output = 1;
90
+static struct strbuf obuf = STRBUF_INIT;
91
+
92
+static int show(int v)
93
+{
94
+ return (!call_depth && merge_recursive_verbosity >= v) ||
95
+ merge_recursive_verbosity >= 5;
96
+}
97
+
98
+static void flush_output(void)
99
+{
100
+ if (obuf.len) {
101
+ fputs(obuf.buf, stdout);
102
+ strbuf_reset(&obuf);
103
+ }
104
+}
105
+
106
+static void output(int v, const char *fmt, ...)
107
+{
108
+ int len;
109
+ va_list ap;
110
+
111
+ if (!show(v))
112
+ return;
113
+
114
+ strbuf_grow(&obuf, call_depth * 2 + 2);
115
+ memset(obuf.buf + obuf.len, ' ', call_depth * 2);
116
+ strbuf_setlen(&obuf, obuf.len + call_depth * 2);
117
+
118
+ va_start(ap, fmt);
119
+ len = vsnprintf(obuf.buf + obuf.len, strbuf_avail(&obuf), fmt, ap);
120
+ va_end(ap);
121
+
122
+ if (len < 0)
123
+ len = 0;
124
+ if (len >= strbuf_avail(&obuf)) {
125
+ strbuf_grow(&obuf, len + 2);
126
+ va_start(ap, fmt);
127
+ len = vsnprintf(obuf.buf + obuf.len, strbuf_avail(&obuf), fmt, ap);
128
+ va_end(ap);
129
+ if (len >= strbuf_avail(&obuf)) {
130
+ die("this should not happen, your snprintf is broken");
131
+ }
132
+ }
133
+ strbuf_setlen(&obuf, obuf.len + len);
134
+ strbuf_add(&obuf, "\n", 1);
135
+ if (!buffer_output)
136
+ flush_output();
137
+}
138
+
139
+static void output_commit_title(struct commit *commit)
140
+{
141
+ int i;
142
+ flush_output();
143
+ for (i = call_depth; i--;)
144
+ fputs(" ", stdout);
145
+ if (commit->util)
146
+ printf("virtual %s\n", (char *)commit->util);
147
+ else {
148
+ printf("%s ", find_unique_abbrev(commit->object.sha1, DEFAULT_ABBREV));
149
+ if (parse_commit(commit) != 0)
150
+ printf("(bad commit)\n");
151
+ else {
152
+ const char *s;
153
+ int len;
154
+ for (s = commit->buffer; *s; s++)
155
+ if (*s == '\n' && s[1] == '\n') {
156
+ s += 2;
157
+ break;
158
+ }
159
+ for (len = 0; s[len] && '\n' != s[len]; len++)
160
+ ; /* do nothing */
161
+ printf("%.*s\n", len, s);
162
+ }
163
+ }
164
+}
165
+
166
+static int add_cacheinfo(unsigned int mode, const unsigned char *sha1,
167
+ const char *path, int stage, int refresh, int options)
168
+{
169
+ struct cache_entry *ce;
170
+ ce = make_cache_entry(mode, sha1 ? sha1 : null_sha1, path, stage, refresh);
171
+ if (!ce)
172
+ return error("addinfo_cache failed for path '%s'", path);
173
+ return add_cache_entry(ce, options);
174
+}
175
+
176
+/*
177
+ * This is a global variable which is used in a number of places but
178
+ * only written to in the 'merge' function.
179
+ *
180
+ * index_only == 1 => Don't leave any non-stage 0 entries in the cache and
181
+ * don't update the working directory.
182
+ * 0 => Leave unmerged entries in the cache and update
183
+ * the working directory.
184
+ */
185
+static int index_only = 0;
186
+
187
+static void init_tree_desc_from_tree(struct tree_desc *desc, struct tree *tree)
188
+{
189
+ parse_tree(tree);
190
+ init_tree_desc(desc, tree->buffer, tree->size);
191
+}
192
+
193
+static int git_merge_trees(int index_only,
194
+ struct tree *common,
195
+ struct tree *head,
196
+ struct tree *merge)
197
+{
198
+ int rc;
199
+ struct tree_desc t[3];
200
+ struct unpack_trees_options opts;
201
+
202
+ memset(&opts, 0, sizeof(opts));
203
+ if (index_only)
204
+ opts.index_only = 1;
205
+ else
206
+ opts.update = 1;
207
+ opts.merge = 1;
208
+ opts.head_idx = 2;
209
+ opts.fn = threeway_merge;
210
+ opts.src_index = &the_index;
211
+ opts.dst_index = &the_index;
212
+
213
+ init_tree_desc_from_tree(t+0, common);
214
+ init_tree_desc_from_tree(t+1, head);
215
+ init_tree_desc_from_tree(t+2, merge);
216
+
217
+ rc = unpack_trees(3, t, &opts);
218
+ cache_tree_free(&active_cache_tree);
219
+ return rc;
220
+}
221
+
222
+struct tree *write_tree_from_memory(void)
223
+{
224
+ struct tree *result = NULL;
225
+
226
+ if (unmerged_cache()) {
227
+ int i;
228
+ output(0, "There are unmerged index entries:");
229
+ for (i = 0; i < active_nr; i++) {
230
+ struct cache_entry *ce = active_cache[i];
231
+ if (ce_stage(ce))
232
+ output(0, "%d %.*s", ce_stage(ce), ce_namelen(ce), ce->name);
233
+ }
234
+ return NULL;
235
+ }
236
+
237
+ if (!active_cache_tree)
238
+ active_cache_tree = cache_tree();
239
+
240
+ if (!cache_tree_fully_valid(active_cache_tree) &&
241
+ cache_tree_update(active_cache_tree,
242
+ active_cache, active_nr, 0, 0) < 0)
243
+ die("error building trees");
244
+
245
+ result = lookup_tree(active_cache_tree->sha1);
246
+
247
+ return result;
248
+}
249
+
250
+static int save_files_dirs(const unsigned char *sha1,
251
+ const char *base, int baselen, const char *path,
252
+ unsigned int mode, int stage, void *context)
253
+{
254
+ int len = strlen(path);
255
+ char *newpath = xmalloc(baselen + len + 1);
256
+ memcpy(newpath, base, baselen);
257
+ memcpy(newpath + baselen, path, len);
258
+ newpath[baselen + len] = '\0';
259
+
260
+ if (S_ISDIR(mode))
261
+ string_list_insert(newpath, ¤t_directory_set);
262
+ else
263
+ string_list_insert(newpath, ¤t_file_set);
264
+ free(newpath);
265
+
266
+ return READ_TREE_RECURSIVE;
267
+}
268
+
269
+static int get_files_dirs(struct tree *tree)
270
+{
271
+ int n;
272
+ if (read_tree_recursive(tree, "", 0, 0, NULL, save_files_dirs, NULL))
273
+ return 0;
274
+ n = current_file_set.nr + current_directory_set.nr;
275
+ return n;
276
+}
277
+
278
+/*
279
+ * Returns an index_entry instance which doesn't have to correspond to
280
+ * a real cache entry in Git's index.
281
+ */
282
+static struct stage_data *insert_stage_data(const char *path,
283
+ struct tree *o, struct tree *a, struct tree *b,
284
+ struct string_list *entries)
285
+{
286
+ struct string_list_item *item;
287
+ struct stage_data *e = xcalloc(1, sizeof(struct stage_data));
288
+ get_tree_entry(o->object.sha1, path,
289
+ e->stages[1].sha, &e->stages[1].mode);
290
+ get_tree_entry(a->object.sha1, path,
291
+ e->stages[2].sha, &e->stages[2].mode);
292
+ get_tree_entry(b->object.sha1, path,
293
+ e->stages[3].sha, &e->stages[3].mode);
294
+ item = string_list_insert(path, entries);
295
+ item->util = e;
296
+ return e;
297
+}
298
+
299
+/*
300
+ * Create a dictionary mapping file names to stage_data objects. The
301
+ * dictionary contains one entry for every path with a non-zero stage entry.
302
+ */
303
+static struct string_list *get_unmerged(void)
304
+{
305
+ struct string_list *unmerged = xcalloc(1, sizeof(struct string_list));
306
+ int i;
307
+
308
+ unmerged->strdup_strings = 1;
309
+
310
+ for (i = 0; i < active_nr; i++) {
311
+ struct string_list_item *item;
312
+ struct stage_data *e;
313
+ struct cache_entry *ce = active_cache[i];
314
+ if (!ce_stage(ce))
315
+ continue;
316
+
317
+ item = string_list_lookup(ce->name, unmerged);
318
+ if (!item) {
319
+ item = string_list_insert(ce->name, unmerged);
320
+ item->util = xcalloc(1, sizeof(struct stage_data));
321
+ }
322
+ e = item->util;
323
+ e->stages[ce_stage(ce)].mode = ce->ce_mode;
324
+ hashcpy(e->stages[ce_stage(ce)].sha, ce->sha1);
325
+ }
326
+
327
+ return unmerged;
328
+}
329
+
330
+struct rename
331
+{
332
+ struct diff_filepair *pair;
333
+ struct stage_data *src_entry;
334
+ struct stage_data *dst_entry;
335
+ unsigned processed:1;
336
+};
337
+
338
+/*
339
+ * Get information of all renames which occurred between 'o_tree' and
340
+ * 'tree'. We need the three trees in the merge ('o_tree', 'a_tree' and
341
+ * 'b_tree') to be able to associate the correct cache entries with
342
+ * the rename information. 'tree' is always equal to either a_tree or b_tree.
343
+ */
344
+static struct string_list *get_renames(struct tree *tree,
345
+ struct tree *o_tree,
346
+ struct tree *a_tree,
347
+ struct tree *b_tree,
348
+ struct string_list *entries)
349
+{
350
+ int i;
351
+ struct string_list *renames;
352
+ struct diff_options opts;
353
+
354
+ renames = xcalloc(1, sizeof(struct string_list));
355
+ diff_setup(&opts);
356
+ DIFF_OPT_SET(&opts, RECURSIVE);
357
+ opts.detect_rename = DIFF_DETECT_RENAME;
358
+ opts.rename_limit = merge_rename_limit >= 0 ? merge_rename_limit :
359
+ diff_rename_limit >= 0 ? diff_rename_limit :
360
+ 500;
361
+ opts.warn_on_too_large_rename = 1;
362
+ opts.output_format = DIFF_FORMAT_NO_OUTPUT;
363
+ if (diff_setup_done(&opts) < 0)
364
+ die("diff setup failed");
365
+ diff_tree_sha1(o_tree->object.sha1, tree->object.sha1, "", &opts);
366
+ diffcore_std(&opts);
367
+ for (i = 0; i < diff_queued_diff.nr; ++i) {
368
+ struct string_list_item *item;
369
+ struct rename *re;
370
+ struct diff_filepair *pair = diff_queued_diff.queue[i];
371
+ if (pair->status != 'R') {
372
+ diff_free_filepair(pair);
373
+ continue;
374
+ }
375
+ re = xmalloc(sizeof(*re));
376
+ re->processed = 0;
377
+ re->pair = pair;
378
+ item = string_list_lookup(re->pair->one->path, entries);
379
+ if (!item)
380
+ re->src_entry = insert_stage_data(re->pair->one->path,
381
+ o_tree, a_tree, b_tree, entries);
382
+ else
383
+ re->src_entry = item->util;
384
+
385
+ item = string_list_lookup(re->pair->two->path, entries);
386
+ if (!item)
387
+ re->dst_entry = insert_stage_data(re->pair->two->path,
388
+ o_tree, a_tree, b_tree, entries);
389
+ else
390
+ re->dst_entry = item->util;
391
+ item = string_list_insert(pair->one->path, renames);
392
+ item->util = re;
393
+ }
394
+ opts.output_format = DIFF_FORMAT_NO_OUTPUT;
395
+ diff_queued_diff.nr = 0;
396
+ diff_flush(&opts);
397
+ return renames;
398
+}
399
+
400
+static int update_stages(const char *path, struct diff_filespec *o,
401
+ struct diff_filespec *a, struct diff_filespec *b,
402
+ int clear)
403
+{
404
+ int options = ADD_CACHE_OK_TO_ADD | ADD_CACHE_OK_TO_REPLACE;
405
+ if (clear)
406
+ if (remove_file_from_cache(path))
407
+ return -1;
408
+ if (o)
409
+ if (add_cacheinfo(o->mode, o->sha1, path, 1, 0, options))
410
+ return -1;
411
+ if (a)
412
+ if (add_cacheinfo(a->mode, a->sha1, path, 2, 0, options))
413
+ return -1;
414
+ if (b)
415
+ if (add_cacheinfo(b->mode, b->sha1, path, 3, 0, options))
416
+ return -1;
417
+ return 0;
418
+}
419
+
420
+static int remove_path(const char *name)
421
+{
422
+ int ret;
423
+ char *slash, *dirs;
424
+
425
+ ret = unlink(name);
426
+ if (ret)
427
+ return ret;
428
+ dirs = xstrdup(name);
429
+ while ((slash = strrchr(name, '/'))) {
430
+ *slash = '\0';
431
+ if (rmdir(name) != 0)
432
+ break;
433
+ }
434
+ free(dirs);
435
+ return ret;
436
+}
437
+
438
+static int remove_file(int clean, const char *path, int no_wd)
439
+{
440
+ int update_cache = index_only || clean;
441
+ int update_working_directory = !index_only && !no_wd;
442
+
443
+ if (update_cache) {
444
+ if (remove_file_from_cache(path))
445
+ return -1;
446
+ }
447
+ if (update_working_directory) {
448
+ unlink(path);
449
+ if (errno != ENOENT || errno != EISDIR)
450
+ return -1;
451
+ remove_path(path);
452
+ }
453
+ return 0;
454
+}
455
+
456
+static char *unique_path(const char *path, const char *branch)
457
+{
458
+ char *newpath = xmalloc(strlen(path) + 1 + strlen(branch) + 8 + 1);
459
+ int suffix = 0;
460
+ struct stat st;
461
+ char *p = newpath + strlen(path);
462
+ strcpy(newpath, path);
463
+ *(p++) = '~';
464
+ strcpy(p, branch);
465
+ for (; *p; ++p)
466
+ if ('/' == *p)
467
+ *p = '_';
468
+ while (string_list_has_string(¤t_file_set, newpath) ||
469
+ string_list_has_string(¤t_directory_set, newpath) ||
470
+ lstat(newpath, &st) == 0)
471
+ sprintf(p, "_%d", suffix++);
472
+
473
+ string_list_insert(newpath, ¤t_file_set);
474
+ return newpath;
475
+}
476
+
477
+static void flush_buffer(int fd, const char *buf, unsigned long size)
478
+{
479
+ while (size > 0) {
480
+ long ret = write_in_full(fd, buf, size);
481
+ if (ret < 0) {
482
+ /* Ignore epipe */
483
+ if (errno == EPIPE)
484
+ break;
485
+ die("merge-recursive: %s", strerror(errno));
486
+ } else if (!ret) {
487
+ die("merge-recursive: disk full?");
488
+ }
489
+ size -= ret;
490
+ buf += ret;
491
+ }
492
+}
493
+
494
+static int make_room_for_path(const char *path)
495
+{
496
+ int status;
497
+ const char *msg = "failed to create path '%s'%s";
498
+
499
+ status = safe_create_leading_directories_const(path);
500
+ if (status) {
501
+ if (status == -3) {
502
+ /* something else exists */
503
+ error(msg, path, ": perhaps a D/F conflict?");
504
+ return -1;
505
+ }
506
+ die(msg, path, "");
507
+ }
508
+
509
+ /* Successful unlink is good.. */
510
+ if (!unlink(path))
511
+ return 0;
512
+ /* .. and so is no existing file */
513
+ if (errno == ENOENT)
514
+ return 0;
515
+ /* .. but not some other error (who really cares what?) */
516
+ return error(msg, path, ": perhaps a D/F conflict?");
517
+}
518
+
519
+static void update_file_flags(const unsigned char *sha,
520
+ unsigned mode,
521
+ const char *path,
522
+ int update_cache,
523
+ int update_wd)
524
+{
525
+ if (index_only)
526
+ update_wd = 0;
527
+
528
+ if (update_wd) {
529
+ enum object_type type;
530
+ void *buf;
531
+ unsigned long size;
532
+
533
+ if (S_ISGITLINK(mode))
534
+ die("cannot read object %s '%s': It is a submodule!",
535
+ sha1_to_hex(sha), path);
536
+
537
+ buf = read_sha1_file(sha, &type, &size);
538
+ if (!buf)
539
+ die("cannot read object %s '%s'", sha1_to_hex(sha), path);
540
+ if (type != OBJ_BLOB)
541
+ die("blob expected for %s '%s'", sha1_to_hex(sha), path);
542
+ if (S_ISREG(mode)) {
543
+ struct strbuf strbuf;
544
+ strbuf_init(&strbuf, 0);
545
+ if (convert_to_working_tree(path, buf, size, &strbuf)) {
546
+ free(buf);
547
+ size = strbuf.len;
548
+ buf = strbuf_detach(&strbuf, NULL);
549
+ }
550
+ }
551
+
552
+ if (make_room_for_path(path) < 0) {
553
+ update_wd = 0;
554
+ free(buf);
555
+ goto update_index;
556
+ }
557
+ if (S_ISREG(mode) || (!has_symlinks && S_ISLNK(mode))) {
558
+ int fd;
559
+ if (mode & 0100)
560
+ mode = 0777;
561
+ else
562
+ mode = 0666;
563
+ fd = open(path, O_WRONLY | O_TRUNC | O_CREAT, mode);
564
+ if (fd < 0)
565
+ die("failed to open %s: %s", path, strerror(errno));
566
+ flush_buffer(fd, buf, size);
567
+ close(fd);
568
+ } else if (S_ISLNK(mode)) {
569
+ char *lnk = xmemdupz(buf, size);
570
+ safe_create_leading_directories_const(path);
571
+ unlink(path);
572
+ symlink(lnk, path);
573
+ free(lnk);
574
+ } else
575
+ die("do not know what to do with %06o %s '%s'",
576
+ mode, sha1_to_hex(sha), path);
577
+ free(buf);
578
+ }
579
+ update_index:
580
+ if (update_cache)
581
+ add_cacheinfo(mode, sha, path, 0, update_wd, ADD_CACHE_OK_TO_ADD);
582
+}
583
+
584
+static void update_file(int clean,
585
+ const unsigned char *sha,
586
+ unsigned mode,
587
+ const char *path)
588
+{
589
+ update_file_flags(sha, mode, path, index_only || clean, !index_only);
590
+}
591
+
592
+/* Low level file merging, update and removal */
593
+
594
+struct merge_file_info
595
+{
596
+ unsigned char sha[20];
597
+ unsigned mode;
598
+ unsigned clean:1,
599
+ merge:1;
600
+};
601
+
602
+static void fill_mm(const unsigned char *sha1, mmfile_t *mm)
603
+{
604
+ unsigned long size;
605
+ enum object_type type;
606
+
607
+ if (!hashcmp(sha1, null_sha1)) {
608
+ mm->ptr = xstrdup("");
609
+ mm->size = 0;
610
+ return;
611
+ }
612
+
613
+ mm->ptr = read_sha1_file(sha1, &type, &size);
614
+ if (!mm->ptr || type != OBJ_BLOB)
615
+ die("unable to read blob object %s", sha1_to_hex(sha1));
616
+ mm->size = size;
617
+}
618
+
619
+static int merge_3way(mmbuffer_t *result_buf,
620
+ struct diff_filespec *o,
621
+ struct diff_filespec *a,
622
+ struct diff_filespec *b,
623
+ const char *branch1,
624
+ const char *branch2)
625
+{
626
+ mmfile_t orig, src1, src2;
627
+ char *name1, *name2;
628
+ int merge_status;
629
+
630
+ name1 = xstrdup(mkpath("%s:%s", branch1, a->path));
631
+ name2 = xstrdup(mkpath("%s:%s", branch2, b->path));
632
+
633
+ fill_mm(o->sha1, &orig);
634
+ fill_mm(a->sha1, &src1);
635
+ fill_mm(b->sha1, &src2);
636
+
637
+ merge_status = ll_merge(result_buf, a->path, &orig,
638
+ &src1, name1, &src2, name2,
639
+ index_only);
640
+
641
+ free(name1);
642
+ free(name2);
643
+ free(orig.ptr);
644
+ free(src1.ptr);
645
+ free(src2.ptr);
646
+ return merge_status;
647
+}
648
+
649
+static struct merge_file_info merge_file(struct diff_filespec *o,
650
+ struct diff_filespec *a, struct diff_filespec *b,
651
+ const char *branch1, const char *branch2)
652
+{
653
+ struct merge_file_info result;
654
+ result.merge = 0;
655
+ result.clean = 1;
656
+
657
+ if ((S_IFMT & a->mode) != (S_IFMT & b->mode)) {
658
+ result.clean = 0;
659
+ if (S_ISREG(a->mode)) {
660
+ result.mode = a->mode;
661
+ hashcpy(result.sha, a->sha1);
662
+ } else {
663
+ result.mode = b->mode;
664
+ hashcpy(result.sha, b->sha1);
665
+ }
666
+ } else {
667
+ if (!sha_eq(a->sha1, o->sha1) && !sha_eq(b->sha1, o->sha1))
668
+ result.merge = 1;
669
+
670
+ /*
671
+ * Merge modes
672
+ */
673
+ if (a->mode == b->mode || a->mode == o->mode)
674
+ result.mode = b->mode;
675
+ else {
676
+ result.mode = a->mode;
677
+ if (b->mode != o->mode) {
678
+ result.clean = 0;
679
+ result.merge = 1;
680
+ }
681
+ }
682
+
683
+ if (sha_eq(a->sha1, b->sha1) || sha_eq(a->sha1, o->sha1))
684
+ hashcpy(result.sha, b->sha1);
685
+ else if (sha_eq(b->sha1, o->sha1))
686
+ hashcpy(result.sha, a->sha1);
687
+ else if (S_ISREG(a->mode)) {
688
+ mmbuffer_t result_buf;
689
+ int merge_status;
690
+
691
+ merge_status = merge_3way(&result_buf, o, a, b,
692
+ branch1, branch2);
693
+
694
+ if ((merge_status < 0) || !result_buf.ptr)
695
+ die("Failed to execute internal merge");
696
+
697
+ if (write_sha1_file(result_buf.ptr, result_buf.size,
698
+ blob_type, result.sha))
699
+ die("Unable to add %s to database",
700
+ a->path);
701
+
702
+ free(result_buf.ptr);
703
+ result.clean = (merge_status == 0);
704
+ } else if (S_ISGITLINK(a->mode)) {
705
+ result.clean = 0;
706
+ hashcpy(result.sha, a->sha1);
707
+ } else if (S_ISLNK(a->mode)) {
708
+ hashcpy(result.sha, a->sha1);
709
+
710
+ if (!sha_eq(a->sha1, b->sha1))
711
+ result.clean = 0;
712
+ } else {
713
+ die("unsupported object type in the tree");
714
+ }
715
+ }
716
+
717
+ return result;
718
+}
719
+
720
+static void conflict_rename_rename(struct rename *ren1,
721
+ const char *branch1,
722
+ struct rename *ren2,
723
+ const char *branch2)
724
+{
725
+ char *del[2];
726
+ int delp = 0;
727
+ const char *ren1_dst = ren1->pair->two->path;
728
+ const char *ren2_dst = ren2->pair->two->path;
729
+ const char *dst_name1 = ren1_dst;
730
+ const char *dst_name2 = ren2_dst;
731
+ if (string_list_has_string(¤t_directory_set, ren1_dst)) {
732
+ dst_name1 = del[delp++] = unique_path(ren1_dst, branch1);
733
+ output(1, "%s is a directory in %s adding as %s instead",
734
+ ren1_dst, branch2, dst_name1);
735
+ remove_file(0, ren1_dst, 0);
736
+ }
737
+ if (string_list_has_string(¤t_directory_set, ren2_dst)) {
738
+ dst_name2 = del[delp++] = unique_path(ren2_dst, branch2);
739
+ output(1, "%s is a directory in %s adding as %s instead",
740
+ ren2_dst, branch1, dst_name2);
741
+ remove_file(0, ren2_dst, 0);
742
+ }
743
+ if (index_only) {
744
+ remove_file_from_cache(dst_name1);
745
+ remove_file_from_cache(dst_name2);
746
+ /*
747
+ * Uncomment to leave the conflicting names in the resulting tree
748
+ *
749
+ * update_file(0, ren1->pair->two->sha1, ren1->pair->two->mode, dst_name1);
750
+ * update_file(0, ren2->pair->two->sha1, ren2->pair->two->mode, dst_name2);
751
+ */
752
+ } else {
753
+ update_stages(dst_name1, NULL, ren1->pair->two, NULL, 1);
754
+ update_stages(dst_name2, NULL, NULL, ren2->pair->two, 1);
755
+ }
756
+ while (delp--)
757
+ free(del[delp]);
758
+}
759
+
760
+static void conflict_rename_dir(struct rename *ren1,
761
+ const char *branch1)
762
+{
763
+ char *new_path = unique_path(ren1->pair->two->path, branch1);
764
+ output(1, "Renaming %s to %s instead", ren1->pair->one->path, new_path);
765
+ remove_file(0, ren1->pair->two->path, 0);
766
+ update_file(0, ren1->pair->two->sha1, ren1->pair->two->mode, new_path);
767
+ free(new_path);
768
+}
769
+
770
+static void conflict_rename_rename_2(struct rename *ren1,
771
+ const char *branch1,
772
+ struct rename *ren2,
773
+ const char *branch2)
774
+{
775
+ char *new_path1 = unique_path(ren1->pair->two->path, branch1);
776
+ char *new_path2 = unique_path(ren2->pair->two->path, branch2);
777
+ output(1, "Renaming %s to %s and %s to %s instead",
778
+ ren1->pair->one->path, new_path1,
779
+ ren2->pair->one->path, new_path2);
780
+ remove_file(0, ren1->pair->two->path, 0);
781
+ update_file(0, ren1->pair->two->sha1, ren1->pair->two->mode, new_path1);
782
+ update_file(0, ren2->pair->two->sha1, ren2->pair->two->mode, new_path2);
783
+ free(new_path2);
784
+ free(new_path1);
785
+}
786
+
787
+static int process_renames(struct string_list *a_renames,
788
+ struct string_list *b_renames,
789
+ const char *a_branch,
790
+ const char *b_branch)
791
+{
792
+ int clean_merge = 1, i, j;
793
+ struct string_list a_by_dst = {NULL, 0, 0, 0}, b_by_dst = {NULL, 0, 0, 0};
794
+ const struct rename *sre;
795
+
796
+ for (i = 0; i < a_renames->nr; i++) {
797
+ sre = a_renames->items[i].util;
798
+ string_list_insert(sre->pair->two->path, &a_by_dst)->util
799
+ = sre->dst_entry;
800
+ }
801
+ for (i = 0; i < b_renames->nr; i++) {
802
+ sre = b_renames->items[i].util;
803
+ string_list_insert(sre->pair->two->path, &b_by_dst)->util
804
+ = sre->dst_entry;
805
+ }
806
+
807
+ for (i = 0, j = 0; i < a_renames->nr || j < b_renames->nr;) {
808
+ int compare;
809
+ char *src;
810
+ struct string_list *renames1, *renames2, *renames2Dst;
811
+ struct rename *ren1 = NULL, *ren2 = NULL;
812
+ const char *branch1, *branch2;
813
+ const char *ren1_src, *ren1_dst;
814
+
815
+ if (i >= a_renames->nr) {
816
+ compare = 1;
817
+ ren2 = b_renames->items[j++].util;
818
+ } else if (j >= b_renames->nr) {
819
+ compare = -1;
820
+ ren1 = a_renames->items[i++].util;
821
+ } else {
822
+ compare = strcmp(a_renames->items[i].string,
823
+ b_renames->items[j].string);
824
+ if (compare <= 0)
825
+ ren1 = a_renames->items[i++].util;
826
+ if (compare >= 0)
827
+ ren2 = b_renames->items[j++].util;
828
+ }
829
+
830
+ /* TODO: refactor, so that 1/2 are not needed */
831
+ if (ren1) {
832
+ renames1 = a_renames;
833
+ renames2 = b_renames;
834
+ renames2Dst = &b_by_dst;
835
+ branch1 = a_branch;
836
+ branch2 = b_branch;
837
+ } else {
838
+ struct rename *tmp;
839
+ renames1 = b_renames;
840
+ renames2 = a_renames;
841
+ renames2Dst = &a_by_dst;
842
+ branch1 = b_branch;
843
+ branch2 = a_branch;
844
+ tmp = ren2;
845
+ ren2 = ren1;
846
+ ren1 = tmp;
847
+ }
848
+ src = ren1->pair->one->path;
849
+
850
+ ren1->dst_entry->processed = 1;
851
+ ren1->src_entry->processed = 1;
852
+
853
+ if (ren1->processed)
854
+ continue;
855
+ ren1->processed = 1;
856
+
857
+ ren1_src = ren1->pair->one->path;
858
+ ren1_dst = ren1->pair->two->path;
859
+
860
+ if (ren2) {
861
+ const char *ren2_src = ren2->pair->one->path;
862
+ const char *ren2_dst = ren2->pair->two->path;
863
+ /* Renamed in 1 and renamed in 2 */
864
+ if (strcmp(ren1_src, ren2_src) != 0)
865
+ die("ren1.src != ren2.src");
866
+ ren2->dst_entry->processed = 1;
867
+ ren2->processed = 1;
868
+ if (strcmp(ren1_dst, ren2_dst) != 0) {
869
+ clean_merge = 0;
870
+ output(1, "CONFLICT (rename/rename): "
871
+ "Rename \"%s\"->\"%s\" in branch \"%s\" "
872
+ "rename \"%s\"->\"%s\" in \"%s\"%s",
873
+ src, ren1_dst, branch1,
874
+ src, ren2_dst, branch2,
875
+ index_only ? " (left unresolved)": "");
876
+ if (index_only) {
877
+ remove_file_from_cache(src);
878
+ update_file(0, ren1->pair->one->sha1,
879
+ ren1->pair->one->mode, src);
880
+ }
881
+ conflict_rename_rename(ren1, branch1, ren2, branch2);
882
+ } else {
883
+ struct merge_file_info mfi;
884
+ remove_file(1, ren1_src, 1);
885
+ mfi = merge_file(ren1->pair->one,
886
+ ren1->pair->two,
887
+ ren2->pair->two,
888
+ branch1,
889
+ branch2);
890
+ if (mfi.merge || !mfi.clean)
891
+ output(1, "Renaming %s->%s", src, ren1_dst);
892
+
893
+ if (mfi.merge)
894
+ output(2, "Auto-merging %s", ren1_dst);
895
+
896
+ if (!mfi.clean) {
897
+ output(1, "CONFLICT (content): merge conflict in %s",
898
+ ren1_dst);
899
+ clean_merge = 0;
900
+
901
+ if (!index_only)
902
+ update_stages(ren1_dst,
903
+ ren1->pair->one,
904
+ ren1->pair->two,
905
+ ren2->pair->two,
906
+ 1 /* clear */);
907
+ }
908
+ update_file(mfi.clean, mfi.sha, mfi.mode, ren1_dst);
909
+ }
910
+ } else {
911
+ /* Renamed in 1, maybe changed in 2 */
912
+ struct string_list_item *item;
913
+ /* we only use sha1 and mode of these */
914
+ struct diff_filespec src_other, dst_other;
915
+ int try_merge, stage = a_renames == renames1 ? 3: 2;
916
+
917
+ remove_file(1, ren1_src, index_only || stage == 3);
918
+
919
+ hashcpy(src_other.sha1, ren1->src_entry->stages[stage].sha);
920
+ src_other.mode = ren1->src_entry->stages[stage].mode;
921
+ hashcpy(dst_other.sha1, ren1->dst_entry->stages[stage].sha);
922
+ dst_other.mode = ren1->dst_entry->stages[stage].mode;
923
+
924
+ try_merge = 0;
925
+
926
+ if (string_list_has_string(¤t_directory_set, ren1_dst)) {
927
+ clean_merge = 0;
928
+ output(1, "CONFLICT (rename/directory): Rename %s->%s in %s "
929
+ " directory %s added in %s",
930
+ ren1_src, ren1_dst, branch1,
931
+ ren1_dst, branch2);
932
+ conflict_rename_dir(ren1, branch1);
933
+ } else if (sha_eq(src_other.sha1, null_sha1)) {
934
+ clean_merge = 0;
935
+ output(1, "CONFLICT (rename/delete): Rename %s->%s in %s "
936
+ "and deleted in %s",
937
+ ren1_src, ren1_dst, branch1,
938
+ branch2);
939
+ update_file(0, ren1->pair->two->sha1, ren1->pair->two->mode, ren1_dst);
940
+ } else if (!sha_eq(dst_other.sha1, null_sha1)) {
941
+ const char *new_path;
942
+ clean_merge = 0;
943
+ try_merge = 1;
944
+ output(1, "CONFLICT (rename/add): Rename %s->%s in %s. "
945
+ "%s added in %s",
946
+ ren1_src, ren1_dst, branch1,
947
+ ren1_dst, branch2);
948
+ new_path = unique_path(ren1_dst, branch2);
949
+ output(1, "Adding as %s instead", new_path);
950
+ update_file(0, dst_other.sha1, dst_other.mode, new_path);
951
+ } else if ((item = string_list_lookup(ren1_dst, renames2Dst))) {
952
+ ren2 = item->util;
953
+ clean_merge = 0;
954
+ ren2->processed = 1;
955
+ output(1, "CONFLICT (rename/rename): Rename %s->%s in %s. "
956
+ "Rename %s->%s in %s",
957
+ ren1_src, ren1_dst, branch1,
958
+ ren2->pair->one->path, ren2->pair->two->path, branch2);
959
+ conflict_rename_rename_2(ren1, branch1, ren2, branch2);
960
+ } else
961
+ try_merge = 1;
962
+
963
+ if (try_merge) {
964
+ struct diff_filespec *o, *a, *b;
965
+ struct merge_file_info mfi;
966
+ src_other.path = (char *)ren1_src;
967
+
968
+ o = ren1->pair->one;
969
+ if (a_renames == renames1) {
970
+ a = ren1->pair->two;
971
+ b = &src_other;
972
+ } else {
973
+ b = ren1->pair->two;
974
+ a = &src_other;
975
+ }
976
+ mfi = merge_file(o, a, b,
977
+ a_branch, b_branch);
978
+
979
+ if (mfi.clean &&
980
+ sha_eq(mfi.sha, ren1->pair->two->sha1) &&
981
+ mfi.mode == ren1->pair->two->mode)
982
+ /*
983
+ * This messaged is part of
984
+ * t6022 test. If you change
985
+ * it update the test too.
986
+ */
987
+ output(3, "Skipped %s (merged same as existing)", ren1_dst);
988
+ else {
989
+ if (mfi.merge || !mfi.clean)
990
+ output(1, "Renaming %s => %s", ren1_src, ren1_dst);
991
+ if (mfi.merge)
992
+ output(2, "Auto-merging %s", ren1_dst);
993
+ if (!mfi.clean) {
994
+ output(1, "CONFLICT (rename/modify): Merge conflict in %s",
995
+ ren1_dst);
996
+ clean_merge = 0;
997
+
998
+ if (!index_only)
999
+ update_stages(ren1_dst,
1000
+ o, a, b, 1);
1001
+ }
1002
+ update_file(mfi.clean, mfi.sha, mfi.mode, ren1_dst);
1003
+ }
1004
+ }
1005
+ }
1006
+ }
1007
+ string_list_clear(&a_by_dst, 0);
1008
+ string_list_clear(&b_by_dst, 0);
1009
+
1010
+ return clean_merge;
1011
+}
1012
+
1013
+static unsigned char *stage_sha(const unsigned char *sha, unsigned mode)
1014
+{
1015
+ return (is_null_sha1(sha) || mode == 0) ? NULL: (unsigned char *)sha;
1016
+}
1017
+
1018
+/* Per entry merge function */
1019
+static int process_entry(const char *path, struct stage_data *entry,
1020
+ const char *branch1,
1021
+ const char *branch2)
1022
+{
1023
+ /*
1024
+ printf("processing entry, clean cache: %s\n", index_only ? "yes": "no");
1025
+ print_index_entry("\tpath: ", entry);
1026
+ */
1027
+ int clean_merge = 1;
1028
+ unsigned o_mode = entry->stages[1].mode;
1029
+ unsigned a_mode = entry->stages[2].mode;
1030
+ unsigned b_mode = entry->stages[3].mode;
1031
+ unsigned char *o_sha = stage_sha(entry->stages[1].sha, o_mode);
1032
+ unsigned char *a_sha = stage_sha(entry->stages[2].sha, a_mode);
1033
+ unsigned char *b_sha = stage_sha(entry->stages[3].sha, b_mode);
1034
+
1035
+ if (o_sha && (!a_sha || !b_sha)) {
1036
+ /* Case A: Deleted in one */
1037
+ if ((!a_sha && !b_sha) ||
1038
+ (sha_eq(a_sha, o_sha) && !b_sha) ||
1039
+ (!a_sha && sha_eq(b_sha, o_sha))) {
1040
+ /* Deleted in both or deleted in one and
1041
+ * unchanged in the other */
1042
+ if (a_sha)
1043
+ output(2, "Removing %s", path);
1044
+ /* do not touch working file if it did not exist */
1045
+ remove_file(1, path, !a_sha);
1046
+ } else {
1047
+ /* Deleted in one and changed in the other */
1048
+ clean_merge = 0;
1049
+ if (!a_sha) {
1050
+ output(1, "CONFLICT (delete/modify): %s deleted in %s "
1051
+ "and modified in %s. Version %s of %s left in tree.",
1052
+ path, branch1,
1053
+ branch2, branch2, path);
1054
+ update_file(0, b_sha, b_mode, path);
1055
+ } else {
1056
+ output(1, "CONFLICT (delete/modify): %s deleted in %s "
1057
+ "and modified in %s. Version %s of %s left in tree.",
1058
+ path, branch2,
1059
+ branch1, branch1, path);
1060
+ update_file(0, a_sha, a_mode, path);
1061
+ }
1062
+ }
1063
+
1064
+ } else if ((!o_sha && a_sha && !b_sha) ||
1065
+ (!o_sha && !a_sha && b_sha)) {
1066
+ /* Case B: Added in one. */
1067
+ const char *add_branch;
1068
+ const char *other_branch;
1069
+ unsigned mode;
1070
+ const unsigned char *sha;
1071
+ const char *conf;
1072
+
1073
+ if (a_sha) {
1074
+ add_branch = branch1;
1075
+ other_branch = branch2;
1076
+ mode = a_mode;
1077
+ sha = a_sha;
1078
+ conf = "file/directory";
1079
+ } else {
1080
+ add_branch = branch2;
1081
+ other_branch = branch1;
1082
+ mode = b_mode;
1083
+ sha = b_sha;
1084
+ conf = "directory/file";
1085
+ }
1086
+ if (string_list_has_string(¤t_directory_set, path)) {
1087
+ const char *new_path = unique_path(path, add_branch);
1088
+ clean_merge = 0;
1089
+ output(1, "CONFLICT (%s): There is a directory with name %s in %s. "
1090
+ "Adding %s as %s",
1091
+ conf, path, other_branch, path, new_path);
1092
+ remove_file(0, path, 0);
1093
+ update_file(0, sha, mode, new_path);
1094
+ } else {
1095
+ output(2, "Adding %s", path);
1096
+ update_file(1, sha, mode, path);
1097
+ }
1098
+ } else if (a_sha && b_sha) {
1099
+ /* Case C: Added in both (check for same permissions) and */
1100
+ /* case D: Modified in both, but differently. */
1101
+ const char *reason = "content";
1102
+ struct merge_file_info mfi;
1103
+ struct diff_filespec o, a, b;
1104
+
1105
+ if (!o_sha) {
1106
+ reason = "add/add";
1107
+ o_sha = (unsigned char *)null_sha1;
1108
+ }
1109
+ output(2, "Auto-merging %s", path);
1110
+ o.path = a.path = b.path = (char *)path;
1111
+ hashcpy(o.sha1, o_sha);
1112
+ o.mode = o_mode;
1113
+ hashcpy(a.sha1, a_sha);
1114
+ a.mode = a_mode;
1115
+ hashcpy(b.sha1, b_sha);
1116
+ b.mode = b_mode;
1117
+
1118
+ mfi = merge_file(&o, &a, &b,
1119
+ branch1, branch2);
1120
+
1121
+ clean_merge = mfi.clean;
1122
+ if (mfi.clean)
1123
+ update_file(1, mfi.sha, mfi.mode, path);
1124
+ else if (S_ISGITLINK(mfi.mode))
1125
+ output(1, "CONFLICT (submodule): Merge conflict in %s "
1126
+ "- needs %s", path, sha1_to_hex(b.sha1));
1127
+ else {
1128
+ output(1, "CONFLICT (%s): Merge conflict in %s",
1129
+ reason, path);
1130
+
1131
+ if (index_only)
1132
+ update_file(0, mfi.sha, mfi.mode, path);
1133
+ else
1134
+ update_file_flags(mfi.sha, mfi.mode, path,
1135
+ 0 /* update_cache */, 1 /* update_working_directory */);
1136
+ }
1137
+ } else if (!o_sha && !a_sha && !b_sha) {
1138
+ /*
1139
+ * this entry was deleted altogether. a_mode == 0 means
1140
+ * we had that path and want to actively remove it.
1141
+ */
1142
+ remove_file(1, path, !a_mode);
1143
+ } else
1144
+ die("Fatal merge failure, shouldn't happen.");
1145
+
1146
+ return clean_merge;
1147
+}
1148
+
1149
+int merge_trees(struct tree *head,
1150
+ struct tree *merge,
1151
+ struct tree *common,
1152
+ const char *branch1,
1153
+ const char *branch2,
1154
+ struct tree **result)
1155
+{
1156
+ int code, clean;
1157
+
1158
+ if (subtree_merge) {
1159
+ merge = shift_tree_object(head, merge);
1160
+ common = shift_tree_object(head, common);
1161
+ }
1162
+
1163
+ if (sha_eq(common->object.sha1, merge->object.sha1)) {
1164
+ output(0, "Already uptodate!");
1165
+ *result = head;
1166
+ return 1;
1167
+ }
1168
+
1169
+ code = git_merge_trees(index_only, common, head, merge);
1170
+
1171
+ if (code != 0)
1172
+ die("merging of trees %s and %s failed",
1173
+ sha1_to_hex(head->object.sha1),
1174
+ sha1_to_hex(merge->object.sha1));
1175
+
1176
+ if (unmerged_cache()) {
1177
+ struct string_list *entries, *re_head, *re_merge;
1178
+ int i;
1179
+ string_list_clear(¤t_file_set, 1);
1180
+ string_list_clear(¤t_directory_set, 1);
1181
+ get_files_dirs(head);
1182
+ get_files_dirs(merge);
1183
+
1184
+ entries = get_unmerged();
1185
+ re_head = get_renames(head, common, head, merge, entries);
1186
+ re_merge = get_renames(merge, common, head, merge, entries);
1187
+ clean = process_renames(re_head, re_merge,
1188
+ branch1, branch2);
1189
+ for (i = 0; i < entries->nr; i++) {
1190
+ const char *path = entries->items[i].string;
1191
+ struct stage_data *e = entries->items[i].util;
1192
+ if (!e->processed
1193
+ && !process_entry(path, e, branch1, branch2))
1194
+ clean = 0;
1195
+ }
1196
+
1197
+ string_list_clear(re_merge, 0);
1198
+ string_list_clear(re_head, 0);
1199
+ string_list_clear(entries, 1);
1200
+
1201
+ }
1202
+ else
1203
+ clean = 1;
1204
+
1205
+ if (index_only)
1206
+ *result = write_tree_from_memory();
1207
+
1208
+ return clean;
1209
+}
1210
+
1211
+static struct commit_list *reverse_commit_list(struct commit_list *list)
1212
+{
1213
+ struct commit_list *next = NULL, *current, *backup;
1214
+ for (current = list; current; current = backup) {
1215
+ backup = current->next;
1216
+ current->next = next;
1217
+ next = current;
1218
+ }
1219
+ return next;
1220
+}
1221
+
1222
+/*
1223
+ * Merge the commits h1 and h2, return the resulting virtual
1224
+ * commit object and a flag indicating the cleanness of the merge.
1225
+ */
1226
+int merge_recursive(struct commit *h1,
1227
+ struct commit *h2,
1228
+ const char *branch1,
1229
+ const char *branch2,
1230
+ struct commit_list *ca,
1231
+ struct commit **result)
1232
+{
1233
+ struct commit_list *iter;
1234
+ struct commit *merged_common_ancestors;
1235
+ struct tree *mrtree = mrtree;
1236
+ int clean;
1237
+
1238
+ if (show(4)) {
1239
+ output(4, "Merging:");
1240
+ output_commit_title(h1);
1241
+ output_commit_title(h2);
1242
+ }
1243
+
1244
+ if (!ca) {
1245
+ ca = get_merge_bases(h1, h2, 1);
1246
+ ca = reverse_commit_list(ca);
1247
+ }
1248
+
1249
+ if (show(5)) {
1250
+ output(5, "found %u common ancestor(s):", commit_list_count(ca));
1251
+ for (iter = ca; iter; iter = iter->next)
1252
+ output_commit_title(iter->item);
1253
+ }
1254
+
1255
+ merged_common_ancestors = pop_commit(&ca);
1256
+ if (merged_common_ancestors == NULL) {
1257
+ /* if there is no common ancestor, make an empty tree */
1258
+ struct tree *tree = xcalloc(1, sizeof(struct tree));
1259
+
1260
+ tree->object.parsed = 1;
1261
+ tree->object.type = OBJ_TREE;
1262
+ pretend_sha1_file(NULL, 0, OBJ_TREE, tree->object.sha1);
1263
+ merged_common_ancestors = make_virtual_commit(tree, "ancestor");
1264
+ }
1265
+
1266
+ for (iter = ca; iter; iter = iter->next) {
1267
+ call_depth++;
1268
+ /*
1269
+ * When the merge fails, the result contains files
1270
+ * with conflict markers. The cleanness flag is
1271
+ * ignored, it was never actually used, as result of
1272
+ * merge_trees has always overwritten it: the committed
1273
+ * "conflicts" were already resolved.
1274
+ */
1275
+ discard_cache();
1276
+ merge_recursive(merged_common_ancestors, iter->item,
1277
+ "Temporary merge branch 1",
1278
+ "Temporary merge branch 2",
1279
+ NULL,
1280
+ &merged_common_ancestors);
1281
+ call_depth--;
1282
+
1283
+ if (!merged_common_ancestors)
1284
+ die("merge returned no commit");
1285
+ }
1286
+
1287
+ discard_cache();
1288
+ if (!call_depth) {
1289
+ read_cache();
1290
+ index_only = 0;
1291
+ } else
1292
+ index_only = 1;
1293
+
1294
+ clean = merge_trees(h1->tree, h2->tree, merged_common_ancestors->tree,
1295
+ branch1, branch2, &mrtree);
1296
+
1297
+ if (index_only) {
1298
+ *result = make_virtual_commit(mrtree, "merged tree");
1299
+ commit_list_insert(h1, &(*result)->parents);
1300
+ commit_list_insert(h2, &(*result)->parents->next);
1301
+ }
1302
+ flush_output();
1303
+ return clean;
1304
+}
1305
+
1306
+int merge_recursive_config(const char *var, const char *value, void *cb)
1307
+{
1308
+ if (!strcasecmp(var, "merge.verbosity")) {
1309
+ merge_recursive_verbosity = git_config_int(var, value);
1310
+ return 0;
1311
+ }
1312
+ if (!strcasecmp(var, "diff.renamelimit")) {
1313
+ diff_rename_limit = git_config_int(var, value);
1314
+ return 0;
1315
+ }
1316
+ if (!strcasecmp(var, "merge.renamelimit")) {
1317
+ merge_rename_limit = git_config_int(var, value);
1318
+ return 0;
1319
+ }
1320
+ return git_default_config(var, value, cb);
1321
+}
1322
+
1323
+void merge_recursive_setup(int is_subtree_merge)
1324
+{
1325
+ if (getenv("GIT_MERGE_VERBOSITY"))
1326
+ merge_recursive_verbosity =
1327
+ strtol(getenv("GIT_MERGE_VERBOSITY"), NULL, 10);
1328
+ if (merge_recursive_verbosity >= 5)
1329
+ buffer_output = 0;
1330
+ subtree_merge = is_subtree_merge;
1331
+}
merge-recursive.h
+5
-1
@@ -14,7 +14,11 @@ int merge_trees(struct tree *head,
14
const char *branch1,
15
const char *branch2,
16
struct tree **result);
17
-
17
+struct commit *make_virtual_commit(struct tree *tree, const char *comment);
18
+int merge_recursive_config(const char *var, const char *value, void *cb);
19
+void merge_recursive_setup(int is_subtree_merge);
20
struct tree *write_tree_from_memory(void);
21
22
+extern int merge_recursive_verbosity;
23
+
24
#endif