]> git.ipfire.org Git - thirdparty/git.git/commitdiff
check_repository_format_gently(): refuse extensions for old repositories
authorXin Li <delphij@google.com>
Fri, 5 Jun 2020 09:10:04 +0000 (02:10 -0700)
committerJunio C Hamano <gitster@pobox.com>
Fri, 5 Jun 2020 17:13:30 +0000 (10:13 -0700)
Previously, extensions were recognized regardless of repository format
version.  If the user sets an undefined "extensions" value on a
repository of version 0 and that value is used by a future git version,
they might get an undesired result.

Because all extensions now also upgrade repository versions, tightening
the check would help avoid this for future extensions.

Signed-off-by: Xin Li <delphij@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
setup.c
t/t0410-partial-clone.sh

diff --git a/setup.c b/setup.c
index 597b41b822cf8a371681d1778de2451cb1bc243b..eb066db6d8c123da03e8992db84a3e562bed8fd3 100644 (file)
--- a/setup.c
+++ b/setup.c
@@ -507,9 +507,15 @@ static int check_repository_format_gently(const char *gitdir, struct repository_
                die("%s", err.buf);
        }
 
-       repository_format_precious_objects = candidate->precious_objects;
-       set_repository_format_partial_clone(candidate->partial_clone);
-       repository_format_worktree_config = candidate->worktree_config;
+       if (candidate->version >= 1) {
+               repository_format_precious_objects = candidate->precious_objects;
+               set_repository_format_partial_clone(candidate->partial_clone);
+               repository_format_worktree_config = candidate->worktree_config;
+       } else {
+               repository_format_precious_objects = 0;
+               set_repository_format_partial_clone(NULL);
+               repository_format_worktree_config = 0;
+       }
        string_list_clear(&candidate->unknown_extensions, 0);
 
        if (repository_format_worktree_config) {
index 16ad0003829333e3707152f2cd510f2c6a90b519..463dc3a8be0857d7a3ac7933a8824389f8528dc7 100755 (executable)
@@ -42,6 +42,17 @@ test_expect_success 'convert shallow clone to partial clone' '
        test_cmp_config -C client 1 core.repositoryformatversion
 '
 
+test_expect_success 'convert shallow clone to partial clone must fail with any extension' '
+       rm -fr server client &&
+       test_create_repo server &&
+       test_commit -C server my_commit 1 &&
+       test_commit -C server my_commit2 1 &&
+       git clone --depth=1 "file://$(pwd)/server" client &&
+       test_cmp_config -C client 0 core.repositoryformatversion &&
+       git -C client config extensions.partialclone origin &&
+       test_must_fail git -C client fetch --unshallow --filter="blob:none"
+'
+
 test_expect_success 'missing reflog object, but promised by a commit, passes fsck' '
        rm -rf repo &&
        test_create_repo repo &&