From: Johannes Schindelin <Johannes.Schindelin@gmx.de>
To: Derrick Stolee via GitGitGadget <gitgitgadget@gmail.com>
Cc: git@vger.kernel.org, newren@gmail.com, delphij@google.com,
peff@peff.net, me@ttaylorr.com,
Derrick Stolee <derrickstolee@github.com>,
Derrick Stolee <dstolee@microsoft.com>
Subject: Re: [PATCH v2 1/2] setup: tweak upgrade policy to grandfather worktreeconfig
Date: Tue, 14 Jul 2020 22:22:25 +0200 (CEST) [thread overview]
Message-ID: <nycvar.QRO.7.76.6.2007142221370.52@tvgsbejvaqbjf.bet> (raw)
In-Reply-To: <1b26d9710a7ffaca0bad1f4e1c1729f501ed1559.1594690017.git.gitgitgadget@gmail.com>
Hi Stolee,
On Tue, 14 Jul 2020, Derrick Stolee via GitGitGadget wrote:
> This is because the logic in 14c7fa269e4 refuses to upgrae repos when
> the version is unset but extensions exist.
s/upgrae/upgrade/
The rest looks good to me.
Thank you for working on this,
Dscho
> One possible way to alert a user of this issue is to warn them when Git
> notices an extension exists, but core.repositoryFormatVersion is not a
> correct value. However,
>
> - it requires the end-user to read, understand and execute the
> manual upgrade
>
> - it encourages to follow the same procedure blindly, making the
> protection even less useful
>
> Let's instead keep failing hard without teaching how to bypass the
> repository protection, but allow upgrading even when only the
> worktreeconfig extension exists in an old repository, which is
> likely to be set by a broke version of Git that did not update the
> repository version when setting the extension.
>
> This change of behavior is made visible by testing how 'git
> sparse-checkout init' behaves to upgrade the repository format version
> even if the extension.worktreeConfig is already set. This would
> previously fail without a clear way forward.
>
> Signed-off-by: Junio C Hamano <gitster@pobox.com>
> Signed-off-by: Derrick Stolee <dstolee@microsoft.com>
> ---
> cache.h | 2 +-
> setup.c | 12 ++++++++----
> t/t1091-sparse-checkout-builtin.sh | 12 ++++++++++++
> 3 files changed, 21 insertions(+), 5 deletions(-)
>
> diff --git a/cache.h b/cache.h
> index e5885cc9ea..8ff46857f6 100644
> --- a/cache.h
> +++ b/cache.h
> @@ -1042,8 +1042,8 @@ struct repository_format {
> int worktree_config;
> int is_bare;
> int hash_algo;
> - int has_extensions;
> char *work_tree;
> + int has_unallowed_extensions;
> struct string_list unknown_extensions;
> };
>
> diff --git a/setup.c b/setup.c
> index eb066db6d8..65270440a9 100644
> --- a/setup.c
> +++ b/setup.c
> @@ -455,12 +455,13 @@ static int check_repo_format(const char *var, const char *value, void *vdata)
> if (strcmp(var, "core.repositoryformatversion") == 0)
> data->version = git_config_int(var, value);
> else if (skip_prefix(var, "extensions.", &ext)) {
> - data->has_extensions = 1;
> /*
> * record any known extensions here; otherwise,
> * we fall through to recording it as unknown, and
> * check_repository_format will complain
> */
> + int is_unallowed_extension = 1;
> +
> if (!strcmp(ext, "noop"))
> ;
> else if (!strcmp(ext, "preciousobjects"))
> @@ -469,10 +470,13 @@ static int check_repo_format(const char *var, const char *value, void *vdata)
> if (!value)
> return config_error_nonbool(var);
> data->partial_clone = xstrdup(value);
> - } else if (!strcmp(ext, "worktreeconfig"))
> + } else if (!strcmp(ext, "worktreeconfig")) {
> data->worktree_config = git_config_bool(var, value);
> - else
> + is_unallowed_extension = 0;
> + } else
> string_list_append(&data->unknown_extensions, ext);
> +
> + data->has_unallowed_extensions |= is_unallowed_extension;
> }
>
> return read_worktree_config(var, value, vdata);
> @@ -560,7 +564,7 @@ int upgrade_repository_format(int target_version)
> return 0;
>
> if (verify_repository_format(&repo_fmt, &err) < 0 ||
> - (!repo_fmt.version && repo_fmt.has_extensions)) {
> + (!repo_fmt.version && repo_fmt.has_unallowed_extensions)) {
> warning("unable to upgrade repository format from %d to %d: %s",
> repo_fmt.version, target_version, err.buf);
> strbuf_release(&err);
> diff --git a/t/t1091-sparse-checkout-builtin.sh b/t/t1091-sparse-checkout-builtin.sh
> index 88cdde255c..6e339c7c8e 100755
> --- a/t/t1091-sparse-checkout-builtin.sh
> +++ b/t/t1091-sparse-checkout-builtin.sh
> @@ -68,6 +68,18 @@ test_expect_success 'git sparse-checkout init' '
> check_files repo a
> '
>
> +test_expect_success 'git sparse-checkout works if repository format is wrong' '
> + test_when_finished git -C repo config core.repositoryFormatVersion 1 &&
> + git -C repo config --unset core.repositoryFormatVersion &&
> + git -C repo sparse-checkout init &&
> + git -C repo config core.repositoryFormatVersion >actual &&
> + echo 1 >expect &&
> + git -C repo config core.repositoryFormatVersion 0 &&
> + git -C repo sparse-checkout init &&
> + git -C repo config core.repositoryFormatVersion >actual &&
> + test_cmp expect actual
> +'
> +
> test_expect_success 'git sparse-checkout list after init' '
> git -C repo sparse-checkout list >actual &&
> cat >expect <<-\EOF &&
> --
> gitgitgadget
>
>
next prev parent reply other threads:[~2020-07-14 20:22 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-07-13 19:20 [PATCH] setup: warn if extensions exist on old format Derrick Stolee via GitGitGadget
2020-07-13 19:34 ` Taylor Blau
2020-07-13 19:41 ` Derrick Stolee
2020-07-13 19:36 ` Junio C Hamano
2020-07-13 20:00 ` Junio C Hamano
2020-07-13 20:18 ` [PATCH] setup: tweak upgrade policy to grandfather worktreeconfig Junio C Hamano
2020-07-13 20:46 ` Derrick Stolee
2020-07-13 21:45 ` Junio C Hamano
2020-07-14 4:06 ` Jonathan Nieder
2020-07-14 4:27 ` Junio C Hamano
2020-07-14 1:26 ` [PATCH v2 0/2] setup: warn if extensions exist on old format Derrick Stolee via GitGitGadget
2020-07-14 1:26 ` [PATCH v2 1/2] setup: tweak upgrade policy to grandfather worktreeconfig Derrick Stolee via GitGitGadget
2020-07-14 20:22 ` Johannes Schindelin [this message]
2020-07-14 1:26 ` [PATCH v2 2/2] config: provide extra detail about worktree config Derrick Stolee via GitGitGadget
2020-07-14 20:24 ` [PATCH v2 0/2] setup: warn if extensions exist on old format Johannes Schindelin
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=nycvar.QRO.7.76.6.2007142221370.52@tvgsbejvaqbjf.bet \
--to=johannes.schindelin@gmx.de \
--cc=delphij@google.com \
--cc=derrickstolee@github.com \
--cc=dstolee@microsoft.com \
--cc=git@vger.kernel.org \
--cc=gitgitgadget@gmail.com \
--cc=me@ttaylorr.com \
--cc=newren@gmail.com \
--cc=peff@peff.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).