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)