1717#include "promisor-remote.h"
1818
1919static const char index_pack_usage [] =
20- "git index-pack [-v] [-o <index-file>] [--keep | --keep=<msg>] [--verify] [--strict] (<pack-file> | --stdin [--fix-thin] [<pack-file>])" ;
20+ "git index-pack [-v] [-o <index-file>] [--keep | --keep=<msg>] [--[no-]rev-index] [-- verify] [--strict] (<pack-file> | --stdin [--fix-thin] [<pack-file>])" ;
2121
2222struct object_entry {
2323 struct pack_idx_entry idx ;
@@ -1484,12 +1484,14 @@ static void write_special_file(const char *suffix, const char *msg,
14841484
14851485static void final (const char * final_pack_name , const char * curr_pack_name ,
14861486 const char * final_index_name , const char * curr_index_name ,
1487+ const char * final_rev_index_name , const char * curr_rev_index_name ,
14871488 const char * keep_msg , const char * promisor_msg ,
14881489 unsigned char * hash )
14891490{
14901491 const char * report = "pack" ;
14911492 struct strbuf pack_name = STRBUF_INIT ;
14921493 struct strbuf index_name = STRBUF_INIT ;
1494+ struct strbuf rev_index_name = STRBUF_INIT ;
14931495 int err ;
14941496
14951497 if (!from_stdin ) {
@@ -1524,6 +1526,16 @@ static void final(const char *final_pack_name, const char *curr_pack_name,
15241526 } else
15251527 chmod (final_index_name , 0444 );
15261528
1529+ if (curr_rev_index_name ) {
1530+ if (final_rev_index_name != curr_rev_index_name ) {
1531+ if (!final_rev_index_name )
1532+ final_rev_index_name = odb_pack_name (& rev_index_name , hash , "rev" );
1533+ if (finalize_object_file (curr_rev_index_name , final_rev_index_name ))
1534+ die (_ ("cannot store reverse index file" ));
1535+ } else
1536+ chmod (final_rev_index_name , 0444 );
1537+ }
1538+
15271539 if (do_fsck_object ) {
15281540 struct packed_git * p ;
15291541 p = add_packed_git (final_index_name , strlen (final_index_name ), 0 );
@@ -1553,6 +1565,7 @@ static void final(const char *final_pack_name, const char *curr_pack_name,
15531565 }
15541566 }
15551567
1568+ strbuf_release (& rev_index_name );
15561569 strbuf_release (& index_name );
15571570 strbuf_release (& pack_name );
15581571}
@@ -1578,6 +1591,12 @@ static int git_index_pack_config(const char *k, const char *v, void *cb)
15781591 }
15791592 return 0 ;
15801593 }
1594+ if (!strcmp (k , "pack.writereverseindex" )) {
1595+ if (git_config_bool (k , v ))
1596+ opts -> flags |= WRITE_REV ;
1597+ else
1598+ opts -> flags &= ~WRITE_REV ;
1599+ }
15811600 return git_default_config (k , v , cb );
15821601}
15831602
@@ -1695,12 +1714,14 @@ static void show_pack_info(int stat_only)
16951714
16961715int cmd_index_pack (int argc , const char * * argv , const char * prefix )
16971716{
1698- int i , fix_thin_pack = 0 , verify = 0 , stat_only = 0 ;
1717+ int i , fix_thin_pack = 0 , verify = 0 , stat_only = 0 , rev_index ;
16991718 const char * curr_index ;
1700- const char * index_name = NULL , * pack_name = NULL ;
1719+ const char * curr_rev_index = NULL ;
1720+ const char * index_name = NULL , * pack_name = NULL , * rev_index_name = NULL ;
17011721 const char * keep_msg = NULL ;
17021722 const char * promisor_msg = NULL ;
17031723 struct strbuf index_name_buf = STRBUF_INIT ;
1724+ struct strbuf rev_index_name_buf = STRBUF_INIT ;
17041725 struct pack_idx_entry * * idx_objects ;
17051726 struct pack_idx_option opts ;
17061727 unsigned char pack_hash [GIT_MAX_RAWSZ ];
@@ -1727,6 +1748,8 @@ int cmd_index_pack(int argc, const char **argv, const char *prefix)
17271748 if (prefix && chdir (prefix ))
17281749 die (_ ("Cannot come back to cwd" ));
17291750
1751+ rev_index = !!(opts .flags & (WRITE_REV_VERIFY | WRITE_REV ));
1752+
17301753 for (i = 1 ; i < argc ; i ++ ) {
17311754 const char * arg = argv [i ];
17321755
@@ -1805,6 +1828,10 @@ int cmd_index_pack(int argc, const char **argv, const char *prefix)
18051828 if (hash_algo == GIT_HASH_UNKNOWN )
18061829 die (_ ("unknown hash algorithm '%s'" ), arg );
18071830 repo_set_hash_algo (the_repository , hash_algo );
1831+ } else if (!strcmp (arg , "--rev-index" )) {
1832+ rev_index = 1 ;
1833+ } else if (!strcmp (arg , "--no-rev-index" )) {
1834+ rev_index = 0 ;
18081835 } else
18091836 usage (index_pack_usage );
18101837 continue ;
@@ -1826,6 +1853,15 @@ int cmd_index_pack(int argc, const char **argv, const char *prefix)
18261853 if (!index_name && pack_name )
18271854 index_name = derive_filename (pack_name , "pack" , "idx" , & index_name_buf );
18281855
1856+ opts .flags &= ~(WRITE_REV | WRITE_REV_VERIFY );
1857+ if (rev_index ) {
1858+ opts .flags |= verify ? WRITE_REV_VERIFY : WRITE_REV ;
1859+ if (index_name )
1860+ rev_index_name = derive_filename (index_name ,
1861+ "idx" , "rev" ,
1862+ & rev_index_name_buf );
1863+ }
1864+
18291865 if (verify ) {
18301866 if (!index_name )
18311867 die (_ ("--verify with no packfile name given" ));
@@ -1878,11 +1914,16 @@ int cmd_index_pack(int argc, const char **argv, const char *prefix)
18781914 for (i = 0 ; i < nr_objects ; i ++ )
18791915 idx_objects [i ] = & objects [i ].idx ;
18801916 curr_index = write_idx_file (index_name , idx_objects , nr_objects , & opts , pack_hash );
1917+ if (rev_index )
1918+ curr_rev_index = write_rev_file (rev_index_name , idx_objects ,
1919+ nr_objects , pack_hash ,
1920+ opts .flags );
18811921 free (idx_objects );
18821922
18831923 if (!verify )
18841924 final (pack_name , curr_pack ,
18851925 index_name , curr_index ,
1926+ rev_index_name , curr_rev_index ,
18861927 keep_msg , promisor_msg ,
18871928 pack_hash );
18881929 else
@@ -1893,10 +1934,13 @@ int cmd_index_pack(int argc, const char **argv, const char *prefix)
18931934
18941935 free (objects );
18951936 strbuf_release (& index_name_buf );
1937+ strbuf_release (& rev_index_name_buf );
18961938 if (pack_name == NULL )
18971939 free ((void * ) curr_pack );
18981940 if (index_name == NULL )
18991941 free ((void * ) curr_index );
1942+ if (rev_index_name == NULL )
1943+ free ((void * ) curr_rev_index );
19001944
19011945 /*
19021946 * Let the caller know this pack is not self contained
0 commit comments