repository: add a helper function to perform repository format upgrade
In version 1 of repository format, "extensions" gained special meaning and it is safer to avoid upgrading when there are pre-existing extensions. Make list-objects-filter to use the helper function instead of setting repository version directly as a prerequisite of exposing the upgrade capability. Signed-off-by: Xin Li <delphij@google.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
29
setup.c
29
setup.c
@ -455,6 +455,7 @@ 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
|
||||
@ -538,6 +539,34 @@ static int check_repository_format_gently(const char *gitdir, struct repository_
|
||||
return 0;
|
||||
}
|
||||
|
||||
int upgrade_repository_format(int target_version)
|
||||
{
|
||||
struct strbuf sb = STRBUF_INIT;
|
||||
struct strbuf err = STRBUF_INIT;
|
||||
struct strbuf repo_version = STRBUF_INIT;
|
||||
struct repository_format repo_fmt = REPOSITORY_FORMAT_INIT;
|
||||
|
||||
strbuf_git_common_path(&sb, the_repository, "config");
|
||||
read_repository_format(&repo_fmt, sb.buf);
|
||||
strbuf_release(&sb);
|
||||
|
||||
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);
|
||||
strbuf_release(&err);
|
||||
return -1;
|
||||
}
|
||||
|
||||
strbuf_addf(&repo_version, "%d", target_version);
|
||||
git_config_set("core.repositoryformatversion", repo_version.buf);
|
||||
strbuf_release(&repo_version);
|
||||
return 1;
|
||||
}
|
||||
|
||||
static void init_repository_format(struct repository_format *format)
|
||||
{
|
||||
const struct repository_format fresh = REPOSITORY_FORMAT_INIT;
|
||||
|
||||
Reference in New Issue
Block a user