t5616: refactor packfile replacement

A subsequent patch will perform the same packfile replacement that is already done twice, so refactor it into its own function. Also, the same subsequent patch will use, in another way, part of the packfile replacement functionality, so extract those out too. Signed-off-by: Jonathan Tan <jonathantanmy@google.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Jonathan Tan committed May 14, 2019 at 14:10 UTC 385d1bfd7ad5d49783a3956bba19d9feea9955b6
1 file changed +21 -13
t/t5616-partial-clone.sh
+21 -13
@@ -244,11 +244,25 @@ test_expect_success 'fetch what is specified on CLI even if already promised' '
244 . "$TEST_DIRECTORY"/lib-httpd.sh
245 start_httpd
246
247 -# Converts bytes into a form suitable for inclusion in a sed command. For
248 -# example, "printf 'ab\r\n' | hex_unpack" results in '\x61\x62\x0d\x0a'.
249 -sed_escape () {
250 - perl -e '$/ = undef; $input = <>; print unpack("H2" x length($input), $input)' |
251 - sed 's/\(..\)/\\x\1/g'
247 +# Converts bytes into their hexadecimal representation. For example,
248 +# "printf 'ab\r\n' | hex_unpack" results in '61620d0a'.
249 +hex_unpack () {
250 + perl -e '$/ = undef; $input = <>; print unpack("H2" x length($input), $input)'
251 +}
252 +
253 +# Inserts $1 at the start of the string and every 2 characters thereafter.
254 +intersperse () {
255 + sed 's/\(..\)/'$1'\1/g'
256 +}
257 +
258 +# Create a one-time-sed command to replace the existing packfile with $1.
259 +replace_packfile () {
260 + # The protocol requires that the packfile be sent in sideband 1, hence
261 + # the extra \x01 byte at the beginning.
262 + printf "1,/packfile/!c %04x\\\\x01%s0000" \
263 + "$(($(wc -c <$1) + 5))" \
264 + "$(hex_unpack <$1 | intersperse '\\x')" \
265 + >"$HTTPD_ROOT_PATH/one-time-sed"
266 }
267
268 test_expect_success 'upon cloning, check that all refs point to objects' '
@@ -270,10 +284,7 @@ test_expect_success 'upon cloning, check that all refs point to objects' '
284 # Replace the existing packfile with the crafted one. The protocol
285 # requires that the packfile be sent in sideband 1, hence the extra
286 # \x01 byte at the beginning.
273 - printf "1,/packfile/!c %04x\\\\x01%s0000" \
274 - "$(($(wc -c <incomplete.pack) + 5))" \
275 - "$(sed_escape <incomplete.pack)" \
276 - >"$HTTPD_ROOT_PATH/one-time-sed" &&
287 + replace_packfile incomplete.pack &&
288
289 # Use protocol v2 because the sed command looks for the "packfile"
290 # section header.
@@ -313,10 +324,7 @@ test_expect_success 'when partial cloning, tolerate server not sending target of
324 # Replace the existing packfile with the crafted one. The protocol
325 # requires that the packfile be sent in sideband 1, hence the extra
326 # \x01 byte at the beginning.
316 - printf "1,/packfile/!c %04x\\\\x01%s0000" \
317 - "$(($(wc -c <incomplete.pack) + 5))" \
318 - "$(sed_escape <incomplete.pack)" \
319 - >"$HTTPD_ROOT_PATH/one-time-sed" &&
327 + replace_packfile incomplete.pack &&
328
329 # Use protocol v2 because the sed command looks for the "packfile"
330 # section header.