1919#include "shallow.h"
2020#include "json-writer.h"
2121#include "trace2.h"
22+ #include "chunk-format.h"
2223
2324void git_test_write_commit_graph_or_die (void )
2425{
@@ -44,7 +45,6 @@ void git_test_write_commit_graph_or_die(void)
4445#define GRAPH_CHUNKID_BLOOMINDEXES 0x42494458 /* "BIDX" */
4546#define GRAPH_CHUNKID_BLOOMDATA 0x42444154 /* "BDAT" */
4647#define GRAPH_CHUNKID_BASE 0x42415345 /* "BASE" */
47- #define MAX_NUM_CHUNKS 9
4848
4949#define GRAPH_DATA_WIDTH (the_hash_algo->rawsz + 16)
5050
@@ -1758,27 +1758,17 @@ static int write_graph_chunk_base(struct hashfile *f,
17581758 return 0 ;
17591759}
17601760
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-
17701761static int write_commit_graph_file (struct write_commit_graph_context * ctx )
17711762{
17721763 uint32_t i ;
17731764 int fd ;
17741765 struct hashfile * f ;
17751766 struct lock_file lk = LOCK_INIT ;
1776- struct chunk_info chunks [MAX_NUM_CHUNKS + 1 ];
17771767 const unsigned hashsz = the_hash_algo -> rawsz ;
17781768 struct strbuf progress_title = STRBUF_INIT ;
17791769 int num_chunks = 3 ;
1780- uint64_t chunk_offset ;
17811770 struct object_id file_hash ;
1771+ struct chunkfile * cf ;
17821772
17831773 if (ctx -> split ) {
17841774 struct strbuf tmp_file = STRBUF_INIT ;
@@ -1824,76 +1814,50 @@ static int write_commit_graph_file(struct write_commit_graph_context *ctx)
18241814 f = hashfd (lk .tempfile -> fd , lk .tempfile -> filename .buf );
18251815 }
18261816
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 );
18361825
18371826 if (git_env_bool (GIT_TEST_COMMIT_GRAPH_NO_GDAT , 0 ))
18381827 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 );
18571840 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 );
18771853
18781854 hashwrite_be32 (f , GRAPH_SIGNATURE );
18791855
18801856 hashwrite_u8 (f , GRAPH_VERSION );
18811857 hashwrite_u8 (f , oid_version ());
1882- hashwrite_u8 (f , num_chunks );
1858+ hashwrite_u8 (f , get_num_chunks ( cf ) );
18831859 hashwrite_u8 (f , ctx -> num_commit_graphs_after - 1 );
18841860
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-
18971861 if (ctx -> report_progress ) {
18981862 strbuf_addf (& progress_title ,
18991863 Q_ ("Writing out commit graph in %d pass" ,
@@ -1905,17 +1869,7 @@ static int write_commit_graph_file(struct write_commit_graph_context *ctx)
19051869 num_chunks * ctx -> commits .nr );
19061870 }
19071871
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 );
19191873
19201874 stop_progress (& ctx -> progress );
19211875 strbuf_release (& progress_title );
@@ -1932,6 +1886,7 @@ static int write_commit_graph_file(struct write_commit_graph_context *ctx)
19321886
19331887 close_commit_graph (ctx -> r -> objects );
19341888 finalize_hashfile (f , file_hash .hash , CSUM_HASH_IN_STREAM | CSUM_FSYNC );
1889+ free_chunkfile (cf );
19351890
19361891 if (ctx -> split ) {
19371892 FILE * chainf = fdopen_lock_file (& lk , "w" );
0 commit comments