@@ -1389,15 +1389,60 @@ 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+ if (report )
1433+ * report = suffix ;
1434+ }
1435+ strbuf_release (& name_buf );
1436+ }
1437+
13921438static void final (const char * final_pack_name , const char * curr_pack_name ,
13931439 const char * final_index_name , const char * curr_index_name ,
1394- const char * keep_name , const char * keep_msg ,
1440+ const char * keep_msg , const char * promisor_msg ,
13951441 unsigned char * sha1 )
13961442{
13971443 const char * report = "pack" ;
13981444 struct strbuf pack_name = STRBUF_INIT ;
13991445 struct strbuf index_name = STRBUF_INIT ;
1400- struct strbuf keep_name_buf = STRBUF_INIT ;
14011446 int err ;
14021447
14031448 if (!from_stdin ) {
@@ -1409,28 +1454,12 @@ static void final(const char *final_pack_name, const char *curr_pack_name,
14091454 die_errno (_ ("error while closing pack file" ));
14101455 }
14111456
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- }
1457+ if (keep_msg )
1458+ write_special_file ("keep" , keep_msg , final_pack_name , sha1 ,
1459+ & report );
1460+ if (promisor_msg )
1461+ write_special_file ("promisor" , promisor_msg , final_pack_name ,
1462+ sha1 , NULL );
14341463
14351464 if (final_pack_name != curr_pack_name ) {
14361465 if (!final_pack_name )
@@ -1472,7 +1501,6 @@ static void final(const char *final_pack_name, const char *curr_pack_name,
14721501
14731502 strbuf_release (& index_name );
14741503 strbuf_release (& pack_name );
1475- strbuf_release (& keep_name_buf );
14761504}
14771505
14781506static int git_index_pack_config (const char * k , const char * v , void * cb )
@@ -1615,32 +1643,26 @@ static void show_pack_info(int stat_only)
16151643 }
16161644}
16171645
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-
16301646int cmd_index_pack (int argc , const char * * argv , const char * prefix )
16311647{
16321648 int i , fix_thin_pack = 0 , verify = 0 , stat_only = 0 ;
16331649 const char * curr_index ;
16341650 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 ;
1651+ const char * keep_msg = NULL ;
1652+ const char * promisor_msg = NULL ;
1653+ struct strbuf index_name_buf = STRBUF_INIT ;
16381654 struct pack_idx_entry * * idx_objects ;
16391655 struct pack_idx_option opts ;
16401656 unsigned char pack_sha1 [20 ];
16411657 unsigned foreign_nr = 1 ; /* zero is a "good" value, assume bad */
16421658 int report_end_of_input = 0 ;
16431659
1660+ /*
1661+ * index-pack never needs to fetch missing objects, since it only
1662+ * accesses the repo to do hash collision checks
1663+ */
1664+ fetch_if_missing = 0 ;
1665+
16441666 if (argc == 2 && !strcmp (argv [1 ], "-h" ))
16451667 usage (index_pack_usage );
16461668
@@ -1678,6 +1700,8 @@ int cmd_index_pack(int argc, const char **argv, const char *prefix)
16781700 stat_only = 1 ;
16791701 } else if (skip_to_optional_arg (arg , "--keep" , & keep_msg )) {
16801702 ; /* nothing to do */
1703+ } else if (skip_to_optional_arg (arg , "--promisor" , & promisor_msg )) {
1704+ ; /* already parsed */
16811705 } else if (starts_with (arg , "--threads=" )) {
16821706 char * end ;
16831707 nr_threads = strtoul (arg + 10 , & end , 0 );
@@ -1740,9 +1764,7 @@ int cmd_index_pack(int argc, const char **argv, const char *prefix)
17401764 if (from_stdin && !startup_info -> have_repository )
17411765 die (_ ("--stdin requires a git repository" ));
17421766 if (!index_name && pack_name )
1743- index_name = derive_filename (pack_name , ".idx" , & index_name_buf );
1744- if (keep_msg && !keep_name && pack_name )
1745- keep_name = derive_filename (pack_name , ".keep" , & keep_name_buf );
1767+ index_name = derive_filename (pack_name , "idx" , & index_name_buf );
17461768
17471769 if (verify ) {
17481770 if (!index_name )
@@ -1790,13 +1812,12 @@ int cmd_index_pack(int argc, const char **argv, const char *prefix)
17901812 if (!verify )
17911813 final (pack_name , curr_pack ,
17921814 index_name , curr_index ,
1793- keep_name , keep_msg ,
1815+ keep_msg , promisor_msg ,
17941816 pack_sha1 );
17951817 else
17961818 close (input_fd );
17971819 free (objects );
17981820 strbuf_release (& index_name_buf );
1799- strbuf_release (& keep_name_buf );
18001821 if (pack_name == NULL )
18011822 free ((void * ) curr_pack );
18021823 if (index_name == NULL )
0 commit comments