17
17
#include "promisor-remote.h"
18
18
19
19
static 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>])" ;
21
21
22
22
struct object_entry {
23
23
struct pack_idx_entry idx ;
@@ -1484,12 +1484,14 @@ static void write_special_file(const char *suffix, const char *msg,
1484
1484
1485
1485
static void final (const char * final_pack_name , const char * curr_pack_name ,
1486
1486
const char * final_index_name , const char * curr_index_name ,
1487
+ const char * final_rev_index_name , const char * curr_rev_index_name ,
1487
1488
const char * keep_msg , const char * promisor_msg ,
1488
1489
unsigned char * hash )
1489
1490
{
1490
1491
const char * report = "pack" ;
1491
1492
struct strbuf pack_name = STRBUF_INIT ;
1492
1493
struct strbuf index_name = STRBUF_INIT ;
1494
+ struct strbuf rev_index_name = STRBUF_INIT ;
1493
1495
int err ;
1494
1496
1495
1497
if (!from_stdin ) {
@@ -1524,6 +1526,16 @@ static void final(const char *final_pack_name, const char *curr_pack_name,
1524
1526
} else
1525
1527
chmod (final_index_name , 0444 );
1526
1528
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
+
1527
1539
if (do_fsck_object ) {
1528
1540
struct packed_git * p ;
1529
1541
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,
1553
1565
}
1554
1566
}
1555
1567
1568
+ strbuf_release (& rev_index_name );
1556
1569
strbuf_release (& index_name );
1557
1570
strbuf_release (& pack_name );
1558
1571
}
@@ -1578,6 +1591,12 @@ static int git_index_pack_config(const char *k, const char *v, void *cb)
1578
1591
}
1579
1592
return 0 ;
1580
1593
}
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
+ }
1581
1600
return git_default_config (k , v , cb );
1582
1601
}
1583
1602
@@ -1695,12 +1714,14 @@ static void show_pack_info(int stat_only)
1695
1714
1696
1715
int cmd_index_pack (int argc , const char * * argv , const char * prefix )
1697
1716
{
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 ;
1699
1718
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 ;
1701
1721
const char * keep_msg = NULL ;
1702
1722
const char * promisor_msg = NULL ;
1703
1723
struct strbuf index_name_buf = STRBUF_INIT ;
1724
+ struct strbuf rev_index_name_buf = STRBUF_INIT ;
1704
1725
struct pack_idx_entry * * idx_objects ;
1705
1726
struct pack_idx_option opts ;
1706
1727
unsigned char pack_hash [GIT_MAX_RAWSZ ];
@@ -1727,6 +1748,8 @@ int cmd_index_pack(int argc, const char **argv, const char *prefix)
1727
1748
if (prefix && chdir (prefix ))
1728
1749
die (_ ("Cannot come back to cwd" ));
1729
1750
1751
+ rev_index = !!(opts .flags & (WRITE_REV_VERIFY | WRITE_REV ));
1752
+
1730
1753
for (i = 1 ; i < argc ; i ++ ) {
1731
1754
const char * arg = argv [i ];
1732
1755
@@ -1805,6 +1828,10 @@ int cmd_index_pack(int argc, const char **argv, const char *prefix)
1805
1828
if (hash_algo == GIT_HASH_UNKNOWN )
1806
1829
die (_ ("unknown hash algorithm '%s'" ), arg );
1807
1830
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 ;
1808
1835
} else
1809
1836
usage (index_pack_usage );
1810
1837
continue ;
@@ -1826,6 +1853,15 @@ int cmd_index_pack(int argc, const char **argv, const char *prefix)
1826
1853
if (!index_name && pack_name )
1827
1854
index_name = derive_filename (pack_name , "pack" , "idx" , & index_name_buf );
1828
1855
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
+
1829
1865
if (verify ) {
1830
1866
if (!index_name )
1831
1867
die (_ ("--verify with no packfile name given" ));
@@ -1878,11 +1914,16 @@ int cmd_index_pack(int argc, const char **argv, const char *prefix)
1878
1914
for (i = 0 ; i < nr_objects ; i ++ )
1879
1915
idx_objects [i ] = & objects [i ].idx ;
1880
1916
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 );
1881
1921
free (idx_objects );
1882
1922
1883
1923
if (!verify )
1884
1924
final (pack_name , curr_pack ,
1885
1925
index_name , curr_index ,
1926
+ rev_index_name , curr_rev_index ,
1886
1927
keep_msg , promisor_msg ,
1887
1928
pack_hash );
1888
1929
else
@@ -1893,10 +1934,13 @@ int cmd_index_pack(int argc, const char **argv, const char *prefix)
1893
1934
1894
1935
free (objects );
1895
1936
strbuf_release (& index_name_buf );
1937
+ strbuf_release (& rev_index_name_buf );
1896
1938
if (pack_name == NULL )
1897
1939
free ((void * ) curr_pack );
1898
1940
if (index_name == NULL )
1899
1941
free ((void * ) curr_index );
1942
+ if (rev_index_name == NULL )
1943
+ free ((void * ) curr_rev_index );
1900
1944
1901
1945
/*
1902
1946
* Let the caller know this pack is not self contained
0 commit comments