]> asedeno.scripts.mit.edu Git - git.git/blobdiff - sha1_file.c
Add "mkpath()" helper function
[git.git] / sha1_file.c
index 74dc2aab26c0e9f87e9238686ad0a077b1570d4a..fc4e6bf91f1b402f2e69c1521498551d5e82acb4 100644 (file)
@@ -102,26 +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];
-       va_list args;
-       int len;
+       char *pos = path;
 
-       if (!git_dir)
-               setup_git_env();
-       len = strlen(git_dir);
-       if (len == 1 && *git_dir == '.')
-               len = 0;
-       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);
-       return pathname;
+       while (pos) {
+               pos = strchr(pos, '/');
+               if (!pos)
+                       break;
+               *pos = 0;
+               if (mkdir(path, 0777) < 0)
+                       if (errno != EEXIST) {
+                               *pos = '/';
+                               return -1;
+                       }
+               *pos++ = '/';
+       }
+       return 0;
 }
 
 int get_sha1(const char *str, unsigned char *sha1)
@@ -457,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)