Skip to content

Commit d13b7f2

Browse files
committed
Merge branch 'jn/v0-with-extensions-fix' into master
In 2.28-rc0, we corrected a bug that some repository extensions are honored by mistake even in a version 0 repositories (these configuration variables in extensions.* namespace were supposed to have special meaning in repositories whose version numbers are 1 or higher), but this was a bit too big a change. * jn/v0-with-extensions-fix: repository: allow repository format upgrade with extensions Revert "check_repository_format_gently(): refuse extensions for old repositories"
2 parents b6a658b + 62f2eca commit d13b7f2

File tree

3 files changed

+23
-17
lines changed

3 files changed

+23
-17
lines changed

cache.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1042,7 +1042,6 @@ struct repository_format {
10421042
int worktree_config;
10431043
int is_bare;
10441044
int hash_algo;
1045-
int has_extensions;
10461045
char *work_tree;
10471046
struct string_list unknown_extensions;
10481047
};

setup.c

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -455,7 +455,6 @@ static int check_repo_format(const char *var, const char *value, void *vdata)
455455
if (strcmp(var, "core.repositoryformatversion") == 0)
456456
data->version = git_config_int(var, value);
457457
else if (skip_prefix(var, "extensions.", &ext)) {
458-
data->has_extensions = 1;
459458
/*
460459
* record any known extensions here; otherwise,
461460
* we fall through to recording it as unknown, and
@@ -507,15 +506,9 @@ static int check_repository_format_gently(const char *gitdir, struct repository_
507506
die("%s", err.buf);
508507
}
509508

510-
if (candidate->version >= 1) {
511-
repository_format_precious_objects = candidate->precious_objects;
512-
set_repository_format_partial_clone(candidate->partial_clone);
513-
repository_format_worktree_config = candidate->worktree_config;
514-
} else {
515-
repository_format_precious_objects = 0;
516-
set_repository_format_partial_clone(NULL);
517-
repository_format_worktree_config = 0;
518-
}
509+
repository_format_precious_objects = candidate->precious_objects;
510+
set_repository_format_partial_clone(candidate->partial_clone);
511+
repository_format_worktree_config = candidate->worktree_config;
519512
string_list_clear(&candidate->unknown_extensions, 0);
520513

521514
if (repository_format_worktree_config) {
@@ -559,13 +552,16 @@ int upgrade_repository_format(int target_version)
559552
if (repo_fmt.version >= target_version)
560553
return 0;
561554

562-
if (verify_repository_format(&repo_fmt, &err) < 0 ||
563-
(!repo_fmt.version && repo_fmt.has_extensions)) {
564-
warning("unable to upgrade repository format from %d to %d: %s",
565-
repo_fmt.version, target_version, err.buf);
555+
if (verify_repository_format(&repo_fmt, &err) < 0) {
556+
error("cannot upgrade repository format from %d to %d: %s",
557+
repo_fmt.version, target_version, err.buf);
566558
strbuf_release(&err);
567559
return -1;
568560
}
561+
if (!repo_fmt.version && repo_fmt.unknown_extensions.nr)
562+
return error("cannot upgrade repository format: "
563+
"unknown extension %s",
564+
repo_fmt.unknown_extensions.items[0].string);
569565

570566
strbuf_addf(&repo_version, "%d", target_version);
571567
git_config_set("core.repositoryformatversion", repo_version.buf);

t/t0410-partial-clone.sh

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,14 +42,25 @@ test_expect_success 'convert shallow clone to partial clone' '
4242
test_cmp_config -C client 1 core.repositoryformatversion
4343
'
4444

45-
test_expect_success 'convert shallow clone to partial clone must fail with any extension' '
45+
test_expect_success 'convert to partial clone with noop extension' '
4646
rm -fr server client &&
4747
test_create_repo server &&
4848
test_commit -C server my_commit 1 &&
4949
test_commit -C server my_commit2 1 &&
5050
git clone --depth=1 "file://$(pwd)/server" client &&
5151
test_cmp_config -C client 0 core.repositoryformatversion &&
52-
git -C client config extensions.partialclone origin &&
52+
git -C client config extensions.noop true &&
53+
git -C client fetch --unshallow --filter="blob:none"
54+
'
55+
56+
test_expect_success 'converting to partial clone fails with unrecognized extension' '
57+
rm -fr server client &&
58+
test_create_repo server &&
59+
test_commit -C server my_commit 1 &&
60+
test_commit -C server my_commit2 1 &&
61+
git clone --depth=1 "file://$(pwd)/server" client &&
62+
test_cmp_config -C client 0 core.repositoryformatversion &&
63+
git -C client config extensions.nonsense true &&
5364
test_must_fail git -C client fetch --unshallow --filter="blob:none"
5465
'
5566

0 commit comments

Comments
 (0)