Code

Don't dereference NULL upon lookup failure.
[git.git] / setup.c
diff --git a/setup.c b/setup.c
index 067f1be3f92c9f3a334c4b427f32b4f4fdb8225b..b59dbe7f51e8ffcbf2721d2ec7201400830e6830 100644 (file)
--- a/setup.c
+++ b/setup.c
@@ -59,7 +59,7 @@ const char *prefix_path(const char *prefix, int len, const char *path)
 const char *prefix_filename(const char *pfx, int pfx_len, const char *arg)
 {
        static char path[PATH_MAX];
-       if (!pfx || !*pfx || arg[0] == '/')
+       if (!pfx || !*pfx || is_absolute_path(arg))
                return arg;
        memcpy(path, pfx, pfx_len);
        strcpy(path + pfx_len, arg);
@@ -206,6 +206,22 @@ static const char *set_work_tree(const char *dir)
        return NULL;
 }
 
+void setup_work_tree(void)
+{
+       const char *work_tree, *git_dir;
+       static int initialized = 0;
+
+       if (initialized)
+               return;
+       work_tree = get_git_work_tree();
+       git_dir = get_git_dir();
+       if (!is_absolute_path(git_dir))
+               set_git_dir(make_absolute_path(git_dir));
+       if (!work_tree || chdir(work_tree))
+               die("This operation must be run in a work tree");
+       initialized = 1;
+}
+
 static int check_repository_format_gently(int *nongit_ok)
 {
        git_config(check_repository_format_version);
@@ -372,7 +388,6 @@ int check_repository_format(void)
 const char *setup_git_directory(void)
 {
        const char *retval = setup_git_directory_gently(NULL);
-       check_repository_format();
 
        /* If the work tree is not the default one, recompute prefix */
        if (inside_work_tree < 0) {