This makes check_updates shorter and easier to understand. Signed-off-by: Stefan Beller <sbeller@xxxxxxxxxx> --- unpack-trees.c | 40 ++++++++++++++++++++++++++-------------- 1 file changed, 26 insertions(+), 14 deletions(-) diff --git a/unpack-trees.c b/unpack-trees.c index b954ec1233..b40c069b1b 100644 --- a/unpack-trees.c +++ b/unpack-trees.c @@ -275,67 +275,79 @@ static struct progress *get_progress(struct unpack_trees_options *o) struct index_state *index = &o->result; if (!o->update || !o->verbose_update) return NULL; for (; cnt < index->cache_nr; cnt++) { const struct cache_entry *ce = index->cache[cnt]; if (ce->ce_flags & (CE_UPDATE | CE_WT_REMOVE)) total++; } return start_progress_delay(_("Checking out files"), total, 50, 1); } -static int check_updates(struct unpack_trees_options *o) +static int update_working_tree_files(struct unpack_trees_options *o, + struct progress *progress, + unsigned start_cnt) { - unsigned cnt = 0; + unsigned cnt = start_cnt; int i, errs = 0; - struct progress *progress = NULL; struct index_state *index = &o->result; struct checkout state = CHECKOUT_INIT; state.force = 1; state.quiet = 1; state.refresh_cache = 1; state.istate = index; - progress = get_progress(o); - - if (o->update) - git_attr_set_direction(GIT_ATTR_CHECKOUT, index); - - cnt = remove_workingtree_files(o, progress); - remove_marked_cache_entries(index); - remove_scheduled_dirs(); - for (i = 0; i < index->cache_nr; i++) { struct cache_entry *ce = index->cache[i]; if (ce->ce_flags & CE_UPDATE) { if (ce->ce_flags & CE_WT_REMOVE) die("BUG: both update and delete flags are set on %s", ce->name); display_progress(progress, ++cnt); ce->ce_flags &= ~CE_UPDATE; - if (o->update && !o->dry_run) { + if (o->update && !o->dry_run) errs |= checkout_entry(ce, &state, NULL); - } } } + + return errs; +} + +static int check_updates(struct unpack_trees_options *o) +{ + struct progress *progress = NULL; + struct index_state *index = &o->result; + int errs; + unsigned total_removed; + + progress = get_progress(o); + + if (o->update) + git_attr_set_direction(GIT_ATTR_CHECKOUT, index); + + total_removed = remove_workingtree_files(o, progress); + remove_marked_cache_entries(index); + remove_scheduled_dirs(); + errs = update_working_tree_files(o, progress, total_removed); + stop_progress(&progress); if (o->update) git_attr_set_direction(GIT_ATTR_CHECKIN, NULL); return errs != 0; } static int verify_uptodate_sparse(const struct cache_entry *ce, struct unpack_trees_options *o); static int verify_absent_sparse(const struct cache_entry *ce, enum unpack_trees_error_types, struct unpack_trees_options *o); static int apply_sparse_checkout(struct index_state *istate, struct cache_entry *ce, struct unpack_trees_options *o) -- 2.11.0.31.g919a8d0.dirty