* [PATCH 00/13] support parsing cgitrc and spawning cgit
@ 2019-03-12 4:00 6% Eric Wong
2019-03-12 4:00 7% ` [PATCH 09/13] cgit: support running cgit as a standalone CGI 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%]
* [PATCH 09/13] cgit: support running cgit as a standalone CGI
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
We depend on git-http-backend for smart HTTP clone support,
however; since cgit does not support smart clones natively.
WWW.pm will be able to cascade down to this as a 404 handler in
the future.
---
MANIFEST | 2 +
examples/cgit.psgi | 29 ++++++++++++++
lib/PublicInbox/Cgit.pm | 87 +++++++++++++++++++++++++++++++++++++++++
3 files changed, 118 insertions(+)
create mode 100644 examples/cgit.psgi
create mode 100644 lib/PublicInbox/Cgit.pm
diff --git a/MANIFEST b/MANIFEST
index e6316ef..150e337 100644
--- a/MANIFEST
+++ b/MANIFEST
@@ -38,6 +38,7 @@ examples/apache2_perl.conf
examples/apache2_perl_old.conf
examples/cgi-webrick.rb
examples/cgit-commit-filter.lua
+examples/cgit.psgi
examples/highlight.psgi
examples/logrotate.conf
examples/newswww.psgi
@@ -58,6 +59,7 @@ examples/varnish-4.vcl
lib/PublicInbox/Address.pm
lib/PublicInbox/Admin.pm
lib/PublicInbox/AltId.pm
+lib/PublicInbox/Cgit.pm
lib/PublicInbox/Config.pm
lib/PublicInbox/ContentId.pm
lib/PublicInbox/Daemon.pm
diff --git a/examples/cgit.psgi b/examples/cgit.psgi
new file mode 100644
index 0000000..ca93f92
--- /dev/null
+++ b/examples/cgit.psgi
@@ -0,0 +1,29 @@
+#!/usr/bin/perl -w
+# Copyright (C) 2019 all contributors <meta@public-inbox.org>
+# License: GPL-3.0+ <https://www.gnu.org/licenses/gpl-3.0.txt>
+#
+# PublicInbox::Cgit may be used independently of WWW.
+#
+# Usage:
+# plackup -I lib -o 127.0.0.1 -R lib -r examples/cgit.psgi
+use strict;
+use warnings;
+use Plack::Builder;
+use PublicInbox::Cgit;
+use PublicInbox::Config;
+my $pi_config = PublicInbox::Config->new;
+my $cgit = PublicInbox::Cgit->new($pi_config);
+
+builder {
+ eval {
+ enable 'Deflater',
+ content_type => [ qw(
+ text/html
+ text/plain
+ application/atom+xml
+ )]
+ };
+ eval { enable 'ReverseProxy' };
+ enable 'Head';
+ sub { $cgit->call($_[0]) }
+}
diff --git a/lib/PublicInbox/Cgit.pm b/lib/PublicInbox/Cgit.pm
new file mode 100644
index 0000000..3d1a0d5
--- /dev/null
+++ b/lib/PublicInbox/Cgit.pm
@@ -0,0 +1,87 @@
+# Copyright (C) 2019 all contributors <meta@public-inbox.org>
+# License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
+
+# wrapper for cgit(1) and git-http-backend(1) for browsing and
+# serving git code repositories. Requires 'publicinbox.cgitrc'
+# directive to be set in the public-inbox config file.
+
+package PublicInbox::Cgit;
+use strict;
+use PublicInbox::GitHTTPBackend;
+# not bothering with Exporter for a one-off
+*r = *PublicInbox::GitHTTPBackend::r;
+*input_prepare = *PublicInbox::GitHTTPBackend::input_prepare;
+*parse_cgi_headers = *PublicInbox::GitHTTPBackend::parse_cgi_headers;
+*serve = *PublicInbox::GitHTTPBackend::serve;
+use warnings;
+use PublicInbox::Qspawn;
+
+sub new {
+ my ($class, $pi_config) = @_;
+ my $cgit_bin = $pi_config->{'publicinbox.cgitbin'} ||
+ # Debian default location:
+ '/usr/lib/cgit/cgit.cgi';
+
+ my $self = bless {
+ cmd => [ $cgit_bin ],
+ pi_config => $pi_config,
+ }, $class;
+
+ $pi_config->each_inbox(sub {}); # fill in -code_repos mapped to inboxes
+
+ # some cgit repos may not be mapped to inboxes, so ensure those exist:
+ my $code_repos = $pi_config->{-code_repos};
+ foreach my $k (keys %$pi_config) {
+ $k =~ /\Acoderepo\.(.+)\.dir\z/ or next;
+ my $dir = $pi_config->{$k};
+ $code_repos->{$1} ||= PublicInbox::Git->new($dir);
+ }
+ while (my ($nick, $repo) = each %$code_repos) {
+ $self->{"\0$nick"} = $repo;
+ }
+ $self;
+}
+
+# only what cgit cares about:
+my @PASS_ENV = qw(
+ HTTP_HOST
+ QUERY_STRING
+ REQUEST_METHOD
+ SCRIPT_NAME
+ SERVER_NAME
+ SERVER_PORT
+ HTTP_COOKIE
+ HTTP_REFERER
+ CONTENT_LENGTH
+);
+# XXX: cgit filters may care about more variables...
+
+sub call {
+ my ($self, $env) = @_;
+ my $path_info = $env->{PATH_INFO};
+
+ # handle requests without spawning cgit iff possible:
+ if ($path_info =~ m!\A/(.+?)/($PublicInbox::GitHTTPBackend::ANY)\z!ox) {
+ my ($nick, $path) = ($1, $2);
+ if (my $git = $self->{"\0$nick"}) {
+ return serve($env, $git, $path);
+ }
+ }
+
+ my $cgi_env = { PATH_INFO => $path_info };
+ foreach (@PASS_ENV) {
+ defined(my $v = $env->{$_}) or next;
+ $cgi_env->{$_} = $v;
+ }
+ $cgi_env->{'HTTPS'} = 'on' if $env->{'psgi.url_scheme'} eq 'https';
+
+ my $rdr = input_prepare($env) or return r(500);
+ my $qsp = PublicInbox::Qspawn->new($self->{cmd}, $cgi_env, $rdr);
+ $qsp->psgi_return($env, undef, sub {
+ my ($r, $bref) = @_;
+ my $res = parse_cgi_headers($r, $bref) or return; # incomplete
+ $res;
+ });
+}
+
+1;
--
EW
^ permalink raw reply related [relevance 7%]
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 09/13] cgit: support running cgit as a standalone CGI 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).