19
19
#include "shallow.h"
20
20
#include "json-writer.h"
21
21
#include "trace2.h"
22
+ #include "chunk-format.h"
22
23
23
24
void git_test_write_commit_graph_or_die (void )
24
25
{
@@ -44,7 +45,6 @@ void git_test_write_commit_graph_or_die(void)
44
45
#define GRAPH_CHUNKID_BLOOMINDEXES 0x42494458 /* "BIDX" */
45
46
#define GRAPH_CHUNKID_BLOOMDATA 0x42444154 /* "BDAT" */
46
47
#define GRAPH_CHUNKID_BASE 0x42415345 /* "BASE" */
47
- #define MAX_NUM_CHUNKS 9
48
48
49
49
#define GRAPH_DATA_WIDTH (the_hash_algo->rawsz + 16)
50
50
@@ -1758,27 +1758,17 @@ static int write_graph_chunk_base(struct hashfile *f,
1758
1758
return 0 ;
1759
1759
}
1760
1760
1761
- typedef int (* chunk_write_fn )(struct hashfile * f ,
1762
- void * data );
1763
-
1764
- struct chunk_info {
1765
- uint32_t id ;
1766
- uint64_t size ;
1767
- chunk_write_fn write_fn ;
1768
- };
1769
-
1770
1761
static int write_commit_graph_file (struct write_commit_graph_context * ctx )
1771
1762
{
1772
1763
uint32_t i ;
1773
1764
int fd ;
1774
1765
struct hashfile * f ;
1775
1766
struct lock_file lk = LOCK_INIT ;
1776
- struct chunk_info chunks [MAX_NUM_CHUNKS + 1 ];
1777
1767
const unsigned hashsz = the_hash_algo -> rawsz ;
1778
1768
struct strbuf progress_title = STRBUF_INIT ;
1779
1769
int num_chunks = 3 ;
1780
- uint64_t chunk_offset ;
1781
1770
struct object_id file_hash ;
1771
+ struct chunkfile * cf ;
1782
1772
1783
1773
if (ctx -> split ) {
1784
1774
struct strbuf tmp_file = STRBUF_INIT ;
@@ -1824,76 +1814,50 @@ static int write_commit_graph_file(struct write_commit_graph_context *ctx)
1824
1814
f = hashfd (lk .tempfile -> fd , lk .tempfile -> filename .buf );
1825
1815
}
1826
1816
1827
- chunks [0 ].id = GRAPH_CHUNKID_OIDFANOUT ;
1828
- chunks [0 ].size = GRAPH_FANOUT_SIZE ;
1829
- chunks [0 ].write_fn = write_graph_chunk_fanout ;
1830
- chunks [1 ].id = GRAPH_CHUNKID_OIDLOOKUP ;
1831
- chunks [1 ].size = hashsz * ctx -> commits .nr ;
1832
- chunks [1 ].write_fn = write_graph_chunk_oids ;
1833
- chunks [2 ].id = GRAPH_CHUNKID_DATA ;
1834
- chunks [2 ].size = (hashsz + 16 ) * ctx -> commits .nr ;
1835
- chunks [2 ].write_fn = write_graph_chunk_data ;
1817
+ cf = init_chunkfile (f );
1818
+
1819
+ add_chunk (cf , GRAPH_CHUNKID_OIDFANOUT , GRAPH_FANOUT_SIZE ,
1820
+ write_graph_chunk_fanout );
1821
+ add_chunk (cf , GRAPH_CHUNKID_OIDLOOKUP , hashsz * ctx -> commits .nr ,
1822
+ write_graph_chunk_oids );
1823
+ add_chunk (cf , GRAPH_CHUNKID_DATA , (hashsz + 16 ) * ctx -> commits .nr ,
1824
+ write_graph_chunk_data );
1836
1825
1837
1826
if (git_env_bool (GIT_TEST_COMMIT_GRAPH_NO_GDAT , 0 ))
1838
1827
ctx -> write_generation_data = 0 ;
1839
- if (ctx -> write_generation_data ) {
1840
- chunks [num_chunks ].id = GRAPH_CHUNKID_GENERATION_DATA ;
1841
- chunks [num_chunks ].size = sizeof (uint32_t ) * ctx -> commits .nr ;
1842
- chunks [num_chunks ].write_fn = write_graph_chunk_generation_data ;
1843
- num_chunks ++ ;
1844
- }
1845
- if (ctx -> num_generation_data_overflows ) {
1846
- chunks [num_chunks ].id = GRAPH_CHUNKID_GENERATION_DATA_OVERFLOW ;
1847
- chunks [num_chunks ].size = sizeof (timestamp_t ) * ctx -> num_generation_data_overflows ;
1848
- chunks [num_chunks ].write_fn = write_graph_chunk_generation_data_overflow ;
1849
- num_chunks ++ ;
1850
- }
1851
- if (ctx -> num_extra_edges ) {
1852
- chunks [num_chunks ].id = GRAPH_CHUNKID_EXTRAEDGES ;
1853
- chunks [num_chunks ].size = 4 * ctx -> num_extra_edges ;
1854
- chunks [num_chunks ].write_fn = write_graph_chunk_extra_edges ;
1855
- num_chunks ++ ;
1856
- }
1828
+ if (ctx -> write_generation_data )
1829
+ add_chunk (cf , GRAPH_CHUNKID_GENERATION_DATA ,
1830
+ sizeof (uint32_t ) * ctx -> commits .nr ,
1831
+ write_graph_chunk_generation_data );
1832
+ if (ctx -> num_generation_data_overflows )
1833
+ add_chunk (cf , GRAPH_CHUNKID_GENERATION_DATA_OVERFLOW ,
1834
+ sizeof (timestamp_t ) * ctx -> num_generation_data_overflows ,
1835
+ write_graph_chunk_generation_data_overflow );
1836
+ if (ctx -> num_extra_edges )
1837
+ add_chunk (cf , GRAPH_CHUNKID_EXTRAEDGES ,
1838
+ 4 * ctx -> num_extra_edges ,
1839
+ write_graph_chunk_extra_edges );
1857
1840
if (ctx -> changed_paths ) {
1858
- chunks [num_chunks ].id = GRAPH_CHUNKID_BLOOMINDEXES ;
1859
- chunks [num_chunks ].size = sizeof (uint32_t ) * ctx -> commits .nr ;
1860
- chunks [num_chunks ].write_fn = write_graph_chunk_bloom_indexes ;
1861
- num_chunks ++ ;
1862
- chunks [num_chunks ].id = GRAPH_CHUNKID_BLOOMDATA ;
1863
- chunks [num_chunks ].size = sizeof (uint32_t ) * 3
1864
- + ctx -> total_bloom_filter_data_size ;
1865
- chunks [num_chunks ].write_fn = write_graph_chunk_bloom_data ;
1866
- num_chunks ++ ;
1867
- }
1868
- if (ctx -> num_commit_graphs_after > 1 ) {
1869
- chunks [num_chunks ].id = GRAPH_CHUNKID_BASE ;
1870
- chunks [num_chunks ].size = hashsz * (ctx -> num_commit_graphs_after - 1 );
1871
- chunks [num_chunks ].write_fn = write_graph_chunk_base ;
1872
- num_chunks ++ ;
1873
- }
1874
-
1875
- chunks [num_chunks ].id = 0 ;
1876
- chunks [num_chunks ].size = 0 ;
1841
+ add_chunk (cf , GRAPH_CHUNKID_BLOOMINDEXES ,
1842
+ sizeof (uint32_t ) * ctx -> commits .nr ,
1843
+ write_graph_chunk_bloom_indexes );
1844
+ add_chunk (cf , GRAPH_CHUNKID_BLOOMDATA ,
1845
+ sizeof (uint32_t ) * 3
1846
+ + ctx -> total_bloom_filter_data_size ,
1847
+ write_graph_chunk_bloom_data );
1848
+ }
1849
+ if (ctx -> num_commit_graphs_after > 1 )
1850
+ add_chunk (cf , GRAPH_CHUNKID_BASE ,
1851
+ hashsz * (ctx -> num_commit_graphs_after - 1 ),
1852
+ write_graph_chunk_base );
1877
1853
1878
1854
hashwrite_be32 (f , GRAPH_SIGNATURE );
1879
1855
1880
1856
hashwrite_u8 (f , GRAPH_VERSION );
1881
1857
hashwrite_u8 (f , oid_version ());
1882
- hashwrite_u8 (f , num_chunks );
1858
+ hashwrite_u8 (f , get_num_chunks ( cf ) );
1883
1859
hashwrite_u8 (f , ctx -> num_commit_graphs_after - 1 );
1884
1860
1885
- chunk_offset = 8 + (num_chunks + 1 ) * GRAPH_CHUNKLOOKUP_WIDTH ;
1886
- for (i = 0 ; i <= num_chunks ; i ++ ) {
1887
- uint32_t chunk_write [3 ];
1888
-
1889
- chunk_write [0 ] = htonl (chunks [i ].id );
1890
- chunk_write [1 ] = htonl (chunk_offset >> 32 );
1891
- chunk_write [2 ] = htonl (chunk_offset & 0xffffffff );
1892
- hashwrite (f , chunk_write , 12 );
1893
-
1894
- chunk_offset += chunks [i ].size ;
1895
- }
1896
-
1897
1861
if (ctx -> report_progress ) {
1898
1862
strbuf_addf (& progress_title ,
1899
1863
Q_ ("Writing out commit graph in %d pass" ,
@@ -1905,17 +1869,7 @@ static int write_commit_graph_file(struct write_commit_graph_context *ctx)
1905
1869
num_chunks * ctx -> commits .nr );
1906
1870
}
1907
1871
1908
- for (i = 0 ; i < num_chunks ; i ++ ) {
1909
- uint64_t start_offset = f -> total + f -> offset ;
1910
-
1911
- if (chunks [i ].write_fn (f , ctx ))
1912
- return -1 ;
1913
-
1914
- if (f -> total + f -> offset != start_offset + chunks [i ].size )
1915
- BUG ("expected to write %" PRId64 " bytes to chunk %" PRIx32 ", but wrote %" PRId64 " instead" ,
1916
- chunks [i ].size , chunks [i ].id ,
1917
- f -> total + f -> offset - start_offset );
1918
- }
1872
+ write_chunkfile (cf , ctx );
1919
1873
1920
1874
stop_progress (& ctx -> progress );
1921
1875
strbuf_release (& progress_title );
@@ -1932,6 +1886,7 @@ static int write_commit_graph_file(struct write_commit_graph_context *ctx)
1932
1886
1933
1887
close_commit_graph (ctx -> r -> objects );
1934
1888
finalize_hashfile (f , file_hash .hash , CSUM_HASH_IN_STREAM | CSUM_FSYNC );
1889
+ free_chunkfile (cf );
1935
1890
1936
1891
if (ctx -> split ) {
1937
1892
FILE * chainf = fdopen_lock_file (& lk , "w" );
0 commit comments