8
#include "progress.h"
9
#include "refs.h"
10
11
-static inline void remove_entry(int remove, struct unpack_trees_options *o)
11
+static void add_entry(struct unpack_trees_options *o, struct cache_entry *ce,
12
+ unsigned int set, unsigned int clear)
13
{
13
- if (remove >= 0)
14
- remove_index_entry_at(o->index, remove);
14
+ unsigned int size = ce_size(ce);
15
+ struct cache_entry *new = xmalloc(size);
16
+
17
+ clear |= CE_HASHED | CE_UNHASHED;
18
+
19
+ memcpy(new, ce, size);
20
+ new->next = NULL;
21
+ new->ce_flags = (new->ce_flags & ~clear) | set;
22
+ add_index_entry(&o->result, new, ADD_CACHE_OK_TO_ADD|ADD_CACHE_OK_TO_REPLACE|ADD_CACHE_SKIP_DFCHECK);
23
}
24
25
/* Unlink the last component and attempt to remove leading
59
unsigned cnt = 0, total = 0;
60
struct progress *progress = NULL;
61
char last_symlink[PATH_MAX];
62
+ struct index_state *index = &o->result;
63
int i;
64
65
if (o->update && o->verbose_update) {
57
- for (total = cnt = 0; cnt < o->index->cache_nr; cnt++) {
58
- struct cache_entry *ce = o->index->cache[cnt];
66
+ for (total = cnt = 0; cnt < index->cache_nr; cnt++) {
67
+ struct cache_entry *ce = index->cache[cnt];
68
if (ce->ce_flags & (CE_UPDATE | CE_REMOVE))
69
total++;
70
}
75
}
76
77
*last_symlink = '\0';
69
- for (i = 0; i < o->index->cache_nr; i++) {
70
- struct cache_entry *ce = o->index->cache[i];
78
+ for (i = 0; i < index->cache_nr; i++) {
79
+ struct cache_entry *ce = index->cache[i];
80
81
if (ce->ce_flags & (CE_UPDATE | CE_REMOVE))
82
display_progress(progress, ++cnt);
83
if (ce->ce_flags & CE_REMOVE) {
84
if (o->update)
85
unlink_entry(ce->name, last_symlink);
77
- remove_index_entry_at(o->index, i);
86
+ remove_index_entry_at(&o->result, i);
87
i--;
88
continue;
89
}
98
stop_progress(&progress);
99
}
100
92
-static inline int call_unpack_fn(struct cache_entry **src, struct unpack_trees_options *o, int remove)
101
+static inline int call_unpack_fn(struct cache_entry **src, struct unpack_trees_options *o)
102
{
94
- int ret = o->fn(src, o, remove);
95
- if (ret > 0) {
96
- o->pos += ret;
103
+ int ret = o->fn(src, o);
104
+ if (ret > 0)
105
ret = 0;
98
- }
106
return ret;
107
}
108
109
static int unpack_index_entry(struct cache_entry *ce, struct unpack_trees_options *o)
110
{
111
struct cache_entry *src[5] = { ce, };
112
+
113
+ o->pos++;
114
if (ce_stage(ce)) {
115
if (o->skip_unmerged) {
107
- o->pos++;
108
- } else {
109
- remove_entry(o->pos, o);
116
+ add_entry(o, ce, 0, 0);
117
+ return 0;
118
}
119
return 0;
120
}
113
- return call_unpack_fn(src, o, o->pos);
121
+ return call_unpack_fn(src, o);
122
}
123
124
int traverse_trees_recursive(int n, unsigned long dirmask, unsigned long df_conflicts, struct name_entry *names, struct traverse_info *info)
208
}
209
210
static int unpack_nondirectories(int n, unsigned long mask, unsigned long dirmask, struct cache_entry *src[5],
203
- const struct name_entry *names, const struct traverse_info *info, int remove)
211
+ const struct name_entry *names, const struct traverse_info *info)
212
{
213
int i;
214
struct unpack_trees_options *o = info->data;
248
}
249
250
if (o->merge)
243
- return call_unpack_fn(src, o, remove);
251
+ return call_unpack_fn(src, o);
252
253
n += o->merge;
246
- remove_entry(remove, o);
254
for (i = 0; i < n; i++)
248
- add_index_entry(o->index, src[i], ADD_CACHE_OK_TO_ADD|ADD_CACHE_SKIP_DFCHECK);
255
+ add_entry(o, src[i], 0, 0);
256
return 0;
257
}
258
260
{
261
struct cache_entry *src[5] = { NULL, };
262
struct unpack_trees_options *o = info->data;
256
- int remove = -1;
263
const struct name_entry *p = names;
264
265
/* Find first entry with a real name (we could use "mask" too) */
268
269
/* Are we supposed to look at the index too? */
270
if (o->merge) {
265
- while (o->pos < o->index->cache_nr) {
266
- struct cache_entry *ce = o->index->cache[o->pos];
271
+ while (o->pos < o->src_index->cache_nr) {
272
+ struct cache_entry *ce = o->src_index->cache[o->pos];
273
int cmp = compare_entry(ce, info, p);
274
if (cmp < 0) {
275
if (unpack_index_entry(ce, o) < 0)
277
continue;
278
}
279
if (!cmp) {
280
+ o->pos++;
281
if (ce_stage(ce)) {
282
/*
283
* If we skip unmerged index entries, we'll skip this
284
* entry *and* the tree entries associated with it!
285
*/
279
- if (o->skip_unmerged)
286
+ if (o->skip_unmerged) {
287
+ add_entry(o, ce, 0, 0);
288
return mask;
281
- remove_entry(o->pos, o);
289
+ }
290
continue;
291
}
292
src[0] = ce;
285
- remove = o->pos;
293
}
294
break;
295
}
296
}
297
291
- if (unpack_nondirectories(n, mask, dirmask, src, names, info, remove) < 0)
298
+ if (unpack_nondirectories(n, mask, dirmask, src, names, info) < 0)
299
return -1;
300
301
/* Now handle any directories.. */
320
return error(message);
321
return -1;
322
}
316
- discard_index(o->index);
317
- read_index(o->index);
323
return -1;
324
}
325
335
state.quiet = 1;
336
state.refresh_cache = 1;
337
338
+ memset(&o->result, 0, sizeof(o->result));
339
o->merge_size = len;
340
341
if (!dfc)
356
357
/* Any left-over entries in the index? */
358
if (o->merge) {
353
- while (o->pos < o->index->cache_nr) {
354
- struct cache_entry *ce = o->index->cache[o->pos];
359
+ while (o->pos < o->src_index->cache_nr) {
360
+ struct cache_entry *ce = o->src_index->cache[o->pos];
361
if (unpack_index_entry(ce, o) < 0)
362
return unpack_failed(o, NULL);
363
}
366
if (o->trivial_merges_only && o->nontrivial_merge)
367
return unpack_failed(o, "Merge requires file-level merging");
368
369
+ o->src_index = NULL;
370
check_updates(o);
371
+ if (o->dst_index)
372
+ *o->dst_index = o->result;
373
return 0;
374
}
375
405
return 0;
406
407
if (!lstat(ce->name, &st)) {
399
- unsigned changed = ie_match_stat(o->index, ce, &st, CE_MATCH_IGNORE_VALID);
408
+ unsigned changed = ie_match_stat(o->src_index, ce, &st, CE_MATCH_IGNORE_VALID);
409
if (!changed)
410
return 0;
411
/*
428
static void invalidate_ce_path(struct cache_entry *ce, struct unpack_trees_options *o)
429
{
430
if (ce)
422
- cache_tree_invalidate_path(o->index->cache_tree, ce->name);
431
+ cache_tree_invalidate_path(o->src_index->cache_tree, ce->name);
432
}
433
434
/*
473
* in that directory.
474
*/
475
namelen = strlen(ce->name);
467
- pos = index_name_pos(o->index, ce->name, namelen);
476
+ pos = index_name_pos(o->src_index, ce->name, namelen);
477
if (0 <= pos)
478
return cnt; /* we have it as nondirectory */
479
pos = -pos - 1;
471
- for (i = pos; i < o->index->cache_nr; i++) {
472
- struct cache_entry *ce = o->index->cache[i];
480
+ for (i = pos; i < o->src_index->cache_nr; i++) {
481
+ struct cache_entry *ce = o->src_index->cache[i];
482
int len = ce_namelen(ce);
483
if (len < namelen ||
484
strncmp(ce->name, ce->name, namelen) ||
490
if (!ce_stage(ce)) {
491
if (verify_uptodate(ce, o))
492
return -1;
484
- ce->ce_flags |= CE_REMOVE;
493
+ add_entry(o, ce, CE_REMOVE, 0);
494
}
495
cnt++;
496
}
576
* delete this path, which is in a subdirectory that
577
* is being replaced with a blob.
578
*/
570
- cnt = index_name_pos(o->index, ce->name, strlen(ce->name));
579
+ cnt = index_name_pos(&o->result, ce->name, strlen(ce->name));
580
if (0 <= cnt) {
572
- struct cache_entry *ce = o->index->cache[cnt];
581
+ struct cache_entry *ce = o->result.cache[cnt];
582
if (ce->ce_flags & CE_REMOVE)
583
return 0;
584
}
593
static int merged_entry(struct cache_entry *merge, struct cache_entry *old,
594
struct unpack_trees_options *o)
595
{
587
- merge->ce_flags |= CE_UPDATE;
596
if (old) {
597
/*
598
* See if we can re-use the old CE directly?
615
invalidate_ce_path(merge, o);
616
}
617
610
- merge->ce_flags &= ~CE_STAGEMASK;
611
- add_index_entry(o->index, merge, ADD_CACHE_OK_TO_ADD|ADD_CACHE_OK_TO_REPLACE);
618
+ add_entry(o, merge, CE_UPDATE, CE_STAGEMASK);
619
return 1;
620
}
621
622
static int deleted_entry(struct cache_entry *ce, struct cache_entry *old,
623
struct unpack_trees_options *o)
624
{
618
- if (old) {
619
- if (verify_uptodate(old, o))
620
- return -1;
621
- } else
625
+ /* Did it exist in the index? */
626
+ if (!old) {
627
if (verify_absent(ce, "removed", o))
628
return -1;
624
- ce->ce_flags |= CE_REMOVE;
625
- add_index_entry(o->index, ce, ADD_CACHE_OK_TO_ADD|ADD_CACHE_OK_TO_REPLACE);
629
+ return 0;
630
+ }
631
+ if (verify_uptodate(old, o))
632
+ return -1;
633
+ add_entry(o, ce, CE_REMOVE, 0);
634
invalidate_ce_path(ce, o);
635
return 1;
636
}
637
638
static int keep_entry(struct cache_entry *ce, struct unpack_trees_options *o)
639
{
632
- add_index_entry(o->index, ce, ADD_CACHE_OK_TO_ADD);
640
+ add_entry(o, ce, 0, 0);
641
return 1;
642
}
643
657
}
658
#endif
659
652
-int threeway_merge(struct cache_entry **stages,
653
- struct unpack_trees_options *o,
654
- int remove)
660
+int threeway_merge(struct cache_entry **stages, struct unpack_trees_options *o)
661
{
662
struct cache_entry *index;
663
struct cache_entry *head;
734
}
735
736
/* #1 */
731
- if (!head && !remote && any_anc_missing) {
732
- remove_entry(remove, o);
737
+ if (!head && !remote && any_anc_missing)
738
return 0;
734
- }
739
740
/* Under the new "aggressive" rule, we resolve mostly trivial
741
* cases that we historically had git-merge-one-file resolve.
767
if ((head_deleted && remote_deleted) ||
768
(head_deleted && remote && remote_match) ||
769
(remote_deleted && head && head_match)) {
766
- remove_entry(remove, o);
770
if (index)
771
return deleted_entry(index, index, o);
769
- else if (ce && !head_deleted) {
772
+ if (ce && !head_deleted) {
773
if (verify_absent(ce, "removed", o))
774
return -1;
775
}
792
return -1;
793
}
794
792
- remove_entry(remove, o);
795
o->nontrivial_merge = 1;
796
797
/* #2, #3, #4, #6, #7, #9, #10, #11. */
826
* "carry forward" rule, please see <Documentation/git-read-tree.txt>.
827
*
828
*/
827
-int twoway_merge(struct cache_entry **src,
828
- struct unpack_trees_options *o,
829
- int remove)
829
+int twoway_merge(struct cache_entry **src, struct unpack_trees_options *o)
830
{
831
struct cache_entry *current = src[0];
832
struct cache_entry *oldtree = src[1];
854
}
855
else if (oldtree && !newtree && same(current, oldtree)) {
856
/* 10 or 11 */
857
- remove_entry(remove, o);
857
return deleted_entry(oldtree, current, o);
858
}
859
else if (oldtree && newtree &&
863
}
864
else {
865
/* all other failures */
867
- remove_entry(remove, o);
866
if (oldtree)
867
return o->gently ? -1 : reject_merge(oldtree);
868
if (current)
874
}
875
else if (newtree)
876
return merged_entry(newtree, current, o);
879
- remove_entry(remove, o);
877
return deleted_entry(oldtree, current, o);
878
}
879
884
* stage0 does not have anything there.
885
*/
886
int bind_merge(struct cache_entry **src,
890
- struct unpack_trees_options *o,
891
- int remove)
887
+ struct unpack_trees_options *o)
888
{
889
struct cache_entry *old = src[0];
890
struct cache_entry *a = src[1];
894
o->merge_size);
895
if (a && old)
896
return o->gently ? -1 :
901
- error("Entry '%s' overlaps. Cannot bind.", a->name);
897
+ error("Entry '%s' overlaps with '%s'. Cannot bind.", a->name, old->name);
898
if (!a)
899
return keep_entry(old, o);
900
else
907
* The rule is:
908
* - take the stat information from stage0, take the data from stage1
909
*/
914
-int oneway_merge(struct cache_entry **src,
915
- struct unpack_trees_options *o,
916
- int remove)
910
+int oneway_merge(struct cache_entry **src, struct unpack_trees_options *o)
911
{
912
struct cache_entry *old = src[0];
913
struct cache_entry *a = src[1];
916
return error("Cannot do a oneway merge of %d trees",
917
o->merge_size);
918
925
- if (!a) {
926
- remove_entry(remove, o);
919
+ if (!a)
920
return deleted_entry(old, old, o);
928
- }
921
+
922
if (old && same(old, a)) {
923
+ int update = 0;
924
if (o->reset) {
925
struct stat st;
926
if (lstat(old->name, &st) ||
933
- ie_match_stat(o->index, old, &st, CE_MATCH_IGNORE_VALID))
934
- old->ce_flags |= CE_UPDATE;
927
+ ie_match_stat(o->src_index, old, &st, CE_MATCH_IGNORE_VALID))
928
+ update |= CE_UPDATE;
929
}
936
- return keep_entry(old, o);
930
+ add_entry(o, old, update, 0);
931
+ return 0;
932
}
933
return merged_entry(a, old, o);
934
}