This was intended for solver, but it's unused since commit 915cd090798069a4 ("solver: switch patch application to use a callback") --- lib/PublicInbox/Git.pm | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/lib/PublicInbox/Git.pm b/lib/PublicInbox/Git.pm index ff3838b3..218846f3 100644 --- a/lib/PublicInbox/Git.pm +++ b/lib/PublicInbox/Git.pm @@ -261,17 +261,6 @@ sub local_nick ($) { wantarray ? ($ret) : $ret; } -# show the blob URL for cgit/gitweb/whatever -sub src_blob_url { - my ($self, $oid) = @_; - # blob_url_format = "https://example.com/foo.git/blob/%s" - if (my $bfu = $self->{blob_url_format}) { - return map { sprintf($_, $oid) } @$bfu if wantarray; - return sprintf($bfu->[0], $oid); - } - local_nick($self); -} - sub host_prefix_url ($$) { my ($env, $url) = @_; return $url if index($url, '//') >= 0;
A bit messy at the moment, but we need to break this up into smaller steps for fairness with other clients, as applying dozens of patches can take several hundred milliseconds. --- lib/PublicInbox/SolverGit.pm | 70 ++++++++++++++++-------------------- 1 file changed, 31 insertions(+), 39 deletions(-) diff --git a/lib/PublicInbox/SolverGit.pm b/lib/PublicInbox/SolverGit.pm index 71494e0..70d8a93 100644 --- a/lib/PublicInbox/SolverGit.pm +++ b/lib/PublicInbox/SolverGit.pm @@ -290,16 +290,35 @@ sub di_url ($) { defined($url) ? "$url$mid/" : "<$mid>"; } -sub apply_patches ($$$$$) { - my ($self, $out, $wt, $found, $patches) = @_; +sub apply_patches_cb ($$$$$) { + my ($self, $out, $found, $patches, $oid_b) = @_; + my $wt = do_git_init_wt($self); my $wt_dir = $wt->dirname; my $wt_git = PublicInbox::Git->new("$wt_dir/.git"); $wt_git->{-wt} = $wt; my $cur = 0; my $tot = scalar @$patches; + my ($apply_pid, $rd, $di); + + # returns an empty string if in progress, undef if not found, + # or the final [ ::Git, oid_full, type, size, $di ] arrayref + # if found + sub { + if ($rd) { + $found->{$di->{oid_b}} = + do_apply_end($out, $wt_git, $rd, $di); + $rd = undef; + # continue to shift @$patches + } elsif ($apply_pid) { + $rd = do_apply_continue($wt_dir, $apply_pid); + $apply_pid = undef; + return ''; # $rd => do_apply_ned + } + + # may return undef here + $di = shift @$patches or return $found->{$oid_b}; - foreach my $di (@$patches) { my $i = ++$cur; my $oid_a = $di->{oid_a}; my $existing = $found->{$oid_a}; @@ -321,29 +340,10 @@ sub apply_patches ($$$$$) { join('', @{$di->{hdr_lines}}), "\n" or die "print \$out failed: $!"; - # apply the patch! - my $apply_pid = do_apply_begin($out, $wt_dir, $di); - my $rd = do_apply_continue($wt_dir, $apply_pid); - $found->{$di->{oid_b}} = do_apply_end($out, $wt_git, $rd, $di); - } -} - -sub dump_found ($$) { - my ($out, $found) = @_; - foreach my $oid (sort keys %$found) { - my ($git, $oid, undef, undef, $di) = @{$found->{$oid}}; - my $loc = $di ? di_url($di) : $git->src_blob_url($oid); - print $out "$oid from $loc\n"; - } -} - -sub dump_patches ($$) { - my ($out, $patches) = @_; - my $tot = scalar(@$patches); - my $i = 0; - foreach my $di (@$patches) { - ++$i; - print $out "[$i/$tot] ", di_url($di), "\n"; + # begin the patch application patch! + $apply_pid = do_apply_begin($out, $wt_dir, $di); + # next call to this callback will call do_apply_continue + ''; } } @@ -415,24 +415,16 @@ sub solve ($$$$) { unless (scalar(@$patches)) { print $out "no patch(es) for $oid_b\n"; - dump_found($out, $found); return; } # reconstruct the oid_b blob using patches we found: - eval { - my $wt = do_git_init_wt($self); - apply_patches($self, $out, $wt, $found, $patches); - }; - if ($@) { - print $out "E: $@\nfound: "; - dump_found($out, $found); - print $out "patches: "; - dump_patches($out, $patches); - return; + my $cb = apply_patches_cb($self, $out, $found, $patches, $oid_b); + my $ret; + while (1) { + $ret = $cb->(); + return $ret if (ref($ret) || !defined($ret)); } - - $found->{$oid_b}; } 1; -- EW
Still working on VCS integration and I'm not comfortable deploying this on the main public-inbox.org because of performance/fairness concerns, yet. But, perfect is the enemy of good and I figure it's worth publishing at the moment. It's also on a Tor mirror: http://hjrcffqmbrq6wope.onion/meta/ http://hjrcffqmbrq6wope.onion/git/ It looks great to me in Netsurf and dillo :> People with machines powerful enough to run Firefox (or Tor Browser Bundle) can use "View -> Page Style" to adjust colors. Performance considerations: * diff highlighting alone adds 10-20% overhead to message rendering Maybe I can speed it up with some less-readable Perl... * blob reconstruction is horribly unfair to other clients at the moment. Fixing this is a priority for me. I haven't hooked up highlight to blob viewing, yet; but that's coming; too. Thinking about it more, the blob lookups is so specific to git that I'm not sure other VCSes can be supported... The following changes since commit 55db8a2a51c13aec813ac56bbaac1505791fd262: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ TODO: autolinkify that(!) t/git.t: do not pass "-b" to git-repack(1) (2019-01-18 22:00:33 +0000) are available in the Git repository at: https://public-inbox.org/ viewvcs for you to fetch changes up to c440c879d38e67f62bdbb74f616dc84d20899c33: t/check-www-inbox: trap SIGINT for File::Temp destruction (2019-01-21 06:53:35 +0000) ---------------------------------------------------------------- Eric Wong (37): view: disable bold in topic display hval: force monospace for <form> elements, too t/perf-msgview: add test to check msg_html performance solver: initial Perl implementation git: support multiple URL endpoints git: add git_quote git: check saves error on disambiguation solver: various bugfixes and cleanups view: wire up diff and vcs viewers with solver git: disable abbreviations with cat-file hints solver: operate directly on git index view: enable naming hints for raw blob downloads git: support 'ambiguous' result from --batch-check solver: more verbose blob resolution solver: break up patch application steps solver: switch patch application to use a callback solver: simplify control flow for initial loop solver: break @todo loop into a callback solver: note the synchronous nature of index preparation solver: add a TODO note about making this fully evented view: enforce trailing slash for /$INBOX/$OID/s/ endpoints solver: restore diagnostics and deal with CRLF www: admin-configurable CSS via "publicinbox.css" $INBOX/_/text/color/ and sample user-side CSS viewdiff: support diff-highlighting w/o coderepo viewdiff: cleanup state transitions a bit viewdiff: quote attributes for Atom feed t/check-www-inbox: use xmlstarlet to validate Atom if available viewdiff: do not link to 0{7,40} blobs (again) viewvcs: disable white-space prewrap in blob view solver: force quoted-printable bodies to LF solver: remove extra "^index $OID..$OID" line config: each_inbox iteration preserves config order t/check-www-inbox: warn on missing Content-Type highlight: initial wrapper and PSGI service hval: split out escape sequences to a separate table t/check-www-inbox: trap SIGINT for File::Temp destruction Documentation/design_www.txt | 6 +- MANIFEST | 15 + Makefile.PL | 3 + TODO | 2 - contrib/css/216dark.css | 26 ++ contrib/css/216light.css | 25 ++ contrib/css/README | 41 +++ examples/highlight.psgi | 13 + examples/public-inbox.psgi | 2 +- lib/PublicInbox/Config.pm | 96 +++++- lib/PublicInbox/Git.pm | 87 ++++- lib/PublicInbox/HlMod.pm | 126 ++++++++ lib/PublicInbox/Hval.pm | 38 +-- lib/PublicInbox/SolverGit.pm | 454 +++++++++++++++++++++++++++ lib/PublicInbox/UserContent.pm | 78 +++++ lib/PublicInbox/View.pm | 51 ++- lib/PublicInbox/ViewDiff.pm | 161 ++++++++++ lib/PublicInbox/ViewVCS.pm | 110 +++++++ lib/PublicInbox/WWW.pm | 152 ++++++++- lib/PublicInbox/WwwHighlight.pm | 73 +++++ lib/PublicInbox/WwwStream.pm | 4 +- lib/PublicInbox/WwwText.pm | 35 +++ script/public-inbox-httpd | 2 +- t/check-www-inbox.perl | 26 +- t/config.t | 19 ++ t/git.t | 7 +- t/hl_mod.t | 54 ++++ t/perf-msgview.t | 50 +++ t/solve/0001-simple-mod.patch | 20 ++ t/solve/0002-rename-with-modifications.patch | 37 +++ t/solver_git.t | 91 ++++++ t/view.t | 2 + 32 files changed, 1841 insertions(+), 65 deletions(-) create mode 100644 contrib/css/216dark.css create mode 100644 contrib/css/216light.css create mode 100644 contrib/css/README create mode 100644 examples/highlight.psgi create mode 100644 lib/PublicInbox/HlMod.pm create mode 100644 lib/PublicInbox/SolverGit.pm create mode 100644 lib/PublicInbox/UserContent.pm create mode 100644 lib/PublicInbox/ViewDiff.pm create mode 100644 lib/PublicInbox/ViewVCS.pm create mode 100644 lib/PublicInbox/WwwHighlight.pm create mode 100644 t/hl_mod.t create mode 100644 t/perf-msgview.t create mode 100644 t/solve/0001-simple-mod.patch create mode 100644 t/solve/0002-rename-with-modifications.patch create mode 100644 t/solver_git.t Eric Wong (37): view: disable bold in topic display hval: force monospace for <form> elements, too t/perf-msgview: add test to check msg_html performance solver: initial Perl implementation git: support multiple URL endpoints git: add git_quote git: check saves error on disambiguation solver: various bugfixes and cleanups view: wire up diff and vcs viewers with solver git: disable abbreviations with cat-file hints solver: operate directly on git index view: enable naming hints for raw blob downloads git: support 'ambiguous' result from --batch-check solver: more verbose blob resolution solver: break up patch application steps solver: switch patch application to use a callback solver: simplify control flow for initial loop solver: break @todo loop into a callback solver: note the synchronous nature of index preparation solver: add a TODO note about making this fully evented view: enforce trailing slash for /$INBOX/$OID/s/ endpoints solver: restore diagnostics and deal with CRLF www: admin-configurable CSS via "publicinbox.css" $INBOX/_/text/color/ and sample user-side CSS viewdiff: support diff-highlighting w/o coderepo viewdiff: cleanup state transitions a bit viewdiff: quote attributes for Atom feed t/check-www-inbox: use xmlstarlet to validate Atom if available viewdiff: do not link to 0{7,40} blobs (again) viewvcs: disable white-space prewrap in blob view solver: force quoted-printable bodies to LF solver: remove extra "^index $OID..$OID" line config: each_inbox iteration preserves config order t/check-www-inbox: warn on missing Content-Type highlight: initial wrapper and PSGI service hval: split out escape sequences to a separate table t/check-www-inbox: trap SIGINT for File::Temp destruction Documentation/design_www.txt | 6 +- MANIFEST | 15 + Makefile.PL | 3 + TODO | 2 - contrib/css/216dark.css | 26 ++ contrib/css/216light.css | 25 + contrib/css/README | 41 ++ examples/highlight.psgi | 13 + examples/public-inbox.psgi | 2 +- lib/PublicInbox/Config.pm | 96 +++- lib/PublicInbox/Git.pm | 87 +++- lib/PublicInbox/HlMod.pm | 126 +++++ lib/PublicInbox/Hval.pm | 38 +- lib/PublicInbox/SolverGit.pm | 454 +++++++++++++++++++ lib/PublicInbox/UserContent.pm | 78 ++++ lib/PublicInbox/View.pm | 51 ++- lib/PublicInbox/ViewDiff.pm | 161 +++++++ lib/PublicInbox/ViewVCS.pm | 110 +++++ lib/PublicInbox/WWW.pm | 152 ++++++- lib/PublicInbox/WwwHighlight.pm | 73 +++ lib/PublicInbox/WwwStream.pm | 4 +- lib/PublicInbox/WwwText.pm | 35 ++ script/public-inbox-httpd | 2 +- t/check-www-inbox.perl | 26 +- t/config.t | 19 + t/git.t | 7 +- t/hl_mod.t | 54 +++ t/perf-msgview.t | 50 ++ t/solve/0001-simple-mod.patch | 20 + t/solve/0002-rename-with-modifications.patch | 37 ++ t/solver_git.t | 91 ++++ t/view.t | 2 + 32 files changed, 1841 insertions(+), 65 deletions(-) create mode 100644 contrib/css/216dark.css create mode 100644 contrib/css/216light.css create mode 100644 contrib/css/README create mode 100644 examples/highlight.psgi create mode 100644 lib/PublicInbox/HlMod.pm create mode 100644 lib/PublicInbox/SolverGit.pm create mode 100644 lib/PublicInbox/UserContent.pm create mode 100644 lib/PublicInbox/ViewDiff.pm create mode 100644 lib/PublicInbox/ViewVCS.pm create mode 100644 lib/PublicInbox/WwwHighlight.pm create mode 100644 t/hl_mod.t create mode 100644 t/perf-msgview.t create mode 100644 t/solve/0001-simple-mod.patch create mode 100644 t/solve/0002-rename-with-modifications.patch create mode 100644 t/solver_git.t