]> Sergey Matveev's repositories - public-inbox.git/commitdiff
view: safer and optional quoting for --in-reply-to arg
authorEric Wong <e@80x24.org>
Sat, 25 Jun 2016 21:29:43 +0000 (21:29 +0000)
committerEric Wong <e@80x24.org>
Sat, 25 Jun 2016 21:29:43 +0000 (21:29 +0000)
Angle brackets around the --in-reply-to= arg for git send-email
has been optional since git v1.5.3.2, so strip them and make the
command-line argument easier-to-type.

lib/PublicInbox/View.pm
t/view.t

index 30d8e3e8eddc28619863fce011abd0d80ed8300c..38e35bf35c535ec38578ee98335c03caa5b804fb 100644 (file)
@@ -455,6 +455,15 @@ sub _parent_headers {
        $rv;
 }
 
+sub squote_maybe ($) {
+       my ($val) = @_;
+       if ($val =~ m{([^\w@\./,\%\+\-])}) {
+               $val =~ s/(['!])/'\\$1'/g; # '!' for csh
+               return "'$val'";
+       }
+       $val;
+}
+
 sub mailto_arg_link {
        my ($hdr) = @_;
        my %cc; # everyone else
@@ -475,7 +484,7 @@ sub mailto_arg_link {
        my $subj = $hdr->header('Subject') || '';
        $subj = "Re: $subj" unless $subj =~ /\bRe:/i;
        my $mid = $hdr->header_raw('Message-ID');
-       push @arg, "--in-reply-to='" . ascii_html($mid) . "'";
+       push @arg, '--in-reply-to='.ascii_html(squote_maybe(mid_clean($mid)));
        my $irt = uri_escape_utf8($mid);
        delete $cc{$to};
        push @arg, '--to=' . ascii_html($to);
index 4ce3c7739018ddf3f5d060471043d729320ef55c..8a898febc3f983433ad3d78c692fafbfa669fe87 100644 (file)
--- a/t/view.t
+++ b/t/view.t
@@ -4,8 +4,20 @@ use strict;
 use warnings;
 use Test::More;
 use Email::MIME;
-use PublicInbox::View;
 use Plack::Util;
+use_ok 'PublicInbox::View';
+
+my @q = (
+       'foo@bar', 'foo@bar',
+       'a b', "'a b'",
+       "a'b", "'a'\\''b'",
+);
+while (@q) {
+       my $input = shift @q;
+       my $expect = shift @q;
+       my $res = PublicInbox::View::squote_maybe($input);
+       is($res, $expect, "quote $input => $res");
+}
 
 # FIXME: make this test less fragile
 my $ctx = {