git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH 1/1] 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.

From
Junio C Hamano <gitster@pobox.com>
Date
Sep 12, 2019, 20:17 UTC
Message-ID
<xmqqlfutfewv.fsf@gitster-ct.c.googlers.com>
In-Reply-To
<0821a8073a48067ecd9ce08226656fa04d803f6b.1568216234.git.gitgitgadget@gmail.com>
"William Baker via GitGitGadget" <gitgitgadget@gmail.com> writes:
>  [verse]
> -'git multi-pack-index' [--object-dir=<dir>] <subcommand>
> +'git multi-pack-index' [--object-dir=<dir>] <subcommand> [--[no-]progress]

I am wondering what the reasoning behind having this new one *after* the subcommand while the existing one *before* is. Isn't the --[no-]progress option supported by all subcommands of the multi-pack-index command, just like the --object-dir=<dir> option is?

If there is no reason that explains why one must come before and the other must come after the subcommand, we are then adding another thing the end-users or scriptors need to memorize, which is not ideal.

> +--[no-]progress::
> +	Turn progress on/off explicitly. If neither is specified, progress is 
> +	shown if standard error is connected to a terminal.
Sounds sensible.
Show 12 quoted lines
> diff --git a/builtin/multi-pack-index.c b/builtin/multi-pack-index.c
> index b1ea1a6aa1..f8b2a74179 100644
> --- a/builtin/multi-pack-index.c
> +++ b/builtin/multi-pack-index.c
> @@ -6,34 +6,41 @@
>  #include "trace2.h"
>  
>  static char const * const builtin_multi_pack_index_usage[] = {
> -	N_("git multi-pack-index [--object-dir=<dir>] (write|verify|expire|repack --batch-size=<size>)"),
> +	N_("git multi-pack-index [--object-dir=<dir>] (write|verify|expire|repack --batch-size=<size>) [--[no-]progress]"),
>  	NULL
>  };
The same comment as the SYNOPSIS part.
Show 19 quoted lines
>  static struct opts_multi_pack_index {
>  	const char *object_dir;
>  	unsigned long batch_size;
> +	int progress;
>  } opts;
>  
>  int cmd_multi_pack_index(int argc, const char **argv,
>  			 const char *prefix)
>  {
> +	unsigned flags = 0;
> +
>  	static struct option builtin_multi_pack_index_options[] = {
>  		OPT_FILENAME(0, "object-dir", &opts.object_dir,
>  		  N_("object directory containing set of packfile and pack-index pairs")),
>  		OPT_MAGNITUDE(0, "batch-size", &opts.batch_size,
>  		  N_("during repack, collect pack-files of smaller size into a batch that is larger than this size")),
> +		OPT_BOOL(0, "progress", &opts.progress, N_("force progress reporting")),
>  		OPT_END(),
>  	};

Seeing that all the options that made me curious (see above) are defined here for all subcommands, I suspect that "technically", all options must come before the <subcommand> (side note: I know parse-options may reorder commands after options, but in the documentation and usage, we strongly discourage users from relying on the reordering and always show "global --options, subcommand, and then subcommand --options" order). I also see in the code that handles opts.batch_size that there is a workaround for this inverted code structure to make sure subcommands other than repack does not allow --batch-size option specified.

Unless and until we get rid of the "git multi-pack-index" as a separate command (side note: when it happens, we;'d call the underlying midx API functions directly from appropriate places in the codepaths like "gc"), we probably would want to correct the use of parse_options() API in the implementation of this command before adding any new option or subcommand.

Show 17 quoted lines
> @@ -47,14 +54,15 @@ int cmd_multi_pack_index(int argc, const char **argv,
>  	trace2_cmd_mode(argv[0]);
>  
>  	if (!strcmp(argv[0], "repack"))
> -		return midx_repack(the_repository, opts.object_dir, (size_t)opts.batch_size);
> +		return midx_repack(the_repository, opts.object_dir, 
> +			(size_t)opts.batch_size, flags);
>  	if (opts.batch_size)
>  		die(_("--batch-size option is only for 'repack' subcommand"));
>  
>  	if (!strcmp(argv[0], "write"))
>  		return write_midx_file(opts.object_dir);
>  	if (!strcmp(argv[0], "verify"))
> -		return verify_midx_file(the_repository, opts.object_dir);
> +		return verify_midx_file(the_repository, opts.object_dir, flags);
>  	if (!strcmp(argv[0], "expire"))
>  		return expire_midx_packs(the_repository, opts.object_dir);

We can see that the new option only affects "verify", even though the SYNOPSIS and usage text pretends that everybody understands and reacts to it. Shouldn't it be documented just like how --batch-size is documented that it is understood only by "repack"?

If the mid-term aspiration of this patch is to later enhance other subcommands to also understand the progress output or verbosity option (and if the excuse given as a response to the above analysis is "this is just a first step, more will come later"), the instead of adding a "unsigned flag" local variable to the function, it would probably make much more sense to

 (1) make struct opts_multi_pack_index as a part of the public API
     between cmd_multi_pack_index() and midx.c and document it in
     midx.h;
 (2) instead of passing opts.object_dir to existing command
     implementations, pass &opts, the pointer to the whole
     structure;
 (3) add a new field "unsigned progress" to the structure, and teach
     the command line parser to flip it upon seeing "--[no-]progress".
Previous: William Baker via GitGitGadgetNext: William Baker
Message 3 of 58 in “multi-pack-index: add --no-progress”
  1. 0/1 multi-pack-index: add --no-progressWilliam Baker via GitGitGadget, Sep 11, 2019
  2. 1/1 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.William Baker via GitGitGadget, Sep 11, 2019
  3. Junio C HamanoSep 12, 2019
  4. William BakerSep 13, 2019
  5. Junio C HamanoSep 13, 2019
  6. William BakerSep 16, 2019
  7. Derrick StoleeSep 11, 2019
  8. 0/6 multi-pack-index: add --no-progressWilliam Baker via GitGitGadget, Sep 20, 2019
  9. 1/6 midx: add MIDX_PROGRESS flag Add the MIDX_PROGRESS flag and update the write|verify|expire|repack functions in midx.h to accept a flags parameter. The MIDX_PROGRESS flag indicates whether the caller of the function would like progress information to be displayed. This patch only changes the method prototypes and does not change the functionality. The functionality change will be handled by a later patch.William Baker via GitGitGadget, Sep 20, 2019
  10. Junio C HamanoSep 20, 2019
  11. Junio C HamanoSep 20, 2019
  12. SZEDER GáborSep 21, 2019
  13. William BakerSep 23, 2019
  14. Junio C HamanoSep 28, 2019
  15. William BakerSep 30, 2019
  16. Junio C HamanoOct 2, 2019
  17. Junio C HamanoOct 2, 2019
  18. Junio C HamanoOct 2, 2019
  19. William BakerOct 2, 2019
  20. SZEDER GáborOct 7, 2019
  21. SZEDER GáborOct 7, 2019
  22. Junio C HamanoOct 8, 2019
  23. William BakerOct 8, 2019
  24. SZEDER GáborOct 9, 2019
  25. SZEDER GáborOct 9, 2019
  26. William BakerOct 15, 2019
  27. Junio C HamanoOct 16, 2019
  28. William BakerOct 16, 2019
  29. William BakerOct 18, 2019
  30. 5/6 midx: honor the MIDX_PROGRESS flag in midx_repack Update midx_repack to only display progress when the MIDX_PROGRESS flag is set.William Baker via GitGitGadget, Sep 20, 2019
  31. Junio C HamanoSep 20, 2019
  32. 4/6 midx: honor the MIDX_PROGRESS flag in verify_midx_file Update verify_midx_file to only display progress when the MIDX_PROGRESS flag is set.William Baker via GitGitGadget, Sep 20, 2019
  33. 2/6 midx: add progress to write_midx_file Add progress to write_midx_file. Progress is displayed when the MIDX_PROGRESS flag is set.William Baker via GitGitGadget, Sep 20, 2019
  34. Junio C HamanoSep 20, 2019
  35. William BakerSep 23, 2019
  36. Junio C HamanoSep 28, 2019
  37. William BakerSep 30, 2019
  38. 3/6 midx: add progress to expire_midx_packs Add progress to expire_midx_packs. Progress is displayed when the MIDX_PROGRESS flag is set.William Baker via GitGitGadget, Sep 20, 2019
  39. 6/6 multi-pack-index: add [--[no-]progress] option. Add the --[no-]progress option to git multi-pack-index. Pass the MIDX_PROGRESS flag to the subcommand functions when progress should be displayed by multi-pack-index. The progress feature was added to 'verify' in 144d703 ("multi-pack-index: report progress during 'verify'", 2018-09-13) but some subcommands were not updated to display progress, and the ability to opt-out was overlooked.William Baker via GitGitGadget, Sep 20, 2019
  40. Junio C HamanoSep 20, 2019
  41. William BakerSep 20, 2019
  42. Philip OakleySep 20, 2019
  43. William BakerSep 20, 2019
  44. 0/6 multi-pack-index: add --no-progressWilliam Baker via GitGitGadget, Oct 3, 2019
  45. 1/6 midx: add MIDX_PROGRESS flagWilliam Baker via GitGitGadget, Oct 3, 2019
  46. 3/6 midx: add progress to expire_midx_packsWilliam Baker via GitGitGadget, Oct 3, 2019
  47. 2/6 midx: add progress to write_midx_fileWilliam Baker via GitGitGadget, Oct 3, 2019
  48. 5/6 midx: honor the MIDX_PROGRESS flag in midx_repackWilliam Baker via GitGitGadget, Oct 3, 2019
  49. 4/6 midx: honor the MIDX_PROGRESS flag in verify_midx_fileWilliam Baker via GitGitGadget, Oct 3, 2019
  50. 6/6 multi-pack-index: add [--[no-]progress] option.William Baker via GitGitGadget, Oct 3, 2019
  51. Junio C HamanoOct 3, 2019
  52. 0/6 multi-pack-index: add --no-progressWilliam Baker via GitGitGadget, Oct 21, 2019
  53. 3/6 midx: add progress to expire_midx_packsWilliam Baker via GitGitGadget, Oct 21, 2019
  54. 1/6 midx: add MIDX_PROGRESS flagWilliam Baker via GitGitGadget, Oct 21, 2019
  55. 5/6 midx: honor the MIDX_PROGRESS flag in midx_repackWilliam Baker via GitGitGadget, Oct 21, 2019
  56. 4/6 midx: honor the MIDX_PROGRESS flag in verify_midx_fileWilliam Baker via GitGitGadget, Oct 21, 2019
  57. 6/6 multi-pack-index: add [--[no-]progress] option.William Baker via GitGitGadget, Oct 21, 2019
  58. 2/6 midx: add progress to write_midx_fileWilliam Baker via GitGitGadget, Oct 21, 2019

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.