[PATCH] Ensure list insertion method does not depend on position of --merge-order...
[git.git] / sha1_file.c
index 8f20e2f..fd6096f 100644 (file)
@@ -102,9 +102,55 @@ char *get_index_file(void)
        return git_index_file;
 }
 
+char *git_path(const char *fmt, ...)
+{
+       static char pathname[PATH_MAX], *ret;
+       va_list args;
+       int len;
+
+       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++;
+       }
+       return ret;
+}
+
+int safe_create_leading_directories(char *path)
+{
+       char *pos = path;
+
+       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)
 {
-       static char pathname[PATH_MAX];
        static const char *prefix[] = {
                "",
                "refs",
@@ -118,11 +164,8 @@ int get_sha1(const char *str, unsigned char *sha1)
        if (!get_sha1_hex(str, sha1))
                return 0;
 
-       if (!git_dir)
-               setup_git_env();
        for (p = prefix; *p; p++) {
-               snprintf(pathname, sizeof(pathname), "%s/%s/%s",
-                        git_dir, *p, str);
+               char * pathname = git_path("%s/%s", *p, str);
                if (!get_sha1_file(pathname, sha1))
                        return 0;
        }
@@ -439,6 +482,7 @@ static void prepare_packed_git_one(char *objdir)
                p->next = packed_git;
                packed_git = p;
        }
+       closedir(dir);
 }
 
 void prepare_packed_git(void)