Skip to content

Commit 62f2eca

Browse files
jrngitster
authored andcommitted
repository: allow repository format upgrade with extensions
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 <[email protected]> Signed-off-by: Jonathan Nieder <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent 1166419 commit 62f2eca

File tree

3 files changed

+9
-8
lines changed

3 files changed

+9
-8
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: 7 additions & 5 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
@@ -553,13 +552,16 @@ int upgrade_repository_format(int target_version)
553552
if (repo_fmt.version >= target_version)
554553
return 0;
555554

556-
if (verify_repository_format(&repo_fmt, &err) < 0 ||
557-
(!repo_fmt.version && repo_fmt.has_extensions)) {
558-
warning("unable to upgrade repository format from %d to %d: %s",
559-
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);
560558
strbuf_release(&err);
561559
return -1;
562560
}
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);
563565

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

t/t0410-partial-clone.sh

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

45-
test_expect_success 'converting to partial clone fails with noop 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 &&
5252
git -C client config extensions.noop true &&
53-
test_must_fail git -C client fetch --unshallow --filter="blob:none"
53+
git -C client fetch --unshallow --filter="blob:none"
5454
'
5555

5656
test_expect_success 'converting to partial clone fails with unrecognized extension' '

0 commit comments

Comments
 (0)