Previously gitweb would ignore partial PATH_INFO. For example,
it would produce a project list for the top URL
        https://www.example.org/projects/
and a project summary for
        https://www.example.org/projects/git/git.git
but if you tried to list just the git-related projects with
        https://www.example.org/projects/git/
you would get a list of all projects, same as the top URL.

As well as fixing that omission, this change also makes gitweb
generate PATH_INFO-style URLs for project filter links, such
as in the breadcrumbs.

Signed-off-by: Tony Finch <d...@dotat.at>
---
 gitweb/gitweb.perl | 24 +++++++++++++++++++++++-
 1 file changed, 23 insertions(+), 1 deletion(-)

diff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl
index a9f57d6..12aba8f 100755
--- a/gitweb/gitweb.perl
+++ b/gitweb/gitweb.perl
@@ -891,7 +891,17 @@ sub evaluate_path_info {
        while ($project && !check_head_link("$projectroot/$project")) {
                $project =~ s,/*[^/]*$,,;
        }
-       return unless $project;
+       # If there is no project, use the PATH_INFO as a project filter if it
+       # is a directory in the projectroot. (It can't be a subdirectory of a
+       # repo because we just verified that isn't the case.)
+       unless ($project) {
+               if (-d "$projectroot/$path_info") {
+                       $path_info =~ s,/+$,,;
+                       $input_params{'project_filter'} = $path_info;
+                       $path_info = "";
+               }
+               return;
+       }
        $input_params{'project'} = $project;

        # do not change any parameters if an action is given using the query 
string
@@ -1356,6 +1366,18 @@ sub href {
        }

        my $use_pathinfo = gitweb_check_feature('pathinfo');
+
+       # we have to check for a project_filter first because handling the full
+       # project-plus-parameters deletes some of the paramaters we check here
+       if (!defined $params{'project'} && $params{'project_filter'} &&
+           $params{'action'} eq "project_list" &&
+           (exists $params{-path_info} ? $params{-path_info} : $use_pathinfo)) 
{
+               $href =~ s,/$,,;
+               $href .= "/".esc_path_info($params{'project_filter'})."/";
+               delete $params{'project_filter'};
+               delete $params{'action'};
+       }
+
        if (defined $params{'project'} &&
            (exists $params{-path_info} ? $params{-path_info} : $use_pathinfo)) 
{
                # try to put as many parameters as possible in PATH_INFO:
-- 
2.1.0.rc0.229.gaee38de


--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to