Add git_project_index, improve href()
cover Add git_project_index, improve href()
This series of patches introduces "project_index" view, which is text/plain equivalent of projects list view, again. This time it is accompanied by the patch which adds links to this view.
"project_index" view has at least two uses: first, to automatically generate gitweb project index file (which we then edit, e.g. removing some projects from being visible from gitweb and correcting ownership information). Second, to get list of projects for scripts, in very easily parseable form.
Even if patches 1 and 3 got discarded, patch 2 is I think worth applying. It finishes consolidation of URL generation.
Shortlog:
[PATCH 1/3] gitweb: Add git_project_index for generating index.aux [PATCH 2/3] gitweb: Allow for href() to be used for projectless links [PATCH 3/3] gitweb: Add link to "project_index" view to "project_list" page
Diffstat:
gitweb/gitweb.perl | 51 ++++++++++++++++++++++++++++++++++++++++++++------- 1 files changed, 44 insertions(+), 7 deletions(-)
P.S. Should shortlog be before, or after diffstat (if it matters)?
Signature · 3 lines
Jakub Narebski ShadeHawk on #git Poland
PATCH 1/3 gitweb: Add git_project_index for generating index.aux
Add git_project_index, which generates index.aux file that can be used as a source of projects list, instead of generating projects list from a directory. Using file as a source of projects list allows for some projects to be not present in gitweb main (project_list) page, and/or correct project owner info. And is probably faster.
Additionally it can be used to get the list of all available repositories for scripts (in easily parseable form).
--- gitweb/gitweb.perl | 25 +++++++++++++++++++++++++ 1 files changed, 25 insertions(+), 0 deletions(-)
gitweb/gitweb.perl +25 -0
@@ -296,6 +296,7 @@ my %actions = ( # those below don't need $project "opml" => \&git_opml, "project_list" => \&git_project_list, + "project_index" => \&git_project_index, ); if (defined $project) {
@@ -2210,6 +2211,30 @@ sub git_project_list { git_footer_html(); } +sub git_project_index { + my @projects = git_get_projects_list(); + + print $cgi->header( + -type => 'text/plain', + -charset => 'utf-8', + -content_disposition => qq(inline; filename="index.aux")); + + foreach my $pr (@projects) { + if (!exists $pr->{'owner'}) { + $pr->{'owner'} = get_file_owner("$projectroot/$project"); + } + + my ($path, $owner) = ($pr->{'path'}, $pr->{'owner'}); + # quote as in CGI::Util::encode, but keep the slash, and use '+' for ' ' + $path =~ s/([^a-zA-Z0-9_.\-\/ ])/sprintf("%%%02X", ord($1))/eg; + $owner =~ s/([^a-zA-Z0-9_.\-\/ ])/sprintf("%%%02X", ord($1))/eg; + $path =~ s/ /\+/g; + $owner =~ s/ /\+/g; + + print "$path $owner\n"; + } +} + sub git_summary { my $descr = git_get_project_description($project) || "none"; my $head = git_get_head_hash($project);
Signature · 1 line
1.4.2
PATCH 2/3 gitweb: Allow for href() to be used for projectless links
In reply to Jakub NarebskiChange adding project to params if $params{"project"} is false to adding project to params if it not exist. It allows for href() to be used for projectless links by using "project=>undef" as argument, while still adding project to params by default in the most common case.
Convert remaining links (except $home_link and anchor links) to use href(); this required adding 'order => "o"' to @mapping in href(). This finishes consolidation of URL generation.
--- gitweb/gitweb.perl | 17 ++++++++++------- 1 files changed, 10 insertions(+), 7 deletions(-)
gitweb/gitweb.perl +10 -7
@@ -326,11 +326,12 @@ sub href(%) { hash_base => "hb", hash_parent_base => "hpb", page => "pg", + order => "o", searchtext => "s", ); my %mapping = @mapping; - $params{"project"} ||= $project; + $params{'project'} = $project unless exists $params{'project'}; my @result = (); for (my $i = 0; $i < @mapping; $i += 2) {
@@ -1304,9 +1305,11 @@ sub git_footer_html { if (defined $descr) { print "<div class=\"page_footer_text\">" . esc_html($descr) . "</div>\n"; } - print $cgi->a({-href => href(action=>"rss"), -class => "rss_logo"}, "RSS") . "\n"; + print $cgi->a({-href => href(action=>"rss"), + -class => "rss_logo"}, "RSS") . "\n"; } else { - print $cgi->a({-href => href(action=>"opml"), -class => "rss_logo"}, "OPML") . "\n"; + print $cgi->a({-href => href(project=>undef, action=>"opml"), + -class => "rss_logo"}, "OPML") . "\n"; } print "</div>\n" . "</body>\n" .
@@ -2153,7 +2156,7 @@ sub git_project_list { print "<th>Project</th>\n"; } else { print "<th>" . - $cgi->a({-href => "$my_uri?" . esc_param("o=project"), + $cgi->a({-href => href(project=>undef, order=>'project'), -class => "header"}, "Project") . "</th>\n"; }
@@ -2162,7 +2165,7 @@ sub git_project_list { print "<th>Description</th>\n"; } else { print "<th>" . - $cgi->a({-href => "$my_uri?" . esc_param("o=descr"), + $cgi->a({-href => href(project=>undef, order=>'descr'), -class => "header"}, "Description") . "</th>\n"; }
@@ -2171,7 +2174,7 @@ sub git_project_list { print "<th>Owner</th>\n"; } else { print "<th>" . - $cgi->a({-href => "$my_uri?" . esc_param("o=owner"), + $cgi->a({-href => href(project=>undef, order=>'owner'), -class => "header"}, "Owner") . "</th>\n"; }
@@ -2180,7 +2183,7 @@ sub git_project_list { print "<th>Last Change</th>\n"; } else { print "<th>" . - $cgi->a({-href => "$my_uri?" . esc_param("o=age"), + $cgi->a({-href => href(project=>undef, order=>'age'), -class => "header"}, "Last Change") . "</th>\n"; }
Signature · 1 line
1.4.2
Re: [PATCH 2/3] gitweb: Allow for href() to be used for projectless links
Quoted 5 lines · Jakub Narebski
Change adding project to params if $params{"project"} is false to adding project to params if it not exist. It allows for
href()to be used for projectless links by using "project=>undef" as argument, while still adding project to params by default in the most common case.
This did not parse very well, at least for me.
Quoted 4 lines
gitweb/gitweb.perl +0
-0@@ -1304,9 +1305,11 @@ sub git_footer_html { if (defined $descr) { print "<div class=\"page_footer_text\">" . esc_html($descr) . "</div>\n"; }
gitweb/gitweb.perl sub git_footer_html { · line 1315
Quoted 10 lines
gitweb/gitweb.perl +4
-2- print $cgi->a({-href => href(action=>"rss"), -class => "rss_logo"}, "RSS") . "\n"; + print $cgi->a({-href => href(action=>"rss"), + -class => "rss_logo"}, "RSS") . "\n"; } else { - print $cgi->a({-href => href(action=>"opml"), -class => "rss_logo"}, "OPML") . "\n"; + print $cgi->a({-href => href(project=>undef, action=>"opml"), + -class => "rss_logo"}, "OPML") . "\n"; } print "</div>\n" . "</body>\n" .
Argh. While I very much welcome folding of the long lines, I'd rather see a separate patch to clean up other loooooooong lines the current gitweb code has.
Re: [PATCH 2/3] gitweb: Allow for href() to be used for projectless links
Quoted 9 lines · Junio C Hamano
Quoted 5 lines · Jakub Narebski
Change adding project to params if $params{"project"} is false to adding project to params if it not exist. It allows for
href()to be used for projectless links by using "project=>undef" as argument, while still adding project to params by default in the most common case.This did not parse very well, at least for me.
O.K. let me rephrase it. Before this patch href() ensured that we had p=<project> among CGI params, by adding it if it was not provided. Some actions don't need project parameter, namely "project_list", "project_index" and "opml". Moreover "project_list" view was sed as a _home_ link, i.e. default action when project was not provided (just like summary is default action when project is provided).
The change introduced by this patch allow to use href() to generate links also for "project_list" and "opml" views. The only links which do not use href() are anchor links, and $home_link link.
Signature · 3 lines
Jakub Narebski Warsaw, Poland ShadeHawk on #git
PATCH 2/3 gitweb: Allow for href() to be used for links without project param
In reply to Jakub NarebskiMake it possible use href() subroutine to generate link with query string which does not include project ('p') parameter. href() used to add project=$project to its parameters, if it was not set (to be more exact if $params{'project'} was false). Now you can pass "project => undef" if you don't want for href() to add project parameter to query string in the generated link.
Links to "project_list", "project_index" and "opml" (all related to list of all projects/all git repositories) doesn't need project parameter. Moreover "project_list" is default view (action) if project ('p') parameter is not set, just like "summary" is default view (action) if project is set; project list served as a kind of "home" page for gitweb instalation, and links to "project_list" view were done without specyfying it as an action.
Convert remaining links (except $home_link and anchor links) to use href(); this required adding 'order => "o"' to @mapping in href(). This finishes consolidation of URL generation.
---
Only commit message has changed.
gitweb/gitweb.perl | 17 ++++++++++------- 1 files changed, 10 insertions(+), 7 deletions(-)
gitweb/gitweb.perl +10 -7
@@ -326,11 +326,12 @@ sub href(%) { hash_base => "hb", hash_parent_base => "hpb", page => "pg", + order => "o", searchtext => "s", ); my %mapping = @mapping; - $params{"project"} ||= $project; + $params{'project'} = $project unless exists $params{'project'}; my @result = (); for (my $i = 0; $i < @mapping; $i += 2) {
@@ -1304,9 +1305,11 @@ sub git_footer_html { if (defined $descr) { print "<div class=\"page_footer_text\">" . esc_html($descr) . "</div>\n"; } - print $cgi->a({-href => href(action=>"rss"), -class => "rss_logo"}, "RSS") . "\n"; + print $cgi->a({-href => href(action=>"rss"), + -class => "rss_logo"}, "RSS") . "\n"; } else { - print $cgi->a({-href => href(action=>"opml"), -class => "rss_logo"}, "OPML") . "\n"; + print $cgi->a({-href => href(project=>undef, action=>"opml"), + -class => "rss_logo"}, "OPML") . "\n"; } print "</div>\n" . "</body>\n" .
@@ -2153,7 +2156,7 @@ sub git_project_list { print "<th>Project</th>\n"; } else { print "<th>" . - $cgi->a({-href => "$my_uri?" . esc_param("o=project"), + $cgi->a({-href => href(project=>undef, order=>'project'), -class => "header"}, "Project") . "</th>\n"; }
@@ -2162,7 +2165,7 @@ sub git_project_list { print "<th>Description</th>\n"; } else { print "<th>" . - $cgi->a({-href => "$my_uri?" . esc_param("o=descr"), + $cgi->a({-href => href(project=>undef, order=>'descr'), -class => "header"}, "Description") . "</th>\n"; }
@@ -2171,7 +2174,7 @@ sub git_project_list { print "<th>Owner</th>\n"; } else { print "<th>" . - $cgi->a({-href => "$my_uri?" . esc_param("o=owner"), + $cgi->a({-href => href(project=>undef, order=>'owner'), -class => "header"}, "Owner") . "</th>\n"; }
@@ -2180,7 +2183,7 @@ sub git_project_list { print "<th>Last Change</th>\n"; } else { print "<th>" . - $cgi->a({-href => "$my_uri?" . esc_param("o=age"), + $cgi->a({-href => href(project=>undef, order=>'age'), -class => "header"}, "Last Change") . "</th>\n"; }
Signature · 1 line
1.4.2
PATCH 3/3 gitweb: Add link to "project_index" view to "project_list" page
In reply to Jakub NarebskiAdd link to "project_index" view as [TXT] beside link to "opml" view, (which is marked by [OPML]) to "project_list" page.
While at it add alternate links for "opml" and "project_list" to HTML header for "project_list" view.
---
In the future we might want to change appereance of [TXT] link to "project_index" view (e.g. green background instead of orange, smaller width).
gitweb/gitweb.perl | 11 ++++++++++- 1 files changed, 10 insertions(+), 1 deletions(-)
gitweb/gitweb.perl +10 -1
@@ -1255,6 +1255,13 @@ EOF printf('<link rel="alternate" title="%s log" '. 'href="%s" type="application/rss+xml"/>'."\n", esc_param($project), href(action=>"rss")); + } else { + printf('<link rel="alternate" title="%s" '. + 'href="%s" type="text/plain; charset=utf-8"/>'."\n", + esc_param($project), href(project=>undef, action=>"project_index")); + printf('<link rel="alternate" title="%s" '. + 'href="%s" type="text/x-opml"/>'."\n", + esc_param($project), href(project=>undef, action=>"opml")); } if (defined $favicon) { print qq(<link rel="shortcut icon" href="$favicon" type="image/png"/>\n);
@@ -1309,7 +1316,9 @@ sub git_footer_html { -class => "rss_logo"}, "RSS") . "\n"; } else { print $cgi->a({-href => href(project=>undef, action=>"opml"), - -class => "rss_logo"}, "OPML") . "\n"; + -class => "rss_logo"}, "OPML") . " "; + print $cgi->a({-href => href(project=>undef, action=>"project_index"), + -class => "rss_logo"}, "TXT") . "\n"; } print "</div>\n" . "</body>\n" .
Signature · 1 line
1.4.2
PATCH 3/3 gitweb: Add link to "project_index" view to "project_list" page
Add link to "project_index" view as [TXT] beside link to "opml" view, (which is marked by [OPML]) to "project_list" page.
While at it add alternate links for "opml" and "project_list" to HTML header for "project_list" view.
---
Corrected alternate links (dumb error while copy'n'paste).
gitweb/gitweb.perl | 11 ++++++++++- 1 files changed, 10 insertions(+), 1 deletions(-)
gitweb/gitweb.perl +10 -1
@@ -1255,6 +1255,13 @@ EOF printf('<link rel="alternate" title="%s log" '. 'href="%s" type="application/rss+xml"/>'."\n", esc_param($project), href(action=>"rss")); + } else { + printf('<link rel="alternate" title="%s projects list" '. + 'href="%s" type="text/plain; charset=utf-8"/>'."\n", + $site_name, href(project=>undef, action=>"project_index")); + printf('<link rel="alternate" title="%s projects logs" '. + 'href="%s" type="text/x-opml"/>'."\n", + $site_name, href(project=>undef, action=>"opml")); } if (defined $favicon) { print qq(<link rel="shortcut icon" href="$favicon" type="image/png"/>\n);
@@ -1309,7 +1316,9 @@ sub git_footer_html { -class => "rss_logo"}, "RSS") . "\n"; } else { print $cgi->a({-href => href(project=>undef, action=>"opml"), - -class => "rss_logo"}, "OPML") . "\n"; + -class => "rss_logo"}, "OPML") . " "; + print $cgi->a({-href => href(project=>undef, action=>"project_index"), + -class => "rss_logo"}, "TXT") . "\n"; } print "</div>\n" . "</body>\n" .
Signature · 1 line
1.4.2