Merge branch 'nd/checkout-noisy'
"git checkout [<tree-ish>] path..." learned to report the number of paths that have been checked out of the index or the tree-ish, which gives it the same degree of noisy-ness as the case in which the command checks out a branch. * nd/checkout-noisy: t0027: squelch checkout path run outside test_expect_* block checkout: print something when checking out paths
This commit is contained in:
commit
4084df42c2
3
apply.c
3
apply.c
@ -3352,7 +3352,8 @@ static int checkout_target(struct index_state *istate,
|
||||
|
||||
costate.refresh_cache = 1;
|
||||
costate.istate = istate;
|
||||
if (checkout_entry(ce, &costate, NULL) || lstat(ce->name, st))
|
||||
if (checkout_entry(ce, &costate, NULL, NULL) ||
|
||||
lstat(ce->name, st))
|
||||
return error(_("cannot checkout %s"), ce->name);
|
||||
return 0;
|
||||
}
|
||||
|
@ -67,7 +67,8 @@ static int checkout_file(const char *name, const char *prefix)
|
||||
continue;
|
||||
did_checkout = 1;
|
||||
if (checkout_entry(ce, &state,
|
||||
to_tempfile ? topath[ce_stage(ce)] : NULL) < 0)
|
||||
to_tempfile ? topath[ce_stage(ce)] : NULL,
|
||||
NULL) < 0)
|
||||
errs++;
|
||||
}
|
||||
|
||||
@ -111,7 +112,8 @@ static void checkout_all(const char *prefix, int prefix_length)
|
||||
write_tempfile_record(last_ce->name, prefix);
|
||||
}
|
||||
if (checkout_entry(ce, &state,
|
||||
to_tempfile ? topath[ce_stage(ce)] : NULL) < 0)
|
||||
to_tempfile ? topath[ce_stage(ce)] : NULL,
|
||||
NULL) < 0)
|
||||
errs++;
|
||||
last_ce = ce;
|
||||
}
|
||||
|
@ -44,6 +44,7 @@ struct checkout_opts {
|
||||
int ignore_skipworktree;
|
||||
int ignore_other_worktrees;
|
||||
int show_progress;
|
||||
int count_checkout_paths;
|
||||
/*
|
||||
* If new checkout options are added, skip_merge_working_tree
|
||||
* should be updated accordingly.
|
||||
@ -166,12 +167,13 @@ static int check_stages(unsigned stages, const struct cache_entry *ce, int pos)
|
||||
}
|
||||
|
||||
static int checkout_stage(int stage, const struct cache_entry *ce, int pos,
|
||||
const struct checkout *state)
|
||||
const struct checkout *state, int *nr_checkouts)
|
||||
{
|
||||
while (pos < active_nr &&
|
||||
!strcmp(active_cache[pos]->name, ce->name)) {
|
||||
if (ce_stage(active_cache[pos]) == stage)
|
||||
return checkout_entry(active_cache[pos], state, NULL);
|
||||
return checkout_entry(active_cache[pos], state,
|
||||
NULL, nr_checkouts);
|
||||
pos++;
|
||||
}
|
||||
if (stage == 2)
|
||||
@ -180,7 +182,7 @@ static int checkout_stage(int stage, const struct cache_entry *ce, int pos,
|
||||
return error(_("path '%s' does not have their version"), ce->name);
|
||||
}
|
||||
|
||||
static int checkout_merged(int pos, const struct checkout *state)
|
||||
static int checkout_merged(int pos, const struct checkout *state, int *nr_checkouts)
|
||||
{
|
||||
struct cache_entry *ce = active_cache[pos];
|
||||
const char *path = ce->name;
|
||||
@ -243,7 +245,7 @@ static int checkout_merged(int pos, const struct checkout *state)
|
||||
ce = make_transient_cache_entry(mode, &oid, path, 2);
|
||||
if (!ce)
|
||||
die(_("make_cache_entry failed for path '%s'"), path);
|
||||
status = checkout_entry(ce, state, NULL);
|
||||
status = checkout_entry(ce, state, NULL, nr_checkouts);
|
||||
discard_cache_entry(ce);
|
||||
return status;
|
||||
}
|
||||
@ -258,6 +260,7 @@ static int checkout_paths(const struct checkout_opts *opts,
|
||||
struct commit *head;
|
||||
int errs = 0;
|
||||
struct lock_file lock_file = LOCK_INIT;
|
||||
int nr_checkouts = 0;
|
||||
|
||||
if (opts->track != BRANCH_TRACK_UNSPECIFIED)
|
||||
die(_("'%s' cannot be used with updating paths"), "--track");
|
||||
@ -372,17 +375,36 @@ static int checkout_paths(const struct checkout_opts *opts,
|
||||
struct cache_entry *ce = active_cache[pos];
|
||||
if (ce->ce_flags & CE_MATCHED) {
|
||||
if (!ce_stage(ce)) {
|
||||
errs |= checkout_entry(ce, &state, NULL);
|
||||
errs |= checkout_entry(ce, &state,
|
||||
NULL, &nr_checkouts);
|
||||
continue;
|
||||
}
|
||||
if (opts->writeout_stage)
|
||||
errs |= checkout_stage(opts->writeout_stage, ce, pos, &state);
|
||||
errs |= checkout_stage(opts->writeout_stage,
|
||||
ce, pos,
|
||||
&state, &nr_checkouts);
|
||||
else if (opts->merge)
|
||||
errs |= checkout_merged(pos, &state);
|
||||
errs |= checkout_merged(pos, &state,
|
||||
&nr_checkouts);
|
||||
pos = skip_same_name(ce, pos) - 1;
|
||||
}
|
||||
}
|
||||
errs |= finish_delayed_checkout(&state);
|
||||
errs |= finish_delayed_checkout(&state, &nr_checkouts);
|
||||
|
||||
if (opts->count_checkout_paths) {
|
||||
if (opts->source_tree)
|
||||
fprintf_ln(stderr, Q_("Checked out %d path out of %s",
|
||||
"Checked out %d paths out of %s",
|
||||
nr_checkouts),
|
||||
nr_checkouts,
|
||||
find_unique_abbrev(&opts->source_tree->object.oid,
|
||||
DEFAULT_ABBREV));
|
||||
else
|
||||
fprintf_ln(stderr, Q_("Checked out %d path out of the index",
|
||||
"Checked out %d paths out of the index",
|
||||
nr_checkouts),
|
||||
nr_checkouts);
|
||||
}
|
||||
|
||||
if (write_locked_index(&the_index, &lock_file, COMMIT_LOCK))
|
||||
die(_("unable to write new index file"));
|
||||
@ -1066,6 +1088,7 @@ static int parse_branchname_arg(int argc, const char **argv,
|
||||
has_dash_dash = 1; /* case (3) or (1) */
|
||||
else if (dash_dash_pos >= 2)
|
||||
die(_("only one reference expected, %d given."), dash_dash_pos);
|
||||
opts->count_checkout_paths = !opts->quiet && !has_dash_dash;
|
||||
|
||||
if (!strcmp(arg, "-"))
|
||||
arg = "@{-1}";
|
||||
|
@ -323,7 +323,7 @@ static int checkout_path(unsigned mode, struct object_id *oid,
|
||||
int ret;
|
||||
|
||||
ce = make_transient_cache_entry(mode, oid, path, 0);
|
||||
ret = checkout_entry(ce, state, NULL);
|
||||
ret = checkout_entry(ce, state, NULL, NULL);
|
||||
|
||||
discard_cache_entry(ce);
|
||||
return ret;
|
||||
|
4
cache.h
4
cache.h
@ -1539,9 +1539,9 @@ struct checkout {
|
||||
#define CHECKOUT_INIT { NULL, "" }
|
||||
|
||||
#define TEMPORARY_FILENAME_LENGTH 25
|
||||
extern int checkout_entry(struct cache_entry *ce, const struct checkout *state, char *topath);
|
||||
extern int checkout_entry(struct cache_entry *ce, const struct checkout *state, char *topath, int *nr_checkouts);
|
||||
extern void enable_delayed_checkout(struct checkout *state);
|
||||
extern int finish_delayed_checkout(struct checkout *state);
|
||||
extern int finish_delayed_checkout(struct checkout *state, int *nr_checkouts);
|
||||
|
||||
struct cache_def {
|
||||
struct strbuf path;
|
||||
|
10
entry.c
10
entry.c
@ -161,7 +161,7 @@ static int remove_available_paths(struct string_list_item *item, void *cb_data)
|
||||
return !available;
|
||||
}
|
||||
|
||||
int finish_delayed_checkout(struct checkout *state)
|
||||
int finish_delayed_checkout(struct checkout *state, int *nr_checkouts)
|
||||
{
|
||||
int errs = 0;
|
||||
unsigned delayed_object_count;
|
||||
@ -226,7 +226,7 @@ int finish_delayed_checkout(struct checkout *state)
|
||||
ce = index_file_exists(state->istate, path->string,
|
||||
strlen(path->string), 0);
|
||||
if (ce) {
|
||||
errs |= checkout_entry(ce, state, NULL);
|
||||
errs |= checkout_entry(ce, state, NULL, nr_checkouts);
|
||||
filtered_bytes += ce->ce_stat_data.sd_size;
|
||||
display_throughput(progress, filtered_bytes);
|
||||
} else
|
||||
@ -435,8 +435,8 @@ static void mark_colliding_entries(const struct checkout *state,
|
||||
* its name is returned in topath[], which must be able to hold at
|
||||
* least TEMPORARY_FILENAME_LENGTH bytes long.
|
||||
*/
|
||||
int checkout_entry(struct cache_entry *ce,
|
||||
const struct checkout *state, char *topath)
|
||||
int checkout_entry(struct cache_entry *ce, const struct checkout *state,
|
||||
char *topath, int *nr_checkouts)
|
||||
{
|
||||
static struct strbuf path = STRBUF_INIT;
|
||||
struct stat st;
|
||||
@ -506,5 +506,7 @@ int checkout_entry(struct cache_entry *ce,
|
||||
return 0;
|
||||
|
||||
create_directories(path.buf, path.len, state);
|
||||
if (nr_checkouts)
|
||||
(*nr_checkouts)++;
|
||||
return write_entry(ce, path.buf, state, 0);
|
||||
}
|
||||
|
@ -293,9 +293,9 @@ checkout_files () {
|
||||
do
|
||||
rm crlf_false_attr__$f.txt &&
|
||||
if test -z "$ceol"; then
|
||||
git checkout crlf_false_attr__$f.txt
|
||||
git checkout -- crlf_false_attr__$f.txt
|
||||
else
|
||||
git -c core.eol=$ceol checkout crlf_false_attr__$f.txt
|
||||
git -c core.eol=$ceol checkout -- crlf_false_attr__$f.txt
|
||||
fi
|
||||
done
|
||||
|
||||
|
@ -294,7 +294,7 @@ static void load_gitmodules_file(struct index_state *index,
|
||||
repo_read_gitmodules(the_repository);
|
||||
} else if (state && (ce->ce_flags & CE_UPDATE)) {
|
||||
submodule_free(the_repository);
|
||||
checkout_entry(ce, state, NULL);
|
||||
checkout_entry(ce, state, NULL, NULL);
|
||||
repo_read_gitmodules(the_repository);
|
||||
}
|
||||
}
|
||||
@ -450,12 +450,12 @@ static int check_updates(struct unpack_trees_options *o)
|
||||
display_progress(progress, ++cnt);
|
||||
ce->ce_flags &= ~CE_UPDATE;
|
||||
if (o->update && !o->dry_run) {
|
||||
errs |= checkout_entry(ce, &state, NULL);
|
||||
errs |= checkout_entry(ce, &state, NULL, NULL);
|
||||
}
|
||||
}
|
||||
}
|
||||
stop_progress(&progress);
|
||||
errs |= finish_delayed_checkout(&state);
|
||||
errs |= finish_delayed_checkout(&state, NULL);
|
||||
if (o->update)
|
||||
git_attr_set_direction(GIT_ATTR_CHECKIN);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user