index-pack: refactor writing of .keep files

In a subsequent commit, index-pack will be taught to write ".promisor" files which are similar to the ".keep" files it knows how to write. Refactor the writing of ".keep" files, so that the implementation of writing ".promisor" files becomes easier. Signed-off-by: Jonathan Tan <jonathantanmy@google.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Jonathan Tan committed Dec 5, 2017 at 16:58 UTC 8e29c7c3af0b27271769052d758d818b149f45c9
1 file changed +53 -46
builtin/index-pack.c
+53 -46
@@ -1389,15 +1389,58 @@ static void fix_unresolved_deltas(struct sha1file *f)
1389 free(sorted_by_pos);
1390 }
1391
1392 +static const char *derive_filename(const char *pack_name, const char *suffix,
1393 + struct strbuf *buf)
1394 +{
1395 + size_t len;
1396 + if (!strip_suffix(pack_name, ".pack", &len))
1397 + die(_("packfile name '%s' does not end with '.pack'"),
1398 + pack_name);
1399 + strbuf_add(buf, pack_name, len);
1400 + strbuf_addch(buf, '.');
1401 + strbuf_addstr(buf, suffix);
1402 + return buf->buf;
1403 +}
1404 +
1405 +static void write_special_file(const char *suffix, const char *msg,
1406 + const char *pack_name, const unsigned char *sha1,
1407 + const char **report)
1408 +{
1409 + struct strbuf name_buf = STRBUF_INIT;
1410 + const char *filename;
1411 + int fd;
1412 + int msg_len = strlen(msg);
1413 +
1414 + if (pack_name)
1415 + filename = derive_filename(pack_name, suffix, &name_buf);
1416 + else
1417 + filename = odb_pack_name(&name_buf, sha1, suffix);
1418 +
1419 + fd = odb_pack_keep(filename);
1420 + if (fd < 0) {
1421 + if (errno != EEXIST)
1422 + die_errno(_("cannot write %s file '%s'"),
1423 + suffix, filename);
1424 + } else {
1425 + if (msg_len > 0) {
1426 + write_or_die(fd, msg, msg_len);
1427 + write_or_die(fd, "\n", 1);
1428 + }
1429 + if (close(fd) != 0)
1430 + die_errno(_("cannot close written %s file '%s'"),
1431 + suffix, filename);
1432 + *report = suffix;
1433 + }
1434 + strbuf_release(&name_buf);
1435 +}
1436 +
1437 static void final(const char *final_pack_name, const char *curr_pack_name,
1438 const char *final_index_name, const char *curr_index_name,
1394 - const char *keep_name, const char *keep_msg,
1395 - unsigned char *sha1)
1439 + const char *keep_msg, unsigned char *sha1)
1440 {
1441 const char *report = "pack";
1442 struct strbuf pack_name = STRBUF_INIT;
1443 struct strbuf index_name = STRBUF_INIT;
1400 - struct strbuf keep_name_buf = STRBUF_INIT;
1444 int err;
1445
1446 if (!from_stdin) {
@@ -1409,28 +1452,9 @@ static void final(const char *final_pack_name, const char *curr_pack_name,
1452 die_errno(_("error while closing pack file"));
1453 }
1454
1412 - if (keep_msg) {
1413 - int keep_fd, keep_msg_len = strlen(keep_msg);
1414 -
1415 - if (!keep_name)
1416 - keep_name = odb_pack_name(&keep_name_buf, sha1, "keep");
1417 -
1418 - keep_fd = odb_pack_keep(keep_name);
1419 - if (keep_fd < 0) {
1420 - if (errno != EEXIST)
1421 - die_errno(_("cannot write keep file '%s'"),
1422 - keep_name);
1423 - } else {
1424 - if (keep_msg_len > 0) {
1425 - write_or_die(keep_fd, keep_msg, keep_msg_len);
1426 - write_or_die(keep_fd, "\n", 1);
1427 - }
1428 - if (close(keep_fd) != 0)
1429 - die_errno(_("cannot close written keep file '%s'"),
1430 - keep_name);
1431 - report = "keep";
1432 - }
1433 - }
1455 + if (keep_msg)
1456 + write_special_file("keep", keep_msg, final_pack_name, sha1,
1457 + &report);
1458
1459 if (final_pack_name != curr_pack_name) {
1460 if (!final_pack_name)
@@ -1472,7 +1496,6 @@ static void final(const char *final_pack_name, const char *curr_pack_name,
1496
1497 strbuf_release(&index_name);
1498 strbuf_release(&pack_name);
1475 - strbuf_release(&keep_name_buf);
1499 }
1500
1501 static int git_index_pack_config(const char *k, const char *v, void *cb)
@@ -1615,26 +1638,13 @@ static void show_pack_info(int stat_only)
1638 }
1639 }
1640
1618 -static const char *derive_filename(const char *pack_name, const char *suffix,
1619 - struct strbuf *buf)
1620 -{
1621 - size_t len;
1622 - if (!strip_suffix(pack_name, ".pack", &len))
1623 - die(_("packfile name '%s' does not end with '.pack'"),
1624 - pack_name);
1625 - strbuf_add(buf, pack_name, len);
1626 - strbuf_addstr(buf, suffix);
1627 - return buf->buf;
1628 -}
1629 -
1641 int cmd_index_pack(int argc, const char **argv, const char *prefix)
1642 {
1643 int i, fix_thin_pack = 0, verify = 0, stat_only = 0;
1644 const char *curr_index;
1645 const char *index_name = NULL, *pack_name = NULL;
1635 - const char *keep_name = NULL, *keep_msg = NULL;
1636 - struct strbuf index_name_buf = STRBUF_INIT,
1637 - keep_name_buf = STRBUF_INIT;
1646 + const char *keep_msg = NULL;
1647 + struct strbuf index_name_buf = STRBUF_INIT;
1648 struct pack_idx_entry **idx_objects;
1649 struct pack_idx_option opts;
1650 unsigned char pack_sha1[20];
@@ -1745,9 +1755,7 @@ int cmd_index_pack(int argc, const char **argv, const char *prefix)
1755 if (from_stdin && !startup_info->have_repository)
1756 die(_("--stdin requires a git repository"));
1757 if (!index_name && pack_name)
1748 - index_name = derive_filename(pack_name, ".idx", &index_name_buf);
1749 - if (keep_msg && !keep_name && pack_name)
1750 - keep_name = derive_filename(pack_name, ".keep", &keep_name_buf);
1758 + index_name = derive_filename(pack_name, "idx", &index_name_buf);
1759
1760 if (verify) {
1761 if (!index_name)
@@ -1795,13 +1803,12 @@ int cmd_index_pack(int argc, const char **argv, const char *prefix)
1803 if (!verify)
1804 final(pack_name, curr_pack,
1805 index_name, curr_index,
1798 - keep_name, keep_msg,
1806 + keep_msg,
1807 pack_sha1);
1808 else
1809 close(input_fd);
1810 free(objects);
1811 strbuf_release(&index_name_buf);
1804 - strbuf_release(&keep_name_buf);
1812 if (pack_name == NULL)
1813 free((void *) curr_pack);
1814 if (index_name == NULL)