docs: warn about possible '=' in clean/smudge filter process values
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>
Lars Schneider committed
Dec 3, 2016 at 20:45 UTC
c6b0831c9c1718b552872953b4949cef7d4726fe
4 files changed
+25
-15
Documentation/gitattributes.txt
+3
-1
@@ -435,7 +435,9 @@ to filter relative to the repository root. Right after the flush packet
435
Git sends the content split in zero or more pkt-line packets and a
436
flush packet to terminate content. Please note, that the filter
437
must not send any response before it received the content and the
438
-final flush packet.
438
+final flush packet. Also note that the "value" of a "key=value" pair
439
+can contain the "=" character whereas the key would never contain
440
+that character.
441
------------------------
442
packet: git> command=smudge
443
packet: git> pathname=path/testfile.dat
contrib/long-running-filter/example.pl
+6
-2
@@ -81,8 +81,12 @@ packet_txt_write("capability=smudge");
81
packet_flush();
82
83
while (1) {
84
- my ($command) = packet_txt_read() =~ /^command=([^=]+)$/;
85
- my ($pathname) = packet_txt_read() =~ /^pathname=([^=]+)$/;
84
+ my ($command) = packet_txt_read() =~ /^command=(.+)$/;
85
+ my ($pathname) = packet_txt_read() =~ /^pathname=(.+)$/;
86
+
87
+ if ( $pathname eq "" ) {
88
+ die "bad pathname '$pathname'";
89
+ }
90
91
packet_bin_read();
92
t/t0021-conversion.sh
+10
-10
@@ -91,7 +91,7 @@ test_expect_success setup '
91
git checkout -- test test.t test.i &&
92
93
echo "content-test2" >test2.o &&
94
- echo "content-test3 - filename with special characters" >"test3 '\''sq'\'',\$x.o"
94
+ echo "content-test3 - filename with special characters" >"test3 '\''sq'\'',\$x=.o"
95
'
96
97
script='s/^\$Id: \([0-9a-f]*\) \$/\1/p'
@@ -357,12 +357,12 @@ test_expect_success PERL 'required process filter should filter data' '
357
cp "$TEST_ROOT/test.o" test.r &&
358
cp "$TEST_ROOT/test2.o" test2.r &&
359
mkdir testsubdir &&
360
- cp "$TEST_ROOT/test3 '\''sq'\'',\$x.o" "testsubdir/test3 '\''sq'\'',\$x.r" &&
360
+ cp "$TEST_ROOT/test3 '\''sq'\'',\$x=.o" "testsubdir/test3 '\''sq'\'',\$x=.r" &&
361
>test4-empty.r &&
362
363
S=$(file_size test.r) &&
364
S2=$(file_size test2.r) &&
365
- S3=$(file_size "testsubdir/test3 '\''sq'\'',\$x.r") &&
365
+ S3=$(file_size "testsubdir/test3 '\''sq'\'',\$x=.r") &&
366
367
filter_git add . &&
368
cat >expected.log <<-EOF &&
@@ -371,7 +371,7 @@ test_expect_success PERL 'required process filter should filter data' '
371
IN: clean test.r $S [OK] -- OUT: $S . [OK]
372
IN: clean test2.r $S2 [OK] -- OUT: $S2 . [OK]
373
IN: clean test4-empty.r 0 [OK] -- OUT: 0 [OK]
374
- IN: clean testsubdir/test3 '\''sq'\'',\$x.r $S3 [OK] -- OUT: $S3 . [OK]
374
+ IN: clean testsubdir/test3 '\''sq'\'',\$x=.r $S3 [OK] -- OUT: $S3 . [OK]
375
STOP
376
EOF
377
test_cmp_count expected.log rot13-filter.log &&
@@ -383,23 +383,23 @@ test_expect_success PERL 'required process filter should filter data' '
383
IN: clean test.r $S [OK] -- OUT: $S . [OK]
384
IN: clean test2.r $S2 [OK] -- OUT: $S2 . [OK]
385
IN: clean test4-empty.r 0 [OK] -- OUT: 0 [OK]
386
- IN: clean testsubdir/test3 '\''sq'\'',\$x.r $S3 [OK] -- OUT: $S3 . [OK]
386
+ IN: clean testsubdir/test3 '\''sq'\'',\$x=.r $S3 [OK] -- OUT: $S3 . [OK]
387
IN: clean test.r $S [OK] -- OUT: $S . [OK]
388
IN: clean test2.r $S2 [OK] -- OUT: $S2 . [OK]
389
IN: clean test4-empty.r 0 [OK] -- OUT: 0 [OK]
390
- IN: clean testsubdir/test3 '\''sq'\'',\$x.r $S3 [OK] -- OUT: $S3 . [OK]
390
+ IN: clean testsubdir/test3 '\''sq'\'',\$x=.r $S3 [OK] -- OUT: $S3 . [OK]
391
STOP
392
EOF
393
test_cmp_count expected.log rot13-filter.log &&
394
395
- rm -f test2.r "testsubdir/test3 '\''sq'\'',\$x.r" &&
395
+ rm -f test2.r "testsubdir/test3 '\''sq'\'',\$x=.r" &&
396
397
filter_git checkout --quiet --no-progress . &&
398
cat >expected.log <<-EOF &&
399
START
400
init handshake complete
401
IN: smudge test2.r $S2 [OK] -- OUT: $S2 . [OK]
402
- IN: smudge testsubdir/test3 '\''sq'\'',\$x.r $S3 [OK] -- OUT: $S3 . [OK]
402
+ IN: smudge testsubdir/test3 '\''sq'\'',\$x=.r $S3 [OK] -- OUT: $S3 . [OK]
403
STOP
404
EOF
405
test_cmp_exclude_clean expected.log rot13-filter.log &&
@@ -420,14 +420,14 @@ test_expect_success PERL 'required process filter should filter data' '
420
IN: smudge test.r $S [OK] -- OUT: $S . [OK]
421
IN: smudge test2.r $S2 [OK] -- OUT: $S2 . [OK]
422
IN: smudge test4-empty.r 0 [OK] -- OUT: 0 [OK]
423
- IN: smudge testsubdir/test3 '\''sq'\'',\$x.r $S3 [OK] -- OUT: $S3 . [OK]
423
+ IN: smudge testsubdir/test3 '\''sq'\'',\$x=.r $S3 [OK] -- OUT: $S3 . [OK]
424
STOP
425
EOF
426
test_cmp_exclude_clean expected.log rot13-filter.log &&
427
428
test_cmp_committed_rot13 "$TEST_ROOT/test.o" test.r &&
429
test_cmp_committed_rot13 "$TEST_ROOT/test2.o" test2.r &&
430
- test_cmp_committed_rot13 "$TEST_ROOT/test3 '\''sq'\'',\$x.o" "testsubdir/test3 '\''sq'\'',\$x.r"
430
+ test_cmp_committed_rot13 "$TEST_ROOT/test3 '\''sq'\'',\$x=.o" "testsubdir/test3 '\''sq'\'',\$x=.r"
431
)
432
'
433
t/t0021/rot13-filter.pl
+6
-2
@@ -109,14 +109,18 @@ print $debug "init handshake complete\n";
109
$debug->flush();
110
111
while (1) {
112
- my ($command) = packet_txt_read() =~ /^command=([^=]+)$/;
112
+ my ($command) = packet_txt_read() =~ /^command=(.+)$/;
113
print $debug "IN: $command";
114
$debug->flush();
115
116
- my ($pathname) = packet_txt_read() =~ /^pathname=([^=]+)$/;
116
+ my ($pathname) = packet_txt_read() =~ /^pathname=(.+)$/;
117
print $debug " $pathname";
118
$debug->flush();
119
120
+ if ( $pathname eq "" ) {
121
+ die "bad pathname '$pathname'";
122
+ }
123
+
124
# Flush
125
packet_bin_read();
126