mirror of
https://github.com/git/git
synced 2024-08-27 11:39:22 +00:00
![Jeff King](/assets/img/avatar_default.png)
When testing corruption of files using the chunk format (like commit-graphs and midx files), it's helpful to be able to modify bytes in specific chunks. This requires being able both to read the table-of-contents (to find the chunk to modify) but also to adjust it (to account for size changes in the offsets of subsequent chunks). We have some tests already which corrupt chunk files, but they have some downsides: 1. They are very brittle, as they manually compute the expected size of a particular instance of the file (e.g., see the definitions starting with NUM_OBJECTS in t5319). 2. Because they rely on manual offsets and don't read the table-of-contents, they're limited to overwriting bytes. But there are many interesting corruptions that involve changing the sizes of chunks (especially smaller-than-expected ones). This patch adds a perl script which makes such corruptions easy. We'll use it in subsequent patches. Note that we could get by with just a big "perl -e" inside the helper function. I chose to put it in a separate script for two reasons. One, so we don't have to worry about the extra layer of shell quoting. And two, the script is kind of big, and running the tests with "-x" would repeatedly dump it into the log output. Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
18 lines
626 B
Bash
18 lines
626 B
Bash
# Shell library for working with "chunk" files (commit-graph, midx, etc).
|
|
|
|
# corrupt_chunk_file <fn> <chunk> <offset> <bytes>
|
|
#
|
|
# Corrupt a chunk-based file (like a commit-graph) by overwriting the bytes
|
|
# found in the chunk specified by the 4-byte <chunk> identifier. If <offset> is
|
|
# "clear", replace the chunk entirely. Otherwise, overwrite data <offset> bytes
|
|
# into the chunk.
|
|
#
|
|
# The <bytes> are interpreted as pairs of hex digits (so "000000FE" would be
|
|
# big-endian 254).
|
|
corrupt_chunk_file () {
|
|
fn=$1; shift
|
|
perl "$TEST_DIRECTORY"/lib-chunk/corrupt-chunk-file.pl \
|
|
"$@" <"$fn" >"$fn.tmp" &&
|
|
mv "$fn.tmp" "$fn"
|
|
}
|