115
hashmap_init(map, (hashmap_cmp_fn) collision_cmp, NULL, 0);
116
}
117
118
-static void flush_output(struct merge_options *o)
118
+static void flush_output(struct merge_options *opt)
119
{
120
- if (o->buffer_output < 2 && o->obuf.len) {
121
- fputs(o->obuf.buf, stdout);
122
- strbuf_reset(&o->obuf);
120
+ if (opt->buffer_output < 2 && opt->obuf.len) {
121
+ fputs(opt->obuf.buf, stdout);
122
+ strbuf_reset(&opt->obuf);
123
}
124
}
125
126
-static int err(struct merge_options *o, const char *err, ...)
126
+static int err(struct merge_options *opt, const char *err, ...)
127
{
128
va_list params;
129
130
- if (o->buffer_output < 2)
131
- flush_output(o);
130
+ if (opt->buffer_output < 2)
131
+ flush_output(opt);
132
else {
133
- strbuf_complete(&o->obuf, '\n');
134
- strbuf_addstr(&o->obuf, "error: ");
133
+ strbuf_complete(&opt->obuf, '\n');
134
+ strbuf_addstr(&opt->obuf, "error: ");
135
}
136
va_start(params, err);
137
- strbuf_vaddf(&o->obuf, err, params);
137
+ strbuf_vaddf(&opt->obuf, err, params);
138
va_end(params);
139
- if (o->buffer_output > 1)
140
- strbuf_addch(&o->obuf, '\n');
139
+ if (opt->buffer_output > 1)
140
+ strbuf_addch(&opt->obuf, '\n');
141
else {
142
- error("%s", o->obuf.buf);
143
- strbuf_reset(&o->obuf);
142
+ error("%s", opt->obuf.buf);
143
+ strbuf_reset(&opt->obuf);
144
}
145
146
return -1;
228
const char *branch2,
229
struct stage_data *dst_entry1,
230
struct stage_data *dst_entry2,
231
- struct merge_options *o,
231
+ struct merge_options *opt,
232
struct stage_data *src_entry1,
233
struct stage_data *src_entry2)
234
{
239
* When we have two renames involved, it's easiest to get the
240
* correct things into stage 2 and 3, and to make sure that the
241
* content merge puts HEAD before the other branch if we just
242
- * ensure that branch1 == o->branch1. So, simply flip arguments
242
+ * ensure that branch1 == opt->branch1. So, simply flip arguments
243
* around if we don't have that.
244
*/
245
- if (dst_entry2 && branch1 != o->branch1) {
245
+ if (dst_entry2 && branch1 != opt->branch1) {
246
setup_rename_conflict_info(rename_type,
247
pair2, pair1,
248
branch2, branch1,
249
dst_entry2, dst_entry1,
250
- o,
250
+ opt,
251
src_entry2, src_entry1);
252
return;
253
}
276
*/
277
if (rename_type == RENAME_ADD ||
278
rename_type == RENAME_TWO_FILES_TO_ONE) {
279
- ostage1 = o->branch1 == branch1 ? 3 : 2;
279
+ ostage1 = opt->branch1 == branch1 ? 3 : 2;
280
281
ci->ren1_other.path = pair1->one->path;
282
oidcpy(&ci->ren1_other.oid, &src_entry1->stages[ostage1].oid);
292
}
293
}
294
295
-static int show(struct merge_options *o, int v)
295
+static int show(struct merge_options *opt, int v)
296
{
297
- return (!o->call_depth && o->verbosity >= v) || o->verbosity >= 5;
297
+ return (!opt->call_depth && opt->verbosity >= v) || opt->verbosity >= 5;
298
}
299
300
__attribute__((format (printf, 3, 4)))
301
-static void output(struct merge_options *o, int v, const char *fmt, ...)
301
+static void output(struct merge_options *opt, int v, const char *fmt, ...)
302
{
303
va_list ap;
304
305
- if (!show(o, v))
305
+ if (!show(opt, v))
306
return;
307
308
- strbuf_addchars(&o->obuf, ' ', o->call_depth * 2);
308
+ strbuf_addchars(&opt->obuf, ' ', opt->call_depth * 2);
309
310
va_start(ap, fmt);
311
- strbuf_vaddf(&o->obuf, fmt, ap);
311
+ strbuf_vaddf(&opt->obuf, fmt, ap);
312
va_end(ap);
313
314
- strbuf_addch(&o->obuf, '\n');
315
- if (!o->buffer_output)
316
- flush_output(o);
314
+ strbuf_addch(&opt->obuf, '\n');
315
+ if (!opt->buffer_output)
316
+ flush_output(opt);
317
}
318
319
-static void output_commit_title(struct merge_options *o, struct commit *commit)
319
+static void output_commit_title(struct merge_options *opt, struct commit *commit)
320
{
321
struct merge_remote_desc *desc;
322
323
- strbuf_addchars(&o->obuf, ' ', o->call_depth * 2);
323
+ strbuf_addchars(&opt->obuf, ' ', opt->call_depth * 2);
324
desc = merge_remote_util(commit);
325
if (desc)
326
- strbuf_addf(&o->obuf, "virtual %s\n", desc->name);
326
+ strbuf_addf(&opt->obuf, "virtual %s\n", desc->name);
327
else {
328
- strbuf_add_unique_abbrev(&o->obuf, &commit->object.oid,
328
+ strbuf_add_unique_abbrev(&opt->obuf, &commit->object.oid,
329
DEFAULT_ABBREV);
330
- strbuf_addch(&o->obuf, ' ');
330
+ strbuf_addch(&opt->obuf, ' ');
331
if (parse_commit(commit) != 0)
332
- strbuf_addstr(&o->obuf, _("(bad commit)\n"));
332
+ strbuf_addstr(&opt->obuf, _("(bad commit)\n"));
333
else {
334
const char *title;
335
const char *msg = get_commit_buffer(commit, NULL);
336
int len = find_commit_subject(msg, &title);
337
if (len)
338
- strbuf_addf(&o->obuf, "%.*s\n", len, title);
338
+ strbuf_addf(&opt->obuf, "%.*s\n", len, title);
339
unuse_commit_buffer(commit, msg);
340
}
341
}
342
- flush_output(o);
342
+ flush_output(opt);
343
}
344
345
-static int add_cacheinfo(struct merge_options *o,
345
+static int add_cacheinfo(struct merge_options *opt,
346
unsigned int mode, const struct object_id *oid,
347
const char *path, int stage, int refresh, int options)
348
{
349
- struct index_state *istate = o->repo->index;
349
+ struct index_state *istate = opt->repo->index;
350
struct cache_entry *ce;
351
int ret;
352
353
ce = make_cache_entry(istate, mode, oid ? oid : &null_oid, path, stage, 0);
354
if (!ce)
355
- return err(o, _("add_cacheinfo failed for path '%s'; merge aborting."), path);
355
+ return err(opt, _("add_cacheinfo failed for path '%s'; merge aborting."), path);
356
357
ret = add_index_entry(istate, ce, options);
358
if (refresh) {
361
nce = refresh_cache_entry(istate, ce,
362
CE_MATCH_REFRESH | CE_MATCH_IGNORE_MISSING);
363
if (!nce)
364
- return err(o, _("add_cacheinfo failed to refresh for path '%s'; merge aborting."), path);
364
+ return err(opt, _("add_cacheinfo failed to refresh for path '%s'; merge aborting."), path);
365
if (nce != ce)
366
ret = add_index_entry(istate, nce, options);
367
}
374
init_tree_desc(desc, tree->buffer, tree->size);
375
}
376
377
-static int unpack_trees_start(struct merge_options *o,
377
+static int unpack_trees_start(struct merge_options *opt,
378
struct tree *common,
379
struct tree *head,
380
struct tree *merge)
383
struct tree_desc t[3];
384
struct index_state tmp_index = { NULL };
385
386
- memset(&o->unpack_opts, 0, sizeof(o->unpack_opts));
387
- if (o->call_depth)
388
- o->unpack_opts.index_only = 1;
386
+ memset(&opt->unpack_opts, 0, sizeof(opt->unpack_opts));
387
+ if (opt->call_depth)
388
+ opt->unpack_opts.index_only = 1;
389
else
390
- o->unpack_opts.update = 1;
391
- o->unpack_opts.merge = 1;
392
- o->unpack_opts.head_idx = 2;
393
- o->unpack_opts.fn = threeway_merge;
394
- o->unpack_opts.src_index = o->repo->index;
395
- o->unpack_opts.dst_index = &tmp_index;
396
- o->unpack_opts.aggressive = !merge_detect_rename(o);
397
- setup_unpack_trees_porcelain(&o->unpack_opts, "merge");
390
+ opt->unpack_opts.update = 1;
391
+ opt->unpack_opts.merge = 1;
392
+ opt->unpack_opts.head_idx = 2;
393
+ opt->unpack_opts.fn = threeway_merge;
394
+ opt->unpack_opts.src_index = opt->repo->index;
395
+ opt->unpack_opts.dst_index = &tmp_index;
396
+ opt->unpack_opts.aggressive = !merge_detect_rename(opt);
397
+ setup_unpack_trees_porcelain(&opt->unpack_opts, "merge");
398
399
init_tree_desc_from_tree(t+0, common);
400
init_tree_desc_from_tree(t+1, head);
401
init_tree_desc_from_tree(t+2, merge);
402
403
- rc = unpack_trees(3, t, &o->unpack_opts);
404
- cache_tree_free(&o->repo->index->cache_tree);
403
+ rc = unpack_trees(3, t, &opt->unpack_opts);
404
+ cache_tree_free(&opt->repo->index->cache_tree);
405
406
/*
407
- * Update o->repo->index to match the new results, AFTER saving a copy
408
- * in o->orig_index. Update src_index to point to the saved copy.
407
+ * Update opt->repo->index to match the new results, AFTER saving a copy
408
+ * in opt->orig_index. Update src_index to point to the saved copy.
409
* (verify_uptodate() checks src_index, and the original index is
410
* the one that had the necessary modification timestamps.)
411
*/
412
- o->orig_index = *o->repo->index;
413
- *o->repo->index = tmp_index;
414
- o->unpack_opts.src_index = &o->orig_index;
412
+ opt->orig_index = *opt->repo->index;
413
+ *opt->repo->index = tmp_index;
414
+ opt->unpack_opts.src_index = &opt->orig_index;
415
416
return rc;
417
}
418
419
-static void unpack_trees_finish(struct merge_options *o)
419
+static void unpack_trees_finish(struct merge_options *opt)
420
{
421
- discard_index(&o->orig_index);
422
- clear_unpack_trees_porcelain(&o->unpack_opts);
421
+ discard_index(&opt->orig_index);
422
+ clear_unpack_trees_porcelain(&opt->unpack_opts);
423
}
424
425
-struct tree *write_tree_from_memory(struct merge_options *o)
425
+struct tree *write_tree_from_memory(struct merge_options *opt)
426
{
427
struct tree *result = NULL;
428
- struct index_state *istate = o->repo->index;
428
+ struct index_state *istate = opt->repo->index;
429
430
if (unmerged_index(istate)) {
431
int i;
444
445
if (!cache_tree_fully_valid(istate->cache_tree) &&
446
cache_tree_update(istate, 0) < 0) {
447
- err(o, _("error building trees"));
447
+ err(opt, _("error building trees"));
448
return NULL;
449
}
450
451
- result = lookup_tree(o->repo, &istate->cache_tree->oid);
451
+ result = lookup_tree(opt->repo, &istate->cache_tree->oid);
452
453
return result;
454
}
459
{
460
struct path_hashmap_entry *entry;
461
int baselen = base->len;
462
- struct merge_options *o = context;
462
+ struct merge_options *opt = context;
463
464
strbuf_addstr(base, path);
465
466
FLEX_ALLOC_MEM(entry, path, base->buf, base->len);
467
hashmap_entry_init(entry, path_hash(entry->path));
468
- hashmap_add(&o->current_file_dir_set, entry);
468
+ hashmap_add(&opt->current_file_dir_set, entry);
469
470
strbuf_setlen(base, baselen);
471
return (S_ISDIR(mode) ? READ_TREE_RECURSIVE : 0);
472
}
473
474
-static void get_files_dirs(struct merge_options *o, struct tree *tree)
474
+static void get_files_dirs(struct merge_options *opt, struct tree *tree)
475
{
476
struct pathspec match_all;
477
memset(&match_all, 0, sizeof(match_all));
478
read_tree_recursive(the_repository, tree, "", 0, 0,
479
- &match_all, save_files_dirs, o);
479
+ &match_all, save_files_dirs, opt);
480
}
481
482
static int get_tree_entry_if_blob(const struct object_id *tree,
573
return onelen - twolen;
574
}
575
576
-static void record_df_conflict_files(struct merge_options *o,
576
+static void record_df_conflict_files(struct merge_options *opt,
577
struct string_list *entries)
578
{
579
/* If there is a D/F conflict and the file for such a conflict
598
* If we're merging merge-bases, we don't want to bother with
599
* any working directory changes.
600
*/
601
- if (o->call_depth)
601
+ if (opt->call_depth)
602
return;
603
604
/* Ensure D/F conflicts are adjacent in the entries list. */
610
df_sorted_entries.cmp = string_list_df_name_compare;
611
string_list_sort(&df_sorted_entries);
612
613
- string_list_clear(&o->df_conflict_file_set, 1);
613
+ string_list_clear(&opt->df_conflict_file_set, 1);
614
for (i = 0; i < df_sorted_entries.nr; i++) {
615
const char *path = df_sorted_entries.items[i].string;
616
int len = strlen(path);
626
len > last_len &&
627
memcmp(path, last_file, last_len) == 0 &&
628
path[last_len] == '/') {
629
- string_list_insert(&o->df_conflict_file_set, last_file);
629
+ string_list_insert(&opt->df_conflict_file_set, last_file);
630
}
631
632
/*
717
oidcpy(&entry->stages[3].oid, &b->oid);
718
}
719
720
-static int remove_file(struct merge_options *o, int clean,
720
+static int remove_file(struct merge_options *opt, int clean,
721
const char *path, int no_wd)
722
{
723
- int update_cache = o->call_depth || clean;
724
- int update_working_directory = !o->call_depth && !no_wd;
723
+ int update_cache = opt->call_depth || clean;
724
+ int update_working_directory = !opt->call_depth && !no_wd;
725
726
if (update_cache) {
727
- if (remove_file_from_index(o->repo->index, path))
727
+ if (remove_file_from_index(opt->repo->index, path))
728
return -1;
729
}
730
if (update_working_directory) {
731
if (ignore_case) {
732
struct cache_entry *ce;
733
- ce = index_file_exists(o->repo->index, path, strlen(path),
733
+ ce = index_file_exists(opt->repo->index, path, strlen(path),
734
ignore_case);
735
if (ce && ce_stage(ce) == 0 && strcmp(path, ce->name))
736
return 0;
751
out->buf[i] = '_';
752
}
753
754
-static char *unique_path(struct merge_options *o, const char *path, const char *branch)
754
+static char *unique_path(struct merge_options *opt, const char *path, const char *branch)
755
{
756
struct path_hashmap_entry *entry;
757
struct strbuf newpath = STRBUF_INIT;
762
add_flattened_path(&newpath, branch);
763
764
base_len = newpath.len;
765
- while (hashmap_get_from_hash(&o->current_file_dir_set,
765
+ while (hashmap_get_from_hash(&opt->current_file_dir_set,
766
path_hash(newpath.buf), newpath.buf) ||
767
- (!o->call_depth && file_exists(newpath.buf))) {
767
+ (!opt->call_depth && file_exists(newpath.buf))) {
768
strbuf_setlen(&newpath, base_len);
769
strbuf_addf(&newpath, "_%d", suffix++);
770
}
771
772
FLEX_ALLOC_MEM(entry, path, newpath.buf, newpath.len);
773
hashmap_entry_init(entry, path_hash(entry->path));
774
- hashmap_add(&o->current_file_dir_set, entry);
774
+ hashmap_add(&opt->current_file_dir_set, entry);
775
return strbuf_detach(&newpath, NULL);
776
}
777
810
* Returns whether path was tracked in the index before the merge started,
811
* and its oid and mode match the specified values
812
*/
813
-static int was_tracked_and_matches(struct merge_options *o, const char *path,
813
+static int was_tracked_and_matches(struct merge_options *opt, const char *path,
814
const struct object_id *oid, unsigned mode)
815
{
816
- int pos = index_name_pos(&o->orig_index, path, strlen(path));
816
+ int pos = index_name_pos(&opt->orig_index, path, strlen(path));
817
struct cache_entry *ce;
818
819
if (0 > pos)
821
return 0;
822
823
/* See if the file we were tracking before matches */
824
- ce = o->orig_index.cache[pos];
824
+ ce = opt->orig_index.cache[pos];
825
return (oid_eq(&ce->oid, oid) && ce->ce_mode == mode);
826
}
827
828
/*
829
* Returns whether path was tracked in the index before the merge started
830
*/
831
-static int was_tracked(struct merge_options *o, const char *path)
831
+static int was_tracked(struct merge_options *opt, const char *path)
832
{
833
- int pos = index_name_pos(&o->orig_index, path, strlen(path));
833
+ int pos = index_name_pos(&opt->orig_index, path, strlen(path));
834
835
if (0 <= pos)
836
/* we were tracking this path before the merge */
839
return 0;
840
}
841
842
-static int would_lose_untracked(struct merge_options *o, const char *path)
842
+static int would_lose_untracked(struct merge_options *opt, const char *path)
843
{
844
- struct index_state *istate = o->repo->index;
844
+ struct index_state *istate = opt->repo->index;
845
846
/*
847
* This may look like it can be simplified to:
848
- * return !was_tracked(o, path) && file_exists(path)
848
+ * return !was_tracked(opt, path) && file_exists(path)
849
* but it can't. This function needs to know whether path was in
850
* the working tree due to EITHER having been tracked in the index
851
* before the merge OR having been put into the working copy and
882
return file_exists(path);
883
}
884
885
-static int was_dirty(struct merge_options *o, const char *path)
885
+static int was_dirty(struct merge_options *opt, const char *path)
886
{
887
struct cache_entry *ce;
888
int dirty = 1;
889
890
- if (o->call_depth || !was_tracked(o, path))
890
+ if (opt->call_depth || !was_tracked(opt, path))
891
return !dirty;
892
893
- ce = index_file_exists(o->unpack_opts.src_index,
893
+ ce = index_file_exists(opt->unpack_opts.src_index,
894
path, strlen(path), ignore_case);
895
- dirty = verify_uptodate(ce, &o->unpack_opts) != 0;
895
+ dirty = verify_uptodate(ce, &opt->unpack_opts) != 0;
896
return dirty;
897
}
898
899
-static int make_room_for_path(struct merge_options *o, const char *path)
899
+static int make_room_for_path(struct merge_options *opt, const char *path)
900
{
901
int status, i;
902
const char *msg = _("failed to create path '%s'%s");
903
904
/* Unlink any D/F conflict files that are in the way */
905
- for (i = 0; i < o->df_conflict_file_set.nr; i++) {
906
- const char *df_path = o->df_conflict_file_set.items[i].string;
905
+ for (i = 0; i < opt->df_conflict_file_set.nr; i++) {
906
+ const char *df_path = opt->df_conflict_file_set.items[i].string;
907
size_t pathlen = strlen(path);
908
size_t df_pathlen = strlen(df_path);
909
if (df_pathlen < pathlen &&
910
path[df_pathlen] == '/' &&
911
strncmp(path, df_path, df_pathlen) == 0) {
912
- output(o, 3,
912
+ output(opt, 3,
913
_("Removing %s to make room for subdirectory\n"),
914
df_path);
915
unlink(df_path);
916
- unsorted_string_list_delete_item(&o->df_conflict_file_set,
916
+ unsorted_string_list_delete_item(&opt->df_conflict_file_set,
917
i, 0);
918
break;
919
}
924
if (status) {
925
if (status == SCLD_EXISTS)
926
/* something else exists */
927
- return err(o, msg, path, _(": perhaps a D/F conflict?"));
928
- return err(o, msg, path, "");
927
+ return err(opt, msg, path, _(": perhaps a D/F conflict?"));
928
+ return err(opt, msg, path, "");
929
}
930
931
/*
932
* Do not unlink a file in the work tree if we are not
933
* tracking it.
934
*/
935
- if (would_lose_untracked(o, path))
936
- return err(o, _("refusing to lose untracked file at '%s'"),
935
+ if (would_lose_untracked(opt, path))
936
+ return err(opt, _("refusing to lose untracked file at '%s'"),
937
path);
938
939
/* Successful unlink is good.. */
943
if (errno == ENOENT)
944
return 0;
945
/* .. but not some other error (who really cares what?) */
946
- return err(o, msg, path, _(": perhaps a D/F conflict?"));
946
+ return err(opt, msg, path, _(": perhaps a D/F conflict?"));
947
}
948
949
-static int update_file_flags(struct merge_options *o,
949
+static int update_file_flags(struct merge_options *opt,
950
const struct object_id *oid,
951
unsigned mode,
952
const char *path,
955
{
956
int ret = 0;
957
958
- if (o->call_depth)
958
+ if (opt->call_depth)
959
update_wd = 0;
960
961
if (update_wd) {
975
976
buf = read_object_file(oid, &type, &size);
977
if (!buf)
978
- return err(o, _("cannot read object %s '%s'"), oid_to_hex(oid), path);
978
+ return err(opt, _("cannot read object %s '%s'"), oid_to_hex(oid), path);
979
if (type != OBJ_BLOB) {
980
- ret = err(o, _("blob expected for %s '%s'"), oid_to_hex(oid), path);
980
+ ret = err(opt, _("blob expected for %s '%s'"), oid_to_hex(oid), path);
981
goto free_buf;
982
}
983
if (S_ISREG(mode)) {
984
struct strbuf strbuf = STRBUF_INIT;
985
- if (convert_to_working_tree(o->repo->index, path, buf, size, &strbuf)) {
985
+ if (convert_to_working_tree(opt->repo->index, path, buf, size, &strbuf)) {
986
free(buf);
987
size = strbuf.len;
988
buf = strbuf_detach(&strbuf, NULL);
989
}
990
}
991
992
- if (make_room_for_path(o, path) < 0) {
992
+ if (make_room_for_path(opt, path) < 0) {
993
update_wd = 0;
994
goto free_buf;
995
}
1001
mode = 0666;
1002
fd = open(path, O_WRONLY | O_TRUNC | O_CREAT, mode);
1003
if (fd < 0) {
1004
- ret = err(o, _("failed to open '%s': %s"),
1004
+ ret = err(opt, _("failed to open '%s': %s"),
1005
path, strerror(errno));
1006
goto free_buf;
1007
}
1012
safe_create_leading_directories_const(path);
1013
unlink(path);
1014
if (symlink(lnk, path))
1015
- ret = err(o, _("failed to symlink '%s': %s"),
1015
+ ret = err(opt, _("failed to symlink '%s': %s"),
1016
path, strerror(errno));
1017
free(lnk);
1018
} else
1019
- ret = err(o,
1019
+ ret = err(opt,
1020
_("do not know what to do with %06o %s '%s'"),
1021
mode, oid_to_hex(oid), path);
1022
free_buf:
1024
}
1025
update_index:
1026
if (!ret && update_cache)
1027
- if (add_cacheinfo(o, mode, oid, path, 0, update_wd,
1027
+ if (add_cacheinfo(opt, mode, oid, path, 0, update_wd,
1028
ADD_CACHE_OK_TO_ADD))
1029
return -1;
1030
return ret;
1031
}
1032
1033
-static int update_file(struct merge_options *o,
1033
+static int update_file(struct merge_options *opt,
1034
int clean,
1035
const struct object_id *oid,
1036
unsigned mode,
1037
const char *path)
1038
{
1039
- return update_file_flags(o, oid, mode, path, o->call_depth || clean, !o->call_depth);
1039
+ return update_file_flags(opt, oid, mode, path, opt->call_depth || clean, !opt->call_depth);
1040
}
1041
1042
/* Low level file merging, update and removal */
1048
merge:1;
1049
};
1050
1051
-static int merge_3way(struct merge_options *o,
1051
+static int merge_3way(struct merge_options *opt,
1052
mmbuffer_t *result_buf,
1053
const struct diff_filespec *one,
1054
const struct diff_filespec *a,
1062
char *base_name, *name1, *name2;
1063
int merge_status;
1064
1065
- ll_opts.renormalize = o->renormalize;
1065
+ ll_opts.renormalize = opt->renormalize;
1066
ll_opts.extra_marker_size = extra_marker_size;
1067
- ll_opts.xdl_opts = o->xdl_opts;
1067
+ ll_opts.xdl_opts = opt->xdl_opts;
1068
1069
- if (o->call_depth) {
1069
+ if (opt->call_depth) {
1070
ll_opts.virtual_ancestor = 1;
1071
ll_opts.variant = 0;
1072
} else {
1073
- switch (o->recursive_variant) {
1073
+ switch (opt->recursive_variant) {
1074
case MERGE_RECURSIVE_OURS:
1075
ll_opts.variant = XDL_MERGE_FAVOR_OURS;
1076
break;
1084
}
1085
1086
if (strcmp(a->path, b->path) ||
1087
- (o->ancestor != NULL && strcmp(a->path, one->path) != 0)) {
1088
- base_name = o->ancestor == NULL ? NULL :
1089
- mkpathdup("%s:%s", o->ancestor, one->path);
1087
+ (opt->ancestor != NULL && strcmp(a->path, one->path) != 0)) {
1088
+ base_name = opt->ancestor == NULL ? NULL :
1089
+ mkpathdup("%s:%s", opt->ancestor, one->path);
1090
name1 = mkpathdup("%s:%s", branch1, a->path);
1091
name2 = mkpathdup("%s:%s", branch2, b->path);
1092
} else {
1093
- base_name = o->ancestor == NULL ? NULL :
1094
- mkpathdup("%s", o->ancestor);
1093
+ base_name = opt->ancestor == NULL ? NULL :
1094
+ mkpathdup("%s", opt->ancestor);
1095
name1 = mkpathdup("%s", branch1);
1096
name2 = mkpathdup("%s", branch2);
1097
}
1102
1103
merge_status = ll_merge(result_buf, a->path, &orig, base_name,
1104
&src1, name1, &src2, name2,
1105
- o->repo->index, &ll_opts);
1105
+ opt->repo->index, &ll_opts);
1106
1107
free(base_name);
1108
free(name1);
1184
strbuf_release(&sb);
1185
}
1186
1187
-static int merge_submodule(struct merge_options *o,
1187
+static int merge_submodule(struct merge_options *opt,
1188
struct object_id *result, const char *path,
1189
const struct object_id *base, const struct object_id *a,
1190
const struct object_id *b)
1194
struct object_array merges;
1195
1196
int i;
1197
- int search = !o->call_depth;
1197
+ int search = !opt->call_depth;
1198
1199
/* store a in result in case we fail */
1200
oidcpy(result, a);
1208
return 0;
1209
1210
if (add_submodule_odb(path)) {
1211
- output(o, 1, _("Failed to merge submodule %s (not checked out)"), path);
1211
+ output(opt, 1, _("Failed to merge submodule %s (not checked out)"), path);
1212
return 0;
1213
}
1214
1215
- if (!(commit_base = lookup_commit_reference(o->repo, base)) ||
1216
- !(commit_a = lookup_commit_reference(o->repo, a)) ||
1217
- !(commit_b = lookup_commit_reference(o->repo, b))) {
1218
- output(o, 1, _("Failed to merge submodule %s (commits not present)"), path);
1215
+ if (!(commit_base = lookup_commit_reference(opt->repo, base)) ||
1216
+ !(commit_a = lookup_commit_reference(opt->repo, a)) ||
1217
+ !(commit_b = lookup_commit_reference(opt->repo, b))) {
1218
+ output(opt, 1, _("Failed to merge submodule %s (commits not present)"), path);
1219
return 0;
1220
}
1221
1222
/* check whether both changes are forward */
1223
if (!in_merge_bases(commit_base, commit_a) ||
1224
!in_merge_bases(commit_base, commit_b)) {
1225
- output(o, 1, _("Failed to merge submodule %s (commits don't follow merge-base)"), path);
1225
+ output(opt, 1, _("Failed to merge submodule %s (commits don't follow merge-base)"), path);
1226
return 0;
1227
}
1228
1229
/* Case #1: a is contained in b or vice versa */
1230
if (in_merge_bases(commit_a, commit_b)) {
1231
oidcpy(result, b);
1232
- if (show(o, 3)) {
1233
- output(o, 3, _("Fast-forwarding submodule %s to the following commit:"), path);
1234
- output_commit_title(o, commit_b);
1235
- } else if (show(o, 2))
1236
- output(o, 2, _("Fast-forwarding submodule %s"), path);
1232
+ if (show(opt, 3)) {
1233
+ output(opt, 3, _("Fast-forwarding submodule %s to the following commit:"), path);
1234
+ output_commit_title(opt, commit_b);
1235
+ } else if (show(opt, 2))
1236
+ output(opt, 2, _("Fast-forwarding submodule %s"), path);
1237
else
1238
; /* no output */
1239
1241
}
1242
if (in_merge_bases(commit_b, commit_a)) {
1243
oidcpy(result, a);
1244
- if (show(o, 3)) {
1245
- output(o, 3, _("Fast-forwarding submodule %s to the following commit:"), path);
1246
- output_commit_title(o, commit_a);
1247
- } else if (show(o, 2))
1248
- output(o, 2, _("Fast-forwarding submodule %s"), path);
1244
+ if (show(opt, 3)) {
1245
+ output(opt, 3, _("Fast-forwarding submodule %s to the following commit:"), path);
1246
+ output_commit_title(opt, commit_a);
1247
+ } else if (show(opt, 2))
1248
+ output(opt, 2, _("Fast-forwarding submodule %s"), path);
1249
else
1250
; /* no output */
1251
1264
return 0;
1265
1266
/* find commit which merges them */
1267
- parent_count = find_first_merges(o->repo, &merges, path,
1267
+ parent_count = find_first_merges(opt->repo, &merges, path,
1268
commit_a, commit_b);
1269
switch (parent_count) {
1270
case 0:
1271
- output(o, 1, _("Failed to merge submodule %s (merge following commits not found)"), path);
1271
+ output(opt, 1, _("Failed to merge submodule %s (merge following commits not found)"), path);
1272
break;
1273
1274
case 1:
1275
- output(o, 1, _("Failed to merge submodule %s (not fast-forward)"), path);
1276
- output(o, 2, _("Found a possible merge resolution for the submodule:\n"));
1275
+ output(opt, 1, _("Failed to merge submodule %s (not fast-forward)"), path);
1276
+ output(opt, 2, _("Found a possible merge resolution for the submodule:\n"));
1277
print_commit((struct commit *) merges.objects[0].item);
1278
- output(o, 2, _(
1278
+ output(opt, 2, _(
1279
"If this is correct simply add it to the index "
1280
"for example\n"
1281
"by using:\n\n"
1285
break;
1286
1287
default:
1288
- output(o, 1, _("Failed to merge submodule %s (multiple merges found)"), path);
1288
+ output(opt, 1, _("Failed to merge submodule %s (multiple merges found)"), path);
1289
for (i = 0; i < merges.nr; i++)
1290
print_commit((struct commit *) merges.objects[i].item);
1291
}
1294
return 0;
1295
}
1296
1297
-static int merge_mode_and_contents(struct merge_options *o,
1297
+static int merge_mode_and_contents(struct merge_options *opt,
1298
const struct diff_filespec *one,
1299
const struct diff_filespec *a,
1300
const struct diff_filespec *b,
1304
const int extra_marker_size,
1305
struct merge_file_info *result)
1306
{
1307
- if (o->branch1 != branch1) {
1307
+ if (opt->branch1 != branch1) {
1308
/*
1309
* It's weird getting a reverse merge with HEAD on the bottom
1310
* side of the conflict markers and the other branch on the
1311
* top. Fix that.
1312
*/
1313
- return merge_mode_and_contents(o, one, b, a,
1313
+ return merge_mode_and_contents(opt, one, b, a,
1314
filename,
1315
branch2, branch1,
1316
extra_marker_size, result);
1353
mmbuffer_t result_buf;
1354
int ret = 0, merge_status;
1355
1356
- merge_status = merge_3way(o, &result_buf, one, a, b,
1356
+ merge_status = merge_3way(opt, &result_buf, one, a, b,
1357
branch1, branch2,
1358
extra_marker_size);
1359
1360
if ((merge_status < 0) || !result_buf.ptr)
1361
- ret = err(o, _("Failed to execute internal merge"));
1361
+ ret = err(opt, _("Failed to execute internal merge"));
1362
1363
if (!ret &&
1364
write_object_file(result_buf.ptr, result_buf.size,
1365
blob_type, &result->oid))
1366
- ret = err(o, _("Unable to add %s to database"),
1366
+ ret = err(opt, _("Unable to add %s to database"),
1367
a->path);
1368
1369
free(result_buf.ptr);
1371
return ret;
1372
result->clean = (merge_status == 0);
1373
} else if (S_ISGITLINK(a->mode)) {
1374
- result->clean = merge_submodule(o, &result->oid,
1374
+ result->clean = merge_submodule(opt, &result->oid,
1375
one->path,
1376
&one->oid,
1377
&a->oid,
1378
&b->oid);
1379
} else if (S_ISLNK(a->mode)) {
1380
- switch (o->recursive_variant) {
1380
+ switch (opt->recursive_variant) {
1381
case MERGE_RECURSIVE_NORMAL:
1382
oidcpy(&result->oid, &a->oid);
1383
if (!oid_eq(&a->oid, &b->oid))
1395
}
1396
1397
if (result->merge)
1398
- output(o, 2, _("Auto-merging %s"), filename);
1398
+ output(opt, 2, _("Auto-merging %s"), filename);
1399
1400
return 0;
1401
}
1402
1403
-static int handle_rename_via_dir(struct merge_options *o,
1403
+static int handle_rename_via_dir(struct merge_options *opt,
1404
struct diff_filepair *pair,
1405
const char *rename_branch)
1406
{
1412
*/
1413
const struct diff_filespec *dest = pair->two;
1414
1415
- if (!o->call_depth && would_lose_untracked(o, dest->path)) {
1416
- char *alt_path = unique_path(o, dest->path, rename_branch);
1415
+ if (!opt->call_depth && would_lose_untracked(opt, dest->path)) {
1416
+ char *alt_path = unique_path(opt, dest->path, rename_branch);
1417
1418
- output(o, 1, _("Error: Refusing to lose untracked file at %s; "
1418
+ output(opt, 1, _("Error: Refusing to lose untracked file at %s; "
1419
"writing to %s instead."),
1420
dest->path, alt_path);
1421
/*
1423
* index. Instead, write to dest->path for the index but
1424
* only at the higher appropriate stage.
1425
*/
1426
- if (update_file(o, 0, &dest->oid, dest->mode, alt_path))
1426
+ if (update_file(opt, 0, &dest->oid, dest->mode, alt_path))
1427
return -1;
1428
free(alt_path);
1429
- return update_stages(o, dest->path, NULL,
1430
- rename_branch == o->branch1 ? dest : NULL,
1431
- rename_branch == o->branch1 ? NULL : dest);
1429
+ return update_stages(opt, dest->path, NULL,
1430
+ rename_branch == opt->branch1 ? dest : NULL,
1431
+ rename_branch == opt->branch1 ? NULL : dest);
1432
}
1433
1434
/* Update dest->path both in index and in worktree */
1435
- if (update_file(o, 1, &dest->oid, dest->mode, dest->path))
1435
+ if (update_file(opt, 1, &dest->oid, dest->mode, dest->path))
1436
return -1;
1437
return 0;
1438
}
1439
1440
-static int handle_change_delete(struct merge_options *o,
1440
+static int handle_change_delete(struct merge_options *opt,
1441
const char *path, const char *old_path,
1442
const struct object_id *o_oid, int o_mode,
1443
const struct object_id *changed_oid,
1450
const char *update_path = path;
1451
int ret = 0;
1452
1453
- if (dir_in_way(o->repo->index, path, !o->call_depth, 0) ||
1454
- (!o->call_depth && would_lose_untracked(o, path))) {
1455
- update_path = alt_path = unique_path(o, path, change_branch);
1453
+ if (dir_in_way(opt->repo->index, path, !opt->call_depth, 0) ||
1454
+ (!opt->call_depth && would_lose_untracked(opt, path))) {
1455
+ update_path = alt_path = unique_path(opt, path, change_branch);
1456
}
1457
1458
- if (o->call_depth) {
1458
+ if (opt->call_depth) {
1459
/*
1460
* We cannot arbitrarily accept either a_sha or b_sha as
1461
* correct; since there is no true "middle point" between
1462
* them, simply reuse the base version for virtual merge base.
1463
*/
1464
- ret = remove_file_from_index(o->repo->index, path);
1464
+ ret = remove_file_from_index(opt->repo->index, path);
1465
if (!ret)
1466
- ret = update_file(o, 0, o_oid, o_mode, update_path);
1466
+ ret = update_file(opt, 0, o_oid, o_mode, update_path);
1467
} else {
1468
/*
1469
* Despite the four nearly duplicate messages and argument
1482
*/
1483
if (!alt_path) {
1484
if (!old_path) {
1485
- output(o, 1, _("CONFLICT (%s/delete): %s deleted in %s "
1485
+ output(opt, 1, _("CONFLICT (%s/delete): %s deleted in %s "
1486
"and %s in %s. Version %s of %s left in tree."),
1487
change, path, delete_branch, change_past,
1488
change_branch, change_branch, path);
1489
} else {
1490
- output(o, 1, _("CONFLICT (%s/delete): %s deleted in %s "
1490
+ output(opt, 1, _("CONFLICT (%s/delete): %s deleted in %s "
1491
"and %s to %s in %s. Version %s of %s left in tree."),
1492
change, old_path, delete_branch, change_past, path,
1493
change_branch, change_branch, path);
1494
}
1495
} else {
1496
if (!old_path) {
1497
- output(o, 1, _("CONFLICT (%s/delete): %s deleted in %s "
1497
+ output(opt, 1, _("CONFLICT (%s/delete): %s deleted in %s "
1498
"and %s in %s. Version %s of %s left in tree at %s."),
1499
change, path, delete_branch, change_past,
1500
change_branch, change_branch, path, alt_path);
1501
} else {
1502
- output(o, 1, _("CONFLICT (%s/delete): %s deleted in %s "
1502
+ output(opt, 1, _("CONFLICT (%s/delete): %s deleted in %s "
1503
"and %s to %s in %s. Version %s of %s left in tree at %s."),
1504
change, old_path, delete_branch, change_past, path,
1505
change_branch, change_branch, path, alt_path);
1507
}
1508
/*
1509
* No need to call update_file() on path when change_branch ==
1510
- * o->branch1 && !alt_path, since that would needlessly touch
1510
+ * opt->branch1 && !alt_path, since that would needlessly touch
1511
* path. We could call update_file_flags() with update_cache=0
1512
* and update_wd=0, but that's a no-op.
1513
*/
1514
- if (change_branch != o->branch1 || alt_path)
1515
- ret = update_file(o, 0, changed_oid, changed_mode, update_path);
1514
+ if (change_branch != opt->branch1 || alt_path)
1515
+ ret = update_file(opt, 0, changed_oid, changed_mode, update_path);
1516
}
1517
free(alt_path);
1518
1519
return ret;
1520
}
1521
1522
-static int handle_rename_delete(struct merge_options *o,
1522
+static int handle_rename_delete(struct merge_options *opt,
1523
struct diff_filepair *pair,
1524
const char *rename_branch,
1525
const char *delete_branch)
1527
const struct diff_filespec *orig = pair->one;
1528
const struct diff_filespec *dest = pair->two;
1529
1530
- if (handle_change_delete(o,
1531
- o->call_depth ? orig->path : dest->path,
1532
- o->call_depth ? NULL : orig->path,
1530
+ if (handle_change_delete(opt,
1531
+ opt->call_depth ? orig->path : dest->path,
1532
+ opt->call_depth ? NULL : orig->path,
1533
&orig->oid, orig->mode,
1534
&dest->oid, dest->mode,
1535
rename_branch, delete_branch,
1536
_("rename"), _("renamed")))
1537
return -1;
1538
1539
- if (o->call_depth)
1540
- return remove_file_from_index(o->repo->index, dest->path);
1539
+ if (opt->call_depth)
1540
+ return remove_file_from_index(opt->repo->index, dest->path);
1541
else
1542
- return update_stages(o, dest->path, NULL,
1543
- rename_branch == o->branch1 ? dest : NULL,
1544
- rename_branch == o->branch1 ? NULL : dest);
1542
+ return update_stages(opt, dest->path, NULL,
1543
+ rename_branch == opt->branch1 ? dest : NULL,
1544
+ rename_branch == opt->branch1 ? NULL : dest);
1545
}
1546
1547
static struct diff_filespec *filespec_from_entry(struct diff_filespec *target,
1557
return target;
1558
}
1559
1560
-static int handle_file_collision(struct merge_options *o,
1560
+static int handle_file_collision(struct merge_options *opt,
1561
const char *collide_path,
1562
const char *prev_path1,
1563
const char *prev_path2,
1575
/*
1576
* It's easiest to get the correct things into stage 2 and 3, and
1577
* to make sure that the content merge puts HEAD before the other
1578
- * branch if we just ensure that branch1 == o->branch1. So, simply
1578
+ * branch if we just ensure that branch1 == opt->branch1. So, simply
1579
* flip arguments around if we don't have that.
1580
*/
1581
- if (branch1 != o->branch1) {
1582
- return handle_file_collision(o, collide_path,
1581
+ if (branch1 != opt->branch1) {
1582
+ return handle_file_collision(opt, collide_path,
1583
prev_path2, prev_path1,
1584
branch2, branch1,
1585
b_oid, b_mode,
1589
/*
1590
* In the recursive case, we just opt to undo renames
1591
*/
1592
- if (o->call_depth && (prev_path1 || prev_path2)) {
1592
+ if (opt->call_depth && (prev_path1 || prev_path2)) {
1593
/* Put first file (a_oid, a_mode) in its original spot */
1594
if (prev_path1) {
1595
- if (update_file(o, 1, a_oid, a_mode, prev_path1))
1595
+ if (update_file(opt, 1, a_oid, a_mode, prev_path1))
1596
return -1;
1597
} else {
1598
- if (update_file(o, 1, a_oid, a_mode, collide_path))
1598
+ if (update_file(opt, 1, a_oid, a_mode, collide_path))
1599
return -1;
1600
}
1601
1602
/* Put second file (b_oid, b_mode) in its original spot */
1603
if (prev_path2) {
1604
- if (update_file(o, 1, b_oid, b_mode, prev_path2))
1604
+ if (update_file(opt, 1, b_oid, b_mode, prev_path2))
1605
return -1;
1606
} else {
1607
- if (update_file(o, 1, b_oid, b_mode, collide_path))
1607
+ if (update_file(opt, 1, b_oid, b_mode, collide_path))
1608
return -1;
1609
}
1610
1611
/* Don't leave something at collision path if unrenaming both */
1612
if (prev_path1 && prev_path2)
1613
- remove_file(o, 1, collide_path, 0);
1613
+ remove_file(opt, 1, collide_path, 0);
1614
1615
return 0;
1616
}
1617
1618
/* Remove rename sources if rename/add or rename/rename(2to1) */
1619
if (prev_path1)
1620
- remove_file(o, 1, prev_path1,
1621
- o->call_depth || would_lose_untracked(o, prev_path1));
1620
+ remove_file(opt, 1, prev_path1,
1621
+ opt->call_depth || would_lose_untracked(opt, prev_path1));
1622
if (prev_path2)
1623
- remove_file(o, 1, prev_path2,
1624
- o->call_depth || would_lose_untracked(o, prev_path2));
1623
+ remove_file(opt, 1, prev_path2,
1624
+ opt->call_depth || would_lose_untracked(opt, prev_path2));
1625
1626
/*
1627
* Remove the collision path, if it wouldn't cause dirty contents
1628
* or an untracked file to get lost. We'll either overwrite with
1629
* merged contents, or just write out to differently named files.
1630
*/
1631
- if (was_dirty(o, collide_path)) {
1632
- output(o, 1, _("Refusing to lose dirty file at %s"),
1631
+ if (was_dirty(opt, collide_path)) {
1632
+ output(opt, 1, _("Refusing to lose dirty file at %s"),
1633
collide_path);
1634
- update_path = alt_path = unique_path(o, collide_path, "merged");
1635
- } else if (would_lose_untracked(o, collide_path)) {
1634
+ update_path = alt_path = unique_path(opt, collide_path, "merged");
1635
+ } else if (would_lose_untracked(opt, collide_path)) {
1636
/*
1637
* Only way we get here is if both renames were from
1638
* a directory rename AND user had an untracked file
1639
* at the location where both files end up after the
1640
* two directory renames. See testcase 10d of t6043.
1641
*/
1642
- output(o, 1, _("Refusing to lose untracked file at "
1642
+ output(opt, 1, _("Refusing to lose untracked file at "
1643
"%s, even though it's in the way."),
1644
collide_path);
1645
- update_path = alt_path = unique_path(o, collide_path, "merged");
1645
+ update_path = alt_path = unique_path(opt, collide_path, "merged");
1646
} else {
1647
/*
1648
* FIXME: It's possible that the two files are identical
1654
* merge-recursive interoperate anyway, so punting for
1655
* now...
1656
*/
1657
- remove_file(o, 0, collide_path, 0);
1657
+ remove_file(opt, 0, collide_path, 0);
1658
}
1659
1660
/* Store things in diff_filespecs for functions that need it */
1670
b.mode = b_mode;
1671
b.oid_valid = 1;
1672
1673
- if (merge_mode_and_contents(o, &null, &a, &b, collide_path,
1674
- branch1, branch2, o->call_depth * 2, &mfi))
1673
+ if (merge_mode_and_contents(opt, &null, &a, &b, collide_path,
1674
+ branch1, branch2, opt->call_depth * 2, &mfi))
1675
return -1;
1676
mfi.clean &= !alt_path;
1677
- if (update_file(o, mfi.clean, &mfi.oid, mfi.mode, update_path))
1677
+ if (update_file(opt, mfi.clean, &mfi.oid, mfi.mode, update_path))
1678
return -1;
1679
- if (!mfi.clean && !o->call_depth &&
1680
- update_stages(o, collide_path, NULL, &a, &b))
1679
+ if (!mfi.clean && !opt->call_depth &&
1680
+ update_stages(opt, collide_path, NULL, &a, &b))
1681
return -1;
1682
free(alt_path);
1683
/*
1690
return mfi.clean;
1691
}
1692
1693
-static int handle_rename_add(struct merge_options *o,
1693
+static int handle_rename_add(struct merge_options *opt,
1694
struct rename_conflict_info *ci)
1695
{
1696
/* a was renamed to c, and a separate c was added. */
1700
char *prev_path_desc;
1701
struct merge_file_info mfi;
1702
1703
- int other_stage = (ci->branch1 == o->branch1 ? 3 : 2);
1703
+ int other_stage = (ci->branch1 == opt->branch1 ? 3 : 2);
1704
1705
- output(o, 1, _("CONFLICT (rename/add): "
1705
+ output(opt, 1, _("CONFLICT (rename/add): "
1706
"Rename %s->%s in %s. Added %s in %s"),
1707
a->path, c->path, ci->branch1,
1708
c->path, ci->branch2);
1709
1710
prev_path_desc = xstrfmt("version of %s from %s", path, a->path);
1711
- if (merge_mode_and_contents(o, a, c, &ci->ren1_other, prev_path_desc,
1712
- o->branch1, o->branch2,
1713
- 1 + o->call_depth * 2, &mfi))
1711
+ if (merge_mode_and_contents(opt, a, c, &ci->ren1_other, prev_path_desc,
1712
+ opt->branch1, opt->branch2,
1713
+ 1 + opt->call_depth * 2, &mfi))
1714
return -1;
1715
free(prev_path_desc);
1716
1717
- return handle_file_collision(o,
1717
+ return handle_file_collision(opt,
1718
c->path, a->path, NULL,
1719
ci->branch1, ci->branch2,
1720
&mfi.oid, mfi.mode,
1722
ci->dst_entry1->stages[other_stage].mode);
1723
}
1724
1725
-static char *find_path_for_conflict(struct merge_options *o,
1725
+static char *find_path_for_conflict(struct merge_options *opt,
1726
const char *path,
1727
const char *branch1,
1728
const char *branch2)
1729
{
1730
char *new_path = NULL;
1731
- if (dir_in_way(o->repo->index, path, !o->call_depth, 0)) {
1732
- new_path = unique_path(o, path, branch1);
1733
- output(o, 1, _("%s is a directory in %s adding "
1731
+ if (dir_in_way(opt->repo->index, path, !opt->call_depth, 0)) {
1732
+ new_path = unique_path(opt, path, branch1);
1733
+ output(opt, 1, _("%s is a directory in %s adding "
1734
"as %s instead"),
1735
path, branch2, new_path);
1736
- } else if (would_lose_untracked(o, path)) {
1737
- new_path = unique_path(o, path, branch1);
1738
- output(o, 1, _("Refusing to lose untracked file"
1736
+ } else if (would_lose_untracked(opt, path)) {
1737
+ new_path = unique_path(opt, path, branch1);
1738
+ output(opt, 1, _("Refusing to lose untracked file"
1739
" at %s; adding as %s instead"),
1740
path, new_path);
1741
}
1743
return new_path;
1744
}
1745
1746
-static int handle_rename_rename_1to2(struct merge_options *o,
1746
+static int handle_rename_rename_1to2(struct merge_options *opt,
1747
struct rename_conflict_info *ci)
1748
{
1749
/* One file was renamed in both branches, but to different names. */
1755
struct diff_filespec *b = ci->pair2->two;
1756
char *path_desc;
1757
1758
- output(o, 1, _("CONFLICT (rename/rename): "
1758
+ output(opt, 1, _("CONFLICT (rename/rename): "
1759
"Rename \"%s\"->\"%s\" in branch \"%s\" "
1760
"rename \"%s\"->\"%s\" in \"%s\"%s"),
1761
one->path, a->path, ci->branch1,
1762
one->path, b->path, ci->branch2,
1763
- o->call_depth ? _(" (left unresolved)") : "");
1763
+ opt->call_depth ? _(" (left unresolved)") : "");
1764
1765
path_desc = xstrfmt("%s and %s, both renamed from %s",
1766
a->path, b->path, one->path);
1767
- if (merge_mode_and_contents(o, one, a, b, path_desc,
1767
+ if (merge_mode_and_contents(opt, one, a, b, path_desc,
1768
ci->branch1, ci->branch2,
1769
- o->call_depth * 2, &mfi))
1769
+ opt->call_depth * 2, &mfi))
1770
return -1;
1771
free(path_desc);
1772
1773
- if (o->call_depth) {
1773
+ if (opt->call_depth) {
1774
/*
1775
* FIXME: For rename/add-source conflicts (if we could detect
1776
* such), this is wrong. We should instead find a unique
1777
* pathname and then either rename the add-source file to that
1778
* unique path, or use that unique path instead of src here.
1779
*/
1780
- if (update_file(o, 0, &mfi.oid, mfi.mode, one->path))
1780
+ if (update_file(opt, 0, &mfi.oid, mfi.mode, one->path))
1781
return -1;
1782
1783
/*
1790
*/
1791
add = filespec_from_entry(&other, ci->dst_entry1, 2 ^ 1);
1792
if (add) {
1793
- if (update_file(o, 0, &add->oid, add->mode, a->path))
1793
+ if (update_file(opt, 0, &add->oid, add->mode, a->path))
1794
return -1;
1795
}
1796
else
1797
- remove_file_from_index(o->repo->index, a->path);
1797
+ remove_file_from_index(opt->repo->index, a->path);
1798
add = filespec_from_entry(&other, ci->dst_entry2, 3 ^ 1);
1799
if (add) {
1800
- if (update_file(o, 0, &add->oid, add->mode, b->path))
1800
+ if (update_file(opt, 0, &add->oid, add->mode, b->path))
1801
return -1;
1802
}
1803
else
1804
- remove_file_from_index(o->repo->index, b->path);
1804
+ remove_file_from_index(opt->repo->index, b->path);
1805
} else {
1806
/*
1807
* For each destination path, we need to see if there is a
1810
*/
1811
add = filespec_from_entry(&other, ci->dst_entry1, 2 ^ 1);
1812
if (add) {
1813
- if (handle_file_collision(o, a->path,
1813
+ if (handle_file_collision(opt, a->path,
1814
NULL, NULL,
1815
ci->branch1, ci->branch2,
1816
&mfi.oid, mfi.mode,
1817
&add->oid, add->mode) < 0)
1818
return -1;
1819
} else {
1820
- char *new_path = find_path_for_conflict(o, a->path,
1820
+ char *new_path = find_path_for_conflict(opt, a->path,
1821
ci->branch1,
1822
ci->branch2);
1823
- if (update_file(o, 0, &mfi.oid, mfi.mode, new_path ? new_path : a->path))
1823
+ if (update_file(opt, 0, &mfi.oid, mfi.mode, new_path ? new_path : a->path))
1824
return -1;
1825
free(new_path);
1826
- if (update_stages(o, a->path, NULL, a, NULL))
1826
+ if (update_stages(opt, a->path, NULL, a, NULL))
1827
return -1;
1828
}
1829
1830
add = filespec_from_entry(&other, ci->dst_entry2, 3 ^ 1);
1831
if (add) {
1832
- if (handle_file_collision(o, b->path,
1832
+ if (handle_file_collision(opt, b->path,
1833
NULL, NULL,
1834
ci->branch1, ci->branch2,
1835
&add->oid, add->mode,
1836
&mfi.oid, mfi.mode) < 0)
1837
return -1;
1838
} else {
1839
- char *new_path = find_path_for_conflict(o, b->path,
1839
+ char *new_path = find_path_for_conflict(opt, b->path,
1840
ci->branch2,
1841
ci->branch1);
1842
- if (update_file(o, 0, &mfi.oid, mfi.mode, new_path ? new_path : b->path))
1842
+ if (update_file(opt, 0, &mfi.oid, mfi.mode, new_path ? new_path : b->path))
1843
return -1;
1844
free(new_path);
1845
- if (update_stages(o, b->path, NULL, NULL, b))
1845
+ if (update_stages(opt, b->path, NULL, NULL, b))
1846
return -1;
1847
}
1848
}
1850
return 0;
1851
}
1852
1853
-static int handle_rename_rename_2to1(struct merge_options *o,
1853
+static int handle_rename_rename_2to1(struct merge_options *opt,
1854
struct rename_conflict_info *ci)
1855
{
1856
/* Two files, a & b, were renamed to the same thing, c. */
1864
struct merge_file_info mfi_c1;
1865
struct merge_file_info mfi_c2;
1866
1867
- output(o, 1, _("CONFLICT (rename/rename): "
1867
+ output(opt, 1, _("CONFLICT (rename/rename): "
1868
"Rename %s->%s in %s. "
1869
"Rename %s->%s in %s"),
1870
a->path, c1->path, ci->branch1,
1872
1873
path_side_1_desc = xstrfmt("version of %s from %s", path, a->path);
1874
path_side_2_desc = xstrfmt("version of %s from %s", path, b->path);
1875
- if (merge_mode_and_contents(o, a, c1, &ci->ren1_other, path_side_1_desc,
1876
- o->branch1, o->branch2,
1877
- 1 + o->call_depth * 2, &mfi_c1) ||
1878
- merge_mode_and_contents(o, b, &ci->ren2_other, c2, path_side_2_desc,
1879
- o->branch1, o->branch2,
1880
- 1 + o->call_depth * 2, &mfi_c2))
1875
+ if (merge_mode_and_contents(opt, a, c1, &ci->ren1_other, path_side_1_desc,
1876
+ opt->branch1, opt->branch2,
1877
+ 1 + opt->call_depth * 2, &mfi_c1) ||
1878
+ merge_mode_and_contents(opt, b, &ci->ren2_other, c2, path_side_2_desc,
1879
+ opt->branch1, opt->branch2,
1880
+ 1 + opt->call_depth * 2, &mfi_c2))
1881
return -1;
1882
free(path_side_1_desc);
1883
free(path_side_2_desc);
1884
1885
- return handle_file_collision(o, path, a->path, b->path,
1885
+ return handle_file_collision(opt, path, a->path, b->path,
1886
ci->branch1, ci->branch2,
1887
&mfi_c1.oid, mfi_c1.mode,
1888
&mfi_c2.oid, mfi_c2.mode);
1891
/*
1892
* Get the diff_filepairs changed between o_tree and tree.
1893
*/
1894
-static struct diff_queue_struct *get_diffpairs(struct merge_options *o,
1894
+static struct diff_queue_struct *get_diffpairs(struct merge_options *opt,
1895
struct tree *o_tree,
1896
struct tree *tree)
1897
{
1898
struct diff_queue_struct *ret;
1899
struct diff_options opts;
1900
1901
- repo_diff_setup(o->repo, &opts);
1901
+ repo_diff_setup(opt->repo, &opts);
1902
opts.flags.recursive = 1;
1903
opts.flags.rename_empty = 0;
1904
- opts.detect_rename = merge_detect_rename(o);
1904
+ opts.detect_rename = merge_detect_rename(opt);
1905
/*
1906
* We do not have logic to handle the detection of copies. In
1907
* fact, it may not even make sense to add such logic: would we
1910
*/
1911
if (opts.detect_rename > DIFF_DETECT_RENAME)
1912
opts.detect_rename = DIFF_DETECT_RENAME;
1913
- opts.rename_limit = o->merge_rename_limit >= 0 ? o->merge_rename_limit :
1914
- o->diff_rename_limit >= 0 ? o->diff_rename_limit :
1913
+ opts.rename_limit = opt->merge_rename_limit >= 0 ? opt->merge_rename_limit :
1914
+ opt->diff_rename_limit >= 0 ? opt->diff_rename_limit :
1915
1000;
1916
- opts.rename_score = o->rename_score;
1917
- opts.show_rename_progress = o->show_rename_progress;
1916
+ opts.rename_score = opt->rename_score;
1917
+ opts.show_rename_progress = opt->show_rename_progress;
1918
opts.output_format = DIFF_FORMAT_NO_OUTPUT;
1919
diff_setup_done(&opts);
1920
diff_tree_oid(&o_tree->object.oid, &tree->object.oid, "", &opts);
1921
diffcore_std(&opts);
1922
- if (opts.needed_rename_limit > o->needed_rename_limit)
1923
- o->needed_rename_limit = opts.needed_rename_limit;
1922
+ if (opts.needed_rename_limit > opt->needed_rename_limit)
1923
+ opt->needed_rename_limit = opts.needed_rename_limit;
1924
1925
ret = xmalloc(sizeof(*ret));
1926
*ret = diff_queued_diff;
2039
* level conflicts for the renamed location. If there is a rename and
2040
* there are no conflicts, return the new name. Otherwise, return NULL.
2041
*/
2042
-static char *handle_path_level_conflicts(struct merge_options *o,
2042
+static char *handle_path_level_conflicts(struct merge_options *opt,
2043
const char *path,
2044
struct dir_rename_entry *entry,
2045
struct hashmap *collisions,
2060
/* This should only happen when entry->non_unique_new_dir set */
2061
if (!entry->non_unique_new_dir)
2062
BUG("entry->non_unqiue_dir not set and !new_path");
2063
- output(o, 1, _("CONFLICT (directory rename split): "
2063
+ output(opt, 1, _("CONFLICT (directory rename split): "
2064
"Unclear where to place %s because directory "
2065
"%s was renamed to multiple other directories, "
2066
"with no destination getting a majority of the "
2092
collision_ent->reported_already = 1;
2093
strbuf_add_separated_string_list(&collision_paths, ", ",
2094
&collision_ent->source_files);
2095
- output(o, 1, _("CONFLICT (implicit dir rename): Existing "
2095
+ output(opt, 1, _("CONFLICT (implicit dir rename): Existing "
2096
"file/dir at %s in the way of implicit "
2097
"directory rename(s) putting the following "
2098
"path(s) there: %s."),
2102
collision_ent->reported_already = 1;
2103
strbuf_add_separated_string_list(&collision_paths, ", ",
2104
&collision_ent->source_files);
2105
- output(o, 1, _("CONFLICT (implicit dir rename): Cannot map "
2105
+ output(opt, 1, _("CONFLICT (implicit dir rename): Cannot map "
2106
"more than one path to %s; implicit directory "
2107
"renames tried to put these paths there: %s"),
2108
new_path, collision_paths.buf);
2139
* causes conflicts for files within those merged directories, then
2140
* that should be detected at the individual path level.
2141
*/
2142
-static void handle_directory_level_conflicts(struct merge_options *o,
2142
+static void handle_directory_level_conflicts(struct merge_options *opt,
2143
struct hashmap *dir_re_head,
2144
struct tree *head,
2145
struct hashmap *dir_re_merge,
2194
* know that head_ent->new_dir and merge_ent->new_dir
2195
* are different strings.
2196
*/
2197
- output(o, 1, _("CONFLICT (rename/rename): "
2197
+ output(opt, 1, _("CONFLICT (rename/rename): "
2198
"Rename directory %s->%s in %s. "
2199
"Rename directory %s->%s in %s"),
2200
- head_ent->dir, head_ent->new_dir.buf, o->branch1,
2201
- head_ent->dir, merge_ent->new_dir.buf, o->branch2);
2200
+ head_ent->dir, head_ent->new_dir.buf, opt->branch1,
2201
+ head_ent->dir, merge_ent->new_dir.buf, opt->branch2);
2202
string_list_append(&remove_from_head,
2203
head_ent->dir)->util = head_ent;
2204
strbuf_release(&head_ent->new_dir);
2397
}
2398
}
2399
2400
-static char *check_for_directory_rename(struct merge_options *o,
2400
+static char *check_for_directory_rename(struct merge_options *opt,
2401
const char *path,
2402
struct tree *tree,
2403
struct hashmap *dir_renames,
2438
*/
2439
oentry = dir_rename_find_entry(dir_rename_exclusions, entry->new_dir.buf);
2440
if (oentry) {
2441
- output(o, 1, _("WARNING: Avoiding applying %s -> %s rename "
2441
+ output(opt, 1, _("WARNING: Avoiding applying %s -> %s rename "
2442
"to %s, because %s itself was renamed."),
2443
entry->dir, entry->new_dir.buf, path, entry->new_dir.buf);
2444
} else {
2445
- new_path = handle_path_level_conflicts(o, path, entry,
2445
+ new_path = handle_path_level_conflicts(opt, path, entry,
2446
collisions, tree);
2447
*clean_merge &= (new_path != NULL);
2448
}
2450
return new_path;
2451
}
2452
2453
-static void apply_directory_rename_modifications(struct merge_options *o,
2453
+static void apply_directory_rename_modifications(struct merge_options *opt,
2454
struct diff_filepair *pair,
2455
char *new_path,
2456
struct rename *re,
2473
* saying the file would have been overwritten), but it might
2474
* be dirty, though.
2475
*/
2476
- update_wd = !was_dirty(o, pair->two->path);
2476
+ update_wd = !was_dirty(opt, pair->two->path);
2477
if (!update_wd)
2478
- output(o, 1, _("Refusing to lose dirty file at %s"),
2478
+ output(opt, 1, _("Refusing to lose dirty file at %s"),
2479
pair->two->path);
2480
- remove_file(o, 1, pair->two->path, !update_wd);
2480
+ remove_file(opt, 1, pair->two->path, !update_wd);
2481
2482
/* Find or create a new re->dst_entry */
2483
item = string_list_lookup(entries, new_path);
2566
* to be able to associate the correct cache entries with the rename
2567
* information; tree is always equal to either a_tree or b_tree.
2568
*/
2569
-static struct string_list *get_renames(struct merge_options *o,
2569
+static struct string_list *get_renames(struct merge_options *opt,
2570
struct diff_queue_struct *pairs,
2571
struct hashmap *dir_renames,
2572
struct hashmap *dir_rename_exclusions,
2596
diff_free_filepair(pair);
2597
continue;
2598
}
2599
- new_path = check_for_directory_rename(o, pair->two->path, tree,
2599
+ new_path = check_for_directory_rename(opt, pair->two->path, tree,
2600
dir_renames,
2601
dir_rename_exclusions,
2602
&collisions,
2626
item = string_list_insert(renames, pair->one->path);
2627
item->util = re;
2628
if (new_path)
2629
- apply_directory_rename_modifications(o, pair, new_path,
2629
+ apply_directory_rename_modifications(opt, pair, new_path,
2630
re, tree, o_tree,
2631
a_tree, b_tree,
2632
entries);
2641
return renames;
2642
}
2643
2644
-static int process_renames(struct merge_options *o,
2644
+static int process_renames(struct merge_options *opt,
2645
struct string_list *a_renames,
2646
struct string_list *b_renames)
2647
{
2685
if (ren1) {
2686
renames1 = a_renames;
2687
renames2Dst = &b_by_dst;
2688
- branch1 = o->branch1;
2689
- branch2 = o->branch2;
2688
+ branch1 = opt->branch1;
2689
+ branch2 = opt->branch2;
2690
} else {
2691
renames1 = b_renames;
2692
renames2Dst = &a_by_dst;
2693
- branch1 = o->branch2;
2694
- branch2 = o->branch1;
2693
+ branch1 = opt->branch2;
2694
+ branch2 = opt->branch1;
2695
SWAP(ren2, ren1);
2696
}
2697
2725
* the base stage (think of rename +
2726
* add-source cases).
2727
*/
2728
- remove_file(o, 1, ren1_src, 1);
2728
+ remove_file(opt, 1, ren1_src, 1);
2729
update_entry(ren1->dst_entry,
2730
ren1->pair->one,
2731
ren1->pair->two,
2738
branch2,
2739
ren1->dst_entry,
2740
ren2->dst_entry,
2741
- o,
2741
+ opt,
2742
NULL,
2743
NULL);
2744
} else if ((lookup = string_list_lookup(renames2Dst, ren1_dst))) {
2765
branch2,
2766
ren1->dst_entry,
2767
ren2->dst_entry,
2768
- o,
2768
+ opt,
2769
ren1->src_entry,
2770
ren2->src_entry);
2771
2788
* stage and in other_stage (think of rename +
2789
* add-source case).
2790
*/
2791
- remove_file(o, 1, ren1_src,
2792
- renamed_stage == 2 || !was_tracked(o, ren1_src));
2791
+ remove_file(opt, 1, ren1_src,
2792
+ renamed_stage == 2 || !was_tracked(opt, ren1_src));
2793
2794
oidcpy(&src_other.oid,
2795
&ren1->src_entry->stages[other_stage].oid);
2808
branch2,
2809
ren1->dst_entry,
2810
NULL,
2811
- o,
2811
+ opt,
2812
NULL,
2813
NULL);
2814
} else if (oid_eq(&src_other.oid, &null_oid)) {
2819
branch2,
2820
ren1->dst_entry,
2821
NULL,
2822
- o,
2822
+ opt,
2823
NULL,
2824
NULL);
2825
} else if ((dst_other.mode == ren1->pair->two->mode) &&
2832
* update_file_flags() instead of
2833
* update_file().
2834
*/
2835
- if (update_file_flags(o,
2835
+ if (update_file_flags(opt,
2836
&ren1->pair->two->oid,
2837
ren1->pair->two->mode,
2838
ren1_dst,
2854
branch2,
2855
ren1->dst_entry,
2856
NULL,
2857
- o,
2857
+ opt,
2858
ren1->src_entry,
2859
NULL);
2860
} else
2882
NULL,
2883
ren1->dst_entry,
2884
NULL,
2885
- o,
2885
+ opt,
2886
NULL,
2887
NULL);
2888
}
2919
free(pairs);
2920
}
2921
2922
-static int detect_and_process_renames(struct merge_options *o,
2922
+static int detect_and_process_renames(struct merge_options *opt,
2923
struct tree *common,
2924
struct tree *head,
2925
struct tree *merge,
2933
ri->head_renames = NULL;
2934
ri->merge_renames = NULL;
2935
2936
- if (!merge_detect_rename(o))
2936
+ if (!merge_detect_rename(opt))
2937
return 1;
2938
2939
- head_pairs = get_diffpairs(o, common, head);
2940
- merge_pairs = get_diffpairs(o, common, merge);
2939
+ head_pairs = get_diffpairs(opt, common, head);
2940
+ merge_pairs = get_diffpairs(opt, common, merge);
2941
2942
- if (o->detect_directory_renames) {
2942
+ if (opt->detect_directory_renames) {
2943
dir_re_head = get_directory_renames(head_pairs);
2944
dir_re_merge = get_directory_renames(merge_pairs);
2945
2946
- handle_directory_level_conflicts(o,
2946
+ handle_directory_level_conflicts(opt,
2947
dir_re_head, head,
2948
dir_re_merge, merge);
2949
} else {
2953
dir_rename_init(dir_re_merge);
2954
}
2955
2956
- ri->head_renames = get_renames(o, head_pairs,
2956
+ ri->head_renames = get_renames(opt, head_pairs,
2957
dir_re_merge, dir_re_head, head,
2958
common, head, merge, entries,
2959
&clean);
2960
if (clean < 0)
2961
goto cleanup;
2962
- ri->merge_renames = get_renames(o, merge_pairs,
2962
+ ri->merge_renames = get_renames(opt, merge_pairs,
2963
dir_re_head, dir_re_merge, merge,
2964
common, head, merge, entries,
2965
&clean);
2966
if (clean < 0)
2967
goto cleanup;
2968
- clean &= process_renames(o, ri->head_renames, ri->merge_renames);
2968
+ clean &= process_renames(opt, ri->head_renames, ri->merge_renames);
2969
2970
cleanup:
2971
/*
3006
return (is_null_oid(oid) || mode == 0) ? NULL: (struct object_id *)oid;
3007
}
3008
3009
-static int read_oid_strbuf(struct merge_options *o,
3009
+static int read_oid_strbuf(struct merge_options *opt,
3010
const struct object_id *oid,
3011
struct strbuf *dst)
3012
{
3015
unsigned long size;
3016
buf = read_object_file(oid, &type, &size);
3017
if (!buf)
3018
- return err(o, _("cannot read object %s"), oid_to_hex(oid));
3018
+ return err(opt, _("cannot read object %s"), oid_to_hex(oid));
3019
if (type != OBJ_BLOB) {
3020
free(buf);
3021
- return err(o, _("object %s is not a blob"), oid_to_hex(oid));
3021
+ return err(opt, _("object %s is not a blob"), oid_to_hex(oid));
3022
}
3023
strbuf_attach(dst, buf, size, size + 1);
3024
return 0;
3060
return ret;
3061
}
3062
3063
-static int handle_modify_delete(struct merge_options *o,
3063
+static int handle_modify_delete(struct merge_options *opt,
3064
const char *path,
3065
struct object_id *o_oid, int o_mode,
3066
struct object_id *a_oid, int a_mode,
3071
int changed_mode;
3072
3073
if (a_oid) {
3074
- modify_branch = o->branch1;
3075
- delete_branch = o->branch2;
3074
+ modify_branch = opt->branch1;
3075
+ delete_branch = opt->branch2;
3076
changed_oid = a_oid;
3077
changed_mode = a_mode;
3078
} else {
3079
- modify_branch = o->branch2;
3080
- delete_branch = o->branch1;
3079
+ modify_branch = opt->branch2;
3080
+ delete_branch = opt->branch1;
3081
changed_oid = b_oid;
3082
changed_mode = b_mode;
3083
}
3084
3085
- return handle_change_delete(o,
3085
+ return handle_change_delete(opt,
3086
path, NULL,
3087
o_oid, o_mode,
3088
changed_oid, changed_mode,
3090
_("modify"), _("modified"));
3091
}
3092
3093
-static int handle_content_merge(struct merge_options *o,
3093
+static int handle_content_merge(struct merge_options *opt,
3094
const char *path,
3095
int is_dirty,
3096
struct object_id *o_oid, int o_mode,
3119
if (rename_conflict_info) {
3120
struct diff_filepair *pair1 = rename_conflict_info->pair1;
3121
3122
- path1 = (o->branch1 == rename_conflict_info->branch1) ?
3122
+ path1 = (opt->branch1 == rename_conflict_info->branch1) ?
3123
pair1->two->path : pair1->one->path;
3124
/* If rename_conflict_info->pair2 != NULL, we are in
3125
* RENAME_ONE_FILE_TO_ONE case. Otherwise, we have a
3126
* normal rename.
3127
*/
3128
path2 = (rename_conflict_info->pair2 ||
3129
- o->branch2 == rename_conflict_info->branch1) ?
3129
+ opt->branch2 == rename_conflict_info->branch1) ?
3130
pair1->two->path : pair1->one->path;
3131
one.path = pair1->one->path;
3132
a.path = (char *)path1;
3133
b.path = (char *)path2;
3134
3135
- if (dir_in_way(o->repo->index, path, !o->call_depth,
3135
+ if (dir_in_way(opt->repo->index, path, !opt->call_depth,
3136
S_ISGITLINK(pair1->two->mode)))
3137
df_conflict_remains = 1;
3138
}
3139
- if (merge_mode_and_contents(o, &one, &a, &b, path,
3140
- o->branch1, o->branch2,
3141
- o->call_depth * 2, &mfi))
3139
+ if (merge_mode_and_contents(opt, &one, &a, &b, path,
3140
+ opt->branch1, opt->branch2,
3141
+ opt->call_depth * 2, &mfi))
3142
return -1;
3143
3144
/*
3148
* c) The target path is usable (i.e. not involved in D/F conflict)
3149
*/
3150
if (mfi.clean &&
3151
- was_tracked_and_matches(o, path, &mfi.oid, mfi.mode) &&
3151
+ was_tracked_and_matches(opt, path, &mfi.oid, mfi.mode) &&
3152
!df_conflict_remains) {
3153
int pos;
3154
struct cache_entry *ce;
3155
3156
- output(o, 3, _("Skipped %s (merged same as existing)"), path);
3157
- if (add_cacheinfo(o, mfi.mode, &mfi.oid, path,
3158
- 0, (!o->call_depth && !is_dirty), 0))
3156
+ output(opt, 3, _("Skipped %s (merged same as existing)"), path);
3157
+ if (add_cacheinfo(opt, mfi.mode, &mfi.oid, path,
3158
+ 0, (!opt->call_depth && !is_dirty), 0))
3159
return -1;
3160
/*
3161
* However, add_cacheinfo() will delete the old cache entry
3163
* flag to avoid making the file appear as if it were
3164
* deleted by the user.
3165
*/
3166
- pos = index_name_pos(&o->orig_index, path, strlen(path));
3167
- ce = o->orig_index.cache[pos];
3166
+ pos = index_name_pos(&opt->orig_index, path, strlen(path));
3167
+ ce = opt->orig_index.cache[pos];
3168
if (ce_skip_worktree(ce)) {
3169
- pos = index_name_pos(o->repo->index, path, strlen(path));
3170
- ce = o->repo->index->cache[pos];
3169
+ pos = index_name_pos(opt->repo->index, path, strlen(path));
3170
+ ce = opt->repo->index->cache[pos];
3171
ce->ce_flags |= CE_SKIP_WORKTREE;
3172
}
3173
return mfi.clean;
3176
if (!mfi.clean) {
3177
if (S_ISGITLINK(mfi.mode))
3178
reason = _("submodule");
3179
- output(o, 1, _("CONFLICT (%s): Merge conflict in %s"),
3179
+ output(opt, 1, _("CONFLICT (%s): Merge conflict in %s"),
3180
reason, path);
3181
if (rename_conflict_info && !df_conflict_remains)
3182
- if (update_stages(o, path, &one, &a, &b))
3182
+ if (update_stages(opt, path, &one, &a, &b))
3183
return -1;
3184
}
3185
3186
if (df_conflict_remains || is_dirty) {
3187
char *new_path;
3188
- if (o->call_depth) {
3189
- remove_file_from_index(o->repo->index, path);
3188
+ if (opt->call_depth) {
3189
+ remove_file_from_index(opt->repo->index, path);
3190
} else {
3191
if (!mfi.clean) {
3192
- if (update_stages(o, path, &one, &a, &b))
3192
+ if (update_stages(opt, path, &one, &a, &b))
3193
return -1;
3194
} else {
3195
- int file_from_stage2 = was_tracked(o, path);
3195
+ int file_from_stage2 = was_tracked(opt, path);
3196
struct diff_filespec merged;
3197
oidcpy(&merged.oid, &mfi.oid);
3198
merged.mode = mfi.mode;
3199
3200
- if (update_stages(o, path, NULL,
3200
+ if (update_stages(opt, path, NULL,
3201
file_from_stage2 ? &merged : NULL,
3202
file_from_stage2 ? NULL : &merged))
3203
return -1;
3204
}
3205
3206
}
3207
- new_path = unique_path(o, path, rename_conflict_info->branch1);
3207
+ new_path = unique_path(opt, path, rename_conflict_info->branch1);
3208
if (is_dirty) {
3209
- output(o, 1, _("Refusing to lose dirty file at %s"),
3209
+ output(opt, 1, _("Refusing to lose dirty file at %s"),
3210
path);
3211
}
3212
- output(o, 1, _("Adding as %s instead"), new_path);
3213
- if (update_file(o, 0, &mfi.oid, mfi.mode, new_path)) {
3212
+ output(opt, 1, _("Adding as %s instead"), new_path);
3213
+ if (update_file(opt, 0, &mfi.oid, mfi.mode, new_path)) {
3214
free(new_path);
3215
return -1;
3216
}
3217
free(new_path);
3218
mfi.clean = 0;
3219
- } else if (update_file(o, mfi.clean, &mfi.oid, mfi.mode, path))
3219
+ } else if (update_file(opt, mfi.clean, &mfi.oid, mfi.mode, path))
3220
return -1;
3221
return !is_dirty && mfi.clean;
3222
}
3223
3224
-static int handle_rename_normal(struct merge_options *o,
3224
+static int handle_rename_normal(struct merge_options *opt,
3225
const char *path,
3226
struct object_id *o_oid, unsigned int o_mode,
3227
struct object_id *a_oid, unsigned int a_mode,
3229
struct rename_conflict_info *ci)
3230
{
3231
/* Merge the content and write it out */
3232
- return handle_content_merge(o, path, was_dirty(o, path),
3232
+ return handle_content_merge(opt, path, was_dirty(opt, path),
3233
o_oid, o_mode, a_oid, a_mode, b_oid, b_mode,
3234
ci);
3235
}
3236
3237
/* Per entry merge function */
3238
-static int process_entry(struct merge_options *o,
3238
+static int process_entry(struct merge_options *opt,
3239
const char *path, struct stage_data *entry)
3240
{
3241
int clean_merge = 1;
3242
- int normalize = o->renormalize;
3242
+ int normalize = opt->renormalize;
3243
unsigned o_mode = entry->stages[1].mode;
3244
unsigned a_mode = entry->stages[2].mode;
3245
unsigned b_mode = entry->stages[3].mode;
3253
switch (conflict_info->rename_type) {
3254
case RENAME_NORMAL:
3255
case RENAME_ONE_FILE_TO_ONE:
3256
- clean_merge = handle_rename_normal(o,
3256
+ clean_merge = handle_rename_normal(opt,
3257
path,
3258
o_oid, o_mode,
3259
a_oid, a_mode,
3262
break;
3263
case RENAME_VIA_DIR:
3264
clean_merge = 1;
3265
- if (handle_rename_via_dir(o,
3265
+ if (handle_rename_via_dir(opt,
3266
conflict_info->pair1,
3267
conflict_info->branch1))
3268
clean_merge = -1;
3274
* two-way merged cleanly with the added file, I
3275
* guess it's a clean merge?
3276
*/
3277
- clean_merge = handle_rename_add(o, conflict_info);
3277
+ clean_merge = handle_rename_add(opt, conflict_info);
3278
break;
3279
case RENAME_DELETE:
3280
clean_merge = 0;
3281
- if (handle_rename_delete(o,
3281
+ if (handle_rename_delete(opt,
3282
conflict_info->pair1,
3283
conflict_info->branch1,
3284
conflict_info->branch2))
3286
break;
3287
case RENAME_ONE_FILE_TO_TWO:
3288
clean_merge = 0;
3289
- if (handle_rename_rename_1to2(o, conflict_info))
3289
+ if (handle_rename_rename_1to2(opt, conflict_info))
3290
clean_merge = -1;
3291
break;
3292
case RENAME_TWO_FILES_TO_ONE:
3296
* can then be two-way merged cleanly, I guess it's
3297
* a clean merge?
3298
*/
3299
- clean_merge = handle_rename_rename_2to1(o,
3299
+ clean_merge = handle_rename_rename_2to1(opt,
3300
conflict_info);
3301
break;
3302
default:
3306
} else if (o_oid && (!a_oid || !b_oid)) {
3307
/* Case A: Deleted in one */
3308
if ((!a_oid && !b_oid) ||
3309
- (!b_oid && blob_unchanged(o, o_oid, o_mode, a_oid, a_mode, normalize, path)) ||
3310
- (!a_oid && blob_unchanged(o, o_oid, o_mode, b_oid, b_mode, normalize, path))) {
3309
+ (!b_oid && blob_unchanged(opt, o_oid, o_mode, a_oid, a_mode, normalize, path)) ||
3310
+ (!a_oid && blob_unchanged(opt, o_oid, o_mode, b_oid, b_mode, normalize, path))) {
3311
/* Deleted in both or deleted in one and
3312
* unchanged in the other */
3313
if (a_oid)
3314
- output(o, 2, _("Removing %s"), path);
3314
+ output(opt, 2, _("Removing %s"), path);
3315
/* do not touch working file if it did not exist */
3316
- remove_file(o, 1, path, !a_oid);
3316
+ remove_file(opt, 1, path, !a_oid);
3317
} else {
3318
/* Modify/delete; deleted side may have put a directory in the way */
3319
clean_merge = 0;
3320
- if (handle_modify_delete(o, path, o_oid, o_mode,
3320
+ if (handle_modify_delete(opt, path, o_oid, o_mode,
3321
a_oid, a_mode, b_oid, b_mode))
3322
clean_merge = -1;
3323
}
3333
const char *conf;
3334
3335
if (a_oid) {
3336
- add_branch = o->branch1;
3337
- other_branch = o->branch2;
3336
+ add_branch = opt->branch1;
3337
+ other_branch = opt->branch2;
3338
mode = a_mode;
3339
oid = a_oid;
3340
conf = _("file/directory");
3341
} else {
3342
- add_branch = o->branch2;
3343
- other_branch = o->branch1;
3342
+ add_branch = opt->branch2;
3343
+ other_branch = opt->branch1;
3344
mode = b_mode;
3345
oid = b_oid;
3346
conf = _("directory/file");
3347
}
3348
- if (dir_in_way(o->repo->index, path,
3349
- !o->call_depth && !S_ISGITLINK(a_mode),
3348
+ if (dir_in_way(opt->repo->index, path,
3349
+ !opt->call_depth && !S_ISGITLINK(a_mode),
3350
0)) {
3351
- char *new_path = unique_path(o, path, add_branch);
3351
+ char *new_path = unique_path(opt, path, add_branch);
3352
clean_merge = 0;
3353
- output(o, 1, _("CONFLICT (%s): There is a directory with name %s in %s. "
3353
+ output(opt, 1, _("CONFLICT (%s): There is a directory with name %s in %s. "
3354
"Adding %s as %s"),
3355
conf, path, other_branch, path, new_path);
3356
- if (update_file(o, 0, oid, mode, new_path))
3356
+ if (update_file(opt, 0, oid, mode, new_path))
3357
clean_merge = -1;
3358
- else if (o->call_depth)
3359
- remove_file_from_index(o->repo->index, path);
3358
+ else if (opt->call_depth)
3359
+ remove_file_from_index(opt->repo->index, path);
3360
free(new_path);
3361
} else {
3362
- output(o, 2, _("Adding %s"), path);
3362
+ output(opt, 2, _("Adding %s"), path);
3363
/* do not overwrite file if already present */
3364
- if (update_file_flags(o, oid, mode, path, 1, !a_oid))
3364
+ if (update_file_flags(opt, oid, mode, path, 1, !a_oid))
3365
clean_merge = -1;
3366
}
3367
} else if (a_oid && b_oid) {
3368
if (!o_oid) {
3369
/* Case C: Added in both (check for same permissions) */
3370
- output(o, 1,
3370
+ output(opt, 1,
3371
_("CONFLICT (add/add): Merge conflict in %s"),
3372
path);
3373
- clean_merge = handle_file_collision(o,
3373
+ clean_merge = handle_file_collision(opt,
3374
path, NULL, NULL,
3375
- o->branch1,
3376
- o->branch2,
3375
+ opt->branch1,
3376
+ opt->branch2,
3377
a_oid, a_mode,
3378
b_oid, b_mode);
3379
} else {
3380
/* case D: Modified in both, but differently. */
3381
int is_dirty = 0; /* unpack_trees would have bailed if dirty */
3382
- clean_merge = handle_content_merge(o, path,
3382
+ clean_merge = handle_content_merge(opt, path,
3383
is_dirty,
3384
o_oid, o_mode,
3385
a_oid, a_mode,
3391
* this entry was deleted altogether. a_mode == 0 means
3392
* we had that path and want to actively remove it.
3393
*/
3394
- remove_file(o, 1, path, !a_mode);
3394
+ remove_file(opt, 1, path, !a_mode);
3395
} else
3396
BUG("fatal merge failure, shouldn't happen.");
3397
3398
return clean_merge;
3399
}
3400
3401
-int merge_trees(struct merge_options *o,
3401
+int merge_trees(struct merge_options *opt,
3402
struct tree *head,
3403
struct tree *merge,
3404
struct tree *common,
3405
struct tree **result)
3406
{
3407
- struct index_state *istate = o->repo->index;
3407
+ struct index_state *istate = opt->repo->index;
3408
int code, clean;
3409
struct strbuf sb = STRBUF_INIT;
3410
3411
- if (!o->call_depth && repo_index_has_changes(o->repo, head, &sb)) {
3412
- err(o, _("Your local changes to the following files would be overwritten by merge:\n %s"),
3411
+ if (!opt->call_depth && repo_index_has_changes(opt->repo, head, &sb)) {
3412
+ err(opt, _("Your local changes to the following files would be overwritten by merge:\n %s"),
3413
sb.buf);
3414
return -1;
3415
}
3416
3417
- if (o->subtree_shift) {
3418
- merge = shift_tree_object(o->repo, head, merge, o->subtree_shift);
3419
- common = shift_tree_object(o->repo, head, common, o->subtree_shift);
3417
+ if (opt->subtree_shift) {
3418
+ merge = shift_tree_object(opt->repo, head, merge, opt->subtree_shift);
3419
+ common = shift_tree_object(opt->repo, head, common, opt->subtree_shift);
3420
}
3421
3422
if (oid_eq(&common->object.oid, &merge->object.oid)) {
3423
- output(o, 0, _("Already up to date!"));
3423
+ output(opt, 0, _("Already up to date!"));
3424
*result = head;
3425
return 1;
3426
}
3427
3428
- code = unpack_trees_start(o, common, head, merge);
3428
+ code = unpack_trees_start(opt, common, head, merge);
3429
3430
if (code != 0) {
3431
- if (show(o, 4) || o->call_depth)
3432
- err(o, _("merging of trees %s and %s failed"),
3431
+ if (show(opt, 4) || opt->call_depth)
3432
+ err(opt, _("merging of trees %s and %s failed"),
3433
oid_to_hex(&head->object.oid),
3434
oid_to_hex(&merge->object.oid));
3435
- unpack_trees_finish(o);
3435
+ unpack_trees_finish(opt);
3436
return -1;
3437
}
3438
3447
* opposed to decaring a local hashmap is for convenience
3448
* so that we don't have to pass it to around.
3449
*/
3450
- hashmap_init(&o->current_file_dir_set, path_hashmap_cmp, NULL, 512);
3451
- get_files_dirs(o, head);
3452
- get_files_dirs(o, merge);
3450
+ hashmap_init(&opt->current_file_dir_set, path_hashmap_cmp, NULL, 512);
3451
+ get_files_dirs(opt, head);
3452
+ get_files_dirs(opt, merge);
3453
3454
- entries = get_unmerged(o->repo->index);
3455
- clean = detect_and_process_renames(o, common, head, merge,
3454
+ entries = get_unmerged(opt->repo->index);
3455
+ clean = detect_and_process_renames(opt, common, head, merge,
3456
entries, &re_info);
3457
- record_df_conflict_files(o, entries);
3457
+ record_df_conflict_files(opt, entries);
3458
if (clean < 0)
3459
goto cleanup;
3460
for (i = entries->nr-1; 0 <= i; i--) {
3461
const char *path = entries->items[i].string;
3462
struct stage_data *e = entries->items[i].util;
3463
if (!e->processed) {
3464
- int ret = process_entry(o, path, e);
3464
+ int ret = process_entry(opt, path, e);
3465
if (!ret)
3466
clean = 0;
3467
else if (ret < 0) {
3483
string_list_clear(entries, 1);
3484
free(entries);
3485
3486
- hashmap_free(&o->current_file_dir_set, 1);
3486
+ hashmap_free(&opt->current_file_dir_set, 1);
3487
3488
if (clean < 0) {
3489
- unpack_trees_finish(o);
3489
+ unpack_trees_finish(opt);
3490
return clean;
3491
}
3492
}
3493
else
3494
clean = 1;
3495
3496
- unpack_trees_finish(o);
3496
+ unpack_trees_finish(opt);
3497
3498
- if (o->call_depth && !(*result = write_tree_from_memory(o)))
3498
+ if (opt->call_depth && !(*result = write_tree_from_memory(opt)))
3499
return -1;
3500
3501
return clean;
3516
* Merge the commits h1 and h2, return the resulting virtual
3517
* commit object and a flag indicating the cleanness of the merge.
3518
*/
3519
-int merge_recursive(struct merge_options *o,
3519
+int merge_recursive(struct merge_options *opt,
3520
struct commit *h1,
3521
struct commit *h2,
3522
struct commit_list *ca,
3527
struct tree *mrtree;
3528
int clean;
3529
3530
- if (show(o, 4)) {
3531
- output(o, 4, _("Merging:"));
3532
- output_commit_title(o, h1);
3533
- output_commit_title(o, h2);
3530
+ if (show(opt, 4)) {
3531
+ output(opt, 4, _("Merging:"));
3532
+ output_commit_title(opt, h1);
3533
+ output_commit_title(opt, h2);
3534
}
3535
3536
if (!ca) {
3538
ca = reverse_commit_list(ca);
3539
}
3540
3541
- if (show(o, 5)) {
3541
+ if (show(opt, 5)) {
3542
unsigned cnt = commit_list_count(ca);
3543
3544
- output(o, 5, Q_("found %u common ancestor:",
3544
+ output(opt, 5, Q_("found %u common ancestor:",
3545
"found %u common ancestors:", cnt), cnt);
3546
for (iter = ca; iter; iter = iter->next)
3547
- output_commit_title(o, iter->item);
3547
+ output_commit_title(opt, iter->item);
3548
}
3549
3550
merged_common_ancestors = pop_commit(&ca);
3552
/* if there is no common ancestor, use an empty tree */
3553
struct tree *tree;
3554
3555
- tree = lookup_tree(o->repo, o->repo->hash_algo->empty_tree);
3556
- merged_common_ancestors = make_virtual_commit(o->repo, tree, "ancestor");
3555
+ tree = lookup_tree(opt->repo, opt->repo->hash_algo->empty_tree);
3556
+ merged_common_ancestors = make_virtual_commit(opt->repo, tree, "ancestor");
3557
}
3558
3559
for (iter = ca; iter; iter = iter->next) {
3560
const char *saved_b1, *saved_b2;
3561
- o->call_depth++;
3561
+ opt->call_depth++;
3562
/*
3563
* When the merge fails, the result contains files
3564
* with conflict markers. The cleanness flag is
3567
* overwritten it: the committed "conflicts" were
3568
* already resolved.
3569
*/
3570
- discard_index(o->repo->index);
3571
- saved_b1 = o->branch1;
3572
- saved_b2 = o->branch2;
3573
- o->branch1 = "Temporary merge branch 1";
3574
- o->branch2 = "Temporary merge branch 2";
3575
- if (merge_recursive(o, merged_common_ancestors, iter->item,
3570
+ discard_index(opt->repo->index);
3571
+ saved_b1 = opt->branch1;
3572
+ saved_b2 = opt->branch2;
3573
+ opt->branch1 = "Temporary merge branch 1";
3574
+ opt->branch2 = "Temporary merge branch 2";
3575
+ if (merge_recursive(opt, merged_common_ancestors, iter->item,
3576
NULL, &merged_common_ancestors) < 0)
3577
return -1;
3578
- o->branch1 = saved_b1;
3579
- o->branch2 = saved_b2;
3580
- o->call_depth--;
3578
+ opt->branch1 = saved_b1;
3579
+ opt->branch2 = saved_b2;
3580
+ opt->call_depth--;
3581
3582
if (!merged_common_ancestors)
3583
- return err(o, _("merge returned no commit"));
3583
+ return err(opt, _("merge returned no commit"));
3584
}
3585
3586
- discard_index(o->repo->index);
3587
- if (!o->call_depth)
3588
- repo_read_index(o->repo);
3586
+ discard_index(opt->repo->index);
3587
+ if (!opt->call_depth)
3588
+ repo_read_index(opt->repo);
3589
3590
- o->ancestor = "merged common ancestors";
3591
- clean = merge_trees(o, get_commit_tree(h1), get_commit_tree(h2),
3590
+ opt->ancestor = "merged common ancestors";
3591
+ clean = merge_trees(opt, get_commit_tree(h1), get_commit_tree(h2),
3592
get_commit_tree(merged_common_ancestors),
3593
&mrtree);
3594
if (clean < 0) {
3595
- flush_output(o);
3595
+ flush_output(opt);
3596
return clean;
3597
}
3598
3599
- if (o->call_depth) {
3600
- *result = make_virtual_commit(o->repo, mrtree, "merged tree");
3599
+ if (opt->call_depth) {
3600
+ *result = make_virtual_commit(opt->repo, mrtree, "merged tree");
3601
commit_list_insert(h1, &(*result)->parents);
3602
commit_list_insert(h2, &(*result)->parents->next);
3603
}
3604
- flush_output(o);
3605
- if (!o->call_depth && o->buffer_output < 2)
3606
- strbuf_release(&o->obuf);
3607
- if (show(o, 2))
3604
+ flush_output(opt);
3605
+ if (!opt->call_depth && opt->buffer_output < 2)
3606
+ strbuf_release(&opt->obuf);
3607
+ if (show(opt, 2))
3608
diff_warn_rename_limit("merge.renamelimit",
3609
- o->needed_rename_limit, 0);
3609
+ opt->needed_rename_limit, 0);
3610
return clean;
3611
}
3612
3628
return (struct commit *)object;
3629
}
3630
3631
-int merge_recursive_generic(struct merge_options *o,
3631
+int merge_recursive_generic(struct merge_options *opt,
3632
const struct object_id *head,
3633
const struct object_id *merge,
3634
int num_base_list,
3637
{
3638
int clean;
3639
struct lock_file lock = LOCK_INIT;
3640
- struct commit *head_commit = get_ref(o->repo, head, o->branch1);
3641
- struct commit *next_commit = get_ref(o->repo, merge, o->branch2);
3640
+ struct commit *head_commit = get_ref(opt->repo, head, opt->branch1);
3641
+ struct commit *next_commit = get_ref(opt->repo, merge, opt->branch2);
3642
struct commit_list *ca = NULL;
3643
3644
if (base_list) {
3645
int i;
3646
for (i = 0; i < num_base_list; ++i) {
3647
struct commit *base;
3648
- if (!(base = get_ref(o->repo, base_list[i], oid_to_hex(base_list[i]))))
3649
- return err(o, _("Could not parse object '%s'"),
3648
+ if (!(base = get_ref(opt->repo, base_list[i], oid_to_hex(base_list[i]))))
3649
+ return err(opt, _("Could not parse object '%s'"),
3650
oid_to_hex(base_list[i]));
3651
commit_list_insert(base, &ca);
3652
}
3653
}
3654
3655
- repo_hold_locked_index(o->repo, &lock, LOCK_DIE_ON_ERROR);
3656
- clean = merge_recursive(o, head_commit, next_commit, ca,
3655
+ repo_hold_locked_index(opt->repo, &lock, LOCK_DIE_ON_ERROR);
3656
+ clean = merge_recursive(opt, head_commit, next_commit, ca,
3657
result);
3658
if (clean < 0) {
3659
rollback_lock_file(&lock);
3660
return clean;
3661
}
3662
3663
- if (write_locked_index(o->repo->index, &lock,
3663
+ if (write_locked_index(opt->repo->index, &lock,
3664
COMMIT_LOCK | SKIP_IF_UNCHANGED))
3665
- return err(o, _("Unable to write index."));
3665
+ return err(opt, _("Unable to write index."));
3666
3667
return clean ? 0 : 1;
3668
}
3669
3670
-static void merge_recursive_config(struct merge_options *o)
3670
+static void merge_recursive_config(struct merge_options *opt)
3671
{
3672
char *value = NULL;
3673
- git_config_get_int("merge.verbosity", &o->verbosity);
3674
- git_config_get_int("diff.renamelimit", &o->diff_rename_limit);
3675
- git_config_get_int("merge.renamelimit", &o->merge_rename_limit);
3673
+ git_config_get_int("merge.verbosity", &opt->verbosity);
3674
+ git_config_get_int("diff.renamelimit", &opt->diff_rename_limit);
3675
+ git_config_get_int("merge.renamelimit", &opt->merge_rename_limit);
3676
if (!git_config_get_string("diff.renames", &value)) {
3677
- o->diff_detect_rename = git_config_rename("diff.renames", value);
3677
+ opt->diff_detect_rename = git_config_rename("diff.renames", value);
3678
free(value);
3679
}
3680
if (!git_config_get_string("merge.renames", &value)) {
3681
- o->merge_detect_rename = git_config_rename("merge.renames", value);
3681
+ opt->merge_detect_rename = git_config_rename("merge.renames", value);
3682
free(value);
3683
}
3684
git_config(git_xmerge_config, NULL);
3685
}
3686
3687
-void init_merge_options(struct merge_options *o,
3687
+void init_merge_options(struct merge_options *opt,
3688
struct repository *repo)
3689
{
3690
const char *merge_verbosity;
3691
- memset(o, 0, sizeof(struct merge_options));
3692
- o->repo = repo;
3693
- o->verbosity = 2;
3694
- o->buffer_output = 1;
3695
- o->diff_rename_limit = -1;
3696
- o->merge_rename_limit = -1;
3697
- o->renormalize = 0;
3698
- o->diff_detect_rename = -1;
3699
- o->merge_detect_rename = -1;
3700
- o->detect_directory_renames = 1;
3701
- merge_recursive_config(o);
3691
+ memset(opt, 0, sizeof(struct merge_options));
3692
+ opt->repo = repo;
3693
+ opt->verbosity = 2;
3694
+ opt->buffer_output = 1;
3695
+ opt->diff_rename_limit = -1;
3696
+ opt->merge_rename_limit = -1;
3697
+ opt->renormalize = 0;
3698
+ opt->diff_detect_rename = -1;
3699
+ opt->merge_detect_rename = -1;
3700
+ opt->detect_directory_renames = 1;
3701
+ merge_recursive_config(opt);
3702
merge_verbosity = getenv("GIT_MERGE_VERBOSITY");
3703
if (merge_verbosity)
3704
- o->verbosity = strtol(merge_verbosity, NULL, 10);
3705
- if (o->verbosity >= 5)
3706
- o->buffer_output = 0;
3707
- strbuf_init(&o->obuf, 0);
3708
- string_list_init(&o->df_conflict_file_set, 1);
3704
+ opt->verbosity = strtol(merge_verbosity, NULL, 10);
3705
+ if (opt->verbosity >= 5)
3706
+ opt->buffer_output = 0;
3707
+ strbuf_init(&opt->obuf, 0);
3708
+ string_list_init(&opt->df_conflict_file_set, 1);
3709
}
3710
3711
-int parse_merge_opt(struct merge_options *o, const char *s)
3711
+int parse_merge_opt(struct merge_options *opt, const char *s)
3712
{
3713
const char *arg;
3714
3715
if (!s || !*s)
3716
return -1;
3717
if (!strcmp(s, "ours"))
3718
- o->recursive_variant = MERGE_RECURSIVE_OURS;
3718
+ opt->recursive_variant = MERGE_RECURSIVE_OURS;
3719
else if (!strcmp(s, "theirs"))
3720
- o->recursive_variant = MERGE_RECURSIVE_THEIRS;
3720
+ opt->recursive_variant = MERGE_RECURSIVE_THEIRS;
3721
else if (!strcmp(s, "subtree"))
3722
- o->subtree_shift = "";
3722
+ opt->subtree_shift = "";
3723
else if (skip_prefix(s, "subtree=", &arg))
3724
- o->subtree_shift = arg;
3724
+ opt->subtree_shift = arg;
3725
else if (!strcmp(s, "patience"))
3726
- o->xdl_opts = DIFF_WITH_ALG(o, PATIENCE_DIFF);
3726
+ opt->xdl_opts = DIFF_WITH_ALG(opt, PATIENCE_DIFF);
3727
else if (!strcmp(s, "histogram"))
3728
- o->xdl_opts = DIFF_WITH_ALG(o, HISTOGRAM_DIFF);
3728
+ opt->xdl_opts = DIFF_WITH_ALG(opt, HISTOGRAM_DIFF);
3729
else if (skip_prefix(s, "diff-algorithm=", &arg)) {
3730
long value = parse_algorithm_value(arg);
3731
if (value < 0)
3732
return -1;
3733
/* clear out previous settings */
3734
- DIFF_XDL_CLR(o, NEED_MINIMAL);
3735
- o->xdl_opts &= ~XDF_DIFF_ALGORITHM_MASK;
3736
- o->xdl_opts |= value;
3734
+ DIFF_XDL_CLR(opt, NEED_MINIMAL);
3735
+ opt->xdl_opts &= ~XDF_DIFF_ALGORITHM_MASK;
3736
+ opt->xdl_opts |= value;
3737
}
3738
else if (!strcmp(s, "ignore-space-change"))
3739
- DIFF_XDL_SET(o, IGNORE_WHITESPACE_CHANGE);
3739
+ DIFF_XDL_SET(opt, IGNORE_WHITESPACE_CHANGE);
3740
else if (!strcmp(s, "ignore-all-space"))
3741
- DIFF_XDL_SET(o, IGNORE_WHITESPACE);
3741
+ DIFF_XDL_SET(opt, IGNORE_WHITESPACE);
3742
else if (!strcmp(s, "ignore-space-at-eol"))
3743
- DIFF_XDL_SET(o, IGNORE_WHITESPACE_AT_EOL);
3743
+ DIFF_XDL_SET(opt, IGNORE_WHITESPACE_AT_EOL);
3744
else if (!strcmp(s, "ignore-cr-at-eol"))
3745
- DIFF_XDL_SET(o, IGNORE_CR_AT_EOL);
3745
+ DIFF_XDL_SET(opt, IGNORE_CR_AT_EOL);
3746
else if (!strcmp(s, "renormalize"))
3747
- o->renormalize = 1;
3747
+ opt->renormalize = 1;
3748
else if (!strcmp(s, "no-renormalize"))
3749
- o->renormalize = 0;
3749
+ opt->renormalize = 0;
3750
else if (!strcmp(s, "no-renames"))
3751
- o->merge_detect_rename = 0;
3751
+ opt->merge_detect_rename = 0;
3752
else if (!strcmp(s, "find-renames")) {
3753
- o->merge_detect_rename = 1;
3754
- o->rename_score = 0;
3753
+ opt->merge_detect_rename = 1;
3754
+ opt->rename_score = 0;
3755
}
3756
else if (skip_prefix(s, "find-renames=", &arg) ||
3757
skip_prefix(s, "rename-threshold=", &arg)) {
3758
- if ((o->rename_score = parse_rename_score(&arg)) == -1 || *arg != 0)
3758
+ if ((opt->rename_score = parse_rename_score(&arg)) == -1 || *arg != 0)
3759
return -1;
3760
- o->merge_detect_rename = 1;
3760
+ opt->merge_detect_rename = 1;
3761
}
3762
/*
3763
* Please update $__git_merge_strategy_options in