rev-list: add optional progress reporting

It's easy to ask rev-list to do a traversal that may takes
many seconds (e.g., by calling "--objects --all"). In theory
you can monitor its progress by the output you get to
stdout, but this isn't always easy.

Some operations, like "--count", don't make any output until
the end.

And some callers, like check_everything_connected(), are
using it just for the error-checking of the traversal, and
throw away stdout entirely.

This patch adds a "--progress" option which can be used to
give some eye-candy for a user waiting for a long traversal.
This is just a rev-list option and not a regular traversal
option, because it needs cooperation from the callbacks in
builtin/rev-list.c to do the actual count.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Jeff King 2016-07-20 07:28:09 -06:00 committed by Junio C Hamano
parent f26eef302f
commit 434ea3cdad
2 changed files with 21 additions and 0 deletions

View file

@ -274,6 +274,10 @@ ifdef::git-rev-list[]
Try to speed up the traversal using the pack bitmap index (if Try to speed up the traversal using the pack bitmap index (if
one is available). Note that when traversing with `--objects`, one is available). Note that when traversing with `--objects`,
trees and blobs will not have their associated path printed. trees and blobs will not have their associated path printed.
--progress=<header>::
Show progress reports on stderr as objects are considered. The
`<header>` text will be printed with each progress update.
endif::git-rev-list[] endif::git-rev-list[]
-- --

View file

@ -9,6 +9,7 @@
#include "log-tree.h" #include "log-tree.h"
#include "graph.h" #include "graph.h"
#include "bisect.h" #include "bisect.h"
#include "progress.h"
static const char rev_list_usage[] = static const char rev_list_usage[] =
"git rev-list [OPTION] <commit-id>... [ -- paths... ]\n" "git rev-list [OPTION] <commit-id>... [ -- paths... ]\n"
@ -49,12 +50,17 @@ static const char rev_list_usage[] =
" --bisect-all" " --bisect-all"
; ;
static struct progress *progress;
static unsigned progress_counter;
static void finish_commit(struct commit *commit, void *data); static void finish_commit(struct commit *commit, void *data);
static void show_commit(struct commit *commit, void *data) static void show_commit(struct commit *commit, void *data)
{ {
struct rev_list_info *info = data; struct rev_list_info *info = data;
struct rev_info *revs = info->revs; struct rev_info *revs = info->revs;
display_progress(progress, ++progress_counter);
if (info->flags & REV_LIST_QUIET) { if (info->flags & REV_LIST_QUIET) {
finish_commit(commit, data); finish_commit(commit, data);
return; return;
@ -190,6 +196,7 @@ static void show_object(struct object *obj, const char *name, void *cb_data)
{ {
struct rev_list_info *info = cb_data; struct rev_list_info *info = cb_data;
finish_object(obj, name, cb_data); finish_object(obj, name, cb_data);
display_progress(progress, ++progress_counter);
if (info->flags & REV_LIST_QUIET) if (info->flags & REV_LIST_QUIET)
return; return;
show_object_with_name(stdout, obj, name); show_object_with_name(stdout, obj, name);
@ -276,6 +283,7 @@ int cmd_rev_list(int argc, const char **argv, const char *prefix)
int bisect_show_vars = 0; int bisect_show_vars = 0;
int bisect_find_all = 0; int bisect_find_all = 0;
int use_bitmap_index = 0; int use_bitmap_index = 0;
const char *show_progress = NULL;
git_config(git_default_config, NULL); git_config(git_default_config, NULL);
init_revisions(&revs, prefix); init_revisions(&revs, prefix);
@ -325,6 +333,10 @@ int cmd_rev_list(int argc, const char **argv, const char *prefix)
test_bitmap_walk(&revs); test_bitmap_walk(&revs);
return 0; return 0;
} }
if (skip_prefix(arg, "--progress=", &arg)) {
show_progress = arg;
continue;
}
usage(rev_list_usage); usage(rev_list_usage);
} }
@ -355,6 +367,9 @@ int cmd_rev_list(int argc, const char **argv, const char *prefix)
if (bisect_list) if (bisect_list)
revs.limited = 1; revs.limited = 1;
if (show_progress)
progress = start_progress_delay(show_progress, 0, 0, 2);
if (use_bitmap_index && !revs.prune) { if (use_bitmap_index && !revs.prune) {
if (revs.count && !revs.left_right && !revs.cherry_mark) { if (revs.count && !revs.left_right && !revs.cherry_mark) {
uint32_t commit_count; uint32_t commit_count;
@ -392,6 +407,8 @@ int cmd_rev_list(int argc, const char **argv, const char *prefix)
traverse_commit_list(&revs, show_commit, show_object, &info); traverse_commit_list(&revs, show_commit, show_object, &info);
stop_progress(&progress);
if (revs.count) { if (revs.count) {
if (revs.left_right && revs.cherry_mark) if (revs.left_right && revs.cherry_mark)
printf("%d\t%d\t%d\n", revs.count_left, revs.count_right, revs.count_same); printf("%d\t%d\t%d\n", revs.count_left, revs.count_right, revs.count_same);