]> git.ipfire.org Git - thirdparty/git.git/commitdiff
test-lib-functions: make packetize() more efficient
authorJeff King <peff@peff.net>
Fri, 27 Mar 2020 08:03:00 +0000 (04:03 -0400)
committerJunio C Hamano <gitster@pobox.com>
Fri, 27 Mar 2020 18:50:54 +0000 (11:50 -0700)
The packetize() function takes its input on stdin, and requires 4
separate sub-processes to format a simple string. We can do much better
by getting the length via the shell's "${#packet}" construct. The one
caveat is that the shell can't put a NUL into a variable, so we'll have
to continue to provide the stdin form for a few calls.

There are a few other cleanups here in the touched code:

 - the stdin form of packetize() had an extra stray "%s" when printing
   the packet

 - the converted calls in t5562 can be made simpler by redirecting
   output as a block, rather than repeated appending

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
t/t5562-http-backend-content-length.sh
t/test-lib-functions.sh

index 4a110b307ee53e623bff98a68307c4947139c39f..3f4ac71f83b571a61c14b5627d843b73cb244f0e 100755 (executable)
@@ -53,15 +53,20 @@ test_expect_success 'setup' '
        test_commit c1 &&
        hash_head=$(git rev-parse HEAD) &&
        hash_prev=$(git rev-parse HEAD~1) &&
-       printf "want %s" "$hash_head" | packetize >fetch_body &&
-       printf 0000 >>fetch_body &&
-       printf "have %s" "$hash_prev" | packetize >>fetch_body &&
-       printf done | packetize >>fetch_body &&
+       {
+               packetize "want $hash_head" &&
+               printf 0000 &&
+               packetize "have $hash_prev" &&
+               packetize "done"
+       } >fetch_body &&
        test_copy_bytes 10 <fetch_body >fetch_body.trunc &&
        hash_next=$(git commit-tree -p HEAD -m next HEAD^{tree}) &&
-       printf "%s %s refs/heads/newbranch\\0report-status\\n" "$ZERO_OID" "$hash_next" | packetize >push_body &&
-       printf 0000 >>push_body &&
-       echo "$hash_next" | git pack-objects --stdout >>push_body &&
+       {
+               printf "%s %s refs/heads/newbranch\\0report-status\\n" \
+                       "$ZERO_OID" "$hash_next" | packetize &&
+               printf 0000 &&
+               echo "$hash_next" | git pack-objects --stdout
+       } >push_body &&
        test_copy_bytes 10 <push_body >push_body.trunc &&
        : >empty_body
 '
index 352c213d52e2e4a50808128c027eba7f1ac163df..216918a58cef43b8a785e0467a28748be2ab7bae 100644 (file)
@@ -1362,14 +1362,23 @@ nongit () {
        )
 } 7>&2 2>&4
 
-# convert stdin to pktline representation; note that empty input becomes an
-# empty packet, not a flush packet (for that you can just print 0000 yourself).
+# convert function arguments or stdin (if not arguments given) to pktline
+# representation. If multiple arguments are given, they are separated by
+# whitespace and put in a single packet. Note that data containing NULs must be
+# given on stdin, and that empty input becomes an empty packet, not a flush
+# packet (for that you can just print 0000 yourself).
 packetize() {
-       cat >packetize.tmp &&
-       len=$(wc -c <packetize.tmp) &&
-       printf '%04x%s' "$(($len + 4))" &&
-       cat packetize.tmp &&
-       rm -f packetize.tmp
+       if test $# -gt 0
+       then
+               packet="$*"
+               printf '%04x%s' "$((4 + ${#packet}))" "$packet"
+       else
+               cat >packetize.tmp &&
+               len=$(wc -c <packetize.tmp) &&
+               printf '%04x' "$(($len + 4))" &&
+               cat packetize.tmp &&
+               rm -f packetize.tmp
+       fi
 }
 
 # Parse the input as a series of pktlines, writing the result to stdout.