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:
Nguyễn Thái Ngọc Duy 2013-03-13 19:59:16 +07:00 коммит произвёл Junio C Hamano
Родитель 5823eb2b28
Коммит 6a38ef2ced
8 изменённых файлов: 36 добавлений и 0 удалений

Просмотреть файл

@ -163,6 +163,10 @@ advice.*::
state in the output of linkgit:git-status[1] and in state in the output of linkgit:git-status[1] and in
the template shown when writing commit messages in the template shown when writing commit messages in
linkgit:git-commit[1]. 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:: commitBeforeMerge::
Advice shown when linkgit:git-merge[1] refuses to Advice shown when linkgit:git-merge[1] refuses to
merge to avoid overwriting local changes. merge to avoid overwriting local changes.

Просмотреть файл

@ -5,6 +5,7 @@ int advice_push_non_ff_current = 1;
int advice_push_non_ff_default = 1; int advice_push_non_ff_default = 1;
int advice_push_non_ff_matching = 1; int advice_push_non_ff_matching = 1;
int advice_status_hints = 1; int advice_status_hints = 1;
int advice_status_u_option = 1;
int advice_commit_before_merge = 1; int advice_commit_before_merge = 1;
int advice_resolve_conflict = 1; int advice_resolve_conflict = 1;
int advice_implicit_identity = 1; int advice_implicit_identity = 1;
@ -19,6 +20,7 @@ static struct {
{ "pushnonffdefault", &advice_push_non_ff_default }, { "pushnonffdefault", &advice_push_non_ff_default },
{ "pushnonffmatching", &advice_push_non_ff_matching }, { "pushnonffmatching", &advice_push_non_ff_matching },
{ "statushints", &advice_status_hints }, { "statushints", &advice_status_hints },
{ "statusuoption", &advice_status_u_option },
{ "commitbeforemerge", &advice_commit_before_merge }, { "commitbeforemerge", &advice_commit_before_merge },
{ "resolveconflict", &advice_resolve_conflict }, { "resolveconflict", &advice_resolve_conflict },
{ "implicitidentity", &advice_implicit_identity }, { "implicitidentity", &advice_implicit_identity },

Просмотреть файл

@ -8,6 +8,7 @@ extern int advice_push_non_ff_current;
extern int advice_push_non_ff_default; extern int advice_push_non_ff_default;
extern int advice_push_non_ff_matching; extern int advice_push_non_ff_matching;
extern int advice_status_hints; extern int advice_status_hints;
extern int advice_status_u_option;
extern int advice_commit_before_merge; extern int advice_commit_before_merge;
extern int advice_resolve_conflict; extern int advice_resolve_conflict;
extern int advice_implicit_identity; extern int advice_implicit_identity;

Просмотреть файл

@ -5,6 +5,7 @@ test_description='basic work tree status reporting'
. ./test-lib.sh . ./test-lib.sh
test_expect_success setup ' test_expect_success setup '
git config --global advice.statusuoption false &&
test_commit A && test_commit A &&
test_commit B oneside added && test_commit B oneside added &&
git checkout A^0 && git checkout A^0 &&

Просмотреть файл

@ -8,6 +8,7 @@ test_description='git status'
. ./test-lib.sh . ./test-lib.sh
test_expect_success 'status -h in broken repository' ' test_expect_success 'status -h in broken repository' '
git config --global advice.statusuoption false &&
mkdir broken && mkdir broken &&
test_when_finished "rm -fr broken" && test_when_finished "rm -fr broken" &&
( (

Просмотреть файл

@ -14,6 +14,7 @@ test_description='git status advices'
set_fake_editor set_fake_editor
test_expect_success 'prepare for conflicts' ' test_expect_success 'prepare for conflicts' '
git config --global advice.statusuoption false &&
test_commit init main.txt init && test_commit init main.txt init &&
git branch conflicts && git branch conflicts &&
test_commit on_master main.txt on_master && test_commit on_master main.txt on_master &&

Просмотреть файл

@ -496,9 +496,14 @@ static void wt_status_collect_untracked(struct wt_status *s)
{ {
int i; int i;
struct dir_struct dir; struct dir_struct dir;
struct timeval t_begin;
if (!s->show_untracked_files) if (!s->show_untracked_files)
return; return;
if (advice_status_u_option)
gettimeofday(&t_begin, NULL);
memset(&dir, 0, sizeof(dir)); memset(&dir, 0, sizeof(dir));
if (s->show_untracked_files != SHOW_ALL_UNTRACKED_FILES) if (s->show_untracked_files != SHOW_ALL_UNTRACKED_FILES)
dir.flags |= dir.flags |=
@ -528,6 +533,14 @@ static void wt_status_collect_untracked(struct wt_status *s)
} }
free(dir.entries); 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) 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"); wt_status_print_other(s, &s->untracked, _("Untracked files"), "add");
if (s->show_ignored_files) if (s->show_ignored_files)
wt_status_print_other(s, &s->ignored, _("Ignored files"), "add -f"); 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) } else if (s->commitable)
status_printf_ln(s, GIT_COLOR_NORMAL, _("Untracked files not listed%s"), status_printf_ln(s, GIT_COLOR_NORMAL, _("Untracked files not listed%s"),
advice_status_hints advice_status_hints

Просмотреть файл

@ -69,6 +69,7 @@ struct wt_status {
struct string_list change; struct string_list change;
struct string_list untracked; struct string_list untracked;
struct string_list ignored; struct string_list ignored;
uint32_t untracked_in_ms;
}; };
struct wt_status_state { struct wt_status_state {