Re: [PATCH] status: hint the user about -uno if read_directory takes too long
- From
Torsten Bögershausen <tboegi@web.de>
- Date
- Mar 15, 2013, 21:14 UTC
- Message-ID
- <51438F33.3080607@web.de>
- In-Reply-To
- <7v4ngcv35l.fsf@alter.siamese.dyndns.org>
On 15.03.13 21:06, Junio C Hamano wrote:
Show 178 quoted lines
> Torsten Bögershausen <tboegi@web.de> writes:
>
>> > Thanks, I like that much better than mine
>> > (and expere is probably a word not yet invented)
> OK, then how about redoing Duy's patch like this on top?
>
> I've moved the timing collection from the caller to callee, and I
> think the result is more readable. The message looked easier to see
> with a leading blank line, so I added one.
>
> -- >8 --
> From: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
> Date: Wed, 13 Mar 2013 19:59:16 +0700
> Subject: [PATCH] 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>
> ---
> Documentation/config.txt | 4 ++++
> advice.c | 2 ++
> advice.h | 1 +
> t/t7060-wtstatus.sh | 1 +
> t/t7508-status.sh | 1 +
> t/t7512-status-help.sh | 1 +
> wt-status.c | 21 +++++++++++++++++++++
> wt-status.h | 1 +
> 8 files changed, 32 insertions(+)
>
> diff --git a/Documentation/config.txt b/Documentation/config.txt
> index d1de857..a16eda5 100644
> --- a/Documentation/config.txt
> +++ b/Documentation/config.txt
> @@ -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.
> diff --git a/advice.c b/advice.c
> index edfbd4a..015011f 100644
> --- a/advice.c
> +++ b/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 },
> diff --git a/advice.h b/advice.h
> index f3cdbbf..e3e665d 100644
> --- a/advice.h
> +++ b/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;
> diff --git a/t/t7060-wtstatus.sh b/t/t7060-wtstatus.sh
> index f4f38a5..52ef06b 100755
> --- a/t/t7060-wtstatus.sh
> +++ b/t/t7060-wtstatus.sh
> @@ -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 &&
> diff --git a/t/t7508-status.sh b/t/t7508-status.sh
> index e313ef1..15e063a 100755
> --- a/t/t7508-status.sh
> +++ b/t/t7508-status.sh
> @@ -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" &&
> (
> diff --git a/t/t7512-status-help.sh b/t/t7512-status-help.sh
> index b3f6eb9..2d53e03 100755
> --- a/t/t7512-status-help.sh
> +++ b/t/t7512-status-help.sh
> @@ -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 &&
> diff --git a/wt-status.c b/wt-status.c
> index 2a9658b..6e75468 100644
> --- a/wt-status.c
> +++ b/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,14 @@ 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."),
> + s->untracked_in_ms / 1000.0);
> + status_printf_ln(s, GIT_COLOR_NORMAL,
> + _("Consider the -u option for a possible speed-up?"));
> + }
> } else if (s->commitable)
> status_printf_ln(s, GIT_COLOR_NORMAL, _("Untracked files not listed%s"),
> advice_status_hints
> diff --git a/wt-status.h b/wt-status.h
> index 236b41f..09420d0 100644
> --- a/wt-status.h
> +++ b/wt-status.h
> @@ -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 {
> -- 1.8.2-279-g744670c -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
> Thanks, that looks good to me:
# It took 2.58 seconds to enumerate untracked files. # Consider the -u option for a possible speed-up?
But: If I follow the advice as is given and use "git status -u", the result is the same.
If I think loud, would it be better to say:
# It took 2.58 seconds to search for untracked files. # Consider the -uno option for a possible speed-up?
or
# It took 2.58 seconds to search for untracked files. # Consider the -u option for a possible speed-up? # Please see git help status
/Torsten