]> granicus.if.org Git - git/commitdiff
t0021/rot13-filter: refactor packet reading functions
authorChristian Couder <christian.couder@gmail.com>
Sun, 5 Nov 2017 21:38:30 +0000 (22:38 +0100)
committerJunio C Hamano <gitster@pobox.com>
Tue, 7 Nov 2017 00:54:41 +0000 (09:54 +0900)
To make it possible in a following commit to move packet
reading and writing functions into a Packet.pm module,
let's refactor these functions, so they don't handle
printing debug output and exiting.

While at it let's create packet_required_key_val_read()
to still handle erroring out in a common case.

Signed-off-by: Christian Couder <chriscool@tuxfamily.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
t/t0021/rot13-filter.pl

index 4b2d9087d4d8a3e61742775ce47df18f6f2914eb..c025518c0a1530e28567a651ba0b3098a1064b3f 100644 (file)
@@ -74,8 +74,7 @@ sub packet_bin_read {
        my $bytes_read = read STDIN, $buffer, 4;
        if ( $bytes_read == 0 ) {
                # EOF - Git stopped talking to us!
-               print $debug "STOP\n";
-               exit();
+               return ( -1, "" );
        }
        elsif ( $bytes_read != 4 ) {
                die "invalid packet: '$buffer'";
@@ -99,12 +98,21 @@ sub packet_bin_read {
 
 sub packet_txt_read {
        my ( $res, $buf ) = packet_bin_read();
-       unless ( $buf eq '' or $buf =~ s/\n$// ) {
+       unless ( $res == -1 or $buf eq '' or $buf =~ s/\n$// ) {
                die "A non-binary line MUST be terminated by an LF.";
        }
        return ( $res, $buf );
 }
 
+sub packet_required_key_val_read {
+       my ( $key ) = @_;
+       my ( $res, $buf ) = packet_txt_read();
+       unless ( $res == -1 or ( $buf =~ s/^$key=// and $buf ne '' ) ) {
+               die "bad $key: '$buf'";
+       }
+       return ( $res, $buf );
+}
+
 sub packet_bin_write {
        my $buf = shift;
        print STDOUT sprintf( "%04x", length($buf) + 4 );
@@ -152,13 +160,18 @@ print $debug "init handshake complete\n";
 $debug->flush();
 
 while (1) {
-       my ( $command ) = packet_txt_read() =~ /^command=(.+)$/;
+       my ( $res, $command ) = packet_required_key_val_read("command");
+       if ( $res == -1 ) {
+               print $debug "STOP\n";
+               exit();
+       }
        print $debug "IN: $command";
        $debug->flush();
 
        if ( $command eq "list_available_blobs" ) {
                # Flush
-               packet_bin_read();
+               packet_compare_lists([1, ""], packet_bin_read()) ||
+                       die "bad list_available_blobs end";
 
                foreach my $pathname ( sort keys %DELAY ) {
                        if ( $DELAY{$pathname}{"requested"} >= 1 ) {
@@ -184,14 +197,13 @@ while (1) {
                packet_flush();
        }
        else {
-               my ( $pathname ) = packet_txt_read() =~ /^pathname=(.+)$/;
+               my ( $res, $pathname ) = packet_required_key_val_read("pathname");
+               if ( $res == -1 ) {
+                       die "unexpected EOF while expecting pathname";
+               }
                print $debug " $pathname";
                $debug->flush();
 
-               if ( $pathname eq "" ) {
-                       die "bad pathname '$pathname'";
-               }
-
                # Read until flush
                my ( $done, $buffer ) = packet_txt_read();
                while ( $buffer ne '' ) {
@@ -205,6 +217,9 @@ while (1) {
 
                        ( $done, $buffer ) = packet_txt_read();
                }
+               if ( $done == -1 ) {
+                       die "unexpected EOF after pathname '$pathname'";
+               }
 
                my $input = "";
                {
@@ -215,6 +230,9 @@ while (1) {
                                ( $done, $buffer ) = packet_bin_read();
                                $input .= $buffer;
                        }
+                       if ( $done == -1 ) {
+                               die "unexpected EOF while reading input for '$pathname'";
+                       }                       
                        print $debug " " . length($input) . " [OK] -- ";
                        $debug->flush();
                }