From: Jakub Narebski <jnareb@gmail.com>
To: git@vger.kernel.org
Cc: "J.H." <warthog9@eaglescrag.net>,
"John 'Warthog9' Hawley" <warthog9@kernel.org>
Subject: [RFC PATCH v7 3/9] gitweb: Introduce %actions_info, gathering information about actions
Date: Thu, 23 Dec 2010 00:55:52 +0100 [thread overview]
Message-ID: <20101222235552.7998.76918.stgit@localhost.localdomain> (raw)
In-Reply-To: <20101222234843.7998.87068.stgit@localhost.localdomain>
Currently it only contains information about output format, and is not
used anywhere. It will be used to check whether current action
produces HTML output, and therefore is displaying HTML-based progress
info about (re)generating cache makes sense.
It can contain information about allowed extra options, whether to
display link to feed (Atom or RSS), etc. in easier and faster way than
listing all matching or all non-matching actions at appropriate place.
Currently not used; will be used in next commit, to check if action
produces HTML output and therefore we can use HTML-specific progress
indicator.
Signed-off-by: Jakub Narebski <jnareb@gmail.com>
---
gitweb/gitweb.perl | 57 ++++++++++++++++++++++++++++++++++++++++++++++++----
1 files changed, 53 insertions(+), 4 deletions(-)
diff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl
index c7a1892..e50654b 100755
--- a/gitweb/gitweb.perl
+++ b/gitweb/gitweb.perl
@@ -749,6 +749,54 @@ our %allowed_options = (
"--no-merges" => [ qw(rss atom log shortlog history) ],
);
+# action => {
+# # what is the output format (content-type) of action
+# 'output_format' => ('html' | 'text' | 'feed' | 'binary' | undef),
+# # does action require $project parameter to work
+# 'needs_project' => (boolean | undef),
+# # log-like action, can start with arbitrary ref or revision
+# 'log_like' => (boolean | undef),
+# # has no specific feed, or should lik to OPML / generic project feed
+# 'no_feed' => (boolean | undef),
+# # allowed options to be passed ussing 'opt' parameter
+# 'allowed_options' => { 'option_1' => 1 [, ... ] },
+# }
+our %actions_info = ();
+sub evaluate_actions_info {
+ our %actions_info;
+ our (%actions);
+
+ # unless explicitely stated otherwise, default output format is html
+ # most actions needs $project parameter
+ foreach my $action (keys %actions) {
+ $actions_info{$action}{'output_format'} = 'html';
+ $actions_info{$action}{'needs_project'} = 1;
+ }
+ # list all exceptions; undef means variable format (no definite format)
+ $actions_info{$_}{'output_format'} = 'text'
+ foreach qw(commitdiff_plain patch patches project_index blame_data);
+ $actions_info{$_}{'output_format'} = 'feed'
+ foreach qw(rss atom opml); # there are different types (document formats) of XML
+ $actions_info{$_}{'output_format'} = undef
+ foreach qw(blob_plain object);
+ $actions_info{'snapshot'}{'output_format'} = 'binary';
+
+ $actions_info{$_}{'needs_project'} = 0
+ foreach qw(opml project_list project_index);
+
+ $actions_info{$_}{'log_like'} = 1
+ foreach qw(log shortlog history);
+
+ $actions_info{$_}{'no_feed'} = 1
+ foreach qw(tags heads forks tag search);
+
+ foreach my $opt (keys %allowed_options) {
+ foreach my $act (@{$allowed_options{$opt}}) {
+ $actions_info{$act}{'allowed_options'}{$opt} = 1;
+ }
+ }
+}
+
# fill %input_params with the CGI parameters. All values except for 'opt'
# should be single values, but opt can be an array. We should probably
# build an array of parameters that can be multi-valued, but since for the time
@@ -980,7 +1028,7 @@ sub evaluate_and_validate_params {
if (not exists $allowed_options{$opt}) {
die_error(400, "Invalid option parameter");
}
- if (not grep(/^$action$/, @{$allowed_options{$opt}})) {
+ if (!$actions_info{$action}{'allowed_options'}{$opt}) {
die_error(400, "Invalid option parameter for this action");
}
}
@@ -1061,7 +1109,7 @@ sub dispatch {
if (!defined($actions{$action})) {
die_error(400, "Unknown action");
}
- if ($action !~ m/^(?:opml|project_list|project_index)$/ &&
+ if ($actions_info{$action}{'needs_project'} &&
!$project) {
die_error(400, "Project needed");
}
@@ -1142,6 +1190,7 @@ sub evaluate_argv {
sub run {
evaluate_argv();
+ evaluate_actions_info();
$first_request = 1;
$pre_listen_hook->()
@@ -1803,7 +1852,7 @@ sub format_ref_marker {
if ($indirect) {
$dest_action = "tag" unless $action eq "tag";
- } elsif ($action =~ /^(history|(short)?log)$/) {
+ } elsif ($actions_info{$action}{'log_like'}) {
$dest_action = $action;
}
@@ -2277,7 +2326,7 @@ sub get_feed_info {
return unless (defined $project);
# some views should link to OPML, or to generic project feed,
# or don't have specific feed yet (so they should use generic)
- return if ($action =~ /^(?:tags|heads|forks|tag|search)$/x);
+ return if ($actions_info{$action}{'no_feed'});
my $branch;
# branches refs uses 'refs/heads/' prefix (fullname) to differentiate
next prev parent reply other threads:[~2010-12-22 23:56 UTC|newest]
Thread overview: 34+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-12-22 23:54 [RFC PATCH v7 0/9] gitweb: Output caching, with eval/die based error handling Jakub Narebski
2010-12-22 23:55 ` [RFC PATCH v7 1/9] gitweb: Go to DONE_REQUEST rather than DONE_GITWEB in die_error Jakub Narebski
2010-12-23 1:55 ` Jonathan Nieder
2010-12-25 22:14 ` Jakub Narebski
2010-12-26 9:07 ` [RFC/PATCH] diff: funcname and word patterns for perl Jonathan Nieder
[not found] ` <201012261143.33190.trast@student.ethz.ch>
2010-12-26 10:54 ` Jonathan Nieder
[not found] ` <201012261206.11942.trast@student.ethz.ch>
2010-12-26 11:22 ` Jonathan Nieder
2010-12-26 23:14 ` Jakub Narebski
2010-12-27 17:18 ` Junio C Hamano
2010-12-27 22:44 ` Jakub Narebski
2010-12-28 3:52 ` Jeff King
2010-12-26 9:50 ` [RFC PATCH v7 1/9] gitweb: Go to DONE_REQUEST rather than DONE_GITWEB in die_error Jonathan Nieder
2010-12-26 22:25 ` Jakub Narebski
2010-12-22 23:55 ` [RFC PATCH v7 2/9] gitweb: use eval + die for error (exception) handling Jakub Narebski
2010-12-23 2:08 ` Jonathan Nieder
2010-12-25 23:17 ` Jakub Narebski
2011-01-04 0:35 ` [RFC PATCH v7 2.5/9] gitweb: Make die_error just die, and use send_error to create error pages Jakub Narebski
2010-12-22 23:55 ` Jakub Narebski [this message]
2010-12-22 23:56 ` [RFC PATCH v7 4/9] gitweb: Prepare for splitting gitweb Jakub Narebski
2010-12-24 9:29 ` Jonathan Nieder
2010-12-26 22:54 ` Jakub Narebski
2010-12-22 23:56 ` [RFC PATCH v7 5/9] t/test-lib.sh: Export also GIT_BUILD_DIR in test_external Jakub Narebski
2010-12-22 23:57 ` [RFC PATCH v7 6/9] gitweb/lib - Simple output capture by redirecting STDOUT to file Jakub Narebski
2010-12-24 9:49 ` Jonathan Nieder
2010-12-26 23:03 ` Jakub Narebski
2010-12-22 23:57 ` [RFC PATCH v7 7/9] gitweb/lib - Very simple file based cache Jakub Narebski
2010-12-22 23:57 ` [RFC PATCH v7 8/9] gitweb/lib - Cache captured output (using compute_fh) Jakub Narebski
2010-12-22 23:58 ` [RFC PATCH v7 9/9] gitweb: Add optional output caching Jakub Narebski
2010-12-31 18:03 ` [RFC PATCH v7 10/9] gitweb: Background cache generation and progress indicator Jakub Narebski
2011-01-03 21:33 ` [RFC PATCH v7 11/9] [PoC] gitweb/lib - tee, i.e. print and capture during cache entry generation Jakub Narebski
2011-01-03 23:31 ` J.H.
2011-01-04 0:28 ` Jakub Narebski
2011-01-04 13:20 ` Jakub Narebski
2011-01-05 2:26 ` [RFC PATCH 11/9] [PoC] gitweb/lib - HTTP-aware output caching Jakub Narebski
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20101222235552.7998.76918.stgit@localhost.localdomain \
--to=jnareb@gmail.com \
--cc=git@vger.kernel.org \
--cc=warthog9@eaglescrag.net \
--cc=warthog9@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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 NNTP newsgroup(s).