diff options
-rw-r--r-- | bug_form.pl | 90 | ||||
-rw-r--r-- | globals.pl | 126 | ||||
-rwxr-xr-x | long_list.cgi | 2 | ||||
-rwxr-xr-x | process_bug.cgi | 8 | ||||
-rwxr-xr-x | processmail | 4 |
5 files changed, 134 insertions, 96 deletions
diff --git a/bug_form.pl b/bug_form.pl index bac65d14c..e74f4f4d8 100644 --- a/bug_form.pl +++ b/bug_form.pl @@ -40,89 +40,6 @@ sub bug_form_pl_sillyness { $zz = @::legal_severity; } -my %knownattachments; - -# This routine quoteUrls contains inspirations from the HTML::FromText CPAN -# module by Gareth Rees <garethr@cre.canon.co.uk>. It has been heavily hacked, -# all that is really recognizable from the original is bits of the regular -# expressions. - -sub quoteUrls { - my $text = shift; # Take a copy; don't modify in-place. - return $text unless $text; - - my $base = Param('urlbase'); - - my $protocol = join '|', - qw(afs cid ftp gopher http https mid news nntp prospero telnet wais); - - my %options = ( metachars => 1, @_ ); - - my $count = 0; - - # Now, quote any "#" characters so they won't confuse stuff later - $text =~ s/#/%#/g; - - # Next, find anything that looks like a URL or an email address and - # pull them out the the text, replacing them with a "##<digits>## - # marker, and writing them into an array. All this confusion is - # necessary so that we don't match on something we've already replaced, - # which can happen if you do multiple s///g operations. - - my @things; - while ($text =~ s%((mailto:)?([\w\.\-\+\=]+\@[\w\-]+(?:\.[\w\-]+)+)\b| - (\b((?:$protocol):[^ \t\n<>"]+[\w/])))%"##$count##"%exo) { - my $item = $&; - - $item = value_quote($item); - - if ($item !~ m/^$protocol:/o && $item !~ /^mailto:/) { - # We must have grabbed this one because it looks like an email - # address. - $item = qq{<A HREF="mailto:$item">$item</A>}; - } else { - $item = qq{<A HREF="$item">$item</A>}; - } - - $things[$count++] = $item; - } - while ($text =~ s/\bbug(\s|%\#)*(\d+)/"##$count##"/ei) { - my $item = $&; - my $num = $2; - $item = value_quote($item); # Not really necessary, since we know - # there's no special chars in it. - $item = qq{<A HREF="show_bug.cgi?id=$num">$item</A>}; - $things[$count++] = $item; - } - while ($text =~ s/\*\*\* This bug has been marked as a duplicate of (\d+) \*\*\*/"##$count##"/ei) { - my $item = $&; - my $num = $1; - $item =~ s@\d+@<A HREF="show_bug.cgi?id=$num">$num</A>@; - $things[$count++] = $item; - } - while ($text =~ s/Created an attachment \(id=(\d+)\)/"##$count##"/e) { - my $item = $&; - my $num = $1; - if (exists $knownattachments{$num}) { - $item = qq{<A HREF="showattachment.cgi?attach_id=$num">$item</A>}; - } - $things[$count++] = $item; - } - - $text = value_quote($text); - $text =~ s/\
/\n/g; - - # Stuff everything back from the array. - for (my $i=0 ; $i<$count ; $i++) { - $text =~ s/##$i##/$things[$i]/e; - } - - # And undo the quoting of "#" characters. - $text =~ s/%#/#/g; - - return $text; -} - my $loginok = quietly_check_login(); my $id = $::FORM{'id'}; @@ -208,7 +125,7 @@ print qq{<FORM NAME="changeform" METHOD="POST" ACTION="process_bug.cgi">\n}; # print qq{<INPUT TYPE="HIDDEN" NAME="orig-$i" VALUE="$q">\n}; # } -$bug{'long_desc'} = GetLongDescription($id); +$bug{'long_desc'} = GetLongDescriptionAsHTML($id); my $longdesclength = length($bug{'long_desc'}); GetVersionTable(); @@ -370,7 +287,6 @@ while (MoreSQLData()) { my $link = "showattachment.cgi?attach_id=$attachid"; $desc = value_quote($desc); print qq{<td><a href="$link">$date</a></td><td colspan=4>$desc</td></tr><tr><td></td>}; - $knownattachments{$attachid} = 1; } print "<td colspan=6><a href=\"createattachment.cgi?id=$id\">Create a new attachment</a> (proposed patch, testcase, etc.)</td></tr></table>\n"; @@ -550,11 +466,9 @@ print " <table><tr><td align=left><B>Description:</B></td> <td align=right width=100%>Opened: $bug{'creation_ts'}</td></tr></table> <HR> -<PRE> "; -print quoteUrls($bug{'long_desc'}, email=>1, urls=>1); +print $bug{'long_desc'}; print " -</PRE> <HR>\n"; # To add back option of editing the long description, insert after the above diff --git a/globals.pl b/globals.pl index 8e05fc0d2..954c55971 100644 --- a/globals.pl +++ b/globals.pl @@ -562,7 +562,88 @@ sub DBNameToIdAndCheck { exit(0); } -sub GetLongDescription { +# This routine quoteUrls contains inspirations from the HTML::FromText CPAN +# module by Gareth Rees <garethr@cre.canon.co.uk>. It has been heavily hacked, +# all that is really recognizable from the original is bits of the regular +# expressions. + +sub quoteUrls { + my ($knownattachments, $text) = (@_); + return $text unless $text; + + my $base = Param('urlbase'); + + my $protocol = join '|', + qw(afs cid ftp gopher http https mid news nntp prospero telnet wais); + + my %options = ( metachars => 1, @_ ); + + my $count = 0; + + # Now, quote any "#" characters so they won't confuse stuff later + $text =~ s/#/%#/g; + + # Next, find anything that looks like a URL or an email address and + # pull them out the the text, replacing them with a "##<digits>## + # marker, and writing them into an array. All this confusion is + # necessary so that we don't match on something we've already replaced, + # which can happen if you do multiple s///g operations. + + my @things; + while ($text =~ s%((mailto:)?([\w\.\-\+\=]+\@[\w\-]+(?:\.[\w\-]+)+)\b| + (\b((?:$protocol):[^ \t\n<>"]+[\w/])))%"##$count##"%exo) { + my $item = $&; + + $item = value_quote($item); + + if ($item !~ m/^$protocol:/o && $item !~ /^mailto:/) { + # We must have grabbed this one because it looks like an email + # address. + $item = qq{<A HREF="mailto:$item">$item</A>}; + } else { + $item = qq{<A HREF="$item">$item</A>}; + } + + $things[$count++] = $item; + } + while ($text =~ s/\bbug(\s|%\#)*(\d+)/"##$count##"/ei) { + my $item = $&; + my $num = $2; + $item = value_quote($item); # Not really necessary, since we know + # there's no special chars in it. + $item = qq{<A HREF="show_bug.cgi?id=$num">$item</A>}; + $things[$count++] = $item; + } + while ($text =~ s/\*\*\* This bug has been marked as a duplicate of (\d+) \*\*\*/"##$count##"/ei) { + my $item = $&; + my $num = $1; + $item =~ s@\d+@<A HREF="show_bug.cgi?id=$num">$num</A>@; + $things[$count++] = $item; + } + while ($text =~ s/Created an attachment \(id=(\d+)\)/"##$count##"/e) { + my $item = $&; + my $num = $1; + if ($knownattachments->{$num}) { + $item = qq{<A HREF="showattachment.cgi?attach_id=$num">$item</A>}; + } + $things[$count++] = $item; + } + + $text = value_quote($text); + $text =~ s/\
/\n/g; + + # Stuff everything back from the array. + for (my $i=0 ; $i<$count ; $i++) { + $text =~ s/##$i##/$things[$i]/e; + } + + # And undo the quoting of "#" characters. + $text =~ s/%#/#/g; + + return $text; +} + +sub GetLongDescriptionAsText { my ($id, $start, $end) = (@_); my $result = ""; my $count = 0; @@ -598,6 +679,49 @@ sub GetLongDescription { } +sub GetLongDescriptionAsHTML { + my ($id, $start, $end) = (@_); + my $result = ""; + my $count = 0; + my %knownattachments; + SendSQL("SELECT attach_id FROM attachments WHERE bug_id = $id"); + while (MoreSQLData()) { + $knownattachments{FetchOneColumn()} = 1; + } + + my ($query) = ("SELECT profiles.login_name, longdescs.bug_when, " . + " longdescs.thetext " . + "FROM longdescs, profiles " . + "WHERE profiles.userid = longdescs.who " . + " AND longdescs.bug_id = $id "); + + if ($start && $start =~ /[1-9]/) { + # If the start is all zeros, then don't do this (because we want to + # not emit a leading "Addition Comments" line in that case.) + $query .= "AND longdescs.bug_when > '$start'"; + $count = 1; + } + if ($end) { + $query .= "AND longdescs.bug_when <= '$end'"; + } + + $query .= "ORDER BY longdescs.bug_when"; + SendSQL($query); + while (MoreSQLData()) { + my ($who, $when, $text) = (FetchSQLData()); + if ($count) { + $result .= "<BR><BR><I>------- Additional Comments From " . + qq{<A HREF="$who">$who</A> } . + time2str("%Y-%m-%d %H:%M", str2time($when)) . + " -------</I><BR>\n"; + } + $result .= "<PRE>" . quoteUrls(\%knownattachments, $text) . "</PRE>\n"; + $count++; + } + + return $result; +} + sub ShowCcList { my ($num) = (@_); my @ccids; diff --git a/long_list.cgi b/long_list.cgi index 9b9f47d87..e095c59ec 100755 --- a/long_list.cgi +++ b/long_list.cgi @@ -116,7 +116,7 @@ foreach my $bug (split(/:/, $::FORM{'buglist'})) { html_quote($status_whiteboard) . "\n"; } print "<TR><TD><B>Description:</B>\n</TABLE>\n"; - print "<PRE>" . html_quote(GetLongDescription($bug)) . "</PRE>\n"; + print GetLongDescriptionAsHTML($bug); print "<HR>\n"; } } diff --git a/process_bug.cgi b/process_bug.cgi index 0e11f16cc..ac8f1a395 100755 --- a/process_bug.cgi +++ b/process_bug.cgi @@ -609,14 +609,14 @@ The changes made were: <p> "; DumpBugActivity($id, $delta_ts); - my $longdesc = GetLongDescription($id); + my $longdesc = GetLongDescriptionAsHTML($id); my $longchanged = 0; if (length($longdesc) > $::FORM{'longdesclength'}) { $longchanged = 1; - print "<P>Added text to the long description:<blockquote><pre>"; - print html_quote(substr($longdesc, $::FORM{'longdesclength'})); - print "</pre></blockquote>\n"; + print "<P>Added text to the long description:<blockquote>"; + print substr($longdesc, $::FORM{'longdesclength'}); + print "</blockquote>\n"; } SendSQL("unlock tables"); print "You have the following choices: <ul>\n"; diff --git a/processmail b/processmail index 618c6dbc1..9b9baa4dd 100755 --- a/processmail +++ b/processmail @@ -199,7 +199,7 @@ sub GetBugText { $status_whiteboard = "StatusWhiteboard: $::bug{'status_whiteboard'}\n"; } - $::bug{'long_desc'} = GetLongDescription($id); + $::bug{'long_desc'} = GetLongDescriptionAsText($id); my @cclist; @cclist = split(/,/, ShowCcList($id)); @@ -455,7 +455,7 @@ sub NewProcessOneBug { } - my $newcomments = GetLongDescription($id, $start, $end); + my $newcomments = GetLongDescriptionAsText($id, $start, $end); my $count = 0; for my $person ($values{'assigned_to'}, $values{'reporter'}, |