Skip to content

Commit 21e02a8

Browse files
jeffhostetlerdscho
authored andcommitted
survey: add --no-name-rev option
Computing `git name-rev` on each commit, tree, and blob in each of the various large_item_vec can be very expensive if there are too many refs, especially if the user doesn't need the result. Lets make it optional. The `--no-name-rev` option can save 50 calls to `git name-rev` since we have 5 large_item_vec's and each defaults to 10 items. Signed-off-by: Jeff Hostetler <[email protected]>
1 parent 3703b8a commit 21e02a8

File tree

3 files changed

+35
-11
lines changed

3 files changed

+35
-11
lines changed

Documentation/config/survey.adoc

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@ survey.*::
44
background with these options.
55
+
66
--
7+
survey.namerev::
8+
Boolean to show/hide `git name-rev` information for each
9+
reported commit and the containing commit of each
10+
reported tree and blob.
711
verbose::
812
This boolean value implies the `--[no-]verbose` option.
913
progress::

Documentation/git-survey.adoc

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,10 @@ OPTIONS
3232
--progress::
3333
Show progress. This is automatically enabled when interactive.
3434

35+
--[no-]name-rev::
36+
Print `git name-rev` output for each commit, tree, and blob.
37+
Defaults to true.
38+
3539
Ref Selection
3640
~~~~~~~~~~~~~
3741

builtin/survey.c

Lines changed: 27 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ static struct survey_refs_wanted default_ref_options = {
4242
struct survey_opts {
4343
int verbose;
4444
int show_progress;
45+
int show_name_rev;
4546

4647
int show_largest_commits_by_nr_parents;
4748
int show_largest_commits_by_size_bytes;
@@ -767,7 +768,7 @@ static void survey_report_commit_parents(struct survey_context *ctx)
767768
clear_table(&table);
768769
}
769770

770-
static void survey_report_largest_vec(struct large_item_vec *vec)
771+
static void survey_report_largest_vec(struct survey_context *ctx, struct large_item_vec *vec)
771772
{
772773
struct survey_table table = SURVEY_TABLE_INIT;
773774
struct strbuf size = STRBUF_INIT;
@@ -776,7 +777,7 @@ static void survey_report_largest_vec(struct large_item_vec *vec)
776777
return;
777778

778779
table.table_name = vec->dimension_label;
779-
strvec_pushl(&table.header, "Size", "OID", "Name", "Commit", "Name-Rev", NULL);
780+
strvec_pushl(&table.header, "Size", "OID", "Name", "Commit", ctx->opts.show_name_rev ? "Name-Rev" : NULL, NULL);
780781

781782
for (size_t k = 0; k < vec->nr_items; k++) {
782783
struct large_item *pk = &vec->items[k];
@@ -787,7 +788,7 @@ static void survey_report_largest_vec(struct large_item_vec *vec)
787788
insert_table_rowv(&table, size.buf, oid_to_hex(&pk->oid), pk->name.buf,
788789
is_null_oid(&pk->containing_commit_oid) ?
789790
"" : oid_to_hex(&pk->containing_commit_oid),
790-
pk->name_rev.len ? pk->name_rev.buf : "",
791+
!ctx->opts.show_name_rev ? NULL : pk->name_rev.len ? pk->name_rev.buf : "",
791792
NULL);
792793
}
793794
}
@@ -977,11 +978,11 @@ static void survey_report_plaintext(struct survey_context *ctx)
977978
survey_report_plaintext_sorted_size(
978979
&ctx->report.top_paths_by_inflate[REPORT_TYPE_BLOB]);
979980

980-
survey_report_largest_vec(ctx->report.reachable_objects.commits.vec_largest_by_nr_parents);
981-
survey_report_largest_vec(ctx->report.reachable_objects.commits.vec_largest_by_size_bytes);
982-
survey_report_largest_vec(ctx->report.reachable_objects.trees.vec_largest_by_nr_entries);
983-
survey_report_largest_vec(ctx->report.reachable_objects.trees.vec_largest_by_size_bytes);
984-
survey_report_largest_vec(ctx->report.reachable_objects.blobs.vec_largest_by_size_bytes);
981+
survey_report_largest_vec(ctx, ctx->report.reachable_objects.commits.vec_largest_by_nr_parents);
982+
survey_report_largest_vec(ctx, ctx->report.reachable_objects.commits.vec_largest_by_size_bytes);
983+
survey_report_largest_vec(ctx, ctx->report.reachable_objects.trees.vec_largest_by_nr_entries);
984+
survey_report_largest_vec(ctx, ctx->report.reachable_objects.trees.vec_largest_by_size_bytes);
985+
survey_report_largest_vec(ctx, ctx->report.reachable_objects.blobs.vec_largest_by_size_bytes);
985986
}
986987

987988
/*
@@ -1053,6 +1054,10 @@ static int survey_load_config_cb(const char *var, const char *value,
10531054
ctx->opts.show_progress = git_config_bool(var, value);
10541055
return 0;
10551056
}
1057+
if (!strcmp(var, "survey.namerev")) {
1058+
ctx->opts.show_name_rev = git_config_bool(var, value);
1059+
return 0;
1060+
}
10561061
if (!strcmp(var, "survey.showcommitparents")) {
10571062
ctx->opts.show_largest_commits_by_nr_parents = git_config_ulong(var, value, cctx->kvi);
10581063
return 0;
@@ -1189,6 +1194,13 @@ static void large_item_vec_lookup_name_rev(struct survey_context *ctx,
11891194

11901195
static void do_lookup_name_rev(struct survey_context *ctx)
11911196
{
1197+
/*
1198+
* `git name-rev` can be very expensive when there are lots of
1199+
* refs, so make it optional.
1200+
*/
1201+
if (!ctx->opts.show_name_rev)
1202+
return;
1203+
11921204
if (ctx->opts.show_progress) {
11931205
ctx->progress_total = 0;
11941206
ctx->progress = start_progress(ctx->repo, _("Resolving name-revs..."), 0);
@@ -1562,9 +1574,12 @@ static void survey_phase_objects(struct survey_context *ctx)
15621574
release_revisions(&revs);
15631575
trace2_region_leave("survey", "phase/objects", ctx->repo);
15641576

1565-
trace2_region_enter("survey", "phase/namerev", the_repository);
1566-
do_lookup_name_rev(ctx);
1567-
trace2_region_enter("survey", "phase/namerev", the_repository);}
1577+
if (ctx->opts.show_name_rev) {
1578+
trace2_region_enter("survey", "phase/namerev", the_repository);
1579+
do_lookup_name_rev(ctx);
1580+
trace2_region_enter("survey", "phase/namerev", the_repository);
1581+
}
1582+
}
15681583

15691584
int cmd_survey(int argc, const char **argv, const char *prefix, struct repository *repo)
15701585
{
@@ -1588,6 +1603,7 @@ int cmd_survey(int argc, const char **argv, const char *prefix, struct repositor
15881603
static struct option survey_options[] = {
15891604
OPT__VERBOSE(&ctx.opts.verbose, N_("verbose output")),
15901605
OPT_BOOL(0, "progress", &ctx.opts.show_progress, N_("show progress")),
1606+
OPT_BOOL(0, "name-rev", &ctx.opts.show_name_rev, N_("run name-rev on each reported commit")),
15911607
OPT_INTEGER('n', "top", &ctx.opts.top_nr,
15921608
N_("number of entries to include in detail tables")),
15931609

0 commit comments

Comments
 (0)