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

[PATCH v2 4/5] setup: correctly reinitialize repository version

From
Caleb White <cdwhite3@pm.me>
Date
Oct 28, 2024, 19:10 UTC
Message-ID
<20241028-wt_relative_options-v2-4-33a5021bd7bb@pm.me>
In-Reply-To
<20241028-wt_relative_options-v2-0-33a5021bd7bb@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 23 of 26 in “Allow relative worktree linking to be configured by the user”
  1. 0/5 Allow relative worktree linking to be configured by the userCaleb White, Oct 28, 2024
  2. 1/5 worktree: add CLI/config options for relative path linkingCaleb White, Oct 28, 2024
  3. Phillip WoodOct 29, 2024
  4. Caleb WhiteOct 30, 2024
  5. Taylor BlauOct 30, 2024
  6. Caleb WhiteOct 30, 2024
  7. phillip.wood123@gmail.comOct 30, 2024
  8. Caleb WhiteOct 30, 2024
  9. Taylor BlauOct 29, 2024
  10. Caleb WhiteOct 30, 2024
  11. 2/5 worktree: add `write_worktree_linking_files` functionCaleb White, Oct 28, 2024
  12. Phillip WoodOct 29, 2024
  13. Taylor BlauOct 29, 2024
  14. Caleb WhiteOct 30, 2024
  15. Caleb WhiteOct 30, 2024
  16. 3/5 worktree: add tests for worktrees with relative pathsCaleb White, Oct 28, 2024
  17. Phillip WoodOct 29, 2024
  18. Caleb WhiteOct 29, 2024
  19. phillip.wood123@gmail.comOct 29, 2024
  20. Caleb WhiteOct 30, 2024
  21. Taylor BlauOct 29, 2024
  22. Caleb WhiteOct 30, 2024
  23. 4/5 setup: correctly reinitialize repository versionCaleb White, Oct 28, 2024
  24. 5/5 worktree: add `relativeWorktrees` extensionCaleb White, Oct 28, 2024
  25. Phillip WoodOct 29, 2024
  26. Caleb WhiteOct 30, 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.