]> git.ipfire.org Git - thirdparty/git.git/commitdiff
repository: allow repository format upgrade with extensions
authorJonathan Nieder <jrnieder@gmail.com>
Thu, 16 Jul 2020 06:28:18 +0000 (23:28 -0700)
committerJunio C Hamano <gitster@pobox.com>
Thu, 16 Jul 2020 16:36:39 +0000 (09:36 -0700)
Now that we officially permit repository extensions in repository
format v0, permit upgrading a repository with extensions from v0 to v1
as well.

For example, this means a repository where the user has set
"extensions.preciousObjects" can use "git fetch --filter=blob:none
origin" to upgrade the repository to use v1 and the partial clone
extension.

To avoid mistakes, continue to forbid repository format upgrades in v0
repositories with an unrecognized extension.  This way, a v0 user
using a misspelled extension field gets a chance to correct the
mistake before updating to the less forgiving v1 format.

While we're here, make the error message for failure to upgrade the
repository format a bit shorter, and present it as an error, not a
warning.

Reported-by: Huan Huan Chen <huanhuanchen@google.com>
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
cache.h
setup.c
t/t0410-partial-clone.sh

diff --git a/cache.h b/cache.h
index e5885cc9ead57a4eba10ad5263f58b94439feb85..0f0485ecfe2cd9a2270cffcec3552e901658539a 100644 (file)
--- a/cache.h
+++ b/cache.h
@@ -1042,7 +1042,6 @@ struct repository_format {
        int worktree_config;
        int is_bare;
        int hash_algo;
-       int has_extensions;
        char *work_tree;
        struct string_list unknown_extensions;
 };
diff --git a/setup.c b/setup.c
index 597b41b822cf8a371681d1778de2451cb1bc243b..e34b07357795f48041cf24e94487c4bc4e071d6a 100644 (file)
--- a/setup.c
+++ b/setup.c
@@ -455,7 +455,6 @@ 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
@@ -553,13 +552,16 @@ int upgrade_repository_format(int target_version)
        if (repo_fmt.version >= target_version)
                return 0;
 
-       if (verify_repository_format(&repo_fmt, &err) < 0 ||
-           (!repo_fmt.version && repo_fmt.has_extensions)) {
-               warning("unable to upgrade repository format from %d to %d: %s",
-                       repo_fmt.version, target_version, err.buf);
+       if (verify_repository_format(&repo_fmt, &err) < 0) {
+               error("cannot upgrade repository format from %d to %d: %s",
+                     repo_fmt.version, target_version, err.buf);
                strbuf_release(&err);
                return -1;
        }
+       if (!repo_fmt.version && repo_fmt.unknown_extensions.nr)
+               return error("cannot upgrade repository format: "
+                            "unknown extension %s",
+                            repo_fmt.unknown_extensions.items[0].string);
 
        strbuf_addf(&repo_version, "%d", target_version);
        git_config_set("core.repositoryformatversion", repo_version.buf);
index 51d1eba605080c95310ade9044f7c43bce539389..6aa0f313bddbc9df06d22d10c1cb59a8b92e8e89 100755 (executable)
@@ -42,7 +42,7 @@ test_expect_success 'convert shallow clone to partial clone' '
        test_cmp_config -C client 1 core.repositoryformatversion
 '
 
-test_expect_success 'converting to partial clone fails with noop extension' '
+test_expect_success 'convert to partial clone with noop extension' '
        rm -fr server client &&
        test_create_repo server &&
        test_commit -C server my_commit 1 &&
@@ -50,7 +50,7 @@ test_expect_success 'converting to partial clone fails with noop extension' '
        git clone --depth=1 "file://$(pwd)/server" client &&
        test_cmp_config -C client 0 core.repositoryformatversion &&
        git -C client config extensions.noop true &&
-       test_must_fail git -C client fetch --unshallow --filter="blob:none"
+       git -C client fetch --unshallow --filter="blob:none"
 '
 
 test_expect_success 'converting to partial clone fails with unrecognized extension' '