gitweb: Allow for href() to be used for links without project param
[gitweb.git] / gitweb / gitweb.perl
index b28da2c4d6e831e207fd598a6e7df1d38882442c..f75fea5623f5e19a69653ecb0629634934b1728e 100755 (executable)
@@ -296,6 +296,7 @@ sub feature_pickaxe {
        # those below don't need $project
        "opml" => \&git_opml,
        "project_list" => \&git_project_list,
+       "project_index" => \&git_project_index,
 );
 
 if (defined $project) {
@@ -325,11 +326,12 @@ (%)
                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) {
@@ -1303,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" .
@@ -2152,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";
        }
@@ -2161,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";
        }
@@ -2170,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";
        }
@@ -2179,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";
        }
@@ -2210,6 +2214,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);