Skip to content

Commit 6a4b0e1

Browse files
committed
Merge branch 'tb/pair-chunk-expect' into seen
Further code clean-up. * tb/pair-chunk-expect: midx: read `OOFF` chunk with `pair_chunk_expect()` midx: read `OIDL` chunk with `pair_chunk_expect()` commit-graph: read `BIDX` chunk with `pair_chunk_expect()` commit-graph: read `GDAT` chunk with `pair_chunk_expect()` commit-graph: read `CDAT` chunk with `pair_chunk_expect()` commit-graph: read `OIDL` chunk with `pair_chunk_expect()` chunk-format: introduce `pair_chunk_expect()` helper
2 parents 6d11152 + e400a8b commit 6a4b0e1

File tree

6 files changed

+65
-85
lines changed

6 files changed

+65
-85
lines changed

chunk-format.c

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,10 @@ int read_table_of_contents(struct chunkfile *cf,
163163
struct pair_chunk_data {
164164
const unsigned char **p;
165165
size_t *size;
166+
167+
/* for pair_chunk_expect() only */
168+
size_t record_size;
169+
size_t record_nr;
166170
};
167171

168172
static int pair_chunk_fn(const unsigned char *chunk_start,
@@ -175,6 +179,17 @@ static int pair_chunk_fn(const unsigned char *chunk_start,
175179
return 0;
176180
}
177181

182+
static int pair_chunk_expect_fn(const unsigned char *chunk_start,
183+
size_t chunk_size,
184+
void *data)
185+
{
186+
struct pair_chunk_data *pcd = data;
187+
if (chunk_size / pcd->record_size != pcd->record_nr)
188+
return -1;
189+
*pcd->p = chunk_start;
190+
return 0;
191+
}
192+
178193
int pair_chunk(struct chunkfile *cf,
179194
uint32_t chunk_id,
180195
const unsigned char **p,
@@ -184,6 +199,20 @@ int pair_chunk(struct chunkfile *cf,
184199
return read_chunk(cf, chunk_id, pair_chunk_fn, &pcd);
185200
}
186201

202+
int pair_chunk_expect(struct chunkfile *cf,
203+
uint32_t chunk_id,
204+
const unsigned char **p,
205+
size_t record_size,
206+
size_t record_nr)
207+
{
208+
struct pair_chunk_data pcd = {
209+
.p = p,
210+
.record_size = record_size,
211+
.record_nr = record_nr,
212+
};
213+
return read_chunk(cf, chunk_id, pair_chunk_expect_fn, &pcd);
214+
}
215+
187216
int read_chunk(struct chunkfile *cf,
188217
uint32_t chunk_id,
189218
chunk_read_fn fn,

chunk-format.h

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,8 @@ struct chunkfile;
1717
*
1818
* If reading a file, use a NULL 'struct hashfile *' and then call
1919
* read_table_of_contents(). Supply the memory-mapped data to the
20-
* pair_chunk() or read_chunk() methods, as appropriate.
20+
* pair_chunk(), pair_chunk_expect(), or read_chunk() methods, as
21+
* appropriate.
2122
*
2223
* DO NOT MIX THESE MODES. Use different 'struct chunkfile' instances
2324
* for reading and writing.
@@ -54,6 +55,16 @@ int pair_chunk(struct chunkfile *cf,
5455
const unsigned char **p,
5556
size_t *size);
5657

58+
/*
59+
* Similar to 'pair_chunk', but used for callers who are reading a chunk
60+
* with a known number of fixed-width records.
61+
*/
62+
int pair_chunk_expect(struct chunkfile *cf,
63+
uint32_t chunk_id,
64+
const unsigned char **p,
65+
size_t record_size,
66+
size_t record_nr);
67+
5768
typedef int (*chunk_read_fn)(const unsigned char *chunk_start,
5869
size_t chunk_size, void *data);
5970
/*

commit-graph.c

Lines changed: 17 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -298,48 +298,6 @@ static int graph_read_oid_fanout(const unsigned char *chunk_start,
298298
return 0;
299299
}
300300

301-
static int graph_read_oid_lookup(const unsigned char *chunk_start,
302-
size_t chunk_size, void *data)
303-
{
304-
struct commit_graph *g = data;
305-
g->chunk_oid_lookup = chunk_start;
306-
if (chunk_size / g->hash_len != g->num_commits)
307-
return error(_("commit-graph OID lookup chunk is the wrong size"));
308-
return 0;
309-
}
310-
311-
static int graph_read_commit_data(const unsigned char *chunk_start,
312-
size_t chunk_size, void *data)
313-
{
314-
struct commit_graph *g = data;
315-
if (chunk_size / GRAPH_DATA_WIDTH != g->num_commits)
316-
return error(_("commit-graph commit data chunk is wrong size"));
317-
g->chunk_commit_data = chunk_start;
318-
return 0;
319-
}
320-
321-
static int graph_read_generation_data(const unsigned char *chunk_start,
322-
size_t chunk_size, void *data)
323-
{
324-
struct commit_graph *g = data;
325-
if (chunk_size / sizeof(uint32_t) != g->num_commits)
326-
return error(_("commit-graph generations chunk is wrong size"));
327-
g->chunk_generation_data = chunk_start;
328-
return 0;
329-
}
330-
331-
static int graph_read_bloom_index(const unsigned char *chunk_start,
332-
size_t chunk_size, void *data)
333-
{
334-
struct commit_graph *g = data;
335-
if (chunk_size / 4 != g->num_commits) {
336-
warning(_("commit-graph changed-path index chunk is too small"));
337-
return -1;
338-
}
339-
g->chunk_bloom_indexes = chunk_start;
340-
return 0;
341-
}
342-
343301
static int graph_read_bloom_data(const unsigned char *chunk_start,
344302
size_t chunk_size, void *data)
345303
{
@@ -431,12 +389,15 @@ struct commit_graph *parse_commit_graph(struct repo_settings *s,
431389
error(_("commit-graph required OID fanout chunk missing or corrupted"));
432390
goto free_and_return;
433391
}
434-
if (read_chunk(cf, GRAPH_CHUNKID_OIDLOOKUP, graph_read_oid_lookup, graph)) {
435-
error(_("commit-graph required OID lookup chunk missing or corrupted"));
392+
if (pair_chunk_expect(cf, GRAPH_CHUNKID_OIDLOOKUP,
393+
&graph->chunk_oid_lookup, graph->hash_len,
394+
graph->num_commits)) {
395+
error(_("commit-graph OID lookup chunk is the wrong size"));
436396
goto free_and_return;
437397
}
438-
if (read_chunk(cf, GRAPH_CHUNKID_DATA, graph_read_commit_data, graph)) {
439-
error(_("commit-graph required commit data chunk missing or corrupted"));
398+
if (pair_chunk_expect(cf, GRAPH_CHUNKID_DATA, &graph->chunk_commit_data,
399+
GRAPH_DATA_WIDTH, graph->num_commits)) {
400+
error(_("commit-graph commit data chunk is wrong size"));
440401
goto free_and_return;
441402
}
442403

@@ -446,8 +407,11 @@ struct commit_graph *parse_commit_graph(struct repo_settings *s,
446407
&graph->chunk_base_graphs_size);
447408

448409
if (s->commit_graph_generation_version >= 2) {
449-
read_chunk(cf, GRAPH_CHUNKID_GENERATION_DATA,
450-
graph_read_generation_data, graph);
410+
if (pair_chunk_expect(cf, GRAPH_CHUNKID_GENERATION_DATA,
411+
&graph->chunk_generation_data,
412+
sizeof(uint32_t),
413+
graph->num_commits))
414+
error(_("commit-graph generations chunk is wrong size"));
451415
pair_chunk(cf, GRAPH_CHUNKID_GENERATION_DATA_OVERFLOW,
452416
&graph->chunk_generation_data_overflow,
453417
&graph->chunk_generation_data_overflow_size);
@@ -457,8 +421,11 @@ struct commit_graph *parse_commit_graph(struct repo_settings *s,
457421
}
458422

459423
if (s->commit_graph_changed_paths_version) {
460-
read_chunk(cf, GRAPH_CHUNKID_BLOOMINDEXES,
461-
graph_read_bloom_index, graph);
424+
int res = pair_chunk_expect(cf, GRAPH_CHUNKID_BLOOMINDEXES,
425+
&graph->chunk_bloom_indexes,
426+
sizeof(uint32_t), graph->num_commits);
427+
if (res && res != CHUNK_NOT_FOUND)
428+
warning(_("commit-graph changed-path index chunk is too small"));
462429
read_chunk(cf, GRAPH_CHUNKID_BLOOMDATA,
463430
graph_read_bloom_data, graph);
464431
}

midx.c

Lines changed: 5 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -89,32 +89,6 @@ static int midx_read_oid_fanout(const unsigned char *chunk_start,
8989
return 0;
9090
}
9191

92-
static int midx_read_oid_lookup(const unsigned char *chunk_start,
93-
size_t chunk_size, void *data)
94-
{
95-
struct multi_pack_index *m = data;
96-
m->chunk_oid_lookup = chunk_start;
97-
98-
if (chunk_size != st_mult(m->hash_len, m->num_objects)) {
99-
error(_("multi-pack-index OID lookup chunk is the wrong size"));
100-
return 1;
101-
}
102-
return 0;
103-
}
104-
105-
static int midx_read_object_offsets(const unsigned char *chunk_start,
106-
size_t chunk_size, void *data)
107-
{
108-
struct multi_pack_index *m = data;
109-
m->chunk_object_offsets = chunk_start;
110-
111-
if (chunk_size != st_mult(m->num_objects, MIDX_CHUNK_OFFSET_WIDTH)) {
112-
error(_("multi-pack-index object offset chunk is the wrong size"));
113-
return 1;
114-
}
115-
return 0;
116-
}
117-
11892
struct multi_pack_index *load_multi_pack_index(const char *object_dir, int local)
11993
{
12094
struct multi_pack_index *m = NULL;
@@ -191,9 +165,12 @@ struct multi_pack_index *load_multi_pack_index(const char *object_dir, int local
191165
die(_("multi-pack-index required pack-name chunk missing or corrupted"));
192166
if (read_chunk(cf, MIDX_CHUNKID_OIDFANOUT, midx_read_oid_fanout, m))
193167
die(_("multi-pack-index required OID fanout chunk missing or corrupted"));
194-
if (read_chunk(cf, MIDX_CHUNKID_OIDLOOKUP, midx_read_oid_lookup, m))
168+
if (pair_chunk_expect(cf, MIDX_CHUNKID_OIDLOOKUP, &m->chunk_oid_lookup,
169+
m->hash_len, m->num_objects))
195170
die(_("multi-pack-index required OID lookup chunk missing or corrupted"));
196-
if (read_chunk(cf, MIDX_CHUNKID_OBJECTOFFSETS, midx_read_object_offsets, m))
171+
if (pair_chunk_expect(cf, MIDX_CHUNKID_OBJECTOFFSETS,
172+
&m->chunk_object_offsets, MIDX_CHUNK_OFFSET_WIDTH,
173+
m->num_objects))
197174
die(_("multi-pack-index required object offsets chunk missing or corrupted"));
198175

199176
pair_chunk(cf, MIDX_CHUNKID_LARGEOFFSETS, &m->chunk_large_offsets,

t/t5318-commit-graph.sh

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -545,12 +545,12 @@ test_expect_success 'detect missing OID fanout chunk' '
545545

546546
test_expect_success 'detect missing OID lookup chunk' '
547547
corrupt_graph_and_verify $GRAPH_BYTE_OID_LOOKUP_ID "\0" \
548-
"commit-graph required OID lookup chunk missing or corrupted"
548+
"commit-graph OID lookup chunk is the wrong size"
549549
'
550550

551551
test_expect_success 'detect missing commit data chunk' '
552552
corrupt_graph_and_verify $GRAPH_BYTE_COMMIT_DATA_ID "\0" \
553-
"commit-graph required commit data chunk missing or corrupted"
553+
"commit-graph commit data chunk is wrong size"
554554
'
555555

556556
test_expect_success 'detect incorrect fanout' '
@@ -851,7 +851,6 @@ test_expect_success 'reader notices fanout/lookup table mismatch' '
851851
check_corrupt_chunk OIDF 1020 "FFFFFFFF" &&
852852
cat >expect.err <<-\EOF &&
853853
error: commit-graph OID lookup chunk is the wrong size
854-
error: commit-graph required OID lookup chunk missing or corrupted
855854
EOF
856855
test_cmp expect.err err
857856
'
@@ -876,7 +875,6 @@ test_expect_success 'reader notices too-small commit data chunk' '
876875
check_corrupt_chunk CDAT clear 00000000 &&
877876
cat >expect.err <<-\EOF &&
878877
error: commit-graph commit data chunk is wrong size
879-
error: commit-graph required commit data chunk missing or corrupted
880878
EOF
881879
test_cmp expect.err err
882880
'

t/t5319-multi-pack-index.sh

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1077,7 +1077,6 @@ test_expect_success 'reader notices too-small oid lookup chunk' '
10771077
corrupt_chunk OIDL clear 00000000 &&
10781078
test_must_fail git log 2>err &&
10791079
cat >expect <<-\EOF &&
1080-
error: multi-pack-index OID lookup chunk is the wrong size
10811080
fatal: multi-pack-index required OID lookup chunk missing or corrupted
10821081
EOF
10831082
test_cmp expect err
@@ -1112,7 +1111,6 @@ test_expect_success 'reader notices too-small object offset chunk' '
11121111
corrupt_chunk OOFF clear 00000000 &&
11131112
test_must_fail git log 2>err &&
11141113
cat >expect <<-\EOF &&
1115-
error: multi-pack-index object offset chunk is the wrong size
11161114
fatal: multi-pack-index required object offsets chunk missing or corrupted
11171115
EOF
11181116
test_cmp expect err

0 commit comments

Comments
 (0)