Optimize the common cases of git-read-tree
[gitweb.git] / builtin-init-db.c
index 66ddaebcc581e4c4bf4dfc66d4171cf988f0d815..0d9b1e0559d04ebda464d2975aaf196378eeb481 100644 (file)
@@ -174,36 +174,7 @@ static void copy_templates(const char *git_dir, int len, const char *template_di
        closedir(dir);
 }
 
-/*
- * Get the full path to the working tree specified in $GIT_WORK_TREE
- * or NULL if no working tree is specified.
- */
-static const char *get_work_tree(void)
-{
-       const char *git_work_tree;
-       char cwd[PATH_MAX];
-       static char worktree[PATH_MAX];
-
-       git_work_tree = getenv(GIT_WORK_TREE_ENVIRONMENT);
-       if (!git_work_tree)
-               return NULL;
-       if (!getcwd(cwd, sizeof(cwd)))
-               die("Unable to read current working directory");
-       if (chdir(git_work_tree))
-               die("Cannot change directory to specified working tree '%s'",
-                       git_work_tree);
-       if (git_work_tree[0] != '/') {
-               if (!getcwd(worktree, sizeof(worktree)))
-                       die("Unable to read current working directory");
-               git_work_tree = worktree;
-       }
-       if (chdir(cwd))
-               die("Cannot come back to cwd");
-       return git_work_tree;
-}
-
-static int create_default_files(const char *git_dir, const char *git_work_tree,
-       const char *template_path)
+static int create_default_files(const char *git_dir, const char *template_path)
 {
        unsigned len = strlen(git_dir);
        static char path[PATH_MAX];
@@ -282,16 +253,16 @@ static int create_default_files(const char *git_dir, const char *git_work_tree,
        }
        git_config_set("core.filemode", filemode ? "true" : "false");
 
-       if (is_bare_repository() && !git_work_tree) {
+       if (is_bare_repository())
                git_config_set("core.bare", "true");
-       }
        else {
+               const char *work_tree = get_git_work_tree();
                git_config_set("core.bare", "false");
                /* allow template config file to override the default */
                if (log_all_ref_updates == -1)
                    git_config_set("core.logallrefupdates", "true");
-               if (git_work_tree)
-                       git_config_set("core.worktree", git_work_tree);
+               if (work_tree != git_work_tree_cfg)
+                       git_config_set("core.worktree", work_tree);
        }
        return reinit;
 }
@@ -308,7 +279,6 @@ static const char init_db_usage[] =
 int cmd_init_db(int argc, const char **argv, const char *prefix)
 {
        const char *git_dir;
-       const char *git_work_tree;
        const char *sha1_dir;
        const char *template_dir = NULL;
        char *path;
@@ -329,7 +299,11 @@ int cmd_init_db(int argc, const char **argv, const char *prefix)
                        usage(init_db_usage);
        }
 
-       git_work_tree = get_work_tree();
+       git_work_tree_cfg = xcalloc(PATH_MAX, 1);
+       if (!getcwd(git_work_tree_cfg, PATH_MAX))
+               die ("Cannot access current working directory.");
+       if (access(get_git_work_tree(), X_OK))
+               die ("Cannot access work tree '%s'", get_git_work_tree());
 
        /*
         * Set up the default .git directory contents
@@ -346,7 +320,7 @@ int cmd_init_db(int argc, const char **argv, const char *prefix)
         */
        check_repository_format();
 
-       reinit = create_default_files(git_dir, git_work_tree, template_dir);
+       reinit = create_default_files(git_dir, template_dir);
 
        /*
         * And set up the object store.