From patchwork Thu Oct 31 05:05:27 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Caleb White X-Patchwork-Id: 13857568 Received: from mail-4322.protonmail.ch (mail-4322.protonmail.ch [185.70.43.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1081610E0 for ; Thu, 31 Oct 2024 05:05:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.70.43.22 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1730351138; cv=none; b=Hbiip16v1rUVMSSG2ME+e4Er10C5OH0xG2T93Ry6j7YXmcBIvimyAz8kfQkJhdUqQwlOBpJqtEiMqNe+bXsv4Ox8AD+6i7OvjKJKrTGTS7VaSkbjNwNYg9CFPIp8Fg5OToFoyufAVdI+n1y84iWyFJEyTAvS8MTg3A+tAP0gtas= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1730351138; c=relaxed/simple; bh=FNqfxejyTh/NAYvcDN4jJ+OBaGZ998m+fpzdNMlcqsg=; h=Date:To:From:Cc:Subject:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=HP82PRlpNC6fxOe1mzy14xKRMB3Hrep1Vp8A9ttkv9CnXkdudhpvz3PrDlUs5n8/fBXlAyWl/9iHsbultf5jJRN+7E3Wnt2/TiVxXvgWdvpKrqomRJSABf8B7w199lQrr6Hi2GHGsugR2wX4PqCz5OelBb/eG8w8xK1stEjBO7E= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=pm.me; spf=pass smtp.mailfrom=pm.me; dkim=pass (2048-bit key) header.d=pm.me header.i=@pm.me header.b=RI+joepU; arc=none smtp.client-ip=185.70.43.22 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=pm.me Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=pm.me Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=pm.me header.i=@pm.me header.b="RI+joepU" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=pm.me; s=protonmail3; t=1730351134; x=1730610334; bh=h0cqGO+in4oPoDTpVBaHNPN66AD5WU3sI3fLGAcaPYI=; h=Date:To:From:Cc:Subject:Message-ID:In-Reply-To:References: Feedback-ID:From:To:Cc:Date:Subject:Reply-To:Feedback-ID: Message-ID:BIMI-Selector; b=RI+joepUKaKZ/7oRR2Z7EYiP2FSAIvsQdZKdRaei/g5Giios9O09siOyED24EpP3d C4qWv7cxoULJdOnIAZsOEQYscyipWhNn7tuij41v+CAeN36pQ6QA++d9zibB5V0/la j8q3JY2euP52not1U9EcyopPxBwkyKgGm/jPTPOwISpksdYeTWclzrDZvsmYg8xaDn BHt/85SW1ibsgMFBnZ+kNQoBC3R2W6TJB7DjYf93ytmDpq4KoKDMWH4Uhhng0rWh0T EWXVwhuAdaOsiVuMg6mQzsRLYLr5sEQaxWp0MRoy0B/AcZzTODRWRbag27UQstEmBk St48seddht/fg== Date: Thu, 31 Oct 2024 05:05:27 +0000 To: git@vger.kernel.org From: Caleb White Cc: Taylor Blau , Phillip Wood , Junio C Hamano , Eric Sunshine , Caleb White Subject: [PATCH v3 1/8] setup: correctly reinitialize repository version Message-ID: <20241031-wt_relative_options-v3-1-3e44ccdf64e6@pm.me> In-Reply-To: <20241031-wt_relative_options-v3-0-3e44ccdf64e6@pm.me> References: <20241031-wt_relative_options-v3-0-3e44ccdf64e6@pm.me> Feedback-ID: 31210263:user:proton X-Pm-Message-ID: 6308f8c10b8ecdf5f80626e19f5c459499832f68 Precedence: bulk X-Mailing-List: git@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 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 --- 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");