From: Eric Wong Date: Wed, 30 Jan 2019 07:40:35 +0000 (+0000) Subject: Merge remote-tracking branch 'origin/viewvcs' into master X-Git-Tag: v1.2.0~397 X-Git-Url: http://www.git.stargrave.org/?p=public-inbox.git;a=commitdiff_plain;h=cf439203c31836e4c48f632f902aa58db6924972;hp=-c Merge remote-tracking branch 'origin/viewvcs' into master * origin/viewvcs: (66 commits) solvergit: deal with alternative diff prefixes solvergit: extract mode from diff headers properly solvergit: avoid "Wide character" warnings solvergit: do not show full path names to "git apply" css/216dark: add comments and tweak highlight colors viewvcs: avoid segfault with highlight.pm at shutdown solvergit: do not solve blobs twice t/check-www-inbox: disable history t/check-www-inbox: don't follow mboxes t/check-www-inbox: replace IPC::Run with PublicInbox::Spawn hval: add src_escape for highlight post-processing viewvcs: wire up syntax-highlighting for blobs hlmod: disable enclosing
 tag
  t/hl_mod: extra check to ensure we escape HTML
  wwwhighlight: read_in_full returns undef on errors
  solver: crank up max patches to 9999
  viewvcs: do not show final error message twice
  qspawn: decode $? for user-friendliness
  solver: reduce "git apply" invocations
  solver: hold patches in temporary directory
  ...
---

cf439203c31836e4c48f632f902aa58db6924972
diff --combined lib/PublicInbox/View.pm
index 4c1c6705,5aaa72ba..ca9b9550
--- a/lib/PublicInbox/View.pm
+++ b/lib/PublicInbox/View.pm
@@@ -14,6 -14,7 +14,7 @@@ use PublicInbox::MsgIter
  use PublicInbox::Address;
  use PublicInbox::WwwStream;
  use PublicInbox::Reply;
+ use PublicInbox::ViewDiff qw(flush_diff);
  require POSIX;
  use Time::Local qw(timegm);
  
@@@ -28,7 -29,7 +29,7 @@@ sub msg_html 
  	my ($ctx, $mime, $more, $smsg) = @_;
  	my $hdr = $mime->header_obj;
  	my $ibx = $ctx->{-inbox};
- 	my $obfs_ibx = $ctx->{-obfs_ibx} = $ibx->{obfuscate} ? $ibx : undef;
+ 	$ctx->{-obfs_ibx} = $ibx->{obfuscate} ? $ibx : undef;
  	my $tip = _msg_html_prepare($hdr, $ctx, $more, 0);
  	my $end = 2;
  	PublicInbox::WwwStream->response($ctx, 200, sub {
@@@ -36,7 -37,7 +37,7 @@@
  		if ($nr == 1) {
  			# $more cannot be true w/o $smsg being defined:
  			my $upfx = $more ? '../'.mid_escape($smsg->mid).'/' : '';
- 			$tip . multipart_text_as_html($mime, $upfx, $obfs_ibx) .
+ 			$tip . multipart_text_as_html($mime, $upfx, $ibx) .
  				'

' } elsif ($more && @$more) { ++$end; @@@ -81,15 -82,15 +82,15 @@@ sub msg_html_more my $str = eval { my ($id, $prev, $smsg) = @$more; my $mid = $ctx->{mid}; - $smsg = $ctx->{-inbox}->smsg_mime($smsg); + my $ibx = $ctx->{-inbox}; + $smsg = $ibx->smsg_mime($smsg); my $next = $ctx->{srch}->next_by_mid($mid, \$id, \$prev); @$more = $next ? ($id, $prev, $next) : (); if ($smsg) { my $mime = $smsg->{mime}; my $upfx = '../' . mid_escape($smsg->mid) . '/'; _msg_html_prepare($mime->header_obj, $ctx, $more, $nr) . - multipart_text_as_html($mime, $upfx, - $ctx->{-obfs_ibx}) . + multipart_text_as_html($mime, $upfx, $ibx) . '
' } else { ''; @@@ -260,7 -261,8 +261,8 @@@ sub index_entry $rv .= "\n"; # scan through all parts, looking for displayable text - msg_iter($mime, sub { $rv .= add_text_body($mhref, $obfs_ibx, $_[0]) }); + my $ibx = $ctx->{-inbox}; + msg_iter($mime, sub { $rv .= add_text_body($mhref, $ibx, $_[0]) }); # add the footer $rv .= "\n^ ". @@@ -488,11 -490,11 +490,11 @@@ sub thread_html } sub multipart_text_as_html { - my ($mime, $upfx, $obfs_ibx) = @_; + my ($mime, $upfx, $ibx) = @_; my $rv = ""; # scan through all parts, looking for displayable text - msg_iter($mime, sub { $rv .= add_text_body($upfx, $obfs_ibx, $_[0]) }); + msg_iter($mime, sub { $rv .= add_text_body($upfx, $ibx, $_[0]) }); $rv; } @@@ -545,7 -547,8 +547,8 @@@ sub attach_link ($$$$;$) } sub add_text_body { - my ($upfx, $obfs_ibx, $p) = @_; + my ($upfx, $ibx, $p) = @_; + my $obfs_ibx = $ibx->{obfuscate} ? $ibx : undef; # $p - from msg_iter: [ Email::MIME, depth, @idx ] my ($part, $depth) = @$p; # attachment @idx is unused my $ct = $part->content_type || 'text/plain'; @@@ -554,6 -557,25 +557,25 @@@ return attach_link($upfx, $ct, $p, $fn) unless defined $s; + # makes no difference to browsers, and don't screw up filename + # link generation in diffs with the extra '%0D' + $s =~ s/\r\n/\n/sg; + + my ($diff, $spfx); + if ($s =~ /^(?:diff|---|\+{3}) /ms) { + $diff = []; + if ($ibx->{-repo_objs}) { + my $n_slash = $upfx =~ tr!/!/!; + if ($n_slash == 0) { + $spfx = '../'; + } elsif ($n_slash == 1) { + $spfx = ''; + } else { # nslash == 2 + $spfx = '../../'; + } + } + }; + my @lines = split(/^/m, $s); $s = ''; if (defined($fn) || $depth > 0 || $err) { @@@ -568,19 -590,26 +590,26 @@@ # show the previously buffered quote inline flush_quote(\$s, $l, \@quot) if @quot; - # regular line, OK - $l->linkify_1($cur); - $s .= $l->linkify_2(ascii_html($cur)); + if ($diff) { + push @$diff, $cur; + } else { + # regular line, OK + $l->linkify_1($cur); + $s .= $l->linkify_2(ascii_html($cur)); + } } else { + flush_diff(\$s, $spfx, $l, $diff) if $diff && @$diff; push @quot, $cur; } } if (@quot) { # ugh, top posted flush_quote(\$s, $l, \@quot); + flush_diff(\$s, $spfx, $l, $diff) if $diff && @$diff; obfuscate_addrs($obfs_ibx, $s) if $obfs_ibx; $s; } else { + flush_diff(\$s, $spfx, $l, $diff) if $diff && @$diff; obfuscate_addrs($obfs_ibx, $s) if $obfs_ibx; if ($s =~ /\n\z/s) { # common, last line ends with a newline $s; @@@ -867,6 -896,11 +896,6 @@@ sub missing_thread PublicInbox::ExtMsg::ext_msg($ctx); } -sub _msg_date { - my ($hdr) = @_; - fmt_ts(msg_datestamp($hdr)); -} - sub fmt_ts { POSIX::strftime('%Y-%m-%d %k:%M', gmtime($_[0])) } sub dedupe_subject { @@@ -1070,7 -1104,7 +1099,7 @@@ sub dump_topics my $mbox = qq(mbox.gz); my $atom = qq(Atom); - my $s = "$top\n" . + my $s = "$top\n" . " $ds UTC $n - $mbox / $atom\n"; for (my $i = 0; $i < scalar(@ex); $i += 2) { my $level = $ex[$i];