X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=pack-write.c;h=665e2b29b8817aa6a8aa83ccd859ab51e7bb2234;hb=4f395eed33816be70181a818cbce4bb7235b83be;hp=1cf5f7c9f0956a457de03c64238d298a9d996984;hpb=db1a4bc168f951ba23eba5bbcdb42fc683feb657;p=git.git diff --git a/pack-write.c b/pack-write.c index 1cf5f7c9f..665e2b29b 100644 --- a/pack-write.c +++ b/pack-write.c @@ -17,7 +17,8 @@ static int sha1_compare(const void *_a, const void *_b) * the SHA1 hash of sorted object names. The objects array passed in * will be sorted by SHA1 on exit. */ -const char *write_idx_file(const char *index_name, struct pack_idx_entry **objects, int nr_objects, unsigned char *sha1) +char *write_idx_file(char *index_name, struct pack_idx_entry **objects, + int nr_objects, unsigned char *sha1) { struct sha1file *f; struct pack_idx_entry **sorted_by_sha, **list, **last; @@ -45,7 +46,7 @@ const char *write_idx_file(const char *index_name, struct pack_idx_entry **objec static char tmpfile[PATH_MAX]; snprintf(tmpfile, sizeof(tmpfile), "%s/tmp_idx_XXXXXX", get_object_directory()); - fd = mkstemp(tmpfile); + fd = xmkstemp(tmpfile); index_name = xstrdup(tmpfile); } else { unlink(index_name); @@ -179,3 +180,29 @@ void fixup_pack_header_footer(int pack_fd, SHA1_Final(pack_file_sha1, &c); write_or_die(pack_fd, pack_file_sha1, 20); } + +char *index_pack_lockfile(int ip_out) +{ + int len, s; + char packname[46]; + + /* + * The first thing we expects from index-pack's output + * is "pack\t%40s\n" or "keep\t%40s\n" (46 bytes) where + * %40s is the newly created pack SHA1 name. In the "keep" + * case, we need it to remove the corresponding .keep file + * later on. If we don't get that then tough luck with it. + */ + for (len = 0; + len < 46 && (s = xread(ip_out, packname+len, 46-len)) > 0; + len += s); + if (len == 46 && packname[45] == '\n' && + memcmp(packname, "keep\t", 5) == 0) { + char path[PATH_MAX]; + packname[45] = 0; + snprintf(path, sizeof(path), "%s/pack/pack-%s.keep", + get_object_directory(), packname + 5); + return xstrdup(path); + } + return NULL; +}