Skip to content

Commit 0821a80

Browse files
committed
multi-pack-index: add --no-progress
Add --no-progress option to git multi-pack-index. The progress feature was added in 144d703 ("multi-pack-index: report progress during 'verify'", 2018-09-13) but the ability to opt-out was overlooked. Signed-off-by: William Baker <[email protected]>
1 parent 5fa0f52 commit 0821a80

File tree

5 files changed

+70
-16
lines changed

5 files changed

+70
-16
lines changed

Documentation/git-multi-pack-index.txt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ git-multi-pack-index - Write and verify multi-pack-indexes
99
SYNOPSIS
1010
--------
1111
[verse]
12-
'git multi-pack-index' [--object-dir=<dir>] <subcommand>
12+
'git multi-pack-index' [--object-dir=<dir>] <subcommand> [--[no-]progress]
1313

1414
DESCRIPTION
1515
-----------
@@ -23,6 +23,10 @@ OPTIONS
2323
`<dir>/packs/multi-pack-index` for the current MIDX file, and
2424
`<dir>/packs` for the pack-files to index.
2525

26+
--[no-]progress::
27+
Turn progress on/off explicitly. If neither is specified, progress is
28+
shown if standard error is connected to a terminal.
29+
2630
The following subcommands are available:
2731

2832
write::

builtin/multi-pack-index.c

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,34 +6,41 @@
66
#include "trace2.h"
77

88
static char const * const builtin_multi_pack_index_usage[] = {
9-
N_("git multi-pack-index [--object-dir=<dir>] (write|verify|expire|repack --batch-size=<size>)"),
9+
N_("git multi-pack-index [--object-dir=<dir>] (write|verify|expire|repack --batch-size=<size>) [--[no-]progress]"),
1010
NULL
1111
};
1212

1313
static struct opts_multi_pack_index {
1414
const char *object_dir;
1515
unsigned long batch_size;
16+
int progress;
1617
} opts;
1718

1819
int cmd_multi_pack_index(int argc, const char **argv,
1920
const char *prefix)
2021
{
22+
unsigned flags = 0;
23+
2124
static struct option builtin_multi_pack_index_options[] = {
2225
OPT_FILENAME(0, "object-dir", &opts.object_dir,
2326
N_("object directory containing set of packfile and pack-index pairs")),
2427
OPT_MAGNITUDE(0, "batch-size", &opts.batch_size,
2528
N_("during repack, collect pack-files of smaller size into a batch that is larger than this size")),
29+
OPT_BOOL(0, "progress", &opts.progress, N_("force progress reporting")),
2630
OPT_END(),
2731
};
2832

2933
git_config(git_default_config, NULL);
3034

35+
opts.progress = isatty(2);
3136
argc = parse_options(argc, argv, prefix,
3237
builtin_multi_pack_index_options,
3338
builtin_multi_pack_index_usage, 0);
3439

3540
if (!opts.object_dir)
3641
opts.object_dir = get_object_directory();
42+
if (opts.progress)
43+
flags |= MIDX_PROGRESS;
3744

3845
if (argc == 0)
3946
usage_with_options(builtin_multi_pack_index_usage,
@@ -47,14 +54,15 @@ int cmd_multi_pack_index(int argc, const char **argv,
4754
trace2_cmd_mode(argv[0]);
4855

4956
if (!strcmp(argv[0], "repack"))
50-
return midx_repack(the_repository, opts.object_dir, (size_t)opts.batch_size);
57+
return midx_repack(the_repository, opts.object_dir,
58+
(size_t)opts.batch_size, flags);
5159
if (opts.batch_size)
5260
die(_("--batch-size option is only for 'repack' subcommand"));
5361

5462
if (!strcmp(argv[0], "write"))
5563
return write_midx_file(opts.object_dir);
5664
if (!strcmp(argv[0], "verify"))
57-
return verify_midx_file(the_repository, opts.object_dir);
65+
return verify_midx_file(the_repository, opts.object_dir, flags);
5866
if (!strcmp(argv[0], "expire"))
5967
return expire_midx_packs(the_repository, opts.object_dir);
6068

midx.c

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1077,19 +1077,20 @@ static int compare_pair_pos_vs_id(const void *_a, const void *_b)
10771077
display_progress(progress, _n); \
10781078
} while (0)
10791079

1080-
int verify_midx_file(struct repository *r, const char *object_dir)
1080+
int verify_midx_file(struct repository *r, const char *object_dir, unsigned flags)
10811081
{
10821082
struct pair_pos_vs_id *pairs = NULL;
10831083
uint32_t i;
1084-
struct progress *progress;
1084+
struct progress *progress = NULL;
10851085
struct multi_pack_index *m = load_multi_pack_index(object_dir, 1);
10861086
verify_midx_error = 0;
10871087

10881088
if (!m)
10891089
return 0;
10901090

1091-
progress = start_progress(_("Looking for referenced packfiles"),
1092-
m->num_packs);
1091+
if (flags & MIDX_PROGRESS)
1092+
progress = start_progress(_("Looking for referenced packfiles"),
1093+
m->num_packs);
10931094
for (i = 0; i < m->num_packs; i++) {
10941095
if (prepare_midx_pack(r, m, i))
10951096
midx_report("failed to load pack in position %d", i);
@@ -1107,8 +1108,9 @@ int verify_midx_file(struct repository *r, const char *object_dir)
11071108
i, oid_fanout1, oid_fanout2, i + 1);
11081109
}
11091110

1110-
progress = start_sparse_progress(_("Verifying OID order in MIDX"),
1111-
m->num_objects - 1);
1111+
if (flags & MIDX_PROGRESS)
1112+
progress = start_sparse_progress(_("Verifying OID order in MIDX"),
1113+
m->num_objects - 1);
11121114
for (i = 0; i < m->num_objects - 1; i++) {
11131115
struct object_id oid1, oid2;
11141116

@@ -1135,13 +1137,15 @@ int verify_midx_file(struct repository *r, const char *object_dir)
11351137
pairs[i].pack_int_id = nth_midxed_pack_int_id(m, i);
11361138
}
11371139

1138-
progress = start_sparse_progress(_("Sorting objects by packfile"),
1139-
m->num_objects);
1140+
if (flags & MIDX_PROGRESS)
1141+
progress = start_sparse_progress(_("Sorting objects by packfile"),
1142+
m->num_objects);
11401143
display_progress(progress, 0); /* TODO: Measure QSORT() progress */
11411144
QSORT(pairs, m->num_objects, compare_pair_pos_vs_id);
11421145
stop_progress(&progress);
11431146

1144-
progress = start_sparse_progress(_("Verifying object offsets"), m->num_objects);
1147+
if (flags & MIDX_PROGRESS)
1148+
progress = start_sparse_progress(_("Verifying object offsets"), m->num_objects);
11451149
for (i = 0; i < m->num_objects; i++) {
11461150
struct object_id oid;
11471151
struct pack_entry e;
@@ -1316,7 +1320,7 @@ static int fill_included_packs_batch(struct repository *r,
13161320
return 0;
13171321
}
13181322

1319-
int midx_repack(struct repository *r, const char *object_dir, size_t batch_size)
1323+
int midx_repack(struct repository *r, const char *object_dir, size_t batch_size, unsigned flags)
13201324
{
13211325
int result = 0;
13221326
uint32_t i;
@@ -1341,6 +1345,12 @@ int midx_repack(struct repository *r, const char *object_dir, size_t batch_size)
13411345
strbuf_addstr(&base_name, object_dir);
13421346
strbuf_addstr(&base_name, "/pack/pack");
13431347
argv_array_push(&cmd.args, base_name.buf);
1348+
1349+
if (flags & MIDX_PROGRESS)
1350+
argv_array_push(&cmd.args, "--progress");
1351+
else
1352+
argv_array_push(&cmd.args, "-q");
1353+
13441354
strbuf_release(&base_name);
13451355

13461356
cmd.git_cmd = 1;

midx.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ struct multi_pack_index {
3737
char object_dir[FLEX_ARRAY];
3838
};
3939

40+
#define MIDX_PROGRESS (1 << 0)
41+
4042
struct multi_pack_index *load_multi_pack_index(const char *object_dir, int local);
4143
int prepare_midx_pack(struct repository *r, struct multi_pack_index *m, uint32_t pack_int_id);
4244
int bsearch_midx(const struct object_id *oid, struct multi_pack_index *m, uint32_t *result);
@@ -49,9 +51,9 @@ int prepare_multi_pack_index_one(struct repository *r, const char *object_dir, i
4951

5052
int write_midx_file(const char *object_dir);
5153
void clear_midx_file(struct repository *r);
52-
int verify_midx_file(struct repository *r, const char *object_dir);
54+
int verify_midx_file(struct repository *r, const char *object_dir, unsigned flags);
5355
int expire_midx_packs(struct repository *r, const char *object_dir);
54-
int midx_repack(struct repository *r, const char *object_dir, size_t batch_size);
56+
int midx_repack(struct repository *r, const char *object_dir, size_t batch_size, unsigned flags);
5557

5658
void close_midx(struct multi_pack_index *m);
5759

t/t5319-multi-pack-index.sh

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,21 @@ test_expect_success 'verify multi-pack-index success' '
169169
git multi-pack-index verify --object-dir=$objdir
170170
'
171171

172+
test_expect_success 'verify progress off for redirected stderr' '
173+
git multi-pack-index verify --object-dir=$objdir 2>err &&
174+
test_line_count = 0 err
175+
'
176+
177+
test_expect_success 'verify force progress on for stderr' '
178+
git multi-pack-index verify --object-dir=$objdir --progress 2>err &&
179+
test_file_not_empty err
180+
'
181+
182+
test_expect_success 'verify with the --no-progress option' '
183+
git multi-pack-index verify --object-dir=$objdir --no-progress 2>err &&
184+
test_line_count = 0 err
185+
'
186+
172187
# usage: corrupt_midx_and_verify <pos> <data> <objdir> <string>
173188
corrupt_midx_and_verify() {
174189
POS=$1 &&
@@ -284,6 +299,21 @@ test_expect_success 'git-fsck incorrect offset' '
284299
"git -c core.multipackindex=true fsck"
285300
'
286301

302+
test_expect_success 'repack progress off for redirected stderr' '
303+
git multi-pack-index repack --object-dir=$objdir 2>err &&
304+
test_line_count = 0 err
305+
'
306+
307+
test_expect_success 'repack force progress on for stderr' '
308+
git multi-pack-index repack --object-dir=$objdir --progress 2>err &&
309+
test_file_not_empty err
310+
'
311+
312+
test_expect_success 'repack with the --no-progress option' '
313+
git multi-pack-index repack --object-dir=$objdir --no-progress 2>err &&
314+
test_line_count = 0 err
315+
'
316+
287317
test_expect_success 'repack removes multi-pack-index' '
288318
test_path_is_file $objdir/pack/multi-pack-index &&
289319
GIT_TEST_MULTI_PACK_INDEX=0 git repack -adf &&

0 commit comments

Comments
 (0)