From 1e7a2bbd2c7b0c1d5f989c0e225d22276055eff1 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Tue, 12 Jan 2016 21:32:33 +0000 Subject: repobrowse: change Perl capitalization to "Repobrowse" We mainly call it "repobrowse" (all lowercase), so do not imply it is two separate words by capitalizing "Browse". --- lib/PublicInbox/Repobrowse.pm | 106 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 106 insertions(+) create mode 100644 lib/PublicInbox/Repobrowse.pm (limited to 'lib/PublicInbox/Repobrowse.pm') diff --git a/lib/PublicInbox/Repobrowse.pm b/lib/PublicInbox/Repobrowse.pm new file mode 100644 index 00000000..75dee72f --- /dev/null +++ b/lib/PublicInbox/Repobrowse.pm @@ -0,0 +1,106 @@ +# Copyright (C) 2015 all contributors +# License: AGPL-3.0+ + +# Version control system (VCS) repository viewer like cgit or gitweb, +# but with optional public-inbox archive integration. +# This uses cgit-compatible PATH_INFO URLs. +# This may be expanded to support other Free Software VCSes such as +# Subversion and Mercurial, so not just git +# +# Same web design principles as PublicInbox::WWW for supporting the +# lowest common denominators (see bottom of Documentation/design_www.txt) +# +# This allows an M:N relationship between "normal" repos for project +# and public-inbox (ssoma) git repositories where N may be zero. +# In other words, repobrowse must work for repositories without +# any public-inbox at all; or with multiple public-inboxes. +# And the rest of public-inbox will always work without a "normal" +# code repo for the project. + +package PublicInbox::Repobrowse; +use strict; +use warnings; +use URI::Escape qw(uri_escape_utf8 uri_unescape); +use PublicInbox::RepobrowseConfig; + +my %CMD = map { lc($_) => $_ } qw(Log Commit Tree Patch Blob Plain Tag); +my %VCS = (git => 'Git'); +my %LOADED; + +sub new { + my ($class, $file) = @_; + bless { rconfig => PublicInbox::RepobrowseConfig->new($file) }, $class; +} + +# simple response for errors +sub r { [ $_[0], ['Content-Type' => 'text/plain'], [ join(' ', @_, "\n") ] ] } + +sub run { + my ($self, $cgi, $method) = @_; + return r(405, 'Method Not Allowed') if ($method !~ /\AGET|HEAD\z/); + + # URL syntax: / repo [ / cmd [ / path ] ] + # cmd: log | commit | diff | tree | view | blob | snapshot + # repo and path (@extra) may both contain '/' + my $rconfig = $self->{rconfig}; + my $path_info = uri_unescape($cgi->path_info); + my (undef, $repo_path, @extra) = split(m{/+}, $path_info, -1); + + return r404() unless $repo_path; + my $repo_info; + until ($repo_info = $rconfig->lookup($repo_path)) { + my $p = shift @extra or last; + $repo_path .= "/$p"; + } + return r404() unless $repo_info; + + my $req = { + repo_info => $repo_info, + extra => \@extra, # path + cgi => $cgi, + rconfig => $rconfig, + tslash => 0, + }; + + my $cmd = shift @extra; + if (defined $cmd && length $cmd) { + my $vcs_lc = $repo_info->{vcs}; + my $vcs = $VCS{$vcs_lc} or return r404(); + my $mod = $CMD{$cmd}; + unless ($mod) { + unshift @extra, $cmd; + $mod = 'Fallback'; + } + $mod = load_once("PublicInbox::Repobrowse$vcs$mod"); + $vcs = load_once("PublicInbox::$vcs"); + $repo_info->{$vcs_lc} ||= $vcs->new($repo_info->{path}); + $req->{relcmd} = '../' x scalar(@extra); + while (@extra && $extra[-1] eq '') { + pop @extra; + ++$req->{tslash}; + } + $req->{expath} = join('/', @extra); + my $rv = eval { $mod->new->call($cmd, $req) }; + $rv || r404(); + } else { + $req->{relcmd} = defined $cmd ? '' : './'; + summary($req); + } +} + +sub summary { + r404(); +} + +sub r404 { r(404, 'Not Found') } + +sub load_once { + my ($mod) = @_; + + return $mod if $LOADED{$mod}; + eval "require $mod"; + $LOADED{$mod} = 1 unless $@; + $mod; +} + +1; -- cgit v1.2.3-24-ge0c7 From b01b50858cac10ff8cd9722fd5be9bcaf314b83c Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Fri, 15 Jan 2016 03:00:13 +0000 Subject: repobrowse: implement preliminary summary page This should provide a decent landing page for projects. Alternative README files may be configured with the per-repo "readme" directive. --- lib/PublicInbox/Repobrowse.pm | 46 +++++++++++++++++++++++++------------------ 1 file changed, 27 insertions(+), 19 deletions(-) (limited to 'lib/PublicInbox/Repobrowse.pm') diff --git a/lib/PublicInbox/Repobrowse.pm b/lib/PublicInbox/Repobrowse.pm index 75dee72f..9e97593b 100644 --- a/lib/PublicInbox/Repobrowse.pm +++ b/lib/PublicInbox/Repobrowse.pm @@ -63,33 +63,41 @@ sub run { }; my $cmd = shift @extra; + my $vcs_lc = $repo_info->{vcs}; + my $vcs = $VCS{$vcs_lc} or return r404(); + my $mod; if (defined $cmd && length $cmd) { - my $vcs_lc = $repo_info->{vcs}; - my $vcs = $VCS{$vcs_lc} or return r404(); - my $mod = $CMD{$cmd}; + $mod = $CMD{$cmd}; unless ($mod) { unshift @extra, $cmd; $mod = 'Fallback'; } - $mod = load_once("PublicInbox::Repobrowse$vcs$mod"); - $vcs = load_once("PublicInbox::$vcs"); - $repo_info->{$vcs_lc} ||= $vcs->new($repo_info->{path}); $req->{relcmd} = '../' x scalar(@extra); - while (@extra && $extra[-1] eq '') { - pop @extra; - ++$req->{tslash}; - } - $req->{expath} = join('/', @extra); - my $rv = eval { $mod->new->call($cmd, $req) }; - $rv || r404(); } else { - $req->{relcmd} = defined $cmd ? '' : './'; - summary($req); + $mod = 'Summary'; + $cmd = 'summary'; + if ($path_info =~ m!/\z!) { + $req->{tslash} = $path_info =~ tr!/!!; + $req->{relcmd} = ''; + } else { + my @repo = split('/', $repo_path); + if (@repo > 1) { + $req->{relcmd} = "./$repo[-1]/"; + } else { + $req->{relcmd} = "/$repo[-1]/"; + } + } } -} - -sub summary { - r404(); + $mod = load_once("PublicInbox::Repobrowse$vcs$mod"); + $vcs = load_once("PublicInbox::$vcs"); + $repo_info->{$vcs_lc} ||= $vcs->new($repo_info->{path}); + while (@extra && $extra[-1] eq '') { + pop @extra; + ++$req->{tslash}; + } + $req->{expath} = join('/', @extra); + my $rv = eval { $mod->new->call($cmd, $req) }; # RepobrowseBase::call + $rv || r404(); } sub r404 { r(404, 'Not Found') } -- cgit v1.2.3-24-ge0c7 From be3e0f48796ddb342d4eeb4838c5eedb9aaf79b9 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Fri, 15 Jan 2016 22:04:30 +0000 Subject: repobrowse: redirect w/o trailing slashes for humans For human-visible HTML pages, avoid the trailing slash as that can reduce cache hits in both the server (using varnish) and clients. Typical web browsers are all capable of following 301 redirects without difficulty or human interaction. We do not redirect for endpoints which may be consumed by automated tools as that may cause compatibility problems. For example, curl(1) does not automatically follow redirects and needs the "-L" flag to do so. --- lib/PublicInbox/Repobrowse.pm | 47 +++++++++++++++++++++++++++++++++++-------- 1 file changed, 39 insertions(+), 8 deletions(-) (limited to 'lib/PublicInbox/Repobrowse.pm') diff --git a/lib/PublicInbox/Repobrowse.pm b/lib/PublicInbox/Repobrowse.pm index 9e97593b..f344e0f8 100644 --- a/lib/PublicInbox/Repobrowse.pm +++ b/lib/PublicInbox/Repobrowse.pm @@ -35,6 +35,32 @@ sub new { # simple response for errors sub r { [ $_[0], ['Content-Type' => 'text/plain'], [ join(' ', @_, "\n") ] ] } +# Remove trailing slash in URLs which regular humans are likely to read +# in an attempt to improve cache hit ratios. Do not redirect +# plain|patch|blob|fallback endpoints since those could be using +# automated tools which may not follow redirects automatically +# (e.g. curl does not follow 301 unless given "-L") +my %NO_TSLASH = map { $_ => 1 } qw(Log Commit Tree Summary Tag); +sub no_tslash { + my ($cgi) = @_; + my ($base, $uri); + if (ref($cgi) eq 'CGI') { + $base = $cgi->url(-base); + $uri = $ENV{REQUEST_URI}; + } else { # Plack::Request + $base = $cgi->base; + $base =~ s!/+\z!!; + $uri = $cgi->request_uri; + } + if ($uri !~ s!/+\z!!) { + warn "W: buggy redirect? base=$base request_uri=$uri\n"; + } + my $url = $base . $uri; + [ 301, + [ Location => $url, 'Content-Type' => 'text/plain' ], + [ "Redirecting to $url\n" ] ] +} + sub run { my ($self, $cgi, $method) = @_; return r(405, 'Method Not Allowed') if ($method !~ /\AGET|HEAD\z/); @@ -59,9 +85,8 @@ sub run { extra => \@extra, # path cgi => $cgi, rconfig => $rconfig, - tslash => 0, }; - + my $tslash = 0; my $cmd = shift @extra; my $vcs_lc = $repo_info->{vcs}; my $vcs = $VCS{$vcs_lc} or return r404(); @@ -77,8 +102,7 @@ sub run { $mod = 'Summary'; $cmd = 'summary'; if ($path_info =~ m!/\z!) { - $req->{tslash} = $path_info =~ tr!/!!; - $req->{relcmd} = ''; + $tslash = $path_info =~ tr!/!!; } else { my @repo = split('/', $repo_path); if (@repo > 1) { @@ -88,13 +112,20 @@ sub run { } } } - $mod = load_once("PublicInbox::Repobrowse$vcs$mod"); - $vcs = load_once("PublicInbox::$vcs"); - $repo_info->{$vcs_lc} ||= $vcs->new($repo_info->{path}); while (@extra && $extra[-1] eq '') { pop @extra; - ++$req->{tslash}; + ++$tslash; } + + if ($tslash && $path_info ne '/' && $NO_TSLASH{$mod}) { + return no_tslash($cgi); + } + + $req->{tslash} = $tslash; + $mod = load_once("PublicInbox::Repobrowse$vcs$mod"); + $vcs = load_once("PublicInbox::$vcs"); + $repo_info->{$vcs_lc} ||= $vcs->new($repo_info->{path}); + $req->{expath} = join('/', @extra); my $rv = eval { $mod->new->call($cmd, $req) }; # RepobrowseBase::call $rv || r404(); -- cgit v1.2.3-24-ge0c7 From 9114c0649e4f675afae1128e73b4d1b94d8929e5 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Sat, 16 Jan 2016 22:22:42 +0000 Subject: repobrowse: show repository index Sometimes; people like to advertise projects and group them. Of course, "-hidden" is a valid group for projects which do not want to be advertised. --- lib/PublicInbox/Repobrowse.pm | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) (limited to 'lib/PublicInbox/Repobrowse.pm') diff --git a/lib/PublicInbox/Repobrowse.pm b/lib/PublicInbox/Repobrowse.pm index f344e0f8..cc18255d 100644 --- a/lib/PublicInbox/Repobrowse.pm +++ b/lib/PublicInbox/Repobrowse.pm @@ -61,6 +61,12 @@ sub no_tslash { [ "Redirecting to $url\n" ] ] } +sub root_index { + my ($self) = @_; + my $mod = load_once('PublicInbox::RepobrowseRoot'); + $mod->new->call($self->{rconfig}); # RepobrowseRoot::call +} + sub run { my ($self, $cgi, $method) = @_; return r(405, 'Method Not Allowed') if ($method !~ /\AGET|HEAD\z/); @@ -68,11 +74,12 @@ sub run { # URL syntax: / repo [ / cmd [ / path ] ] # cmd: log | commit | diff | tree | view | blob | snapshot # repo and path (@extra) may both contain '/' - my $rconfig = $self->{rconfig}; my $path_info = uri_unescape($cgi->path_info); my (undef, $repo_path, @extra) = split(m{/+}, $path_info, -1); - return r404() unless $repo_path; + return $self->root_index($self) unless length($repo_path); + + my $rconfig = $self->{rconfig}; # RepobrowseConfig my $repo_info; until ($repo_info = $rconfig->lookup($repo_path)) { my $p = shift @extra or last; @@ -104,12 +111,8 @@ sub run { if ($path_info =~ m!/\z!) { $tslash = $path_info =~ tr!/!!; } else { - my @repo = split('/', $repo_path); - if (@repo > 1) { - $req->{relcmd} = "./$repo[-1]/"; - } else { - $req->{relcmd} = "/$repo[-1]/"; - } + my @x = split('/', $repo_path); + $req->{relcmd} = @x > 1 ? "./$x[-1]/" : "/$x[-1]/"; } } while (@extra && $extra[-1] eq '') { @@ -117,9 +120,7 @@ sub run { ++$tslash; } - if ($tslash && $path_info ne '/' && $NO_TSLASH{$mod}) { - return no_tslash($cgi); - } + return no_tslash($cgi) if ($tslash && $NO_TSLASH{$mod}); $req->{tslash} = $tslash; $mod = load_once("PublicInbox::Repobrowse$vcs$mod"); -- cgit v1.2.3-24-ge0c7 From b3bc0d722aacdad5ac5e8ee7c32bda9c87d3052b Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Wed, 20 Jan 2016 22:17:37 +0000 Subject: repobrowse: fix redirects with query string We need to preserve the query string to avoid breakage. --- lib/PublicInbox/Repobrowse.pm | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'lib/PublicInbox/Repobrowse.pm') diff --git a/lib/PublicInbox/Repobrowse.pm b/lib/PublicInbox/Repobrowse.pm index cc18255d..219b44d6 100644 --- a/lib/PublicInbox/Repobrowse.pm +++ b/lib/PublicInbox/Repobrowse.pm @@ -52,10 +52,14 @@ sub no_tslash { $base =~ s!/+\z!!; $uri = $cgi->request_uri; } + my $qs = ''; + if ($uri =~ s/(\?.+)\z//) { + $qs = $1; + } if ($uri !~ s!/+\z!!) { warn "W: buggy redirect? base=$base request_uri=$uri\n"; } - my $url = $base . $uri; + my $url = $base . $uri . $qs; [ 301, [ Location => $url, 'Content-Type' => 'text/plain' ], [ "Redirecting to $url\n" ] ] -- cgit v1.2.3-24-ge0c7 From 7d8cc28839176b7fa67c509aae2b4c050e3abbd1 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Fri, 26 Feb 2016 10:38:41 +0000 Subject: repobrowse: drop CGI support We already dropped CGI from the master branch, drop it from repobrowse as well to simplify code. --- lib/PublicInbox/Repobrowse.pm | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) (limited to 'lib/PublicInbox/Repobrowse.pm') diff --git a/lib/PublicInbox/Repobrowse.pm b/lib/PublicInbox/Repobrowse.pm index 219b44d6..91d0ab20 100644 --- a/lib/PublicInbox/Repobrowse.pm +++ b/lib/PublicInbox/Repobrowse.pm @@ -42,16 +42,11 @@ sub r { [ $_[0], ['Content-Type' => 'text/plain'], [ join(' ', @_, "\n") ] ] } # (e.g. curl does not follow 301 unless given "-L") my %NO_TSLASH = map { $_ => 1 } qw(Log Commit Tree Summary Tag); sub no_tslash { - my ($cgi) = @_; + my ($cgi) = @_; # Plack::Request my ($base, $uri); - if (ref($cgi) eq 'CGI') { - $base = $cgi->url(-base); - $uri = $ENV{REQUEST_URI}; - } else { # Plack::Request - $base = $cgi->base; - $base =~ s!/+\z!!; - $uri = $cgi->request_uri; - } + $base = $cgi->base; + $base =~ s!/+\z!!; + $uri = $cgi->request_uri; my $qs = ''; if ($uri =~ s/(\?.+)\z//) { $qs = $1; -- cgit v1.2.3-24-ge0c7 From 74bdccb25e66298c3f9c81af0f611ad3adfc5a01 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Fri, 29 Jan 2016 03:23:39 +0000 Subject: repobrowse: implement Atom feed Mostly following cgit, except we do not serve redundant text-only output which wastes bandwidth and doesn't preserve pre-formatting layout which is critical to some messages. --- lib/PublicInbox/Repobrowse.pm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib/PublicInbox/Repobrowse.pm') diff --git a/lib/PublicInbox/Repobrowse.pm b/lib/PublicInbox/Repobrowse.pm index 91d0ab20..82d38f90 100644 --- a/lib/PublicInbox/Repobrowse.pm +++ b/lib/PublicInbox/Repobrowse.pm @@ -23,7 +23,7 @@ use warnings; use URI::Escape qw(uri_escape_utf8 uri_unescape); use PublicInbox::RepobrowseConfig; -my %CMD = map { lc($_) => $_ } qw(Log Commit Tree Patch Blob Plain Tag); +my %CMD = map { lc($_) => $_ } qw(Log Commit Tree Patch Blob Plain Tag Atom); my %VCS = (git => 'Git'); my %LOADED; -- cgit v1.2.3-24-ge0c7 From 2722ba03b74a782c0f64c7a6b1d09b7b82ff5478 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Mon, 7 Mar 2016 08:10:55 +0000 Subject: repobrowse: git fallback allows smart cloning We can reuse the existing code for cloning ssoma repositories to serve normal git repos for repobrowse. Also, this finally adds a test to fallback to dumb cloning when http.uploadPack is disabled for the git repository to save CPU/memory on the host machine. --- lib/PublicInbox/Repobrowse.pm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib/PublicInbox/Repobrowse.pm') diff --git a/lib/PublicInbox/Repobrowse.pm b/lib/PublicInbox/Repobrowse.pm index 82d38f90..51ec14c8 100644 --- a/lib/PublicInbox/Repobrowse.pm +++ b/lib/PublicInbox/Repobrowse.pm @@ -68,7 +68,7 @@ sub root_index { sub run { my ($self, $cgi, $method) = @_; - return r(405, 'Method Not Allowed') if ($method !~ /\AGET|HEAD\z/); + return r(405, 'Method Not Allowed') if ($method !~ /\AGET|HEAD|POST\z/); # URL syntax: / repo [ / cmd [ / path ] ] # cmd: log | commit | diff | tree | view | blob | snapshot -- cgit v1.2.3-24-ge0c7 From 2de5a44d184c25b162229690282a237adadbcb55 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Mon, 7 Mar 2016 08:10:56 +0000 Subject: repobrowse: standardize interface a bit Make it closer to what the existing WWW interface is since we no longer rely on CGI.pm --- lib/PublicInbox/Repobrowse.pm | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) (limited to 'lib/PublicInbox/Repobrowse.pm') diff --git a/lib/PublicInbox/Repobrowse.pm b/lib/PublicInbox/Repobrowse.pm index 51ec14c8..fe06a5be 100644 --- a/lib/PublicInbox/Repobrowse.pm +++ b/lib/PublicInbox/Repobrowse.pm @@ -20,6 +20,7 @@ package PublicInbox::Repobrowse; use strict; use warnings; +use Plack::Request; use URI::Escape qw(uri_escape_utf8 uri_unescape); use PublicInbox::RepobrowseConfig; @@ -66,8 +67,10 @@ sub root_index { $mod->new->call($self->{rconfig}); # RepobrowseRoot::call } -sub run { - my ($self, $cgi, $method) = @_; +sub call { + my ($self, $env) = @_; + my $cgi = Plack::Request->new($env); + my $method = $cgi->method; return r(405, 'Method Not Allowed') if ($method !~ /\AGET|HEAD|POST\z/); # URL syntax: / repo [ / cmd [ / path ] ] -- cgit v1.2.3-24-ge0c7 From 2d3debbcf3fa4a4f0705624a897cf43547e5bf32 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Mon, 7 Mar 2016 08:10:58 +0000 Subject: repobrowse: improve API consistency, harder This allows RepobrowseConfig objects to passed directly to Repobrowse initialization, similar to the way the normal Config can be passed to WWW at initialization. --- lib/PublicInbox/Repobrowse.pm | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'lib/PublicInbox/Repobrowse.pm') diff --git a/lib/PublicInbox/Repobrowse.pm b/lib/PublicInbox/Repobrowse.pm index fe06a5be..0b09800b 100644 --- a/lib/PublicInbox/Repobrowse.pm +++ b/lib/PublicInbox/Repobrowse.pm @@ -29,8 +29,9 @@ my %VCS = (git => 'Git'); my %LOADED; sub new { - my ($class, $file) = @_; - bless { rconfig => PublicInbox::RepobrowseConfig->new($file) }, $class; + my ($class, $rconfig) = @_; + $rconfig ||= PublicInbox::RepobrowseConfig->new; + bless { rconfig => $rconfig }, $class; } # simple response for errors -- cgit v1.2.3-24-ge0c7 From 89abb41ac9a2ca0a4fff0ccf75edf0bc1d050d61 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Sat, 12 Mar 2016 03:41:29 +0000 Subject: repobrowse: implement diff view for compatibility This needs to be cleaned up, but we shall support the (potentially very expensive) diff view between arbitrary revisions to avoid breaking existing URLs. The diff parsing code will need to be consolidated between this and the commit view. --- lib/PublicInbox/Repobrowse.pm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'lib/PublicInbox/Repobrowse.pm') diff --git a/lib/PublicInbox/Repobrowse.pm b/lib/PublicInbox/Repobrowse.pm index 0b09800b..0c4cf144 100644 --- a/lib/PublicInbox/Repobrowse.pm +++ b/lib/PublicInbox/Repobrowse.pm @@ -24,7 +24,8 @@ use Plack::Request; use URI::Escape qw(uri_escape_utf8 uri_unescape); use PublicInbox::RepobrowseConfig; -my %CMD = map { lc($_) => $_ } qw(Log Commit Tree Patch Blob Plain Tag Atom); +my %CMD = map { lc($_) => $_ } qw(Log Commit Tree Patch Blob Plain Tag Atom + Diff); my %VCS = (git => 'Git'); my %LOADED; -- cgit v1.2.3-24-ge0c7 From 25b49fc37121d8584b84b44b20c910ef43c44950 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Mon, 4 Apr 2016 21:09:19 +0000 Subject: repobrowse: snapshot support for cgit compatibility We currently do not display links to snapshots, but may in the future (optionally, like cgit). However, support snapshots for compatibility reasons in case people had cached URLs or auto-generated them somewhere. We won't natively support xz and bzip2 just yet, but will document (at least in comments) how to enable these expensive compression schemes via git-config(1). Also, support disabling certain archive types to twart URL guessing or old cached links from spiders burning bandwidth. In retrospect, enabling snapshots for my own cgit views was a bad idea since it wastes bandwidth from crawlers and is is often not useful for users with maintainer-built files (e.g. "configure" from "configure.ac" for autoconf, where only the latter is stored in git and the former is generated in release tarballs). --- lib/PublicInbox/Repobrowse.pm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib/PublicInbox/Repobrowse.pm') diff --git a/lib/PublicInbox/Repobrowse.pm b/lib/PublicInbox/Repobrowse.pm index 0c4cf144..0a812f72 100644 --- a/lib/PublicInbox/Repobrowse.pm +++ b/lib/PublicInbox/Repobrowse.pm @@ -25,7 +25,7 @@ use URI::Escape qw(uri_escape_utf8 uri_unescape); use PublicInbox::RepobrowseConfig; my %CMD = map { lc($_) => $_ } qw(Log Commit Tree Patch Blob Plain Tag Atom - Diff); + Diff Snapshot); my %VCS = (git => 'Git'); my %LOADED; -- cgit v1.2.3-24-ge0c7