perlbug: wrap overly long lines
authorNiko Tyni <ntyni@debian.org>
Mon, 25 Apr 2016 13:31:00 +0000 (16:31 +0300)
committerAaron Crane <arc@cpan.org>
Mon, 16 May 2016 12:31:40 +0000 (13:31 +0100)
Mail transport agents limit the length of message lines at SMTP time.
One observed limit is 1000 characters per line. Mail user agents typically
work around these limits by MIME-encoding the message. Since perlbug
doesn't do that, it needs to limit the length of its lines manually to
make sure bug reports get delivered.

The longest lines in perlbug reports normally come from Config::myconfig
output, particularly 'config_args', which has been observed to exceed
1000 characters on some configurations, causing report rejection. While
less likely, the list of local patches is another potential source of
overly long lines.

Use Text::Wrap (if available) to wrap the body of the report at an
arbitrarily chosen and hopefully safe limit of 900 characters. No
indentation or continuation line markers are added, though it would
be easy to add those if desired. Attachments and mail headers are not
wrapped.

Bug-Debian: https://bugs.debian.org/822463

lib/perlbug.t
utils/perlbug.PL

index ede26af..ed32c04 100644 (file)
@@ -151,8 +151,5 @@ for (split(/\n/, $contents)) {
         $maxlen1 = $len if $len > $maxlen1 and !/$B/;
         $maxlen2 = $len if $len > $maxlen2 and  /$B/;
 }
-TODO: {
-local $::TODO = 'long body lines not wrapped yet';
 ok($maxlen1 < 1000, "[perl #128020] long body lines are wrapped: maxlen $maxlen1");
-}
 ok($maxlen2 > 1000, "long attachment lines are not wrapped: maxlen $maxlen2");
index 95e34fe..6290ca7 100644 (file)
@@ -76,6 +76,8 @@ BEGIN {
     $::HaveTemp = ($@ eq "");
     eval { require Module::CoreList; };
     $::HaveCoreList = ($@ eq "");
+    eval { require Text::Wrap; };
+    $::HaveWrap = ($@ eq "");
 };
 
 my $Version = "1.40";
@@ -1084,7 +1086,16 @@ sub _read_report {
     my $content;
     open( REP, "<:raw", $fname ) or die "Couldn't open file '$fname': $!\n";
     binmode(REP, ':raw :crlf') if $Is_MSWin32;
-    while (<REP>) { $content .= $_; }
+    # wrap long lines to make sure the report gets delivered
+    local $Text::Wrap::columns = 900;
+    local $Text::Wrap::huge = 'overflow';
+    while (<REP>) {
+        if ($::HaveWrap && /\S/) { # wrap() would remove empty lines
+            $content .= Text::Wrap::wrap(undef, undef, $_);
+        } else {
+            $content .= $_;
+        }
+    }
     close(REP) or die "Error closing report file '$fname': $!";
     return $content;
 }