git: ensure correct git directory setup with -h

Ensure correct git directory setup when -h is passed with commands. This specifically applies to repos with special help text configuration variables and to commands run with -h outside a repository. This will also protect against test failures in the upcoming change to BUG in prepare_repo_settings if no git directory exists. Note: this diff is better seen when ignoring whitespace changes. Co-authored-by: Junio C Hamano <gitster@pobox.com> Signed-off-by: Lessley Dennington <lessleydennington@gmail.com> Reviewed-by: Elijah Newren <newren@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Lessley Dennington committed Dec 6, 2021 at 15:55 UTC e5b17bda8b6c830aa65f8c52e08755cae5b815a1
1 file changed +21 -18
git.c
+21 -18
@@ -421,27 +421,30 @@ static int run_builtin(struct cmd_struct *p, int argc, const char **argv)
421 int status, help;
422 struct stat st;
423 const char *prefix;
424 + int run_setup = (p->option & (RUN_SETUP | RUN_SETUP_GENTLY));
425
425 - prefix = NULL;
426 help = argc == 2 && !strcmp(argv[1], "-h");
427 - if (!help) {
428 - if (p->option & RUN_SETUP)
429 - prefix = setup_git_directory();
430 - else if (p->option & RUN_SETUP_GENTLY) {
431 - int nongit_ok;
432 - prefix = setup_git_directory_gently(&nongit_ok);
433 - }
434 - precompose_argv_prefix(argc, argv, NULL);
435 - if (use_pager == -1 && p->option & (RUN_SETUP | RUN_SETUP_GENTLY) &&
436 - !(p->option & DELAY_PAGER_CONFIG))
437 - use_pager = check_pager_config(p->cmd);
438 - if (use_pager == -1 && p->option & USE_PAGER)
439 - use_pager = 1;
440 -
441 - if ((p->option & (RUN_SETUP | RUN_SETUP_GENTLY)) &&
442 - startup_info->have_repository) /* get_git_dir() may set up repo, avoid that */
443 - trace_repo_setup(prefix);
427 + if (help && (run_setup & RUN_SETUP))
428 + /* demote to GENTLY to allow 'git cmd -h' outside repo */
429 + run_setup = RUN_SETUP_GENTLY;
430 +
431 + if (run_setup & RUN_SETUP) {
432 + prefix = setup_git_directory();
433 + } else if (run_setup & RUN_SETUP_GENTLY) {
434 + int nongit_ok;
435 + prefix = setup_git_directory_gently(&nongit_ok);
436 + } else {
437 + prefix = NULL;
438 }
439 + precompose_argv_prefix(argc, argv, NULL);
440 + if (use_pager == -1 && run_setup &&
441 + !(p->option & DELAY_PAGER_CONFIG))
442 + use_pager = check_pager_config(p->cmd);
443 + if (use_pager == -1 && p->option & USE_PAGER)
444 + use_pager = 1;
445 + if (run_setup && startup_info->have_repository)
446 + /* get_git_dir() may set up repo, avoid that */
447 + trace_repo_setup(prefix);
448 commit_pager_choice();
449
450 if (!help && get_super_prefix()) {