@matheusbsbs / matheus-bagliano / commits / 62f2eca606
Fork 0

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 <huanhuanchen@google.com> Signed-off-by: Jonathan Nieder <jrnieder@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Jonathan Nieder committed Jul 15, 2020 at 23:28 UTC 62f2eca6065d0c27b0ea3b7806a590466ea04960
3 files changed +9 -8
cache.h
-1
@@ -1042,7 +1042,6 @@ struct repository_format {
1042 int worktree_config;
1043 int is_bare;
1044 int hash_algo;
1045 - int has_extensions;
1045 char *work_tree;
1046 struct string_list unknown_extensions;
1047 };
setup.c
+7 -5
@@ -455,7 +455,6 @@ static int check_repo_format(const char *var, const char *value, void *vdata)
455 if (strcmp(var, "core.repositoryformatversion") == 0)
456 data->version = git_config_int(var, value);
457 else if (skip_prefix(var, "extensions.", &ext)) {
458 - data->has_extensions = 1;
458 /*
459 * record any known extensions here; otherwise,
460 * we fall through to recording it as unknown, and
@@ -553,13 +552,16 @@ int upgrade_repository_format(int target_version)
552 if (repo_fmt.version >= target_version)
553 return 0;
554
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);
558 strbuf_release(&err);
559 return -1;
560 }
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);
565
566 strbuf_addf(&repo_version, "%d", target_version);
567 git_config_set("core.repositoryformatversion", repo_version.buf);
t/t0410-partial-clone.sh
+2 -2
@@ -42,7 +42,7 @@ test_expect_success 'convert shallow clone to partial clone' '
42 test_cmp_config -C client 1 core.repositoryformatversion
43 '
44
45 -test_expect_success 'converting to partial clone fails with noop extension' '
45 +test_expect_success 'convert to partial clone with noop extension' '
46 rm -fr server client &&
47 test_create_repo server &&
48 test_commit -C server my_commit 1 &&
@@ -50,7 +50,7 @@ test_expect_success 'converting to partial clone fails with noop extension' '
50 git clone --depth=1 "file://$(pwd)/server" client &&
51 test_cmp_config -C client 0 core.repositoryformatversion &&
52 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"
54 '
55
56 test_expect_success 'converting to partial clone fails with unrecognized extension' '