@@ -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+
13921437static 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
14781501static 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-
16301641int 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