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)
p->next = packed_git;
packed_git = p;
}
+ closedir(dir);
}
void prepare_packed_git(void)
}
}
-static char *write_sha1_file_prepare(void *buf,
- unsigned long len,
- const char *type,
- unsigned char *sha1,
- unsigned char *hdr,
- int *hdrlen)
+char *write_sha1_file_prepare(void *buf,
+ unsigned long len,
+ const char *type,
+ unsigned char *sha1,
+ unsigned char *hdr,
+ int *hdrlen)
{
SHA_CTX c;
return find_pack_entry(sha1, &e);
}
-int index_fd(unsigned char *sha1, int fd, struct stat *st)
+int index_fd(unsigned char *sha1, int fd, struct stat *st, int write_object, const char *type)
{
unsigned long size = st->st_size;
void *buf;
int ret;
+ unsigned char hdr[50];
+ int hdrlen;
buf = "";
if (size)
if ((int)(long)buf == -1)
return -1;
- ret = write_sha1_file(buf, size, "blob", sha1);
+ if (!type)
+ type = "blob";
+ if (write_object)
+ ret = write_sha1_file(buf, size, type, sha1);
+ else {
+ write_sha1_file_prepare(buf, size, type, sha1, hdr, &hdrlen);
+ ret = 0;
+ }
if (size)
munmap(buf, size);
return ret;