All of lore.kernel.org
 help / color / mirror / Atom feed
From: Lessley Dennington <lessleydennington@gmail.com>
To: Junio C Hamano <gitster@pobox.com>
Cc: Lessley Dennington via GitGitGadget <gitgitgadget@gmail.com>,
	git@vger.kernel.org, stolee@gmail.com, newren@gmail.com,
	Taylor Blau <me@ttaylorr.com>
Subject: Re: [PATCH v4 1/4] sparse index: enable only for git repos
Date: Mon, 29 Nov 2021 15:38:03 -0800	[thread overview]
Message-ID: <6db27c92-6ea6-fa5f-8aa7-e1fef7d5ff5a@gmail.com> (raw)
In-Reply-To: <xmqqzgpt2z0h.fsf@gitster.g>



On 11/24/21 10:23 AM, Junio C Hamano wrote:
> Lessley Dennington <lessleydennington@gmail.com> writes:
> 
>>>> @@ -1588,8 +1588,10 @@ static int checkout_main(int argc, const char **argv, const char *prefix,
>>>>      	git_config(git_checkout_config, opts);
>>>>    -	prepare_repo_settings(the_repository);
>>>> -	the_repository->settings.command_requires_full_index = 0;
>>>> +	if (startup_info->have_repository) {
>>>> +		prepare_repo_settings(the_repository);
>>>> +		the_repository->settings.command_requires_full_index = 0;
>>>> +	}
>>> I am kind-a surprised if the control reaches this deep if you are
>>> not in a repository.  In git.c::commands[] list, all three primary
>>> entry points that call checkout_main(), namely, cmd_checkout(),
>>> cmd_restore(), and cmd_switch(), are marked with RUN_SETUP bit,
>>> which makes us call setup_git_directory() even before we call the
>>> cmd_X() function.  And setup_git_directory() dies with "not a git
>>> repository (or any of the parent directories)" outside a repository.
>>> So, how can startup_info->have_repository bit be false if the
>>> control flow reaches here?  Or am I grossly misunderstanding what
>>> you are trying to do?
>>>
>> This was in reaction to the t0012-help.sh tests failing with the
>> new BUG in prepare_repo_settings. However, Elijah pointed out that
>> it's a better idea to move prepare_repo_settings farther down
>> (after parse_options) instead. So I will be issuing that change as
>> part of v5.
> 
> I forgot that "git foo -h" for a builtin command 'foo' calls
> run_builtin() but bypasses the RUN_SETUP and NEED_WORK_TREE handling
> before it in turn calls cmd_foo().  We expect a call in cmd_foo() to
> parse_options() emit a short-help and exit.
> 
> So, yes, there is a way to reach this point in the codeflow without
> being in a repository (or even when in a repository, we may have
> chosen not to realize it).  Feels ugly.
> 
> Now a bit of tangent.
> 
> I wonder if it is a problem to completely bypass RUN_SETUP in such a
> case.  In general, we read the configuration to tweak the hardcoded
> default behaviour, and then further override it by parsing command
> line options.  In order to read configuration fully, we'd need to
> know where the repository is.  So the start-up sequence must be in
> this order:
> 
>   - discover where the repository is (either gently or with a hard failure)
>   - read the configuration files
>   - call parse_options()
> 
> And by completly bypassing RUN_SETUP, we are not reading per-repo
> settings from the configuration files.
> 
> Something along this line (note: there is an always-taken if block
> to reduce the patch noise for this illustration), perhaps.
> 
> 
> 
> 
>   git.c | 17 +++++++++++------
>   1 file changed, 11 insertions(+), 6 deletions(-)
> 
> diff --git i/git.c w/git.c
> index 5ff21be21f..50e258508e 100644
> --- i/git.c
> +++ w/git.c
> @@ -421,25 +421,30 @@ static int run_builtin(struct cmd_struct *p, int argc, const char **argv)
>   	int status, help;
>   	struct stat st;
>   	const char *prefix;
> +	int run_setup = (p->option & (RUN_SETUP | RUN_SETUP_GENTLY));
>   
>   	prefix = NULL;
>   	help = argc == 2 && !strcmp(argv[1], "-h");
> -	if (!help) {
> -		if (p->option & RUN_SETUP)
> +	if (help && (run_setup & RUN_SETUP))
> +		/* demote to GENTLY to allow 'git cmd -h' outside repo */
> +		run_setup = RUN_SETUP_GENTLY;
> +
> +	if (1) {
> +		if (run_setup & RUN_SETUP)
>   			prefix = setup_git_directory();
> -		else if (p->option & RUN_SETUP_GENTLY) {
> +		else if (run_setup & RUN_SETUP_GENTLY) {
>   			int nongit_ok;
>   			prefix = setup_git_directory_gently(&nongit_ok);
>   		}
>   		precompose_argv_prefix(argc, argv, NULL);
> -		if (use_pager == -1 && p->option & (RUN_SETUP | RUN_SETUP_GENTLY) &&
> +		if (use_pager == -1 && run_setup &&
>   		    !(p->option & DELAY_PAGER_CONFIG))
>   			use_pager = check_pager_config(p->cmd);
>   		if (use_pager == -1 && p->option & USE_PAGER)
>   			use_pager = 1;
>   
> -		if ((p->option & (RUN_SETUP | RUN_SETUP_GENTLY)) &&
> -		    startup_info->have_repository) /* get_git_dir() may set up repo, avoid that */
> +		if (run_setup && startup_info->have_repository)
> +			/* get_git_dir() may set up repo, avoid that */
>   			trace_repo_setup(prefix);
>   	}
>   	commit_pager_choice();
> 
This is cool! I applied it locally, and it seems to be working well. I
will plan to replace my changes to checkout and pack-objects with this
for v5.

Lessley

  reply	other threads:[~2021-11-29 23:38 UTC|newest]

Thread overview: 66+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-10-14 17:25 [PATCH 0/2] Sparse Index: diff and blame builtins Lessley Dennington via GitGitGadget
2021-10-14 17:25 ` [PATCH 1/2] diff: enable and test the sparse index Lessley Dennington via GitGitGadget
2021-10-15 16:46   ` Derrick Stolee
2021-10-14 17:25 ` [PATCH 2/2] blame: " Lessley Dennington via GitGitGadget
2021-11-23  7:57   ` Elijah Newren
2021-11-23 14:57     ` Lessley Dennington
2021-10-15 21:20 ` [PATCH v2 0/2] Sparse Index: diff and blame builtins Lessley Dennington via GitGitGadget
2021-10-15 21:20   ` [PATCH v2 1/2] diff: enable and test the sparse index Lessley Dennington via GitGitGadget
2021-10-25 20:47     ` Taylor Blau
2021-10-26 16:10       ` Lessley Dennington
2021-10-26 16:15         ` Taylor Blau
2021-10-15 21:20   ` [PATCH v2 2/2] blame: " Lessley Dennington via GitGitGadget
2021-10-25 20:53     ` Taylor Blau
2021-10-26 16:17       ` Lessley Dennington
2021-11-21  1:32         ` Elijah Newren
2021-11-01 21:27   ` [PATCH v3 0/2] Sparse Index: diff and blame builtins Lessley Dennington via GitGitGadget
2021-11-01 21:27     ` [PATCH v3 1/2] diff: enable and test the sparse index Lessley Dennington via GitGitGadget
2021-11-03 17:05       ` Junio C Hamano
2021-11-04 23:55         ` Lessley Dennington
2021-11-01 21:27     ` [PATCH v3 2/2] blame: " Lessley Dennington via GitGitGadget
2021-11-03 16:47       ` Junio C Hamano
2021-11-05  0:04         ` Lessley Dennington
2021-11-21  1:46         ` Elijah Newren
2021-11-22 22:42     ` [PATCH v4 0/4] Sparse Index: diff and blame builtins Lessley Dennington via GitGitGadget
2021-11-22 22:42       ` [PATCH v4 1/4] sparse index: enable only for git repos Lessley Dennington via GitGitGadget
2021-11-23  7:41         ` Elijah Newren
2021-11-23 14:52           ` Lessley Dennington
2021-11-23 23:39         ` Junio C Hamano
2021-11-24 14:41           ` Lessley Dennington
2021-11-24 18:23             ` Junio C Hamano
2021-11-29 23:38               ` Lessley Dennington [this message]
2021-11-30  6:32                 ` Junio C Hamano
2021-11-30 23:25                   ` Lessley Dennington
2021-11-22 22:42       ` [PATCH v4 2/4] test-read-cache: set up repo after git directory Lessley Dennington via GitGitGadget
2021-11-23 23:42         ` Junio C Hamano
2021-11-24 15:10           ` Lessley Dennington
2021-11-24 18:36             ` Junio C Hamano
2021-11-29 23:01               ` Lessley Dennington
2021-11-22 22:42       ` [PATCH v4 3/4] diff: enable and test the sparse index Lessley Dennington via GitGitGadget
2021-11-23  7:47         ` Elijah Newren
2021-11-23 14:53           ` Lessley Dennington
2021-11-23 23:48         ` Junio C Hamano
2021-11-22 22:42       ` [PATCH v4 4/4] blame: " Lessley Dennington via GitGitGadget
2021-11-23 23:53         ` Junio C Hamano
2021-11-24 14:52           ` Lessley Dennington
2021-12-03 21:15       ` [PATCH v5 0/7] Sparse Index: diff and blame builtins Lessley Dennington via GitGitGadget
2021-12-03 21:15         ` [PATCH v5 1/7] git: esnure correct git directory setup with -h Lessley Dennington via GitGitGadget
2021-12-04 18:41           ` Elijah Newren
2021-12-04 19:58           ` Junio C Hamano
2021-12-03 21:16         ` [PATCH v5 2/7] commit-graph: return if there is no git directory Lessley Dennington via GitGitGadget
2021-12-03 21:16         ` [PATCH v5 3/7] test-read-cache: set up repo after " Lessley Dennington via GitGitGadget
2021-12-03 21:16         ` [PATCH v5 4/7] repo-settings: prepare_repo_settings only in git repos Lessley Dennington via GitGitGadget
2021-12-07  4:43           ` Ævar Arnfjörð Bjarmason
2021-12-08 15:46             ` Lessley Dennington
2021-12-03 21:16         ` [PATCH v5 5/7] diff: replace --staged with --cached in t1092 tests Lessley Dennington via GitGitGadget
2021-12-03 21:16         ` [PATCH v5 6/7] diff: enable and test the sparse index Lessley Dennington via GitGitGadget
2021-12-03 21:16         ` [PATCH v5 7/7] blame: " Lessley Dennington via GitGitGadget
2021-12-04 19:43         ` [PATCH v5 0/7] Sparse Index: diff and blame builtins Elijah Newren
2021-12-06 15:55         ` [PATCH v6 " Lessley Dennington via GitGitGadget
2021-12-06 15:55           ` [PATCH v6 1/7] git: ensure correct git directory setup with -h Lessley Dennington via GitGitGadget
2021-12-06 15:55           ` [PATCH v6 2/7] commit-graph: return if there is no git directory Lessley Dennington via GitGitGadget
2021-12-06 15:55           ` [PATCH v6 3/7] test-read-cache: set up repo after " Lessley Dennington via GitGitGadget
2021-12-06 15:55           ` [PATCH v6 4/7] repo-settings: prepare_repo_settings only in git repos Lessley Dennington via GitGitGadget
2021-12-06 15:55           ` [PATCH v6 5/7] diff: replace --staged with --cached in t1092 tests Lessley Dennington via GitGitGadget
2021-12-06 15:56           ` [PATCH v6 6/7] diff: enable and test the sparse index Lessley Dennington via GitGitGadget
2021-12-06 15:56           ` [PATCH v6 7/7] blame: " Lessley Dennington via GitGitGadget

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=6db27c92-6ea6-fa5f-8aa7-e1fef7d5ff5a@gmail.com \
    --to=lessleydennington@gmail.com \
    --cc=git@vger.kernel.org \
    --cc=gitgitgadget@gmail.com \
    --cc=gitster@pobox.com \
    --cc=me@ttaylorr.com \
    --cc=newren@gmail.com \
    --cc=stolee@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.