зеркало из https://github.com/microsoft/git.git
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:
Родитель
5823eb2b28
Коммит
6a38ef2ced
|
@ -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.
|
||||||
|
|
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_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 },
|
||||||
|
|
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_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 &&
|
||||||
|
|
25
wt-status.c
25
wt-status.c
|
@ -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 {
|
||||||
|
|
Загрузка…
Ссылка в новой задаче