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 pathsmaint
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.refresh_cache = 1;
|
||||||
costate.istate = istate;
|
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 error(_("cannot checkout %s"), ce->name);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -67,7 +67,8 @@ static int checkout_file(const char *name, const char *prefix)
|
||||||
continue;
|
continue;
|
||||||
did_checkout = 1;
|
did_checkout = 1;
|
||||||
if (checkout_entry(ce, &state,
|
if (checkout_entry(ce, &state,
|
||||||
to_tempfile ? topath[ce_stage(ce)] : NULL) < 0)
|
to_tempfile ? topath[ce_stage(ce)] : NULL,
|
||||||
|
NULL) < 0)
|
||||||
errs++;
|
errs++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -111,7 +112,8 @@ static void checkout_all(const char *prefix, int prefix_length)
|
||||||
write_tempfile_record(last_ce->name, prefix);
|
write_tempfile_record(last_ce->name, prefix);
|
||||||
}
|
}
|
||||||
if (checkout_entry(ce, &state,
|
if (checkout_entry(ce, &state,
|
||||||
to_tempfile ? topath[ce_stage(ce)] : NULL) < 0)
|
to_tempfile ? topath[ce_stage(ce)] : NULL,
|
||||||
|
NULL) < 0)
|
||||||
errs++;
|
errs++;
|
||||||
last_ce = ce;
|
last_ce = ce;
|
||||||
}
|
}
|
||||||
|
|
|
@ -44,6 +44,7 @@ struct checkout_opts {
|
||||||
int ignore_skipworktree;
|
int ignore_skipworktree;
|
||||||
int ignore_other_worktrees;
|
int ignore_other_worktrees;
|
||||||
int show_progress;
|
int show_progress;
|
||||||
|
int count_checkout_paths;
|
||||||
/*
|
/*
|
||||||
* If new checkout options are added, skip_merge_working_tree
|
* If new checkout options are added, skip_merge_working_tree
|
||||||
* should be updated accordingly.
|
* 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,
|
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 &&
|
while (pos < active_nr &&
|
||||||
!strcmp(active_cache[pos]->name, ce->name)) {
|
!strcmp(active_cache[pos]->name, ce->name)) {
|
||||||
if (ce_stage(active_cache[pos]) == stage)
|
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++;
|
pos++;
|
||||||
}
|
}
|
||||||
if (stage == 2)
|
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);
|
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];
|
struct cache_entry *ce = active_cache[pos];
|
||||||
const char *path = ce->name;
|
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);
|
ce = make_transient_cache_entry(mode, &oid, path, 2);
|
||||||
if (!ce)
|
if (!ce)
|
||||||
die(_("make_cache_entry failed for path '%s'"), path);
|
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);
|
discard_cache_entry(ce);
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
@ -258,6 +260,7 @@ static int checkout_paths(const struct checkout_opts *opts,
|
||||||
struct commit *head;
|
struct commit *head;
|
||||||
int errs = 0;
|
int errs = 0;
|
||||||
struct lock_file lock_file = LOCK_INIT;
|
struct lock_file lock_file = LOCK_INIT;
|
||||||
|
int nr_checkouts = 0;
|
||||||
|
|
||||||
if (opts->track != BRANCH_TRACK_UNSPECIFIED)
|
if (opts->track != BRANCH_TRACK_UNSPECIFIED)
|
||||||
die(_("'%s' cannot be used with updating paths"), "--track");
|
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];
|
struct cache_entry *ce = active_cache[pos];
|
||||||
if (ce->ce_flags & CE_MATCHED) {
|
if (ce->ce_flags & CE_MATCHED) {
|
||||||
if (!ce_stage(ce)) {
|
if (!ce_stage(ce)) {
|
||||||
errs |= checkout_entry(ce, &state, NULL);
|
errs |= checkout_entry(ce, &state,
|
||||||
|
NULL, &nr_checkouts);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (opts->writeout_stage)
|
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)
|
else if (opts->merge)
|
||||||
errs |= checkout_merged(pos, &state);
|
errs |= checkout_merged(pos, &state,
|
||||||
|
&nr_checkouts);
|
||||||
pos = skip_same_name(ce, pos) - 1;
|
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))
|
if (write_locked_index(&the_index, &lock_file, COMMIT_LOCK))
|
||||||
die(_("unable to write new index file"));
|
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) */
|
has_dash_dash = 1; /* case (3) or (1) */
|
||||||
else if (dash_dash_pos >= 2)
|
else if (dash_dash_pos >= 2)
|
||||||
die(_("only one reference expected, %d given."), dash_dash_pos);
|
die(_("only one reference expected, %d given."), dash_dash_pos);
|
||||||
|
opts->count_checkout_paths = !opts->quiet && !has_dash_dash;
|
||||||
|
|
||||||
if (!strcmp(arg, "-"))
|
if (!strcmp(arg, "-"))
|
||||||
arg = "@{-1}";
|
arg = "@{-1}";
|
||||||
|
|
|
@ -323,7 +323,7 @@ static int checkout_path(unsigned mode, struct object_id *oid,
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ce = make_transient_cache_entry(mode, oid, path, 0);
|
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);
|
discard_cache_entry(ce);
|
||||||
return ret;
|
return ret;
|
||||||
|
|
4
cache.h
4
cache.h
|
@ -1539,9 +1539,9 @@ struct checkout {
|
||||||
#define CHECKOUT_INIT { NULL, "" }
|
#define CHECKOUT_INIT { NULL, "" }
|
||||||
|
|
||||||
#define TEMPORARY_FILENAME_LENGTH 25
|
#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 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 cache_def {
|
||||||
struct strbuf path;
|
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;
|
return !available;
|
||||||
}
|
}
|
||||||
|
|
||||||
int finish_delayed_checkout(struct checkout *state)
|
int finish_delayed_checkout(struct checkout *state, int *nr_checkouts)
|
||||||
{
|
{
|
||||||
int errs = 0;
|
int errs = 0;
|
||||||
unsigned delayed_object_count;
|
unsigned delayed_object_count;
|
||||||
|
@ -226,7 +226,7 @@ int finish_delayed_checkout(struct checkout *state)
|
||||||
ce = index_file_exists(state->istate, path->string,
|
ce = index_file_exists(state->istate, path->string,
|
||||||
strlen(path->string), 0);
|
strlen(path->string), 0);
|
||||||
if (ce) {
|
if (ce) {
|
||||||
errs |= checkout_entry(ce, state, NULL);
|
errs |= checkout_entry(ce, state, NULL, nr_checkouts);
|
||||||
filtered_bytes += ce->ce_stat_data.sd_size;
|
filtered_bytes += ce->ce_stat_data.sd_size;
|
||||||
display_throughput(progress, filtered_bytes);
|
display_throughput(progress, filtered_bytes);
|
||||||
} else
|
} 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
|
* its name is returned in topath[], which must be able to hold at
|
||||||
* least TEMPORARY_FILENAME_LENGTH bytes long.
|
* least TEMPORARY_FILENAME_LENGTH bytes long.
|
||||||
*/
|
*/
|
||||||
int checkout_entry(struct cache_entry *ce,
|
int checkout_entry(struct cache_entry *ce, const struct checkout *state,
|
||||||
const struct checkout *state, char *topath)
|
char *topath, int *nr_checkouts)
|
||||||
{
|
{
|
||||||
static struct strbuf path = STRBUF_INIT;
|
static struct strbuf path = STRBUF_INIT;
|
||||||
struct stat st;
|
struct stat st;
|
||||||
|
@ -506,5 +506,7 @@ int checkout_entry(struct cache_entry *ce,
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
create_directories(path.buf, path.len, state);
|
create_directories(path.buf, path.len, state);
|
||||||
|
if (nr_checkouts)
|
||||||
|
(*nr_checkouts)++;
|
||||||
return write_entry(ce, path.buf, state, 0);
|
return write_entry(ce, path.buf, state, 0);
|
||||||
}
|
}
|
||||||
|
|
|
@ -293,9 +293,9 @@ checkout_files () {
|
||||||
do
|
do
|
||||||
rm crlf_false_attr__$f.txt &&
|
rm crlf_false_attr__$f.txt &&
|
||||||
if test -z "$ceol"; then
|
if test -z "$ceol"; then
|
||||||
git checkout crlf_false_attr__$f.txt
|
git checkout -- crlf_false_attr__$f.txt
|
||||||
else
|
else
|
||||||
git -c core.eol=$ceol checkout crlf_false_attr__$f.txt
|
git -c core.eol=$ceol checkout -- crlf_false_attr__$f.txt
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
|
|
|
@ -294,7 +294,7 @@ static void load_gitmodules_file(struct index_state *index,
|
||||||
repo_read_gitmodules(the_repository);
|
repo_read_gitmodules(the_repository);
|
||||||
} else if (state && (ce->ce_flags & CE_UPDATE)) {
|
} else if (state && (ce->ce_flags & CE_UPDATE)) {
|
||||||
submodule_free(the_repository);
|
submodule_free(the_repository);
|
||||||
checkout_entry(ce, state, NULL);
|
checkout_entry(ce, state, NULL, NULL);
|
||||||
repo_read_gitmodules(the_repository);
|
repo_read_gitmodules(the_repository);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -450,12 +450,12 @@ static int check_updates(struct unpack_trees_options *o)
|
||||||
display_progress(progress, ++cnt);
|
display_progress(progress, ++cnt);
|
||||||
ce->ce_flags &= ~CE_UPDATE;
|
ce->ce_flags &= ~CE_UPDATE;
|
||||||
if (o->update && !o->dry_run) {
|
if (o->update && !o->dry_run) {
|
||||||
errs |= checkout_entry(ce, &state, NULL);
|
errs |= checkout_entry(ce, &state, NULL, NULL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
stop_progress(&progress);
|
stop_progress(&progress);
|
||||||
errs |= finish_delayed_checkout(&state);
|
errs |= finish_delayed_checkout(&state, NULL);
|
||||||
if (o->update)
|
if (o->update)
|
||||||
git_attr_set_direction(GIT_ATTR_CHECKIN);
|
git_attr_set_direction(GIT_ATTR_CHECKIN);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue