From: Chuck Lever Date: Mon, 12 Sep 2005 14:56:03 GMT Subject: [PATCH 09/22] teach read-tree.c to use cache iterators Message-ID: <20050912145602.28120.31547.stgit@dexter.citi.umich.edu> In-Reply-To: <20050912145543.28120.7086.stgit@dexter.citi.umich.edu> Merging will wait for another patch. Signed-off-by: Chuck Lever --- read-tree.c | 66 +++++++++++++++++++++++++++++++++-------------------------- 1 files changed, 37 insertions(+), 29 deletions(-) diff --git a/read-tree.c b/read-tree.c --- a/read-tree.c +++ b/read-tree.c @@ -233,7 +233,7 @@ static void reject_merge(struct cache_en ce->name); } -static void check_updates(struct cache_entry **src, int nr) +static int check_one_out(struct cache_cursor *cc, struct cache_entry *ce) { static struct checkout state = { .base_dir = "", @@ -242,19 +242,21 @@ static void check_updates(struct cache_e .refresh_cache = 1, }; unsigned short mask = htons(CE_UPDATE); - while (nr--) { - struct cache_entry *ce = *src++; - if (!ce->ce_mode) { - if (update) - unlink(ce->name); - continue; - } - if (ce->ce_flags & mask) { - ce->ce_flags &= ~mask; - if (update) - checkout_entry(ce, &state); - } + + if (!ce->ce_mode) { + if (update) + unlink(ce->name); + goto out; } + + if (ce->ce_flags & mask) { + ce->ce_flags &= ~mask; + if (update) + checkout_entry(ce, &state); + } +out: + next_cc(cc); + return 0; } static int unpack_trees(merge_fn_t fn) @@ -273,7 +275,7 @@ static int unpack_trees(merge_fn_t fn) if (unpack_trees_rec(posns, len, "", fn, &indpos)) return -1; - check_updates(active_cache, active_nr); + walk_cache(check_one_out); return 0; } @@ -553,24 +555,30 @@ static int oneway_merge(struct cache_ent return merged_entry(a, NULL); } -static int read_cache_unmerged(void) +static int deleted = 0; +static struct cache_cursor dst; + +static int read_one_unmerged(struct cache_cursor *cc, struct cache_entry *ce) { - int i, deleted; - struct cache_entry **dst; + if (ce_stage(ce)) { + deleted++; + goto out; + } + if (deleted) + set_ce_at_cursor(&dst, ce); + next_cc(&dst); +out: + next_cc(cc); + return 0; +} - read_cache(); - dst = active_cache; - deleted = 0; - for (i = 0; i < active_nr; i++) { - struct cache_entry *ce = active_cache[i]; - if (ce_stage(ce)) { - deleted++; - continue; - } - if (deleted) - *dst = ce; - dst++; +static int read_cache_unmerged(void) +{ + if (read_cache() > 0) { + init_cc(&dst); + walk_cache(read_one_unmerged); } + active_nr -= deleted; return deleted; }