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

[PATCH v3 1/8] setup: correctly reinitialize repository version

From
Caleb White <cdwhite3@pm.me>
Date
Oct 31, 2024, 05:05 UTC
Message-ID
<20241031-wt_relative_options-v3-1-3e44ccdf64e6@pm.me>
In-Reply-To
<20241031-wt_relative_options-v3-0-3e44ccdf64e6@pm.me>

When reinitializing a repository, Git does not account for extensions other than `objectformat` and `refstorage` when determining the repository version. This can lead to a repository being downgraded to version 0 if extensions are set, causing Git future operations to fail.

This patch teaches Git to check if other extensions are defined in the config to ensure that the repository version is set correctly.

Signed-off-by: Caleb White <cdwhite3@pm.me>
---
 setup.c | 32 +++++++++++++++++++++++---------
 1 file changed, 23 insertions(+), 9 deletions(-)
diff --git a/setup.c b/setup.c
index 7b648de0279116b381eea46800ad130606926103..1e5c2eacb19eb6b230d7c9954f66fc7ae0b05631 100644
--- a/setup.c
+++ b/setup.c
@@ -2204,8 +2204,8 @@ void initialize_repository_version(int hash_algo,
 				   enum ref_storage_format ref_storage_format,
 				   int reinit)
 {
-	char repo_version_string[10];
-	int repo_version = GIT_REPO_VERSION;
+	struct strbuf repo_version = STRBUF_INIT;
+	int target_version = GIT_REPO_VERSION;
 
 	/*
 	 * Note that we initialize the repository version to 1 when the ref
@@ -2216,12 +2216,7 @@ void initialize_repository_version(int hash_algo,
 	 */
 	if (hash_algo != GIT_HASH_SHA1 ||
 	    ref_storage_format != REF_STORAGE_FORMAT_FILES)
-		repo_version = GIT_REPO_VERSION_READ;
-
-	/* This forces creation of new config file */
-	xsnprintf(repo_version_string, sizeof(repo_version_string),
-		  "%d", repo_version);
-	git_config_set("core.repositoryformatversion", repo_version_string);
+		target_version = GIT_REPO_VERSION_READ;
 
 	if (hash_algo != GIT_HASH_SHA1 && hash_algo != GIT_HASH_UNKNOWN)
 		git_config_set("extensions.objectformat",
@@ -2234,6 +2229,25 @@ void initialize_repository_version(int hash_algo,
 			       ref_storage_format_to_name(ref_storage_format));
 	else if (reinit)
 		git_config_set_gently("extensions.refstorage", NULL);
+
+	if (reinit) {
+		struct strbuf config = STRBUF_INIT;
+		struct repository_format repo_fmt = REPOSITORY_FORMAT_INIT;
+
+		strbuf_git_common_path(&config, the_repository, "config");
+		read_repository_format(&repo_fmt, config.buf);
+
+		if (repo_fmt.v1_only_extensions.nr)
+			target_version = GIT_REPO_VERSION_READ;
+
+		strbuf_release(&config);
+		clear_repository_format(&repo_fmt);
+	}
+
+	strbuf_addf(&repo_version, "%d", target_version);
+	git_config_set("core.repositoryformatversion", repo_version.buf);
+
+	strbuf_release(&repo_version);
 }
 
 static int is_reinit(void)
@@ -2333,7 +2347,7 @@ static int create_default_files(const char *template_path,
 		adjust_shared_perm(repo_get_git_dir(the_repository));
 	}
 
-	initialize_repository_version(fmt->hash_algo, fmt->ref_storage_format, 0);
+	initialize_repository_version(fmt->hash_algo, fmt->ref_storage_format, reinit);
 
 	/* Check filemode trustability */
 	path = git_path_buf(&buf, "config");
-- 
2.47.0
Previous: Caleb WhiteNext: Caleb White
Message 2 of 11 in “Allow relative worktree linking to be configured by the user”
  1. 0/8 Allow relative worktree linking to be configured by the userCaleb White, Oct 31, 2024
  2. 1/8 setup: correctly reinitialize repository versionCaleb White, Oct 31, 2024
  3. 3/8 worktree: refactor infer_backlink returnCaleb White, Oct 31, 2024
  4. 2/8 worktree: add `relativeWorktrees` extensionCaleb White, Oct 31, 2024
  5. 4/8 worktree: add `write_worktree_linking_files()` functionCaleb White, Oct 31, 2024
  6. 5/8 worktree: add relative cli/config options to `add` commandCaleb White, Oct 31, 2024
  7. 6/8 worktree: add relative cli/config options to `move` commandCaleb White, Oct 31, 2024
  8. 7/8 worktree: add relative cli/config options to `repair` commandCaleb White, Oct 31, 2024
  9. 8/8 worktree: refactor `repair_worktree_after_gitdir_move()`Caleb White, Oct 31, 2024
  10. Taylor BlauOct 31, 2024
  11. Caleb WhiteOct 31, 2024

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.