From patchwork Tue Jan 25 18:42:10 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Derrick Stolee X-Patchwork-Id: 12724146 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id B85C3C433EF for ; Tue, 25 Jan 2022 18:43:15 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233215AbiAYSnL (ORCPT ); Tue, 25 Jan 2022 13:43:11 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:39890 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233094AbiAYSmU (ORCPT ); Tue, 25 Jan 2022 13:42:20 -0500 Received: from mail-wr1-x432.google.com (mail-wr1-x432.google.com [IPv6:2a00:1450:4864:20::432]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id C5F55C06173E for ; Tue, 25 Jan 2022 10:42:18 -0800 (PST) Received: by mail-wr1-x432.google.com with SMTP id e2so6182676wra.2 for ; Tue, 25 Jan 2022 10:42:18 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=message-id:in-reply-to:references:from:date:subject:fcc :content-transfer-encoding:mime-version:to:cc; bh=8hp2MiLjwahWoIrBxqypq0Dh6jYC1c8Kd9JUDxNK2Cs=; b=BzCPkGSytNBNTflw2rd4MClgn5ZFL+WEZLjPKNRbloXeGXsJcEzXf3HEN0OBJhvHTe PuqVPJJBiXwax30TfW4TyNlfUShxDP4G9wDj0+fI8P2cRHj/ggGYDLrY2kdMz61BB7q7 c7iroft6Z/KDwVTE70nOYe93kpX/zcX5N/Iw8SZ35V9AMuCoGBfqkW5G2I15QCM35PMc JFBTHs9WphJYk5oMkPKfsTxipyXTka/kdt31P/zbXInfBpERrgv58FEvb46ZHoCLd2vu FALwE3BpHk70/Vi63z8vVKE71uGszoxdJJF+8TPR7Pc2LuBX9590H73MRRn6hzGW8fk2 Q9Xg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:message-id:in-reply-to:references:from:date :subject:fcc:content-transfer-encoding:mime-version:to:cc; bh=8hp2MiLjwahWoIrBxqypq0Dh6jYC1c8Kd9JUDxNK2Cs=; b=EWyxBPQI0YPfgLSOEDhhfmWFfFXog8sb9WorQc3MRKO3ggvUL2xaw3YoRPAtnVqfDH pj2qCyjaHUOzqky7l0H8v+pCWFinYdk9j/7xV4lhGZr+vW1iQUC6US7sNb9z1hwclA9J ICOVHyOX4BF7Jwalyepv2cDRsn+H55LlI4DIWJkVFt/QHNZmP1dZjXgXu6DL2vRf5uAA 6rhcg+O3s9eSNSYMw+PxrM8SGzixT2gph07Kz0Dkh4wQVrkmHMcPPMu7U3Cg6ENQzd2d MN8Ji/7ionOkfk+wd5Gobpe3cK4CbsnPmYAUwY2GT9U5AaSotjza0Ql0HUh2hZcfzNJE AH6g== X-Gm-Message-State: AOAM530UeilwxP6NQLA0Uo1SkNl55ogcQnN8SUnQF4vA00+/w+aoXan3 w6JDKWN9p4m1jBkcud7oCJtBFuQ7Vy6Ytg== X-Google-Smtp-Source: ABdhPJzE4RwAoM/HcAe4frzRXMlVROnNPq+myc+xrY+Yzz1xpUzCbGO7eqx2klLmIBklsn1w5zoDSQ== X-Received: by 2002:a05:6000:18a2:: with SMTP id b2mr10369376wri.282.1643136137110; Tue, 25 Jan 2022 10:42:17 -0800 (PST) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id 31sm21903298wrl.27.2022.01.25.10.42.16 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 25 Jan 2022 10:42:16 -0800 (PST) Message-Id: <459e09dedd71fcb64b9796bac52c3812d78f2405.1643136134.git.gitgitgadget@gmail.com> In-Reply-To: References: Date: Tue, 25 Jan 2022 18:42:10 +0000 Subject: [PATCH v4 1/5] Documentation: add extensions.worktreeConfig details Fcc: Sent MIME-Version: 1.0 To: git@vger.kernel.org Cc: stolee@gmail.com, sunshine@sunshineco.com, allred.sean@gmail.com, gitster@pobox.com, Elijah Newren , Derrick Stolee , Derrick Stolee Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org From: Derrick Stolee From: Derrick Stolee The extensions.worktreeConfig extension was added in 58b284a (worktree: add per-worktree config files, 2018-10-21) and was somewhat documented in Documentation/git-config.txt. However, the extensions.worktreeConfig value was not specified further in the list of possible config keys. The location of the config.worktree file is not specified, and there are some precautions that should be mentioned clearly, but are only mentioned in git-worktree.txt. Expand the documentation to help users discover the complexities of extensions.worktreeConfig by adding details and cross links in these locations (relative to Documentation/): - config/extensions.txt - git-config.txt - git-worktree.txt The updates focus on items such as * $GIT_DIR/config.worktree takes precedence over $GIT_COMMON_DIR/config. * The core.worktree and core.bare=true settings are incorrect to have in the common config file when extensions.worktreeConfig is enabled. * The sparse-checkout settings core.sparseCheckout[Cone] are recommended to be set in the worktree config. As documented in 11664196ac ("Revert "check_repository_format_gently(): refuse extensions for old repositories"", 2020-07-15), this extension must be considered regardless of the repository format version for historical reasons. A future change will update references to extensions.worktreeConfig within git-sparse-checkout.txt, but a behavior change is needed before making those updates. Signed-off-by: Derrick Stolee --- Documentation/config/extensions.txt | 31 +++++++++++++++++++++++++++++ Documentation/git-config.txt | 8 ++++++-- Documentation/git-worktree.txt | 11 +++++++--- 3 files changed, 45 insertions(+), 5 deletions(-) diff --git a/Documentation/config/extensions.txt b/Documentation/config/extensions.txt index 4e23d73cdca..5999dcb2a1f 100644 --- a/Documentation/config/extensions.txt +++ b/Documentation/config/extensions.txt @@ -6,3 +6,34 @@ extensions.objectFormat:: Note that this setting should only be set by linkgit:git-init[1] or linkgit:git-clone[1]. Trying to change it after initialization will not work and will produce hard-to-diagnose issues. + +extensions.worktreeConfig:: + If enabled, then worktrees will load config settings from the + `$GIT_DIR/config.worktree` file in addition to the + `$GIT_COMMON_DIR/config` file. Note that `$GIT_COMMON_DIR` and + `$GIT_DIR` are the same for the main worktree, while other + worktrees have `$GIT_DIR` equal to + `$GIT_COMMON_DIR/worktrees//`. The settings in the + `config.worktree` file will override settings from any other + config files. ++ +When enabling `extensions.worktreeConfig`, you must be careful to move +certain values from the common config file to the main worktree's +`config.worktree` file, if present: ++ +* `core.worktree` must be moved from `$GIT_COMMON_DIR/config` to + `$GIT_COMMON_DIR/config.worktree`. +* If `core.bare` is true, then it must be moved from `$GIT_COMMON_DIR/config` + to `$GIT_COMMON_DIR/config.worktree`. ++ +It may also be beneficial to adjust the locations of `core.sparseCheckout` +and `core.sparseCheckoutCone` depending on your desire for customizable +sparse-checkout settings for each worktree. By default, the `git +sparse-checkout` builtin enables `extensions.worktreeConfig`, assigns +these config values on a per-worktree basis, and uses the +`$GIT_DIR/info/sparse-checkout` file to specify the sparsity for each +worktree independently. See linkgit:git-sparse-checkout[1] for more +details. ++ +For historical reasons, `extensions.worktreeConfig` is respected +regardless of the `core.repositoryFormatVersion` setting. diff --git a/Documentation/git-config.txt b/Documentation/git-config.txt index 2285effb363..95cefd5e399 100644 --- a/Documentation/git-config.txt +++ b/Documentation/git-config.txt @@ -141,9 +141,13 @@ from all available files. See also <>. --worktree:: - Similar to `--local` except that `.git/config.worktree` is + Similar to `--local` except that `$GIT_DIR/config.worktree` is read from or written to if `extensions.worktreeConfig` is - present. If not it's the same as `--local`. + enabled. If not it's the same as `--local`. Note that `$GIT_DIR` + is equal to `$GIT_COMMON_DIR` for the main worktree, but is of the + form `.git/worktrees//` for other worktrees. See + linkgit:git-worktree[1] to learn how to enable + `extensions.worktreeConfig`. -f :: --file :: diff --git a/Documentation/git-worktree.txt b/Documentation/git-worktree.txt index 9e862fbcf79..ea0ee9f8bb5 100644 --- a/Documentation/git-worktree.txt +++ b/Documentation/git-worktree.txt @@ -286,8 +286,8 @@ CONFIGURATION FILE ------------------ By default, the repository `config` file is shared across all working trees. If the config variables `core.bare` or `core.worktree` are -already present in the config file, they will be applied to the main -working trees only. +present in the common config file and `extensions.worktreeConfig` is +disabled, then they will be applied to the main working trees only. In order to have configuration specific to working trees, you can turn on the `worktreeConfig` extension, e.g.: @@ -307,11 +307,16 @@ them to the `config.worktree` of the main working tree. You may also take this opportunity to review and move other configuration that you do not want to share to all working trees: - - `core.worktree` and `core.bare` should never be shared + - `core.worktree` should never be shared. + + - `core.bare` should not be shared unless the value is `core.bare=false`. - `core.sparseCheckout` is recommended per working tree, unless you are sure you always use sparse checkout for all working trees. +See the documentation of `extensions.worktreeConfig` in +linkgit:git-config[1] for more details. + DETAILS ------- Each linked working tree has a private sub-directory in the repository's From patchwork Tue Jan 25 18:42:11 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Derrick Stolee X-Patchwork-Id: 12724143 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id CF02AC433FE for ; Tue, 25 Jan 2022 18:43:04 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233129AbiAYSmi (ORCPT ); Tue, 25 Jan 2022 13:42:38 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:39902 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233090AbiAYSmU (ORCPT ); Tue, 25 Jan 2022 13:42:20 -0500 Received: from mail-wr1-x432.google.com (mail-wr1-x432.google.com [IPv6:2a00:1450:4864:20::432]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id DAD69C061744 for ; Tue, 25 Jan 2022 10:42:19 -0800 (PST) Received: by mail-wr1-x432.google.com with SMTP id s18so21563313wrv.7 for ; Tue, 25 Jan 2022 10:42:19 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=message-id:in-reply-to:references:from:date:subject:fcc :content-transfer-encoding:mime-version:to:cc; bh=jsxUMLHxtK7S8EQUs8/9O6ekGTMZd12pY38Rj8BEQxg=; b=kH2GRcJXkrtqQFUYxVQ5PAQu0/dQU/lF/vEls7ZNipqab4T/KslB2VmmhMF3dNaA5o Eef9ZGNfSSsRHHWzbAE5nTNkENkmEy3yMXCtwXhTPMwJrEjMOoypW3TNkPaUZ81UAHXs RjPL2ijXeFHiaFXng3gcnpso9pEy+GyWUwsLMLebymq2hA+Mqrt5qOZyar7a+9GuT7Xq yLx5SYvazNGB1N3UYrPquQD60wqwsotmTOKt2GlrCU6+UgdusEqKao/BFh4jZCq8n1ta p2UetpYtXfsjwrgGWLC/tEE8fxFoukwSWO2uwNpuOCvXb+LC3vJI1eEle47V3aJ4Ktom QC1A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:message-id:in-reply-to:references:from:date :subject:fcc:content-transfer-encoding:mime-version:to:cc; bh=jsxUMLHxtK7S8EQUs8/9O6ekGTMZd12pY38Rj8BEQxg=; b=Soiis4j7vi6Y7HjItEA8cEDDVJjHYgPtZwzUV1y/khX2uqmjjOndcjGOP26+gbcB5t irAbg8j7Tj4ypu2ysirJcSZBFy+occ6jQux0yJje5VuAV/ZVdRk/Gcv1qxP1NY+39v4a dkPKwbYPVcs8lEkXi8qlAFMXlI2MLM1DGF5w0OJc8uNfMIqkm8FhKN9bsT9amLLYsjuW y8gS3ceg9xs185l7E8r+V+BL02LA5XP7EeoBrq5AWJFpGTFEtJIJOdkNbYcvjYrSmO5R AjjFnGpayogq7GsrpiNHstGZEQv5Jp1L2xptXDC6G+Wx8NaMuxHlOOgdLc1uwgoh3uFv NiIA== X-Gm-Message-State: AOAM532LT7HBSMzdznFwQsB1Znby5+Wng2GpZlcnep+P7misCnbXstE2 czUPQOy3ivBzFEPeNNA0nBFkNYDGhkrJkQ== X-Google-Smtp-Source: ABdhPJzV9BzJ3LeqmL86VZcgiP99STnYQ8Z1mpt3SlD4uWjPrp3FTwqPsXjSdpzDuQVQ1UYUQtFrTA== X-Received: by 2002:adf:f850:: with SMTP id d16mr19924403wrq.303.1643136138144; Tue, 25 Jan 2022 10:42:18 -0800 (PST) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id c10sm17456326wrq.11.2022.01.25.10.42.17 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 25 Jan 2022 10:42:17 -0800 (PST) Message-Id: In-Reply-To: References: Date: Tue, 25 Jan 2022 18:42:11 +0000 Subject: [PATCH v4 2/5] worktree: create init_worktree_config() Fcc: Sent MIME-Version: 1.0 To: git@vger.kernel.org Cc: stolee@gmail.com, sunshine@sunshineco.com, allred.sean@gmail.com, gitster@pobox.com, Elijah Newren , Derrick Stolee , Derrick Stolee Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org From: Derrick Stolee From: Derrick Stolee Upgrading a repository to use extensions.worktreeConfig is non-trivial. There are several steps involved, including moving some config settings from the common config file to the main worktree's config.worktree file. The previous change updated the documentation with all of these details. Commands such as 'git sparse-checkout set' upgrade the repository to use extensions.worktreeConfig without following these steps, causing some user pain in some special cases. Create a helper method, init_worktree_config(), that will be used in a later change to fix this behavior within 'git sparse-checkout set'. The method is carefully documented in worktree.h. Note that we do _not_ upgrade the repository format version to 1 during this process. The worktree config extension must be considered by Git and third-party tools even if core.repositoryFormatVersion is 0 for historical reasons documented in 11664196ac ("Revert "check_repository_format_gently(): refuse extensions for old repositories"", 2020-07-15). This is a special case for this extension, and newer extensions (such as extensions.objectFormat) still need to upgrade the repository format version. Signed-off-by: Derrick Stolee --- worktree.c | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ worktree.h | 19 +++++++++++++++ 2 files changed, 89 insertions(+) diff --git a/worktree.c b/worktree.c index 6f598dcfcdf..dc4ead4c8fb 100644 --- a/worktree.c +++ b/worktree.c @@ -5,6 +5,7 @@ #include "worktree.h" #include "dir.h" #include "wt-status.h" +#include "config.h" void free_worktrees(struct worktree **worktrees) { @@ -826,3 +827,72 @@ int should_prune_worktree(const char *id, struct strbuf *reason, char **wtpath, *wtpath = path; return 0; } + +static int move_config_setting(const char *key, const char *value, + const char *from_file, const char *to_file) +{ + if (git_config_set_in_file_gently(to_file, key, value)) + return error(_("unable to set %s in '%s'"), key, to_file); + if (git_config_set_in_file_gently(from_file, key, NULL)) + return error(_("unable to unset %s in '%s'"), key, from_file); + return 0; +} + +int init_worktree_config(struct repository *r) +{ + int res = 0; + int bare = 0; + struct config_set cs = { { 0 } }; + const char *core_worktree; + char *common_config_file = xstrfmt("%s/config", r->commondir); + char *main_worktree_file = xstrfmt("%s/config.worktree", r->commondir); + + /* + * If the extension is already enabled, then we can skip the + * upgrade process. + */ + if (repository_format_worktree_config) + return 0; + if ((res = git_config_set_gently("extensions.worktreeConfig", "true"))) + return error(_("failed to set extensions.worktreeConfig setting")); + + git_configset_init(&cs); + git_configset_add_file(&cs, common_config_file); + + /* + * If core.bare is true in the common config file, then we need to + * move it to the base worktree's config file or it will break all + * worktrees. If it is false, then leave it in place because it + * _could_ be negating a global core.bare=true. + */ + if (!git_configset_get_bool(&cs, "core.bare", &bare) && bare) { + if ((res = move_config_setting("core.bare", "true", + common_config_file, + main_worktree_file))) + goto cleanup; + } + /* + * If core.worktree is set, then the base worktree is located + * somewhere different than the parent of the common Git dir. + * Relocate that value to avoid breaking all worktrees with this + * upgrade to worktree config. + */ + if (!git_configset_get_string_tmp(&cs, "core.worktree", &core_worktree)) { + if ((res = move_config_setting("core.worktree", core_worktree, + common_config_file, + main_worktree_file))) + goto cleanup; + } + + /* + * Ensure that we use worktree config for the remaining lifetime + * of the current process. + */ + repository_format_worktree_config = 1; + +cleanup: + git_configset_clear(&cs); + free(common_config_file); + free(main_worktree_file); + return res; +} diff --git a/worktree.h b/worktree.h index 9e06fcbdf3d..5ea5fcc3647 100644 --- a/worktree.h +++ b/worktree.h @@ -183,4 +183,23 @@ void strbuf_worktree_ref(const struct worktree *wt, struct strbuf *sb, const char *refname); +/** + * Enable worktree config for the first time. This will make the following + * adjustments: + * + * 1. Add extensions.worktreeConfig=true in the common config file. + * + * 2. If the common config file has a core.worktree value or core.bare is + * set to true, then those values are moved to the main worktree's + * config.worktree file. + * + * If extensions.worktreeConfig is already true, then this method + * terminates early without any of the above steps. The existing config + * arrangement is assumed to be intentional. + * + * Returns 0 on success. Reports an error message and returns non-zero + * if any of these steps fail. + */ +int init_worktree_config(struct repository *r); + #endif From patchwork Tue Jan 25 18:42:12 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Derrick Stolee X-Patchwork-Id: 12724145 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 78D86C433F5 for ; Tue, 25 Jan 2022 18:43:11 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233241AbiAYSnI (ORCPT ); Tue, 25 Jan 2022 13:43:08 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:39904 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233095AbiAYSmV (ORCPT ); Tue, 25 Jan 2022 13:42:21 -0500 Received: from mail-wr1-x436.google.com (mail-wr1-x436.google.com [IPv6:2a00:1450:4864:20::436]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 81FABC061749 for ; Tue, 25 Jan 2022 10:42:20 -0800 (PST) Received: by mail-wr1-x436.google.com with SMTP id s18so21563345wrv.7 for ; Tue, 25 Jan 2022 10:42:20 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=message-id:in-reply-to:references:from:date:subject:fcc :content-transfer-encoding:mime-version:to:cc; bh=INwATnL1xRLYdZVmyzbjAkZIOCTDRoDVPXqO0Q4F5YA=; b=UiRsWtECrsrqKnEBQz4eesM/Eyd3ZKKH7QculiW6w4zdUNiD7qPLy5VDjEzr56ajMQ 8pEoSP1r11vdpYaGLhpXZjhIrL/MKLCZVcoAARokqDt/ZJrkODYZoriE213JT4Y3pCTl FU1j/xWS2zrgswT3N+K44RYMoDoFWgTpZOdkWV/9eWQxe3YG6cKotee/yyN4mASUBTwH z7cdrdhCYixPRnjzfiM4U75kg422SQimNSB7wOvcHtmnnBJmnGE+HDwdG7owIsqF7qEq kZLrckWKxZVUl9lHGyVciLRiEuO+dBmSeXGwMS918jed9qAJu/g1QggjqIKN+GzUJAMX tnTA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:message-id:in-reply-to:references:from:date :subject:fcc:content-transfer-encoding:mime-version:to:cc; bh=INwATnL1xRLYdZVmyzbjAkZIOCTDRoDVPXqO0Q4F5YA=; b=Z9mfnxAAuLHre+JlxGcb/SUOM+imCCwCtvefeOmUjve3NAIG0Z5YI686xOhFSAgg13 /ur7E6/iTWEYpcm589/ZF+ddmu0apLswEP16uCkDPvtwJ2zYteE76dNWzLNgSKnvFukm hE9t+WHnhDO8PPvhwXluue+uhVi1lX+rdSgG3DIwgOE+wWpUQD3cC1h78RlyryGyaJww jnrX+grErILUqtowCLWcBgqCoz8fkcP+NFHhX2rmDX8dCmpcYx0WoeaVo0FSyFSlKuWc RHVX2Bw9jN8e+BYGlFqyM6bdujv8Nqy4QQ7c+V5vP4OKAH4D4GjQZBw9XgSY0rFayfmF IpiA== X-Gm-Message-State: AOAM532kDRx8sf2kCLJQVk5iIXzYH3xoRl8IfPT9jOM5ANbNGf1U8ZlR l/96Y5U1nL8mZnO2jJNvctmJjlLoA+CL0g== X-Google-Smtp-Source: ABdhPJwuxdaGqrOI8SKD08XXL0X1VL1c/bZMT+tw2j8kqR2XEIfPsIFTwsGmCETqwAcxNnYa+x4XSw== X-Received: by 2002:a5d:47cf:: with SMTP id o15mr6893631wrc.583.1643136138925; Tue, 25 Jan 2022 10:42:18 -0800 (PST) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id u3sm7603945wrs.55.2022.01.25.10.42.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 25 Jan 2022 10:42:18 -0800 (PST) Message-Id: <110d5e0546c76848d6e942a6c9b69d5146b0e1b3.1643136134.git.gitgitgadget@gmail.com> In-Reply-To: References: Date: Tue, 25 Jan 2022 18:42:12 +0000 Subject: [PATCH v4 3/5] config: add repo_config_set_worktree_gently() Fcc: Sent MIME-Version: 1.0 To: git@vger.kernel.org Cc: stolee@gmail.com, sunshine@sunshineco.com, allred.sean@gmail.com, gitster@pobox.com, Elijah Newren , Derrick Stolee , Derrick Stolee Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org From: Derrick Stolee From: Derrick Stolee Some config settings, such as those for sparse-checkout, are likely intended to only apply to one worktree at a time. To make this write easier, add a new config API method, repo_config_set_worktree_gently(). This method will attempt to write to the worktree-specific config, but will instead write to the common config file if worktree config is not enabled. The next change will introduce a consumer of this method. Signed-off-by: Derrick Stolee --- config.c | 35 ++++++++++++++++++++++++++++++++--- config.h | 8 ++++++++ 2 files changed, 40 insertions(+), 3 deletions(-) diff --git a/config.c b/config.c index 2bffa8d4a01..1a03ced1a54 100644 --- a/config.c +++ b/config.c @@ -21,6 +21,7 @@ #include "dir.h" #include "color.h" #include "refs.h" +#include "worktree.h" struct config_source { struct config_source *prev; @@ -2884,6 +2885,20 @@ int git_config_set_gently(const char *key, const char *value) return git_config_set_multivar_gently(key, value, NULL, 0); } +int repo_config_set_worktree_gently(struct repository *r, + const char *key, const char *value) +{ + /* Only use worktree-specific config if it is is already enabled. */ + if (repository_format_worktree_config) { + char *file = repo_git_path(r, "config.worktree"); + int ret = git_config_set_multivar_in_file_gently( + file, key, value, NULL, 0); + free(file); + return ret; + } + return repo_config_set_multivar_gently(r, key, value, NULL, 0); +} + void git_config_set(const char *key, const char *value) { git_config_set_multivar(key, value, NULL, 0); @@ -3181,14 +3196,28 @@ void git_config_set_multivar_in_file(const char *config_filename, int git_config_set_multivar_gently(const char *key, const char *value, const char *value_pattern, unsigned flags) { - return git_config_set_multivar_in_file_gently(NULL, key, value, value_pattern, - flags); + return repo_config_set_multivar_gently(the_repository, key, value, + value_pattern, flags); +} + +int repo_config_set_multivar_gently(struct repository *r, const char *key, + const char *value, + const char *value_pattern, unsigned flags) +{ + char *file = repo_git_path(r, "config"); + int res = git_config_set_multivar_in_file_gently(file, + key, value, + value_pattern, + flags); + free(file); + return res; } void git_config_set_multivar(const char *key, const char *value, const char *value_pattern, unsigned flags) { - git_config_set_multivar_in_file(NULL, key, value, value_pattern, + git_config_set_multivar_in_file(git_path("config"), + key, value, value_pattern, flags); } diff --git a/config.h b/config.h index f119de01309..1d98ad269bd 100644 --- a/config.h +++ b/config.h @@ -253,6 +253,13 @@ void git_config_set_in_file(const char *, const char *, const char *); int git_config_set_gently(const char *, const char *); +/** + * Write a config value that should apply to the current worktree. If + * extensions.worktreeConfig is enabled, then the write will happen in the + * current worktree's config. Otherwise, write to the common config file. + */ +int repo_config_set_worktree_gently(struct repository *, const char *, const char *); + /** * write config values to `.git/config`, takes a key/value pair as parameter. */ @@ -281,6 +288,7 @@ int git_config_parse_key(const char *, char **, size_t *); int git_config_set_multivar_gently(const char *, const char *, const char *, unsigned); void git_config_set_multivar(const char *, const char *, const char *, unsigned); +int repo_config_set_multivar_gently(struct repository *, const char *, const char *, const char *, unsigned); int git_config_set_multivar_in_file_gently(const char *, const char *, const char *, const char *, unsigned); /** From patchwork Tue Jan 25 18:42:13 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Derrick Stolee X-Patchwork-Id: 12724147 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id B1C00C433F5 for ; Tue, 25 Jan 2022 18:43:28 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233257AbiAYSnS (ORCPT ); Tue, 25 Jan 2022 13:43:18 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:39912 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233086AbiAYSmW (ORCPT ); Tue, 25 Jan 2022 13:42:22 -0500 Received: from mail-wr1-x431.google.com (mail-wr1-x431.google.com [IPv6:2a00:1450:4864:20::431]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 84637C06174E for ; Tue, 25 Jan 2022 10:42:21 -0800 (PST) Received: by mail-wr1-x431.google.com with SMTP id f17so21574406wrx.1 for ; Tue, 25 Jan 2022 10:42:21 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=message-id:in-reply-to:references:from:date:subject:fcc :content-transfer-encoding:mime-version:to:cc; bh=Z92cXzxOMOXSQJrB/5DWqYVgOFHRRQCuflcw+BRqa50=; b=pxCWj/GTKnsC15KHuh6OEpmw4TNT9sHcLAkKZIXa02T9rPfS/1itH+Ujr4qFvGbLrU g8USXCDdV+oxyXpG+Nl942DGfQ1Ijd2ySTDIe85M4wdpnEDYxWAhv4sZHOWMRUFKL7qp 7mf/PtJLq0x9Ocy/YDFWrqD9NhpUKRYWJZLSRuoiqGijDDEKlbImOQnoKo1ScwaUs0Lu 53XhyfnOJ9pADRONi68YoYcYxfh7Cf+sfaq4JKsrwkU9dBjF+3jcAtGVt6CKRXXEUNCJ H+tja978LGClYshg9sfB/ZiUwSBh1ghXHSlAhVKFJuwttABZYpCM5XMu4OHmn+8zuKvH N1RA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:message-id:in-reply-to:references:from:date :subject:fcc:content-transfer-encoding:mime-version:to:cc; bh=Z92cXzxOMOXSQJrB/5DWqYVgOFHRRQCuflcw+BRqa50=; b=mrpO5sLdA0daFvN7zLK2Xn737oTlLbwneNEfC+TsTNGWVT3S7dLVg5KgvRIjc8Np+p CIXpsZb78tL723yAS0W5TNiRKhIpw86qEHmluSORV7rIzZ4c3B2dPd5jTfFAfEfWPT86 YR2KMZifjrNlO7CP4xs7sZWyGATwQu29uNOfDWtYkkoOnBd925tIc0PdfKBYqcwCsjA1 we/1XgSXiqEKEX46FYl26loOOyzjo0dHOscbb3+iyB3xLlpSLD8wSyLFHNBtmDDJnz6d BheNtfwrxcpxFnosQAGUiWK0lHKLWmhL8NhQEtQgbojZSzodHz4GyQ1kZiBgvF4jeiVr IZow== X-Gm-Message-State: AOAM532oXOscCE7DVH8WWd33YPaGlZgbnyANouZCP9VuScspEq3lUWln gZ1aLF+XeluxkpSTaC8AahoIG3eZYfC5ww== X-Google-Smtp-Source: ABdhPJxgSAaZOVKSL1iTyjO4vLG2S9FZ3yPb3DNAxvcorrFn069N0To6N38DD7PajATdq+/TY68PWA== X-Received: by 2002:a05:6000:42:: with SMTP id k2mr19206455wrx.178.1643136139883; Tue, 25 Jan 2022 10:42:19 -0800 (PST) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id u3sm7603970wrs.55.2022.01.25.10.42.19 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 25 Jan 2022 10:42:19 -0800 (PST) Message-Id: In-Reply-To: References: Date: Tue, 25 Jan 2022 18:42:13 +0000 Subject: [PATCH v4 4/5] sparse-checkout: set worktree-config correctly Fcc: Sent MIME-Version: 1.0 To: git@vger.kernel.org Cc: stolee@gmail.com, sunshine@sunshineco.com, allred.sean@gmail.com, gitster@pobox.com, Elijah Newren , Derrick Stolee , Derrick Stolee Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org From: Derrick Stolee From: Derrick Stolee The previous change added repo_config_set_worktree_gently() to assist writing config values into the config.worktree file, if enabled. An earlier change added init_worktree_config() as a helper to initialize extensions.worktreeConfig if not already enabled. Let the sparse-checkout builtin use these helpers instead of attempting to initialize the worktree config on its own. This changes behavior of 'git sparse-checkout set' in a few important ways: 1. Git will no longer upgrade the repository format, since this is not a requirement for understanding extensions.worktreeConfig. 2. If the main worktree is bare, then this command will not put the worktree in a broken state. The main reason to use worktree-specific config for the sparse-checkout builtin was to avoid enabling sparse-checkout patterns in one and causing a loss of files in another. If a worktree does not have a sparse-checkout patterns file, then the sparse-checkout logic will not kick in on that worktree. Reported-by: Sean Allred Helped-by: Eric Sunshine Signed-off-by: Derrick Stolee --- Documentation/git-sparse-checkout.txt | 24 ++++++++++++++++------- builtin/sparse-checkout.c | 28 +++++++++++++-------------- sparse-index.c | 10 +++------- t/t1091-sparse-checkout-builtin.sh | 4 ++-- 4 files changed, 35 insertions(+), 31 deletions(-) diff --git a/Documentation/git-sparse-checkout.txt b/Documentation/git-sparse-checkout.txt index b81dbe06543..c6eae3ec7fd 100644 --- a/Documentation/git-sparse-checkout.txt +++ b/Documentation/git-sparse-checkout.txt @@ -31,12 +31,20 @@ COMMANDS Describe the patterns in the sparse-checkout file. 'set':: - Enable the necessary config settings - (extensions.worktreeConfig, core.sparseCheckout, - core.sparseCheckoutCone) if they are not already enabled, and - write a set of patterns to the sparse-checkout file from the - list of arguments following the 'set' subcommand. Update the - working directory to match the new patterns. + Enable the necessary sparse-checkout config settings + (`core.sparseCheckout` and possibly `core.sparseCheckoutCone`) if + they are not already enabled, and write a set of patterns to the + sparse-checkout file from the list of arguments following the + 'set' subcommand. Update the working directory to match the new + patterns. ++ +To ensure that adjusting the sparse-checkout settings within a worktree +does not alter the sparse-checkout settings in other worktrees, the 'set' +subcommand will upgrade your repository config to use worktree-specific +config if not already present. The sparsity defined by the arguments to +the 'set' subcommand are stored in the worktree-specific sparse-checkout +file. See linkgit:git-worktree[1] and the documentation of +`extensions.worktreeConfig` in linkgit:git-config[1] for more details. + When the `--stdin` option is provided, the patterns are read from standard in as a newline-delimited list instead of from the arguments. @@ -73,7 +81,9 @@ interact with your repository until it is disabled. By default, these patterns are read from the command-line arguments, but they can be read from stdin using the `--stdin` option. When `core.sparseCheckoutCone` is enabled, the given patterns are interpreted - as directory names as in the 'set' subcommand. + as directory names as in the 'set' subcommand. The sparsity defined + by the arguments to the 'add' subcommand are added to the patterns + in the worktree-specific sparse-checkout file. 'reapply':: Reapply the sparsity pattern rules to paths in the working tree. diff --git a/builtin/sparse-checkout.c b/builtin/sparse-checkout.c index 679c1070368..314c8d61f80 100644 --- a/builtin/sparse-checkout.c +++ b/builtin/sparse-checkout.c @@ -15,6 +15,7 @@ #include "wt-status.h" #include "quote.h" #include "sparse-index.h" +#include "worktree.h" static const char *empty_base = ""; @@ -359,26 +360,23 @@ enum sparse_checkout_mode { static int set_config(enum sparse_checkout_mode mode) { - const char *config_path; - - if (upgrade_repository_format(1) < 0) - die(_("unable to upgrade repository format to enable worktreeConfig")); - if (git_config_set_gently("extensions.worktreeConfig", "true")) { - error(_("failed to set extensions.worktreeConfig setting")); + /* Update to use worktree config, if not already. */ + if (init_worktree_config(the_repository)) { + error(_("failed to initialize worktree config")); return 1; } - config_path = git_path("config.worktree"); - git_config_set_in_file_gently(config_path, - "core.sparseCheckout", - mode ? "true" : NULL); - - git_config_set_in_file_gently(config_path, - "core.sparseCheckoutCone", - mode == MODE_CONE_PATTERNS ? "true" : NULL); + if (repo_config_set_worktree_gently(the_repository, + "core.sparseCheckout", + mode ? "true" : "false") || + repo_config_set_worktree_gently(the_repository, + "core.sparseCheckoutCone", + mode == MODE_CONE_PATTERNS ? + "true" : "false")) + return 1; if (mode == MODE_NO_PATTERNS) - set_sparse_index_config(the_repository, 0); + return set_sparse_index_config(the_repository, 0); return 0; } diff --git a/sparse-index.c b/sparse-index.c index a1d505d50e9..e93609999e0 100644 --- a/sparse-index.c +++ b/sparse-index.c @@ -99,13 +99,9 @@ static int convert_to_sparse_rec(struct index_state *istate, int set_sparse_index_config(struct repository *repo, int enable) { - int res; - char *config_path = repo_git_path(repo, "config.worktree"); - res = git_config_set_in_file_gently(config_path, - "index.sparse", - enable ? "true" : NULL); - free(config_path); - + int res = repo_config_set_worktree_gently(repo, + "index.sparse", + enable ? "true" : "false"); prepare_repo_settings(repo); repo->settings.sparse_index = enable; return res; diff --git a/t/t1091-sparse-checkout-builtin.sh b/t/t1091-sparse-checkout-builtin.sh index 42776984fe7..be6ea4ffe33 100755 --- a/t/t1091-sparse-checkout-builtin.sh +++ b/t/t1091-sparse-checkout-builtin.sh @@ -117,7 +117,7 @@ test_expect_success 'switching to cone mode with non-cone mode patterns' ' cd bad-patterns && git sparse-checkout init && git sparse-checkout add dir && - git config core.sparseCheckoutCone true && + git config --worktree core.sparseCheckoutCone true && test_must_fail git sparse-checkout add dir 2>err && grep "existing sparse-checkout patterns do not use cone mode" err ) @@ -256,7 +256,7 @@ test_expect_success 'sparse-index enabled and disabled' ' test_cmp expect actual && git -C repo config --list >config && - ! grep index.sparse config + test_cmp_config -C repo false index.sparse ) ' From patchwork Tue Jan 25 18:42:14 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Derrick Stolee X-Patchwork-Id: 12724148 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 4F068C433EF for ; Tue, 25 Jan 2022 18:43:32 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233384AbiAYSna (ORCPT ); Tue, 25 Jan 2022 13:43:30 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:39916 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233098AbiAYSmW (ORCPT ); Tue, 25 Jan 2022 13:42:22 -0500 Received: from mail-wr1-x42d.google.com (mail-wr1-x42d.google.com [IPv6:2a00:1450:4864:20::42d]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 6FBA4C061751 for ; Tue, 25 Jan 2022 10:42:22 -0800 (PST) Received: by mail-wr1-x42d.google.com with SMTP id w11so9405238wra.4 for ; Tue, 25 Jan 2022 10:42:22 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=message-id:in-reply-to:references:from:date:subject:fcc :content-transfer-encoding:mime-version:to:cc; bh=uDbG23i/k1KPC7HTYwaOSI93cnqOxh7kNAgcphilFVc=; b=bcu9S59CI7utuK54PDSt8QfBhRcwdjZcplODlnf8Zo2SKtyDJEVDLnhTolWu6N7o9h 4LLJOjfGiAmveT02Czpna67ORelRcCf4wW/6nuZAIbUHsfbvM/JK1j+WicJ7YY9XPQcb 4g46BZon3/AL2IWvW6FpI5vfZg7DJug462kGIGH0POQcMxDdvwNZYSRPg5eSuwQx0J68 +UMDgnnaSylwS5Ml8Z2eicNqAf2szWgLALK8Ab+Gc1hnr5EpJxPJmc9xFlfVuNEcHQAp CEg8DAqd7OXuy5l/wgU/IyOahNFRTtgz7/Qx5rIdVkKmHUhEWGnDIowixYV95HgvdDJj Pumw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:message-id:in-reply-to:references:from:date :subject:fcc:content-transfer-encoding:mime-version:to:cc; bh=uDbG23i/k1KPC7HTYwaOSI93cnqOxh7kNAgcphilFVc=; b=QENXI12mwgnZ5RFnwQyrczNUMlHesU6Lpttz2ShjVHAbcN9Alt10PQMBjb/CYakiv2 p2lkz+HQWjDNwtMTLwNIMYY5zJS9aww1mY5pa0VXMDgYygvUUQ15J4Tj4TTwNYl1cU7l mTq4NzMo22vsj6BlLXg5pb/g/nali5SafsPKriu6AXyUgKzhwmnVoQEmbqyMxHdq2ZSf 8LjV2IRJ9PILqFjnk+afrT0jjEXHApaSLXrGHNrFKRvxvnFbeljz5awt9jn87BdF/gyS OiO5yti6mFc3h4Y+JTJSEC5cqbZNnwBhlQjhqR90WTnEvo3a7gt2d2ZeWuoySoaijS7r KYBg== X-Gm-Message-State: AOAM530yHVipKn+EENRhAMm/7Ng9OiSsyGslrO/WK5uGOUknySmWFAtz SIZrYxBbDCfWY05rTCNqqIEXCzm0DteQkg== X-Google-Smtp-Source: ABdhPJwa+q3R/Qb7EUf39mVm8dGnXOpS9WRFse4R4huGPz7HqIAKPDDNIpjYGjvPsWk5l2x18jMTOg== X-Received: by 2002:a05:6000:1787:: with SMTP id e7mr19254412wrg.281.1643136140862; Tue, 25 Jan 2022 10:42:20 -0800 (PST) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id c11sm10967383wri.43.2022.01.25.10.42.20 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 25 Jan 2022 10:42:20 -0800 (PST) Message-Id: In-Reply-To: References: Date: Tue, 25 Jan 2022 18:42:14 +0000 Subject: [PATCH v4 5/5] worktree: copy sparse-checkout patterns and config on add Fcc: Sent MIME-Version: 1.0 To: git@vger.kernel.org Cc: stolee@gmail.com, sunshine@sunshineco.com, allred.sean@gmail.com, gitster@pobox.com, Elijah Newren , Derrick Stolee , Derrick Stolee Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org From: Derrick Stolee From: Derrick Stolee When adding a new worktree, it is reasonable to expect that we want to use the current set of sparse-checkout settings for that new worktree. This is particularly important for repositories where the worktree would become too large to be useful. This is even more important when using partial clone as well, since we want to avoid downloading the missing blobs for files that should not be written to the new worktree. The only way to create such a worktree without this intermediate step of expanding the full worktree is to copy the sparse-checkout patterns and config settings during 'git worktree add'. Each worktree has its own sparse-checkout patterns, and the default behavior when the sparse-checkout file is missing is to include all paths at HEAD. Thus, we need to have patterns from somewhere, they might as well be the current worktree's patterns. These are then modified independently in the future. In addition to the sparse-checkout file, copy the worktree config file if worktree config is enabled and the file exists. This will copy over any important settings to ensure the new worktree behaves the same as the current one. The only exception we must continue to make is that core.bare and core.worktree should become unset in the worktree's config file. Signed-off-by: Derrick Stolee --- builtin/worktree.c | 60 ++++++++++++++++++++++++++++++ t/t1091-sparse-checkout-builtin.sh | 31 +++++++++++---- t/t2400-worktree-add.sh | 46 ++++++++++++++++++++++- 3 files changed, 127 insertions(+), 10 deletions(-) diff --git a/builtin/worktree.c b/builtin/worktree.c index 2838254f7f2..dc9cd6decc8 100644 --- a/builtin/worktree.c +++ b/builtin/worktree.c @@ -335,6 +335,66 @@ static int add_worktree(const char *path, const char *refname, strbuf_addf(&sb, "%s/commondir", sb_repo.buf); write_file(sb.buf, "../.."); + /* + * If the current worktree has sparse-checkout enabled, then copy + * the sparse-checkout patterns from the current worktree. + */ + if (core_apply_sparse_checkout) { + char *from_file = git_pathdup("info/sparse-checkout"); + char *to_file = xstrfmt("%s/worktrees/%s/info/sparse-checkout", + realpath.buf, name); + + if (file_exists(from_file)) { + if (safe_create_leading_directories(to_file) || + copy_file(to_file, from_file, 0666)) + error(_("failed to copy '%s' to '%s'; sparse-checkout may not work correctly"), + from_file, to_file); + } + + free(from_file); + free(to_file); + } + + /* + * If we are using worktree config, then copy all current config + * values from the current worktree into the new one, that way the + * new worktree behaves the same as this one. + */ + if (repository_format_worktree_config) { + char *from_file = git_pathdup("config.worktree"); + char *to_file = xstrfmt("%s/worktrees/%s/config.worktree", + realpath.buf, name); + + if (file_exists(from_file)) { + struct config_set cs = { { 0 }}; + const char *str_value; + int bool_value; + + if (safe_create_leading_directories(to_file) || + copy_file(to_file, from_file, 0666)) + die(_("failed to copy worktree config from '%s' to '%s'"), + from_file, to_file); + + git_configset_init(&cs); + git_configset_add_file(&cs, from_file); + + if (!git_configset_get_bool(&cs, "core.bare", &bool_value) && + bool_value && + git_config_set_multivar_in_file_gently( + to_file, "core.bare", NULL, "true", 0)) + error(_("failed to unset 'core.bare' in '%s'"), to_file); + if (!git_configset_get_value(&cs, "core.worktree", &str_value) && + git_config_set_in_file_gently(to_file, + "core.worktree", NULL)) + error(_("failed to unset 'core.worktree' in '%s'"), to_file); + + git_configset_clear(&cs); + } + + free(from_file); + free(to_file); + } + strvec_pushf(&child_env, "%s=%s", GIT_DIR_ENVIRONMENT, sb_git.buf); strvec_pushf(&child_env, "%s=%s", GIT_WORK_TREE_ENVIRONMENT, path); cp.git_cmd = 1; diff --git a/t/t1091-sparse-checkout-builtin.sh b/t/t1091-sparse-checkout-builtin.sh index be6ea4ffe33..d929772be96 100755 --- a/t/t1091-sparse-checkout-builtin.sh +++ b/t/t1091-sparse-checkout-builtin.sh @@ -146,9 +146,9 @@ test_expect_success 'interaction with clone --no-checkout (unborn index)' ' ' test_expect_success 'set enables config' ' - git init empty-config && + git init worktree-config && ( - cd empty-config && + cd worktree-config && test_commit test file && test_path_is_missing .git/config.worktree && git sparse-checkout set nothing && @@ -201,6 +201,21 @@ test_expect_success 'add to sparse-checkout' ' check_files repo "a folder1 folder2" ' +test_expect_success 'worktree: add copies sparse-checkout patterns' ' + cat repo/.git/info/sparse-checkout >old && + test_when_finished cp old repo/.git/info/sparse-checkout && + test_when_finished git -C repo worktree remove ../worktree && + git -C repo sparse-checkout set "/*" && + git -C repo worktree add --quiet ../worktree 2>err && + test_must_be_empty err && + new=repo/.git/worktrees/worktree/info/sparse-checkout && + test_path_is_file $new && + test_cmp repo/.git/info/sparse-checkout $new && + git -C worktree sparse-checkout set --cone && + test_cmp_config -C worktree true core.sparseCheckoutCone && + test_must_fail git -C repo core.sparseCheckoutCone +' + test_expect_success 'cone mode: match patterns' ' git -C repo config --worktree core.sparseCheckoutCone true && rm -rf repo/a repo/folder1 repo/folder2 && @@ -520,13 +535,13 @@ test_expect_success 'interaction with submodules' ' ' test_expect_success 'different sparse-checkouts with worktrees' ' + git -C repo sparse-checkout set --cone deep folder1 && git -C repo worktree add --detach ../worktree && - check_files worktree "a deep folder1 folder2" && - git -C worktree sparse-checkout init --cone && - git -C repo sparse-checkout set folder1 && - git -C worktree sparse-checkout set deep/deeper1 && - check_files repo a folder1 && - check_files worktree a deep + check_files worktree "a deep folder1" && + git -C repo sparse-checkout set --cone folder1 && + git -C worktree sparse-checkout set --cone deep/deeper1 && + check_files repo "a folder1" && + check_files worktree "a deep" ' test_expect_success 'set using filename keeps file on-disk' ' diff --git a/t/t2400-worktree-add.sh b/t/t2400-worktree-add.sh index 37ad79470fb..3fb5b21b943 100755 --- a/t/t2400-worktree-add.sh +++ b/t/t2400-worktree-add.sh @@ -165,8 +165,50 @@ test_expect_success '"add" default branch of a bare repo' ' ( git clone --bare . bare2 && cd bare2 && - git worktree add ../there3 main - ) + git worktree add ../there3 main && + cd ../there3 && + git status + ) && + cat >expect <<-EOF && + init.t + EOF + ls there3 >actual && + test_cmp expect actual +' + +test_expect_success '"add" to bare repo with worktree config' ' + ( + git clone --bare . bare3 && + cd bare3 && + git config extensions.worktreeconfig true && + git config --worktree core.bare true && + git config --worktree core.worktree "$(pwd)" && + git config --worktree bogus.key value && + git config --unset core.bare && + git worktree add ../there4 main && + cd ../there4 && + git status && + git worktree add --detach ../there5 && + cd ../there5 && + git status + ) && + + # the worktree has the arbitrary value copied. + test_cmp_config -C there4 value bogus.key && + test_cmp_config -C there5 value bogus.key && + + # however, core.bare and core.worktree were removed. + test_must_fail git -C there4 config core.bare && + test_must_fail git -C there4 config core.worktree && + + cat >expect <<-EOF && + init.t + EOF + + ls there4 >actual && + test_cmp expect actual && + ls there5 >actual && + test_cmp expect actual ' test_expect_success 'checkout with grafts' '