]> granicus.if.org Git - git/commitdiff
docs: warn about possible '=' in clean/smudge filter process values
authorLars Schneider <larsxschneider@gmail.com>
Sat, 3 Dec 2016 19:45:16 +0000 (20:45 +0100)
committerJunio C Hamano <gitster@pobox.com>
Tue, 6 Dec 2016 19:29:52 +0000 (11:29 -0800)
A pathname value in a clean/smudge filter process "key=value" pair can
contain the '=' character (introduced in edcc858). Make the user aware
of this issue in the docs, add a corresponding test case, and fix the
issue in filter process value parser of the example implementation in
contrib.

Signed-off-by: Lars Schneider <larsxschneider@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Documentation/gitattributes.txt
contrib/long-running-filter/example.pl
t/t0021-conversion.sh
t/t0021/rot13-filter.pl

index 976243a63e6ee4c4627a8a0db77bab2846d17f40..e0b66c1220a7d22ef5b8eb960a4e2e389a71f884 100644 (file)
@@ -435,7 +435,9 @@ to filter relative to the repository root. Right after the flush packet
 Git sends the content split in zero or more pkt-line packets and a
 flush packet to terminate content. Please note, that the filter
 must not send any response before it received the content and the
-final flush packet.
+final flush packet. Also note that the "value" of a "key=value" pair
+can contain the "=" character whereas the key would never contain
+that character.
 ------------------------
 packet:          git> command=smudge
 packet:          git> pathname=path/testfile.dat
index 39457055a59261c6af9ce72616fa5f74079c672d..a677569ddd95f4ce567570ad68111e37a5ed8508 100755 (executable)
@@ -81,8 +81,12 @@ packet_txt_write("capability=smudge");
 packet_flush();
 
 while (1) {
-       my ($command)  = packet_txt_read() =~ /^command=([^=]+)$/;
-       my ($pathname) = packet_txt_read() =~ /^pathname=([^=]+)$/;
+       my ($command)  = packet_txt_read() =~ /^command=(.+)$/;
+       my ($pathname) = packet_txt_read() =~ /^pathname=(.+)$/;
+
+       if ( $pathname eq "" ) {
+               die "bad pathname '$pathname'";
+       }
 
        packet_bin_read();
 
index 5ce2535017054250a91fac3ae4328aeb45ba6d55..5ae5ecb0fbc085f4723be236e1b74d42811d82ae 100755 (executable)
@@ -91,7 +91,7 @@ test_expect_success setup '
        git checkout -- test test.t test.i &&
 
        echo "content-test2" >test2.o &&
-       echo "content-test3 - filename with special characters" >"test3 '\''sq'\'',\$x.o"
+       echo "content-test3 - filename with special characters" >"test3 '\''sq'\'',\$x=.o"
 '
 
 script='s/^\$Id: \([0-9a-f]*\) \$/\1/p'
@@ -357,12 +357,12 @@ test_expect_success PERL 'required process filter should filter data' '
                cp "$TEST_ROOT/test.o" test.r &&
                cp "$TEST_ROOT/test2.o" test2.r &&
                mkdir testsubdir &&
-               cp "$TEST_ROOT/test3 '\''sq'\'',\$x.o" "testsubdir/test3 '\''sq'\'',\$x.r" &&
+               cp "$TEST_ROOT/test3 '\''sq'\'',\$x=.o" "testsubdir/test3 '\''sq'\'',\$x=.r" &&
                >test4-empty.r &&
 
                S=$(file_size test.r) &&
                S2=$(file_size test2.r) &&
-               S3=$(file_size "testsubdir/test3 '\''sq'\'',\$x.r") &&
+               S3=$(file_size "testsubdir/test3 '\''sq'\'',\$x=.r") &&
 
                filter_git add . &&
                cat >expected.log <<-EOF &&
@@ -371,7 +371,7 @@ test_expect_success PERL 'required process filter should filter data' '
                        IN: clean test.r $S [OK] -- OUT: $S . [OK]
                        IN: clean test2.r $S2 [OK] -- OUT: $S2 . [OK]
                        IN: clean test4-empty.r 0 [OK] -- OUT: 0  [OK]
-                       IN: clean testsubdir/test3 '\''sq'\'',\$x.r $S3 [OK] -- OUT: $S3 . [OK]
+                       IN: clean testsubdir/test3 '\''sq'\'',\$x=.r $S3 [OK] -- OUT: $S3 . [OK]
                        STOP
                EOF
                test_cmp_count expected.log rot13-filter.log &&
@@ -383,23 +383,23 @@ test_expect_success PERL 'required process filter should filter data' '
                        IN: clean test.r $S [OK] -- OUT: $S . [OK]
                        IN: clean test2.r $S2 [OK] -- OUT: $S2 . [OK]
                        IN: clean test4-empty.r 0 [OK] -- OUT: 0  [OK]
-                       IN: clean testsubdir/test3 '\''sq'\'',\$x.r $S3 [OK] -- OUT: $S3 . [OK]
+                       IN: clean testsubdir/test3 '\''sq'\'',\$x=.r $S3 [OK] -- OUT: $S3 . [OK]
                        IN: clean test.r $S [OK] -- OUT: $S . [OK]
                        IN: clean test2.r $S2 [OK] -- OUT: $S2 . [OK]
                        IN: clean test4-empty.r 0 [OK] -- OUT: 0  [OK]
-                       IN: clean testsubdir/test3 '\''sq'\'',\$x.r $S3 [OK] -- OUT: $S3 . [OK]
+                       IN: clean testsubdir/test3 '\''sq'\'',\$x=.r $S3 [OK] -- OUT: $S3 . [OK]
                        STOP
                EOF
                test_cmp_count expected.log rot13-filter.log &&
 
-               rm -f test2.r "testsubdir/test3 '\''sq'\'',\$x.r" &&
+               rm -f test2.r "testsubdir/test3 '\''sq'\'',\$x=.r" &&
 
                filter_git checkout --quiet --no-progress . &&
                cat >expected.log <<-EOF &&
                        START
                        init handshake complete
                        IN: smudge test2.r $S2 [OK] -- OUT: $S2 . [OK]
-                       IN: smudge testsubdir/test3 '\''sq'\'',\$x.r $S3 [OK] -- OUT: $S3 . [OK]
+                       IN: smudge testsubdir/test3 '\''sq'\'',\$x=.r $S3 [OK] -- OUT: $S3 . [OK]
                        STOP
                EOF
                test_cmp_exclude_clean expected.log rot13-filter.log &&
@@ -420,14 +420,14 @@ test_expect_success PERL 'required process filter should filter data' '
                        IN: smudge test.r $S [OK] -- OUT: $S . [OK]
                        IN: smudge test2.r $S2 [OK] -- OUT: $S2 . [OK]
                        IN: smudge test4-empty.r 0 [OK] -- OUT: 0  [OK]
-                       IN: smudge testsubdir/test3 '\''sq'\'',\$x.r $S3 [OK] -- OUT: $S3 . [OK]
+                       IN: smudge testsubdir/test3 '\''sq'\'',\$x=.r $S3 [OK] -- OUT: $S3 . [OK]
                        STOP
                EOF
                test_cmp_exclude_clean expected.log rot13-filter.log &&
 
                test_cmp_committed_rot13 "$TEST_ROOT/test.o" test.r &&
                test_cmp_committed_rot13 "$TEST_ROOT/test2.o" test2.r &&
-               test_cmp_committed_rot13 "$TEST_ROOT/test3 '\''sq'\'',\$x.o" "testsubdir/test3 '\''sq'\'',\$x.r"
+               test_cmp_committed_rot13 "$TEST_ROOT/test3 '\''sq'\'',\$x=.o" "testsubdir/test3 '\''sq'\'',\$x=.r"
        )
 '
 
index ae4c50f5c518f65462b900c560682a3d794847a8..02b3363fd9d1bb040c441b9a589afb3dfc8f8ed9 100755 (executable)
@@ -109,14 +109,18 @@ print $debug "init handshake complete\n";
 $debug->flush();
 
 while (1) {
-       my ($command) = packet_txt_read() =~ /^command=([^=]+)$/;
+       my ($command) = packet_txt_read() =~ /^command=(.+)$/;
        print $debug "IN: $command";
        $debug->flush();
 
-       my ($pathname) = packet_txt_read() =~ /^pathname=([^=]+)$/;
+       my ($pathname) = packet_txt_read() =~ /^pathname=(.+)$/;
        print $debug " $pathname";
        $debug->flush();
 
+       if ( $pathname eq "" ) {
+               die "bad pathname '$pathname'";
+       }
+
        # Flush
        packet_bin_read();