worktree.c: check whether branch is rebased in another worktree
[gitweb.git] / setup.c
diff --git a/setup.c b/setup.c
index 8aa49a9570e8de9bb86ee23a60873d5b1525bd36..1563cd42df2865d9f4390c9e68cdc666b45fcf96 100644 (file)
--- a/setup.c
+++ b/setup.c
@@ -6,6 +6,9 @@ static int inside_git_dir = -1;
 static int inside_work_tree = -1;
 static int work_tree_config_is_bogus;
 
+static struct startup_info the_startup_info;
+struct startup_info *startup_info = &the_startup_info;
+
 /*
  * The input parameter must contain an absolute path, and it must already be
  * normalized.
@@ -388,27 +391,26 @@ static int check_repo_format(const char *var, const char *value, void *vdata)
                        data->precious_objects = git_config_bool(var, value);
                else
                        string_list_append(&data->unknown_extensions, ext);
+       } else if (strcmp(var, "core.bare") == 0) {
+               data->is_bare = git_config_bool(var, value);
+       } else if (strcmp(var, "core.worktree") == 0) {
+               if (!value)
+                       return config_error_nonbool(var);
+               data->work_tree = xstrdup(value);
        }
        return 0;
 }
 
-static int read_repository_format_1(struct repository_format *, config_fn_t,
-                                   const char *);
-
 static int check_repository_format_gently(const char *gitdir, int *nongit_ok)
 {
        struct strbuf sb = STRBUF_INIT;
        struct strbuf err = STRBUF_INIT;
        struct repository_format candidate;
-       config_fn_t fn;
-
-       if (get_common_dir(&sb, gitdir))
-               fn = check_repo_format;
-       else
-               fn = check_repository_format_version;
+       int has_common;
 
+       has_common = get_common_dir(&sb, gitdir);
        strbuf_addstr(&sb, "/config");
-       read_repository_format_1(&candidate, fn, sb.buf);
+       read_repository_format(&candidate, sb.buf);
        strbuf_release(&sb);
 
        /*
@@ -429,44 +431,41 @@ static int check_repository_format_gently(const char *gitdir, int *nongit_ok)
                die("%s", err.buf);
        }
 
-       repository_format_version = candidate.version;
        repository_format_precious_objects = candidate.precious_objects;
        string_list_clear(&candidate.unknown_extensions, 0);
-       if (candidate.is_bare != -1) {
-               is_bare_repository_cfg = candidate.is_bare;
-               if (is_bare_repository_cfg == 1)
+       if (!has_common) {
+               if (candidate.is_bare != -1) {
+                       is_bare_repository_cfg = candidate.is_bare;
+                       if (is_bare_repository_cfg == 1)
+                               inside_work_tree = -1;
+               }
+               if (candidate.work_tree) {
+                       free(git_work_tree_cfg);
+                       git_work_tree_cfg = candidate.work_tree;
                        inside_work_tree = -1;
-       }
-       if (candidate.work_tree) {
-               free(git_work_tree_cfg);
-               git_work_tree_cfg = candidate.work_tree;
-               inside_work_tree = -1;
+               }
+       } else {
+               free(candidate.work_tree);
        }
 
        return 0;
 }
 
-static int read_repository_format_1(struct repository_format *format,
-                                   config_fn_t fn, const char *path)
+int read_repository_format(struct repository_format *format, const char *path)
 {
        memset(format, 0, sizeof(*format));
        format->version = -1;
        format->is_bare = -1;
        string_list_init(&format->unknown_extensions, 1);
-       git_config_from_file(fn, path, format);
+       git_config_from_file(check_repo_format, path, format);
        return format->version;
 }
 
-int read_repository_format(struct repository_format *format, const char *path)
-{
-       return read_repository_format_1(format, check_repository_format_version, path);
-}
-
 int verify_repository_format(const struct repository_format *format,
                             struct strbuf *err)
 {
        if (GIT_REPO_VERSION_READ < format->version) {
-               strbuf_addf(err, "Expected git repo version <= %d, found %d",
+               strbuf_addf(err, _("Expected git repo version <= %d, found %d"),
                            GIT_REPO_VERSION_READ, format->version);
                return -1;
        }
@@ -474,7 +473,7 @@ int verify_repository_format(const struct repository_format *format,
        if (format->version >= 1 && format->unknown_extensions.nr) {
                int i;
 
-               strbuf_addstr(err, "unknown repository extensions found:");
+               strbuf_addstr(err, _("unknown repository extensions found:"));
 
                for (i = 0; i < format->unknown_extensions.nr; i++)
                        strbuf_addf(err, "\n\t%s",
@@ -941,10 +940,9 @@ const char *setup_git_directory_gently(int *nongit_ok)
        else
                setenv(GIT_PREFIX_ENVIRONMENT, "", 1);
 
-       if (startup_info) {
-               startup_info->have_repository = !nongit_ok || !*nongit_ok;
-               startup_info->prefix = prefix;
-       }
+       startup_info->have_repository = !nongit_ok || !*nongit_ok;
+       startup_info->prefix = prefix;
+
        return prefix;
 }
 
@@ -999,25 +997,10 @@ int git_config_perm(const char *var, const char *value)
        return -(i & 0666);
 }
 
-int check_repository_format_version(const char *var, const char *value, void *cb)
-{
-       struct repository_format *data = cb;
-       int ret = check_repo_format(var, value, cb);
-       if (ret)
-               return ret;
-       if (strcmp(var, "core.bare") == 0) {
-               data->is_bare = git_config_bool(var, value);
-       } else if (strcmp(var, "core.worktree") == 0) {
-               if (!value)
-                       return config_error_nonbool(var);
-               data->work_tree = xstrdup(value);
-       }
-       return 0;
-}
-
 void check_repository_format(void)
 {
        check_repository_format_gently(get_git_dir(), NULL);
+       startup_info->have_repository = 1;
 }
 
 /*