]> git.ipfire.org Git - thirdparty/git.git/blobdiff - setup.c
The sixth batch
[thirdparty/git.git] / setup.c
diff --git a/setup.c b/setup.c
index 65fe5ecefbe196eba04070978bc668b9af17257d..eb066db6d8c123da03e8992db84a3e562bed8fd3 100644 (file)
--- a/setup.c
+++ b/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
@@ -506,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) {
@@ -538,6 +545,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;