]> asedeno.scripts.mit.edu Git - git.git/blobdiff - sha1_file.c
Add "mkpath()" helper function
[git.git] / sha1_file.c
index bbb749c561ebfe6cff8240f99b8902e526dda368..fc4e6bf91f1b402f2e69c1521498551d5e82acb4 100644 (file)
@@ -102,32 +102,23 @@ char *get_index_file(void)
        return git_index_file;
 }
 
-char *git_path(const char *fmt, ...)
+int safe_create_leading_directories(char *path)
 {
-       static char pathname[PATH_MAX], *ret;
-       va_list args;
-       int len;
+       char *pos = path;
 
-       if (!git_dir)
-               setup_git_env();
-       len = strlen(git_dir);
-       if (len > PATH_MAX-100)
-               return "pad-path";
-       memcpy(pathname, git_dir, len);
-       if (len && git_dir[len-1] != '/')
-               pathname[len++] = '/';
-       va_start(args, fmt);
-       vsnprintf(pathname + len, sizeof(pathname) - len, fmt, args);
-       va_end(args);
-       ret = pathname;
-
-       /* Clean it up */
-       if (!memcmp(pathname, "./", 2)) {
-               ret += 2;
-               while (*ret == '/')
-                       ret++;
+       while (pos) {
+               pos = strchr(pos, '/');
+               if (!pos)
+                       break;
+               *pos = 0;
+               if (mkdir(path, 0777) < 0)
+                       if (errno != EEXIST) {
+                               *pos = '/';
+                               return -1;
+                       }
+               *pos++ = '/';
        }
-       return ret;
+       return 0;
 }
 
 int get_sha1(const char *str, unsigned char *sha1)
@@ -463,6 +454,7 @@ static void prepare_packed_git_one(char *objdir)
                p->next = packed_git;
                packed_git = p;
        }
+       closedir(dir);
 }
 
 void prepare_packed_git(void)