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

[PATCH 1/2] checkout/fetch/pull/pack-objects: allow `-h` outside a repository

From
Johannes Schindelin via GitGitGadget <gitgitgadget@gmail.com>
Date
Feb 7, 2022, 23:49 UTC
Message-ID
<25d1a2963f2934753de4fb6899429301637377c9.1644277797.git.gitgitgadget@gmail.com>
In-Reply-To
<pull.1139.git.1644277797.gitgitgadget@gmail.com>
From: Johannes Schindelin <johannes.schindelin@gmx.de>

When we taught these commands about the sparse index, we did not account for the fact that the `cmd_*()` functions _can_ be called without a gitdir, namely when `-h` is passed to show the usage.

A plausible approach to address this is to move the `prepare_repo_settings()` calls right after the `parse_options()` calls: The latter will never return when it handles `-h`, and therefore it is safe to assume that we have a `gitdir` at that point, as long as the built-in is marked with the `RUN_SETUP` flag.

However, it is unfortunately not that simple. In `cmd_pack_objects()`, for example, the repo settings need to be fully populated so that the command-line options `--sparse`/`--no-sparse` can override them, not the other way round.

Therefore, we choose to imitate the strategy taken in `cmd_diff()`, where we simply do not bother to prepare and initialize the repo settings unless we have a `gitdir`.

This fixes https://github.com/git-for-windows/git/issues/3688
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
---
 builtin/checkout.c     | 7 ++++---
 builtin/fetch.c        | 7 +++++--
 builtin/pack-objects.c | 8 +++++---
 builtin/pull.c         | 6 ++++--
 4 files changed, 18 insertions(+), 10 deletions(-)
diff --git a/builtin/checkout.c b/builtin/checkout.c
index cc804ba8e1e..1c13d7fedb3 100644
--- a/builtin/checkout.c
+++ b/builtin/checkout.c
@@ -1602,9 +1602,10 @@ static int checkout_main(int argc, const char **argv, const char *prefix,
 	opts->show_progress = -1;
 
 	git_config(git_checkout_config, opts);
-
-	prepare_repo_settings(the_repository);
-	the_repository->settings.command_requires_full_index = 0;
+	if (the_repository->gitdir) {
+		prepare_repo_settings(the_repository);
+		the_repository->settings.command_requires_full_index = 0;
+	}
 
 	opts->track = BRANCH_TRACK_UNSPECIFIED;
 
diff --git a/builtin/fetch.c b/builtin/fetch.c
index 5f06b21f8e9..e0a05de10ee 100644
--- a/builtin/fetch.c
+++ b/builtin/fetch.c
@@ -2014,11 +2014,14 @@ int cmd_fetch(int argc, const char **argv, const char *prefix)
 	}
 
 	git_config(git_fetch_config, NULL);
-	prepare_repo_settings(the_repository);
-	the_repository->settings.command_requires_full_index = 0;
+	if (the_repository->gitdir) {
+		prepare_repo_settings(the_repository);
+		the_repository->settings.command_requires_full_index = 0;
+	}
 
 	argc = parse_options(argc, argv, prefix,
 			     builtin_fetch_options, builtin_fetch_usage, 0);
+
 	if (recurse_submodules != RECURSE_SUBMODULES_OFF) {
 		int *sfjc = submodule_fetch_jobs_config == -1
 			    ? &submodule_fetch_jobs_config : NULL;
diff --git a/builtin/pack-objects.c b/builtin/pack-objects.c
index ba2006f2212..87cb7b45c37 100644
--- a/builtin/pack-objects.c
+++ b/builtin/pack-objects.c
@@ -3976,9 +3976,11 @@ int cmd_pack_objects(int argc, const char **argv, const char *prefix)
 	read_replace_refs = 0;
 
 	sparse = git_env_bool("GIT_TEST_PACK_SPARSE", -1);
-	prepare_repo_settings(the_repository);
-	if (sparse < 0)
-		sparse = the_repository->settings.pack_use_sparse;
+	if (the_repository->gitdir) {
+		prepare_repo_settings(the_repository);
+		if (sparse < 0)
+			sparse = the_repository->settings.pack_use_sparse;
+	}
 
 	reset_pack_idx_option(&pack_idx_opts);
 	git_config(git_pack_config, NULL);
diff --git a/builtin/pull.c b/builtin/pull.c
index 100cbf9fb85..d15007d93f3 100644
--- a/builtin/pull.c
+++ b/builtin/pull.c
@@ -994,8 +994,10 @@ int cmd_pull(int argc, const char **argv, const char *prefix)
 		set_reflog_message(argc, argv);
 
 	git_config(git_pull_config, NULL);
-	prepare_repo_settings(the_repository);
-	the_repository->settings.command_requires_full_index = 0;
+	if (the_repository->gitdir) {
+		prepare_repo_settings(the_repository);
+		the_repository->settings.command_requires_full_index = 0;
+	}
 
 	argc = parse_options(argc, argv, prefix, pull_options, pull_usage, 0);
 
-- 
gitgitgadget
Previous: Johannes Schindelin via GitGitGadgetNext: Junio C Hamano
Message 3 of 8 in “checkout/fetch/pull/pack-objects: allow -h outside a repository again”
  1. 0/2 checkout/fetch/pull/pack-objects: allow -h outside a repository againJohannes Schindelin via GitGitGadget, Feb 7, 2022
  2. 2/2 t0012: verify that built-ins handle `-h` even without gitdirJohannes Schindelin via GitGitGadget, Feb 7, 2022
  3. 1/2 checkout/fetch/pull/pack-objects: allow `-h` outside a repositoryJohannes Schindelin via GitGitGadget, Feb 7, 2022
  4. Junio C HamanoFeb 8, 2022
  5. Johannes SchindelinFeb 8, 2022
  6. 0/2 checkout/fetch/pull/pack-objects: allow -h outside a repository againJohannes Schindelin via GitGitGadget, Feb 8, 2022
  7. 2/2 t0012: verify that built-ins handle `-h` even without gitdirJohannes Schindelin via GitGitGadget, Feb 8, 2022
  8. 1/2 checkout/fetch/pull/pack-objects: allow `-h` outside a repositoryJohannes Schindelin via GitGitGadget, Feb 8, 2022

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.