mirror of
https://github.com/git/git
synced 2024-08-24 18:26:02 +00:00
![Junio C Hamano](/assets/img/avatar_default.png)
This prepares but does not yet implement a look-ahead in the index entries when traverse-trees.c decides to give us tree entries in an order that does not match what is in the index. A case where a look-ahead in the index is necessary happens when merging branch B into branch A while the index matches the current branch A, using a tree O as their common ancestor, and these three trees looks like this: O A B t t t-i t-i t-i t-j t-j t/1 t/2 The traverse_trees() function gets "t", "t-i" and "t" from trees O, A and B first, and notices that A may have a matching "t" behind "t-i" and "t-j" (indeed it does), and tells A to give that entry instead. After unpacking blob "t" from tree B (as it hasn't changed since O in B and A removed it, it will result in its removal), it descends into directory "t/". The side that walked index in parallel to the tree traversal used to be implemented with one pointer, o->pos, that points at the next index entry to be processed. When this happens, the pointer o->pos still points at "t-i" that is the first entry. We should be able to skip "t-i" and "t-j" and locate "t/1" from the index while the recursive invocation of traverse_trees() walks and match entries found there, and later come back to process "t-i". While that look-ahead is not implemented yet, this adds a flag bit, CE_UNPACKED, to mark the entries in the index that has already been processed. o->pos pointer has been renamed to o->cache_bottom and it points at the first entry that may still need to be processed. Signed-off-by: Junio C Hamano <gitster@pobox.com>
58 lines
1.4 KiB
C
58 lines
1.4 KiB
C
#ifndef UNPACK_TREES_H
|
|
#define UNPACK_TREES_H
|
|
|
|
#define MAX_UNPACK_TREES 8
|
|
|
|
struct unpack_trees_options;
|
|
|
|
typedef int (*merge_fn_t)(struct cache_entry **src,
|
|
struct unpack_trees_options *options);
|
|
|
|
struct unpack_trees_error_msgs {
|
|
const char *would_overwrite;
|
|
const char *not_uptodate_file;
|
|
const char *not_uptodate_dir;
|
|
const char *would_lose_untracked;
|
|
const char *bind_overlap;
|
|
};
|
|
|
|
struct unpack_trees_options {
|
|
unsigned int reset,
|
|
merge,
|
|
update,
|
|
index_only,
|
|
nontrivial_merge,
|
|
trivial_merges_only,
|
|
verbose_update,
|
|
aggressive,
|
|
skip_unmerged,
|
|
initial_checkout,
|
|
diff_index_cached,
|
|
gently;
|
|
const char *prefix;
|
|
int cache_bottom;
|
|
struct dir_struct *dir;
|
|
merge_fn_t fn;
|
|
struct unpack_trees_error_msgs msgs;
|
|
|
|
int head_idx;
|
|
int merge_size;
|
|
|
|
struct cache_entry *df_conflict_entry;
|
|
void *unpack_data;
|
|
|
|
struct index_state *dst_index;
|
|
struct index_state *src_index;
|
|
struct index_state result;
|
|
};
|
|
|
|
extern int unpack_trees(unsigned n, struct tree_desc *t,
|
|
struct unpack_trees_options *options);
|
|
|
|
int threeway_merge(struct cache_entry **stages, struct unpack_trees_options *o);
|
|
int twoway_merge(struct cache_entry **src, struct unpack_trees_options *o);
|
|
int bind_merge(struct cache_entry **src, struct unpack_trees_options *o);
|
|
int oneway_merge(struct cache_entry **src, struct unpack_trees_options *o);
|
|
|
|
#endif
|