提交 bc052d7f 编写于 作者: L Linus Torvalds 提交者: Junio C Hamano

Make 'unpack_trees()' take the index to work on as an argument

This is just a very mechanical conversion, and makes everybody set it to
'&the_index' before calling, but at least it makes it more explicit
where we work with the index.

The next stage would be to split that index usage up into a 'source' and
a 'destination' index, so that we can unpack into a different index than
we started out from.
Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: NJunio C Hamano <gitster@pobox.com>
上级 d1f128b0
...@@ -152,6 +152,7 @@ static int reset_to_new(struct tree *tree, int quiet) ...@@ -152,6 +152,7 @@ static int reset_to_new(struct tree *tree, int quiet)
{ {
struct unpack_trees_options opts; struct unpack_trees_options opts;
struct tree_desc tree_desc; struct tree_desc tree_desc;
memset(&opts, 0, sizeof(opts)); memset(&opts, 0, sizeof(opts));
opts.head_idx = -1; opts.head_idx = -1;
opts.update = 1; opts.update = 1;
...@@ -159,6 +160,7 @@ static int reset_to_new(struct tree *tree, int quiet) ...@@ -159,6 +160,7 @@ static int reset_to_new(struct tree *tree, int quiet)
opts.merge = 1; opts.merge = 1;
opts.fn = oneway_merge; opts.fn = oneway_merge;
opts.verbose_update = !quiet; opts.verbose_update = !quiet;
opts.index = &the_index;
parse_tree(tree); parse_tree(tree);
init_tree_desc(&tree_desc, tree->buffer, tree->size); init_tree_desc(&tree_desc, tree->buffer, tree->size);
if (unpack_trees(1, &tree_desc, &opts)) if (unpack_trees(1, &tree_desc, &opts))
...@@ -170,6 +172,7 @@ static void reset_clean_to_new(struct tree *tree, int quiet) ...@@ -170,6 +172,7 @@ static void reset_clean_to_new(struct tree *tree, int quiet)
{ {
struct unpack_trees_options opts; struct unpack_trees_options opts;
struct tree_desc tree_desc; struct tree_desc tree_desc;
memset(&opts, 0, sizeof(opts)); memset(&opts, 0, sizeof(opts));
opts.head_idx = -1; opts.head_idx = -1;
opts.skip_unmerged = 1; opts.skip_unmerged = 1;
...@@ -177,6 +180,7 @@ static void reset_clean_to_new(struct tree *tree, int quiet) ...@@ -177,6 +180,7 @@ static void reset_clean_to_new(struct tree *tree, int quiet)
opts.merge = 1; opts.merge = 1;
opts.fn = oneway_merge; opts.fn = oneway_merge;
opts.verbose_update = !quiet; opts.verbose_update = !quiet;
opts.index = &the_index;
parse_tree(tree); parse_tree(tree);
init_tree_desc(&tree_desc, tree->buffer, tree->size); init_tree_desc(&tree_desc, tree->buffer, tree->size);
if (unpack_trees(1, &tree_desc, &opts)) if (unpack_trees(1, &tree_desc, &opts))
...@@ -224,8 +228,10 @@ static int merge_working_tree(struct checkout_opts *opts, ...@@ -224,8 +228,10 @@ static int merge_working_tree(struct checkout_opts *opts,
struct tree_desc trees[2]; struct tree_desc trees[2];
struct tree *tree; struct tree *tree;
struct unpack_trees_options topts; struct unpack_trees_options topts;
memset(&topts, 0, sizeof(topts)); memset(&topts, 0, sizeof(topts));
topts.head_idx = -1; topts.head_idx = -1;
topts.index = &the_index;
refresh_cache(REFRESH_QUIET); refresh_cache(REFRESH_QUIET);
......
...@@ -198,6 +198,7 @@ static void create_base_index(void) ...@@ -198,6 +198,7 @@ static void create_base_index(void)
opts.head_idx = 1; opts.head_idx = 1;
opts.index_only = 1; opts.index_only = 1;
opts.merge = 1; opts.merge = 1;
opts.index = &the_index;
opts.fn = oneway_merge; opts.fn = oneway_merge;
tree = parse_tree_indirect(head_sha1); tree = parse_tree_indirect(head_sha1);
......
...@@ -213,6 +213,7 @@ static int git_merge_trees(int index_only, ...@@ -213,6 +213,7 @@ static int git_merge_trees(int index_only,
opts.merge = 1; opts.merge = 1;
opts.head_idx = 2; opts.head_idx = 2;
opts.fn = threeway_merge; opts.fn = threeway_merge;
opts.index = &the_index;
init_tree_desc_from_tree(t+0, common); init_tree_desc_from_tree(t+0, common);
init_tree_desc_from_tree(t+1, head); init_tree_desc_from_tree(t+1, head);
......
...@@ -102,6 +102,7 @@ int cmd_read_tree(int argc, const char **argv, const char *unused_prefix) ...@@ -102,6 +102,7 @@ int cmd_read_tree(int argc, const char **argv, const char *unused_prefix)
memset(&opts, 0, sizeof(opts)); memset(&opts, 0, sizeof(opts));
opts.head_idx = -1; opts.head_idx = -1;
opts.index = &the_index;
git_config(git_default_config); git_config(git_default_config);
......
...@@ -734,6 +734,7 @@ int run_diff_index(struct rev_info *revs, int cached) ...@@ -734,6 +734,7 @@ int run_diff_index(struct rev_info *revs, int cached)
opts.merge = 1; opts.merge = 1;
opts.fn = oneway_diff; opts.fn = oneway_diff;
opts.unpack_data = revs; opts.unpack_data = revs;
opts.index = &the_index;
init_tree_desc(&t, tree->buffer, tree->size); init_tree_desc(&t, tree->buffer, tree->size);
if (unpack_trees(1, &t, &opts)) if (unpack_trees(1, &t, &opts))
...@@ -787,6 +788,7 @@ int do_diff_cache(const unsigned char *tree_sha1, struct diff_options *opt) ...@@ -787,6 +788,7 @@ int do_diff_cache(const unsigned char *tree_sha1, struct diff_options *opt)
opts.merge = 1; opts.merge = 1;
opts.fn = oneway_diff; opts.fn = oneway_diff;
opts.unpack_data = &revs; opts.unpack_data = &revs;
opts.index = &the_index;
init_tree_desc(&t, tree->buffer, tree->size); init_tree_desc(&t, tree->buffer, tree->size);
if (unpack_trees(1, &t, &opts)) if (unpack_trees(1, &t, &opts))
......
#define NO_THE_INDEX_COMPATIBILITY_MACROS
#include "cache.h" #include "cache.h"
#include "dir.h" #include "dir.h"
#include "tree.h" #include "tree.h"
...@@ -7,10 +8,10 @@ ...@@ -7,10 +8,10 @@
#include "progress.h" #include "progress.h"
#include "refs.h" #include "refs.h"
static inline void remove_entry(int remove) static inline void remove_entry(int remove, struct unpack_trees_options *o)
{ {
if (remove >= 0) if (remove >= 0)
remove_cache_entry_at(remove); remove_index_entry_at(o->index, remove);
} }
/* Unlink the last component and attempt to remove leading /* Unlink the last component and attempt to remove leading
...@@ -53,8 +54,8 @@ static void check_updates(struct unpack_trees_options *o) ...@@ -53,8 +54,8 @@ static void check_updates(struct unpack_trees_options *o)
int i; int i;
if (o->update && o->verbose_update) { if (o->update && o->verbose_update) {
for (total = cnt = 0; cnt < active_nr; cnt++) { for (total = cnt = 0; cnt < o->index->cache_nr; cnt++) {
struct cache_entry *ce = active_cache[cnt]; struct cache_entry *ce = o->index->cache[cnt];
if (ce->ce_flags & (CE_UPDATE | CE_REMOVE)) if (ce->ce_flags & (CE_UPDATE | CE_REMOVE))
total++; total++;
} }
...@@ -65,15 +66,15 @@ static void check_updates(struct unpack_trees_options *o) ...@@ -65,15 +66,15 @@ static void check_updates(struct unpack_trees_options *o)
} }
*last_symlink = '\0'; *last_symlink = '\0';
for (i = 0; i < active_nr; i++) { for (i = 0; i < o->index->cache_nr; i++) {
struct cache_entry *ce = active_cache[i]; struct cache_entry *ce = o->index->cache[i];
if (ce->ce_flags & (CE_UPDATE | CE_REMOVE)) if (ce->ce_flags & (CE_UPDATE | CE_REMOVE))
display_progress(progress, ++cnt); display_progress(progress, ++cnt);
if (ce->ce_flags & CE_REMOVE) { if (ce->ce_flags & CE_REMOVE) {
if (o->update) if (o->update)
unlink_entry(ce->name, last_symlink); unlink_entry(ce->name, last_symlink);
remove_cache_entry_at(i); remove_index_entry_at(o->index, i);
i--; i--;
continue; continue;
} }
...@@ -105,7 +106,7 @@ static int unpack_index_entry(struct cache_entry *ce, struct unpack_trees_option ...@@ -105,7 +106,7 @@ static int unpack_index_entry(struct cache_entry *ce, struct unpack_trees_option
if (o->skip_unmerged) { if (o->skip_unmerged) {
o->pos++; o->pos++;
} else { } else {
remove_entry(o->pos); remove_entry(o->pos, o);
} }
return 0; return 0;
} }
...@@ -242,9 +243,9 @@ static int unpack_nondirectories(int n, unsigned long mask, unsigned long dirmas ...@@ -242,9 +243,9 @@ static int unpack_nondirectories(int n, unsigned long mask, unsigned long dirmas
return call_unpack_fn(src, o, remove); return call_unpack_fn(src, o, remove);
n += o->merge; n += o->merge;
remove_entry(remove); remove_entry(remove, o);
for (i = 0; i < n; i++) for (i = 0; i < n; i++)
add_cache_entry(src[i], ADD_CACHE_OK_TO_ADD|ADD_CACHE_SKIP_DFCHECK); add_index_entry(o->index, src[i], ADD_CACHE_OK_TO_ADD|ADD_CACHE_SKIP_DFCHECK);
return 0; return 0;
} }
...@@ -261,8 +262,8 @@ static int unpack_callback(int n, unsigned long mask, unsigned long dirmask, str ...@@ -261,8 +262,8 @@ static int unpack_callback(int n, unsigned long mask, unsigned long dirmask, str
/* Are we supposed to look at the index too? */ /* Are we supposed to look at the index too? */
if (o->merge) { if (o->merge) {
while (o->pos < active_nr) { while (o->pos < o->index->cache_nr) {
struct cache_entry *ce = active_cache[o->pos]; struct cache_entry *ce = o->index->cache[o->pos];
int cmp = compare_entry(ce, info, p); int cmp = compare_entry(ce, info, p);
if (cmp < 0) { if (cmp < 0) {
if (unpack_index_entry(ce, o) < 0) if (unpack_index_entry(ce, o) < 0)
...@@ -277,7 +278,7 @@ static int unpack_callback(int n, unsigned long mask, unsigned long dirmask, str ...@@ -277,7 +278,7 @@ static int unpack_callback(int n, unsigned long mask, unsigned long dirmask, str
*/ */
if (o->skip_unmerged) if (o->skip_unmerged)
return mask; return mask;
remove_entry(o->pos); remove_entry(o->pos, o);
continue; continue;
} }
src[0] = ce; src[0] = ce;
...@@ -312,8 +313,8 @@ static int unpack_failed(struct unpack_trees_options *o, const char *message) ...@@ -312,8 +313,8 @@ static int unpack_failed(struct unpack_trees_options *o, const char *message)
return error(message); return error(message);
return -1; return -1;
} }
discard_cache(); discard_index(o->index);
read_cache(); read_index(o->index);
return -1; return -1;
} }
...@@ -349,8 +350,8 @@ int unpack_trees(unsigned len, struct tree_desc *t, struct unpack_trees_options ...@@ -349,8 +350,8 @@ int unpack_trees(unsigned len, struct tree_desc *t, struct unpack_trees_options
/* Any left-over entries in the index? */ /* Any left-over entries in the index? */
if (o->merge) { if (o->merge) {
while (o->pos < active_nr) { while (o->pos < o->index->cache_nr) {
struct cache_entry *ce = active_cache[o->pos]; struct cache_entry *ce = o->index->cache[o->pos];
if (unpack_index_entry(ce, o) < 0) if (unpack_index_entry(ce, o) < 0)
return unpack_failed(o, NULL); return unpack_failed(o, NULL);
} }
...@@ -395,7 +396,7 @@ static int verify_uptodate(struct cache_entry *ce, ...@@ -395,7 +396,7 @@ static int verify_uptodate(struct cache_entry *ce,
return 0; return 0;
if (!lstat(ce->name, &st)) { if (!lstat(ce->name, &st)) {
unsigned changed = ce_match_stat(ce, &st, CE_MATCH_IGNORE_VALID); unsigned changed = ie_match_stat(o->index, ce, &st, CE_MATCH_IGNORE_VALID);
if (!changed) if (!changed)
return 0; return 0;
/* /*
...@@ -415,10 +416,10 @@ static int verify_uptodate(struct cache_entry *ce, ...@@ -415,10 +416,10 @@ static int verify_uptodate(struct cache_entry *ce,
error("Entry '%s' not uptodate. Cannot merge.", ce->name); error("Entry '%s' not uptodate. Cannot merge.", ce->name);
} }
static void invalidate_ce_path(struct cache_entry *ce) static void invalidate_ce_path(struct cache_entry *ce, struct unpack_trees_options *o)
{ {
if (ce) if (ce)
cache_tree_invalidate_path(active_cache_tree, ce->name); cache_tree_invalidate_path(o->index->cache_tree, ce->name);
} }
/* /*
...@@ -463,12 +464,12 @@ static int verify_clean_subdirectory(struct cache_entry *ce, const char *action, ...@@ -463,12 +464,12 @@ static int verify_clean_subdirectory(struct cache_entry *ce, const char *action,
* in that directory. * in that directory.
*/ */
namelen = strlen(ce->name); namelen = strlen(ce->name);
pos = cache_name_pos(ce->name, namelen); pos = index_name_pos(o->index, ce->name, namelen);
if (0 <= pos) if (0 <= pos)
return cnt; /* we have it as nondirectory */ return cnt; /* we have it as nondirectory */
pos = -pos - 1; pos = -pos - 1;
for (i = pos; i < active_nr; i++) { for (i = pos; i < o->index->cache_nr; i++) {
struct cache_entry *ce = active_cache[i]; struct cache_entry *ce = o->index->cache[i];
int len = ce_namelen(ce); int len = ce_namelen(ce);
if (len < namelen || if (len < namelen ||
strncmp(ce->name, ce->name, namelen) || strncmp(ce->name, ce->name, namelen) ||
...@@ -566,9 +567,9 @@ static int verify_absent(struct cache_entry *ce, const char *action, ...@@ -566,9 +567,9 @@ static int verify_absent(struct cache_entry *ce, const char *action,
* delete this path, which is in a subdirectory that * delete this path, which is in a subdirectory that
* is being replaced with a blob. * is being replaced with a blob.
*/ */
cnt = cache_name_pos(ce->name, strlen(ce->name)); cnt = index_name_pos(o->index, ce->name, strlen(ce->name));
if (0 <= cnt) { if (0 <= cnt) {
struct cache_entry *ce = active_cache[cnt]; struct cache_entry *ce = o->index->cache[cnt];
if (ce->ce_flags & CE_REMOVE) if (ce->ce_flags & CE_REMOVE)
return 0; return 0;
} }
...@@ -597,17 +598,17 @@ static int merged_entry(struct cache_entry *merge, struct cache_entry *old, ...@@ -597,17 +598,17 @@ static int merged_entry(struct cache_entry *merge, struct cache_entry *old,
} else { } else {
if (verify_uptodate(old, o)) if (verify_uptodate(old, o))
return -1; return -1;
invalidate_ce_path(old); invalidate_ce_path(old, o);
} }
} }
else { else {
if (verify_absent(merge, "overwritten", o)) if (verify_absent(merge, "overwritten", o))
return -1; return -1;
invalidate_ce_path(merge); invalidate_ce_path(merge, o);
} }
merge->ce_flags &= ~CE_STAGEMASK; merge->ce_flags &= ~CE_STAGEMASK;
add_cache_entry(merge, ADD_CACHE_OK_TO_ADD|ADD_CACHE_OK_TO_REPLACE); add_index_entry(o->index, merge, ADD_CACHE_OK_TO_ADD|ADD_CACHE_OK_TO_REPLACE);
return 1; return 1;
} }
...@@ -621,14 +622,14 @@ static int deleted_entry(struct cache_entry *ce, struct cache_entry *old, ...@@ -621,14 +622,14 @@ static int deleted_entry(struct cache_entry *ce, struct cache_entry *old,
if (verify_absent(ce, "removed", o)) if (verify_absent(ce, "removed", o))
return -1; return -1;
ce->ce_flags |= CE_REMOVE; ce->ce_flags |= CE_REMOVE;
add_cache_entry(ce, ADD_CACHE_OK_TO_ADD|ADD_CACHE_OK_TO_REPLACE); add_index_entry(o->index, ce, ADD_CACHE_OK_TO_ADD|ADD_CACHE_OK_TO_REPLACE);
invalidate_ce_path(ce); invalidate_ce_path(ce, o);
return 1; return 1;
} }
static int keep_entry(struct cache_entry *ce, struct unpack_trees_options *o) static int keep_entry(struct cache_entry *ce, struct unpack_trees_options *o)
{ {
add_cache_entry(ce, ADD_CACHE_OK_TO_ADD); add_index_entry(o->index, ce, ADD_CACHE_OK_TO_ADD);
return 1; return 1;
} }
...@@ -728,7 +729,7 @@ int threeway_merge(struct cache_entry **stages, ...@@ -728,7 +729,7 @@ int threeway_merge(struct cache_entry **stages,
/* #1 */ /* #1 */
if (!head && !remote && any_anc_missing) { if (!head && !remote && any_anc_missing) {
remove_entry(remove); remove_entry(remove, o);
return 0; return 0;
} }
...@@ -762,7 +763,7 @@ int threeway_merge(struct cache_entry **stages, ...@@ -762,7 +763,7 @@ int threeway_merge(struct cache_entry **stages,
if ((head_deleted && remote_deleted) || if ((head_deleted && remote_deleted) ||
(head_deleted && remote && remote_match) || (head_deleted && remote && remote_match) ||
(remote_deleted && head && head_match)) { (remote_deleted && head && head_match)) {
remove_entry(remove); remove_entry(remove, o);
if (index) if (index)
return deleted_entry(index, index, o); return deleted_entry(index, index, o);
else if (ce && !head_deleted) { else if (ce && !head_deleted) {
...@@ -788,7 +789,7 @@ int threeway_merge(struct cache_entry **stages, ...@@ -788,7 +789,7 @@ int threeway_merge(struct cache_entry **stages,
return -1; return -1;
} }
remove_entry(remove); remove_entry(remove, o);
o->nontrivial_merge = 1; o->nontrivial_merge = 1;
/* #2, #3, #4, #6, #7, #9, #10, #11. */ /* #2, #3, #4, #6, #7, #9, #10, #11. */
...@@ -853,7 +854,7 @@ int twoway_merge(struct cache_entry **src, ...@@ -853,7 +854,7 @@ int twoway_merge(struct cache_entry **src,
} }
else if (oldtree && !newtree && same(current, oldtree)) { else if (oldtree && !newtree && same(current, oldtree)) {
/* 10 or 11 */ /* 10 or 11 */
remove_entry(remove); remove_entry(remove, o);
return deleted_entry(oldtree, current, o); return deleted_entry(oldtree, current, o);
} }
else if (oldtree && newtree && else if (oldtree && newtree &&
...@@ -863,7 +864,7 @@ int twoway_merge(struct cache_entry **src, ...@@ -863,7 +864,7 @@ int twoway_merge(struct cache_entry **src,
} }
else { else {
/* all other failures */ /* all other failures */
remove_entry(remove); remove_entry(remove, o);
if (oldtree) if (oldtree)
return o->gently ? -1 : reject_merge(oldtree); return o->gently ? -1 : reject_merge(oldtree);
if (current) if (current)
...@@ -875,7 +876,7 @@ int twoway_merge(struct cache_entry **src, ...@@ -875,7 +876,7 @@ int twoway_merge(struct cache_entry **src,
} }
else if (newtree) else if (newtree)
return merged_entry(newtree, current, o); return merged_entry(newtree, current, o);
remove_entry(remove); remove_entry(remove, o);
return deleted_entry(oldtree, current, o); return deleted_entry(oldtree, current, o);
} }
...@@ -922,14 +923,14 @@ int oneway_merge(struct cache_entry **src, ...@@ -922,14 +923,14 @@ int oneway_merge(struct cache_entry **src,
o->merge_size); o->merge_size);
if (!a) { if (!a) {
remove_entry(remove); remove_entry(remove, o);
return deleted_entry(old, old, o); return deleted_entry(old, old, o);
} }
if (old && same(old, a)) { if (old && same(old, a)) {
if (o->reset) { if (o->reset) {
struct stat st; struct stat st;
if (lstat(old->name, &st) || if (lstat(old->name, &st) ||
ce_match_stat(old, &st, CE_MATCH_IGNORE_VALID)) ie_match_stat(o->index, old, &st, CE_MATCH_IGNORE_VALID))
old->ce_flags |= CE_UPDATE; old->ce_flags |= CE_UPDATE;
} }
return keep_entry(old, o); return keep_entry(old, o);
......
...@@ -28,6 +28,7 @@ struct unpack_trees_options { ...@@ -28,6 +28,7 @@ struct unpack_trees_options {
struct cache_entry *df_conflict_entry; struct cache_entry *df_conflict_entry;
void *unpack_data; void *unpack_data;
struct index_state *index;
}; };
extern int unpack_trees(unsigned n, struct tree_desc *t, extern int unpack_trees(unsigned n, struct tree_desc *t,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册