user/dev discussion of public-inbox itself
 help / color / mirror / code / Atom feed
Search results ordered by [date|relevance]  view[summary|nested|Atom feed]
thread overview below | download mbox.gz: |
* [PATCH 02/13] viewvcs: preliminary support for showing non-blobs
  2019-03-12  4:00  6% [PATCH 00/13] support parsing cgitrc and spawning cgit Eric Wong
@ 2019-03-12  4:00  7% ` Eric Wong
  0 siblings, 0 replies; 2+ results
From: Eric Wong @ 2019-03-12  4:00 UTC (permalink / raw)
  To: meta

Eventually, we'll have special displays for various git objects
(commit, tree, tag).  But for now, we'll just use git-show
to spew whatever comes from git.
---
 lib/PublicInbox/SolverGit.pm | 11 +++++++----
 lib/PublicInbox/ViewVCS.pm   | 28 ++++++++++++++++++++++++++++
 2 files changed, 35 insertions(+), 4 deletions(-)

diff --git a/lib/PublicInbox/SolverGit.pm b/lib/PublicInbox/SolverGit.pm
index 463a9b6..cd0f94a 100644
--- a/lib/PublicInbox/SolverGit.pm
+++ b/lib/PublicInbox/SolverGit.pm
@@ -62,14 +62,15 @@ sub ERR ($$) {
 	die $err;
 }
 
-# look for existing blobs already in git repos
+# look for existing objects already in git repos
 sub solve_existing ($$) {
 	my ($self, $want) = @_;
 	my $oid_b = $want->{oid_b};
+	my $have_hints = scalar keys %$want > 1;
 	my @ambiguous; # Array of [ git, $oids]
 	foreach my $git (@{$self->{gits}}) {
 		my ($oid_full, $type, $size) = $git->check($oid_b);
-		if (defined($type) && $type eq 'blob') {
+		if (defined($type) && (!$have_hints || $type eq 'blob')) {
 			return [ $git, $oid_full, $type, int($size) ];
 		}
 
@@ -480,10 +481,11 @@ sub resolve_patch ($$) {
 		die "Loop detected solving $cur_want\n";
 	}
 	if (my $existing = solve_existing($self, $want)) {
+		my ($found_git, undef, $type, undef) = @$existing;
 		dbg($self, "found $cur_want in " .
-			join("\n", $existing->[0]->pub_urls));
+			join("\n", $found_git->pub_urls));
 
-		if ($cur_want eq $self->{oid_want}) { # all done!
+		if ($cur_want eq $self->{oid_want} || $type ne 'blob') {
 			eval { delete($self->{user_cb})->($existing) };
 			die "E: $@" if $@;
 			return;
@@ -540,6 +542,7 @@ sub new {
 }
 
 # recreate $oid_want using $hints
+# hints keys: path_a, path_b, oid_a
 # Calls {user_cb} with: [ ::Git object, oid_full, type, size, di (diff_info) ]
 # with found object, or undef if nothing was found
 # Calls {user_cb} with a string error on fatal errors
diff --git a/lib/PublicInbox/ViewVCS.pm b/lib/PublicInbox/ViewVCS.pm
index f537451..4a97b9a 100644
--- a/lib/PublicInbox/ViewVCS.pm
+++ b/lib/PublicInbox/ViewVCS.pm
@@ -67,6 +67,33 @@ sub stream_large_blob ($$$$) {
 	});
 }
 
+sub show_other ($$$$) {
+	my ($ctx, $res, $logref, $fn) = @_;
+	my ($git, $oid, $type, $size) = @$res;
+	if ($size > $max_size) {
+		$$logref = "$oid is too big to show\n" . $$logref;
+		return html_page($ctx, 200, $logref);
+	}
+	my $cmd = ['git', "--git-dir=$git->{git_dir}",
+		qw(show --encoding=UTF-8 --no-color --no-abbrev), $oid ];
+	my $qsp = PublicInbox::Qspawn->new($cmd);
+	my $env = $ctx->{env};
+	$qsp->psgi_qx($env, undef, sub {
+		my ($bref) = @_;
+		if (my $err = $qsp->{err}) {
+			utf8::decode($$err);
+			$$logref .= "git show error: $err";
+			return html_page($ctx, 500, $logref);
+		}
+		my $l = PublicInbox::Linkify->new;
+		utf8::decode($$bref);
+		$l->linkify_1($$bref);
+		$$bref = '<pre>'. $l->linkify_2(ascii_html($$bref));
+		$$bref .= '</pre><hr>' . $$logref;
+		html_page($ctx, 200, $bref);
+	});
+}
+
 sub solve_result {
 	my ($ctx, $res, $log, $hints, $fn) = @_;
 
@@ -86,6 +113,7 @@ sub solve_result {
 	$ref eq 'ARRAY' or return html_page($ctx, 500, \$log);
 
 	my ($git, $oid, $type, $size, $di) = @$res;
+	return show_other($ctx, $res, \$log, $fn) if $type ne 'blob';
 	my $path = to_filename($di->{path_b} || $hints->{path_b} || 'blob');
 	my $raw_link = "(<a\nhref=$path>raw</a>)";
 	if ($size > $max_size) {
-- 
EW


^ permalink raw reply related	[relevance 7%]

* [PATCH 00/13] support parsing cgitrc and spawning cgit
@ 2019-03-12  4:00  6% Eric Wong
  2019-03-12  4:00  7% ` [PATCH 02/13] viewvcs: preliminary support for showing non-blobs Eric Wong
  0 siblings, 1 reply; 2+ results
From: Eric Wong @ 2019-03-12  4:00 UTC (permalink / raw)
  To: meta

Parsing an existing cgitrc reduces the amount of work some for
admins (who already maintain cgit instances) by allowing them to
skip the tedious setup of of setting up [coderepo "..."]
sections.

We currently do not support "scan-path", "project-list" or
macros in cgitrc processing, yet.  So it's expected that
"repo.url" and "repo.path" be configured in the cgitrc for each
code repo.  (I started using cgit in 2008 before cgit supported
path scanning, and never updated my setup :x)

Since cgit does not serve smart HTTP fetch/clone, we can
intercept requests for those and route such requests to
git-http-backend(1) using the same mechanisms we use for
serving inboxes.

Eric Wong (13):
  git: add "commit_title" method
  viewvcs: preliminary support for showing non-blobs
  viewvcs: match 8000-byte lookup for git
  spawn: support RLIMIT_CPU, RLIMIT_DATA and RLIMIT_CORE
  support publicinbox.cgitrc directive
  githttpbackend: move more psgi.input handling into subroutine
  githttpbackend: check for other errors and relax CRLF check
  spawn: support absolute paths
  cgit: support running cgit as a standalone CGI
  www: wire up cgit as a 404 handler if cgitrc is configured
  qspawn: wire up RLIMIT_* handling to limiters
  cgit: use a dedicated named limiter
  spawn: require soft and hard entries in RLIMIT_* handling

 Documentation/public-inbox-config.pod | 44 +++++++++++++-
 MANIFEST                              |  2 +
 examples/cgit.psgi                    | 29 +++++++++
 lib/PublicInbox/Cgit.pm               | 88 +++++++++++++++++++++++++++
 lib/PublicInbox/Config.pm             | 61 +++++++++++++++++--
 lib/PublicInbox/Git.pm                | 20 +++++-
 lib/PublicInbox/GitHTTPBackend.pm     | 29 ++++-----
 lib/PublicInbox/Qspawn.pm             | 41 ++++++++++++-
 lib/PublicInbox/SolverGit.pm          | 14 +++--
 lib/PublicInbox/Spawn.pm              | 40 ++++++++++--
 lib/PublicInbox/SpawnPP.pm            |  9 ++-
 lib/PublicInbox/ViewVCS.pm            | 34 ++++++++++-
 lib/PublicInbox/WWW.pm                | 20 +++++-
 t/solver_git.t                        |  9 ++-
 t/spawn.t                             | 19 ++++++
 15 files changed, 416 insertions(+), 43 deletions(-)
 create mode 100644 examples/cgit.psgi
 create mode 100644 lib/PublicInbox/Cgit.pm

-- 
EW


^ permalink raw reply	[relevance 6%]

Results 1-2 of 2 | reverse | options above
-- pct% links below jump to the message on this page, permalinks otherwise --
2019-03-12  4:00  6% [PATCH 00/13] support parsing cgitrc and spawning cgit Eric Wong
2019-03-12  4:00  7% ` [PATCH 02/13] viewvcs: preliminary support for showing non-blobs Eric Wong

Code repositories for project(s) associated with this public inbox

	https://80x24.org/public-inbox.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).