]> asedeno.scripts.mit.edu Git - git.git/blobdiff - gitweb/gitweb.perl
Merge branch 'pb/commit-where'
[git.git] / gitweb / gitweb.perl
index 0cb29705b2e8b343b162554ceef094741400fe56..11168006cffe9bd2f6c8c27bd1d034c41667e39a 100755 (executable)
@@ -283,6 +283,26 @@ our %feature = (
                'override' => 0,
                'default' => [0]},
 
+       # Insert custom links to the action bar of all project pages.
+       # This enables you mainly to link to third-party scripts integrating
+       # into gitweb; e.g. git-browser for graphical history representation
+       # or custom web-based repository administration interface.
+
+       # The 'default' value consists of a list of triplets in the form
+       # (label, link, position) where position is the label after which
+       # to inster the link and link is a format string where %n expands
+       # to the project name, %f to the project path within the filesystem,
+       # %h to the current hash (h gitweb parameter) and %b to the current
+       # hash base (hb gitweb parameter).
+
+       # To enable system wide have in $GITWEB_CONFIG e.g.
+       # $feature{'actions'}{'default'} = [('graphiclog',
+       #       '/git-browser/by-commit.html?r=%n', 'summary')];
+       # Project specific override is not supported.
+       'actions' => {
+               'override' => 0,
+               'default' => []},
+
        # Allow gitweb scan project content tags described in ctags/
        # of project repository, and display the popular Web 2.0-ish
        # "tag cloud" near the project list. Note that this is something
@@ -1889,9 +1909,7 @@ sub git_get_projects_list {
 
                                my $subdir = substr($File::Find::name, $pfxlen + 1);
                                # we check related file in $projectroot
-                               if ($check_forks and $subdir =~ m#/.#) {
-                                       $File::Find::prune = 1;
-                               } elsif (check_export_ok("$projectroot/$filter/$subdir")) {
+                               if (check_export_ok("$projectroot/$filter/$subdir")) {
                                        push @list, { path => ($filter ? "$filter/" : '') . $subdir };
                                        $File::Find::prune = 1;
                                }
@@ -2843,13 +2861,26 @@ sub git_print_page_nav {
                        }
                }
        }
+
        $arg{'tree'}{'hash'} = $treehead if defined $treehead;
        $arg{'tree'}{'hash_base'} = $treebase if defined $treebase;
 
+       my @actions = gitweb_check_feature('actions');
+       while (@actions) {
+               my ($label, $link, $pos) = (shift(@actions), shift(@actions), shift(@actions));
+               @navs = map { $_ eq $pos ? ($_, $label) : $_ } @navs;
+               # munch munch
+               $link =~ s#%n#$project#g;
+               $link =~ s#%f#$git_dir#g;
+               $treehead ? $link =~ s#%h#$treehead#g : $link =~ s#%h##g;
+               $treebase ? $link =~ s#%b#$treebase#g : $link =~ s#%b##g;
+               $arg{$label}{'_href'} = $link;
+       }
+
        print "<div class=\"page_nav\">\n" .
                (join " | ",
                 map { $_ eq $current ?
-                      $_ : $cgi->a({-href => href(%{$arg{$_}})}, "$_")
+                      $_ : $cgi->a({-href => ($arg{$_}{_href} ? $arg{$_}{_href} : href(%{$arg{$_}}))}, "$_")
                 } @navs);
        print "<br/>\n$extra<br/>\n" .
              "</div>\n";
@@ -3693,19 +3724,13 @@ sub fill_project_list_info {
        return @projects;
 }
 
-# print 'sort by' <th> element, either sorting by $key if $name eq $order
-# (changing $list), or generating 'sort by $name' replay link otherwise
+# print 'sort by' <th> element, generating 'sort by $name' replay link
+# if that order is not selected
 sub print_sort_th {
-       my ($str_sort, $name, $order, $key, $header, $list) = @_;
-       $key    ||= $name;
+       my ($name, $order, $header) = @_;
        $header ||= ucfirst($name);
 
        if ($order eq $name) {
-               if ($str_sort) {
-                       @$list = sort {$a->{$key} cmp $b->{$key}} @$list;
-               } else {
-                       @$list = sort {$a->{$key} <=> $b->{$key}} @$list;
-               }
                print "<th>$header</th>\n";
        } else {
                print "<th>" .
@@ -3715,15 +3740,8 @@ sub print_sort_th {
        }
 }
 
-sub print_sort_th_str {
-       print_sort_th(1, @_);
-}
-
-sub print_sort_th_num {
-       print_sort_th(0, @_);
-}
-
 sub git_project_list_body {
+       # actually uses global variable $project
        my ($projlist, $order, $from, $to, $extra, $no_header) = @_;
 
        my ($check_forks) = gitweb_check_feature('forks');
@@ -3733,6 +3751,19 @@ sub git_project_list_body {
        $from = 0 unless defined $from;
        $to = $#projects if (!defined $to || $#projects < $to);
 
+       my %order_info = (
+               project => { key => 'path', type => 'str' },
+               descr => { key => 'descr_long', type => 'str' },
+               owner => { key => 'owner', type => 'str' },
+               age => { key => 'age', type => 'num' }
+       );
+       my $oi = $order_info{$order};
+       if ($oi->{'type'} eq 'str') {
+               @projects = sort {$a->{$oi->{'key'}} cmp $b->{$oi->{'key'}}} @projects;
+       } else {
+               @projects = sort {$a->{$oi->{'key'}} <=> $b->{$oi->{'key'}}} @projects;
+       }
+
        my $show_ctags = gitweb_check_feature('ctags');
        if ($show_ctags) {
                my %ctags;
@@ -3751,14 +3782,10 @@ sub git_project_list_body {
                if ($check_forks) {
                        print "<th></th>\n";
                }
-               print_sort_th_str('project', $order, 'path',
-                                 'Project', \@projects);
-               print_sort_th_str('descr', $order, 'descr_long',
-                                 'Description', \@projects);
-               print_sort_th_str('owner', $order, 'owner',
-                                 'Owner', \@projects);
-               print_sort_th_num('age', $order, 'age',
-                                 'Last Change', \@projects);
+               print_sort_th('project', $order, 'Project');
+               print_sort_th('descr', $order, 'Description');
+               print_sort_th('owner', $order, 'Owner');
+               print_sort_th('age', $order, 'Last Change');
                print "<th></th>\n" . # for links
                      "</tr>\n";
        }
@@ -3766,7 +3793,18 @@ sub git_project_list_body {
        my $tagfilter = $cgi->param('by_tag');
        for (my $i = $from; $i <= $to; $i++) {
                my $pr = $projects[$i];
+
                next if $tagfilter and $show_ctags and not grep { lc $_ eq lc $tagfilter } keys %{$pr->{'ctags'}};
+               next if $searchtext and not $pr->{'path'} =~ /$searchtext/
+                       and not $pr->{'descr_long'} =~ /$searchtext/;
+               # Weed out forks or non-matching entries of search
+               if ($check_forks) {
+                       my $forkbase = $project; $forkbase ||= ''; $forkbase =~ s#\.git$#/#;
+                       $forkbase="^$forkbase" if $forkbase;
+                       next if not $searchtext and not $tagfilter and $show_ctags
+                               and $pr->{'path'} =~ m#$forkbase.*/.*#; # regexp-safe
+               }
+
                if ($alternate) {
                        print "<tr class=\"dark\">\n";
                } else {
@@ -4101,6 +4139,11 @@ sub git_project_list {
                close $fd;
                print "</div>\n";
        }
+       print $cgi->startform(-method => "get") .
+             "<p class=\"projsearch\">Search:\n" .
+             $cgi->textfield(-name => "s", -value => $searchtext) . "\n" .
+             "</p>" .
+             $cgi->end_form() . "\n";
        git_project_list_body(\@list, $order);
        git_footer_html();
 }
@@ -4240,10 +4283,10 @@ sub git_summary {
 
        if (@forklist) {
                git_print_header_div('forks');
-               git_project_list_body(\@forklist, undef, 0, 15,
+               git_project_list_body(\@forklist, 'age', 0, 15,
                                      $#forklist <= 15 ? undef :
                                      $cgi->a({-href => href(action=>"forks")}, "..."),
-                                     'noheader');
+                                     'no_header');
        }
 
        git_footer_html();