Skip to content

Commit 8e29c7c

Browse files
jonathantanmygitster
authored andcommitted
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 <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent 096c9b8 commit 8e29c7c

File tree

1 file changed

+53
-46
lines changed

1 file changed

+53
-46
lines changed

builtin/index-pack.c

Lines changed: 53 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1389,15 +1389,58 @@ static void fix_unresolved_deltas(struct sha1file *f)
13891389
free(sorted_by_pos);
13901390
}
13911391

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+
13921437
static void final(const char *final_pack_name, const char *curr_pack_name,
13931438
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)
13961440
{
13971441
const char *report = "pack";
13981442
struct strbuf pack_name = STRBUF_INIT;
13991443
struct strbuf index_name = STRBUF_INIT;
1400-
struct strbuf keep_name_buf = STRBUF_INIT;
14011444
int err;
14021445

14031446
if (!from_stdin) {
@@ -1409,28 +1452,9 @@ static void final(const char *final_pack_name, const char *curr_pack_name,
14091452
die_errno(_("error while closing pack file"));
14101453
}
14111454

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);
14341458

14351459
if (final_pack_name != curr_pack_name) {
14361460
if (!final_pack_name)
@@ -1472,7 +1496,6 @@ static void final(const char *final_pack_name, const char *curr_pack_name,
14721496

14731497
strbuf_release(&index_name);
14741498
strbuf_release(&pack_name);
1475-
strbuf_release(&keep_name_buf);
14761499
}
14771500

14781501
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)
16151638
}
16161639
}
16171640

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-
16301641
int cmd_index_pack(int argc, const char **argv, const char *prefix)
16311642
{
16321643
int i, fix_thin_pack = 0, verify = 0, stat_only = 0;
16331644
const char *curr_index;
16341645
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;
16381648
struct pack_idx_entry **idx_objects;
16391649
struct pack_idx_option opts;
16401650
unsigned char pack_sha1[20];
@@ -1745,9 +1755,7 @@ int cmd_index_pack(int argc, const char **argv, const char *prefix)
17451755
if (from_stdin && !startup_info->have_repository)
17461756
die(_("--stdin requires a git repository"));
17471757
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);
17511759

17521760
if (verify) {
17531761
if (!index_name)
@@ -1795,13 +1803,12 @@ int cmd_index_pack(int argc, const char **argv, const char *prefix)
17951803
if (!verify)
17961804
final(pack_name, curr_pack,
17971805
index_name, curr_index,
1798-
keep_name, keep_msg,
1806+
keep_msg,
17991807
pack_sha1);
18001808
else
18011809
close(input_fd);
18021810
free(objects);
18031811
strbuf_release(&index_name_buf);
1804-
strbuf_release(&keep_name_buf);
18051812
if (pack_name == NULL)
18061813
free((void *) curr_pack);
18071814
if (index_name == NULL)

0 commit comments

Comments
 (0)