status: advise to consider use of -u when read_directory takes too long
Introduce advice.statusUoption to suggest considering use of -u to strike different trade-off when it took more than 2 seconds to enumerate untracked/ignored files. Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
5823eb2b28
commit
6a38ef2ced
@ -163,6 +163,10 @@ advice.*::
|
||||
state in the output of linkgit:git-status[1] and in
|
||||
the template shown when writing commit messages in
|
||||
linkgit:git-commit[1].
|
||||
statusUoption::
|
||||
Advise to consider using the `-u` option to linkgit:git-status[1]
|
||||
when the command takes more than 2 seconds to enumerate untracked
|
||||
files.
|
||||
commitBeforeMerge::
|
||||
Advice shown when linkgit:git-merge[1] refuses to
|
||||
merge to avoid overwriting local changes.
|
||||
|
2
advice.c
2
advice.c
@ -5,6 +5,7 @@ int advice_push_non_ff_current = 1;
|
||||
int advice_push_non_ff_default = 1;
|
||||
int advice_push_non_ff_matching = 1;
|
||||
int advice_status_hints = 1;
|
||||
int advice_status_u_option = 1;
|
||||
int advice_commit_before_merge = 1;
|
||||
int advice_resolve_conflict = 1;
|
||||
int advice_implicit_identity = 1;
|
||||
@ -19,6 +20,7 @@ static struct {
|
||||
{ "pushnonffdefault", &advice_push_non_ff_default },
|
||||
{ "pushnonffmatching", &advice_push_non_ff_matching },
|
||||
{ "statushints", &advice_status_hints },
|
||||
{ "statusuoption", &advice_status_u_option },
|
||||
{ "commitbeforemerge", &advice_commit_before_merge },
|
||||
{ "resolveconflict", &advice_resolve_conflict },
|
||||
{ "implicitidentity", &advice_implicit_identity },
|
||||
|
1
advice.h
1
advice.h
@ -8,6 +8,7 @@ extern int advice_push_non_ff_current;
|
||||
extern int advice_push_non_ff_default;
|
||||
extern int advice_push_non_ff_matching;
|
||||
extern int advice_status_hints;
|
||||
extern int advice_status_u_option;
|
||||
extern int advice_commit_before_merge;
|
||||
extern int advice_resolve_conflict;
|
||||
extern int advice_implicit_identity;
|
||||
|
@ -5,6 +5,7 @@ test_description='basic work tree status reporting'
|
||||
. ./test-lib.sh
|
||||
|
||||
test_expect_success setup '
|
||||
git config --global advice.statusuoption false &&
|
||||
test_commit A &&
|
||||
test_commit B oneside added &&
|
||||
git checkout A^0 &&
|
||||
|
@ -8,6 +8,7 @@ test_description='git status'
|
||||
. ./test-lib.sh
|
||||
|
||||
test_expect_success 'status -h in broken repository' '
|
||||
git config --global advice.statusuoption false &&
|
||||
mkdir broken &&
|
||||
test_when_finished "rm -fr broken" &&
|
||||
(
|
||||
|
@ -14,6 +14,7 @@ test_description='git status advices'
|
||||
set_fake_editor
|
||||
|
||||
test_expect_success 'prepare for conflicts' '
|
||||
git config --global advice.statusuoption false &&
|
||||
test_commit init main.txt init &&
|
||||
git branch conflicts &&
|
||||
test_commit on_master main.txt on_master &&
|
||||
|
25
wt-status.c
25
wt-status.c
@ -496,9 +496,14 @@ static void wt_status_collect_untracked(struct wt_status *s)
|
||||
{
|
||||
int i;
|
||||
struct dir_struct dir;
|
||||
struct timeval t_begin;
|
||||
|
||||
if (!s->show_untracked_files)
|
||||
return;
|
||||
|
||||
if (advice_status_u_option)
|
||||
gettimeofday(&t_begin, NULL);
|
||||
|
||||
memset(&dir, 0, sizeof(dir));
|
||||
if (s->show_untracked_files != SHOW_ALL_UNTRACKED_FILES)
|
||||
dir.flags |=
|
||||
@ -528,6 +533,14 @@ static void wt_status_collect_untracked(struct wt_status *s)
|
||||
}
|
||||
|
||||
free(dir.entries);
|
||||
|
||||
if (advice_status_u_option) {
|
||||
struct timeval t_end;
|
||||
gettimeofday(&t_end, NULL);
|
||||
s->untracked_in_ms =
|
||||
(uint64_t)t_end.tv_sec * 1000 + t_end.tv_usec / 1000 -
|
||||
((uint64_t)t_begin.tv_sec * 1000 + t_begin.tv_usec / 1000);
|
||||
}
|
||||
}
|
||||
|
||||
void wt_status_collect(struct wt_status *s)
|
||||
@ -1011,6 +1024,18 @@ void wt_status_print(struct wt_status *s)
|
||||
wt_status_print_other(s, &s->untracked, _("Untracked files"), "add");
|
||||
if (s->show_ignored_files)
|
||||
wt_status_print_other(s, &s->ignored, _("Ignored files"), "add -f");
|
||||
if (advice_status_u_option && 2000 < s->untracked_in_ms) {
|
||||
status_printf_ln(s, GIT_COLOR_NORMAL, "");
|
||||
status_printf_ln(s, GIT_COLOR_NORMAL,
|
||||
_("It took %.2f seconds to enumerate untracked files."
|
||||
" 'status -uno'"),
|
||||
s->untracked_in_ms / 1000.0);
|
||||
status_printf_ln(s, GIT_COLOR_NORMAL,
|
||||
_("may speed it up, but you have to be careful not"
|
||||
" to forget to add"));
|
||||
status_printf_ln(s, GIT_COLOR_NORMAL,
|
||||
_("new files yourself (see 'git help status')."));
|
||||
}
|
||||
} else if (s->commitable)
|
||||
status_printf_ln(s, GIT_COLOR_NORMAL, _("Untracked files not listed%s"),
|
||||
advice_status_hints
|
||||
|
@ -69,6 +69,7 @@ struct wt_status {
|
||||
struct string_list change;
|
||||
struct string_list untracked;
|
||||
struct string_list ignored;
|
||||
uint32_t untracked_in_ms;
|
||||
};
|
||||
|
||||
struct wt_status_state {
|
||||
|
Loading…
Reference in New Issue
Block a user