]> git.ipfire.org Git - thirdparty/git.git/commitdiff
test-lib-functions: use test-tool for [de]packetize()
authorÆvar Arnfjörð Bjarmason <avarab@gmail.com>
Fri, 16 Jul 2021 15:41:33 +0000 (17:41 +0200)
committerJunio C Hamano <gitster@pobox.com>
Mon, 19 Jul 2021 18:53:50 +0000 (11:53 -0700)
The shell+perl "[de]packetize()" helper functions were added in
4414a150025 (t/lib-git-daemon: add network-protocol helpers,
2018-01-24), and around the same time we added the "pkt-line" helper
in 74e70029615 (test-pkt-line: introduce a packet-line test helper,
2018-03-14).

For some reason it seems we've mostly used the shell+perl version
instead of the helper since then. There were discussions around
88124ab2636 (test-lib-functions: make packetize() more efficient,
2020-03-27) and cacae4329fa (test-lib-functions: simplify packetize()
stdin code, 2020-03-29) to improve them and make them more efficient.

There was one good reason to do so, we needed an equivalent of
"test-tool pkt-line pack", but that command wasn't capable of handling
input with "\n" (a feature) or "\0" (just because it happens to be
printf-based under the hood).

Let's add a "pkt-line-raw" helper for that, and expose is at a
packetize_raw() to go with the existing packetize() on the shell
level, this gives us the smallest amount of change to the tests
themselves.

Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
t/helper/test-pkt-line.c
t/t5411/once-0010-report-status-v1.sh
t/t5562-http-backend-content-length.sh
t/t5570-git-daemon.sh
t/test-lib-functions.sh

index 5e638f0b970d37e57cc0b17d1aa9e17b29e52a0e..c5e052e537805075682f16204f1ab16991a8e0fe 100644 (file)
@@ -26,6 +26,16 @@ static void pack(int argc, const char **argv)
        }
 }
 
+static void pack_raw_stdin(void)
+{
+       struct strbuf sb = STRBUF_INIT;
+
+       if (strbuf_read(&sb, 0, 0) < 0)
+               die_errno("failed to read from stdin");
+       packet_write(1, sb.buf, sb.len);
+       strbuf_release(&sb);
+}
+
 static void unpack(void)
 {
        struct packet_reader reader;
@@ -110,6 +120,8 @@ int cmd__pkt_line(int argc, const char **argv)
 
        if (!strcmp(argv[1], "pack"))
                pack(argc - 2, argv + 2);
+       else if (!strcmp(argv[1], "pack-raw-stdin"))
+               pack_raw_stdin();
        else if (!strcmp(argv[1], "unpack"))
                unpack();
        else if (!strcmp(argv[1], "unpack-sideband"))
index 1233a46eac5f8ca9606c6de370e0a2e32136ae72..297b10925d59a85ab21c26d5a5173ab015d3c628 100644 (file)
@@ -28,10 +28,10 @@ test_expect_success "proc-receive: report status v1" '
                if test -z "$GIT_DEFAULT_HASH" || test "$GIT_DEFAULT_HASH" = "sha1"
                then
                        printf "%s %s refs/heads/main\0report-status\n" \
-                               $A $B | packetize
+                               $A $B | packetize_raw
                else
                        printf "%s %s refs/heads/main\0report-status object-format=$GIT_DEFAULT_HASH\n" \
-                               $A $B | packetize
+                               $A $B | packetize_raw
                fi &&
                printf "%s %s refs/for/main/topic1\n" \
                        $ZERO_OID $A | packetize &&
index e5d3d15ba8dddaf98eeabcc909a726c77224afab..05a58069b0cd41243f072c37b612c721ee88c2e1 100755 (executable)
@@ -63,7 +63,7 @@ test_expect_success 'setup' '
        hash_next=$(git commit-tree -p HEAD -m next HEAD^{tree}) &&
        {
                printf "%s %s refs/heads/newbranch\\0report-status object-format=%s\\n" \
-                       "$ZERO_OID" "$hash_next" "$(test_oid algo)" | packetize &&
+                       "$ZERO_OID" "$hash_next" "$(test_oid algo)" | packetize_raw
                printf 0000 &&
                echo "$hash_next" | git pack-objects --stdout
        } >push_body &&
index 82c31ab6cd832247f327d71cdb70067346fb25ae..b87ca06a585ca9791ca766dea212704dacddd7ff 100755 (executable)
@@ -194,7 +194,7 @@ test_expect_success 'hostname cannot break out of directory' '
 
 test_expect_success FAKENC 'hostname interpolation works after LF-stripping' '
        {
-               printf "git-upload-pack /interp.git\n\0host=localhost" | packetize
+               printf "git-upload-pack /interp.git\n\0host=localhost" | packetize_raw
                printf "0000"
        } >input &&
        fake_nc "$GIT_DAEMON_HOST_PORT" <input >output &&
index b823c140271037b9f8c03b6670e3133d2cc9d0c1..b5f481f7a4a2ca3a959cbdfaa35f9ae3b4e48ce8 100644 (file)
@@ -1437,46 +1437,24 @@ nongit () {
        )
 } 7>&2 2>&4
 
-# 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).
+# These functions are historical wrappers around "test-tool pkt-line"
+# for older tests. Use "test-tool pkt-line" itself in new tests.
 packetize () {
        if test $# -gt 0
        then
                packet="$*"
                printf '%04x%s' "$((4 + ${#packet}))" "$packet"
        else
-               perl -e '
-                       my $packet = do { local $/; <STDIN> };
-                       printf "%04x%s", 4 + length($packet), $packet;
-               '
+               test-tool pkt-line pack
        fi
 }
 
-# Parse the input as a series of pktlines, writing the result to stdout.
-# Sideband markers are removed automatically, and the output is routed to
-# stderr if appropriate.
-#
-# NUL bytes are converted to "\\0" for ease of parsing with text tools.
+packetize_raw () {
+       test-tool pkt-line pack-raw-stdin
+}
+
 depacketize () {
-       perl -e '
-               while (read(STDIN, $len, 4) == 4) {
-                       if ($len eq "0000") {
-                               print "FLUSH\n";
-                       } else {
-                               read(STDIN, $buf, hex($len) - 4);
-                               $buf =~ s/\0/\\0/g;
-                               if ($buf =~ s/^[\x2\x3]//) {
-                                       print STDERR $buf;
-                               } else {
-                                       $buf =~ s/^\x1//;
-                                       print $buf;
-                               }
-                       }
-               }
-       '
+       test-tool pkt-line unpack
 }
 
 # Converts base-16 data into base-8. The output is given as a sequence of