gitweb: Make pickaxe search a feature
[gitweb.git] / gitweb / gitweb.perl
index 57ffa25070984f6ca3310c83062ac8dcd68d30fc..53e3478e4f81fd8b88708df6206b6159dae00a7f 100755 (executable)
@@ -48,6 +48,8 @@
 our $stylesheet = "++GITWEB_CSS++";
 # URI of GIT logo
 our $logo = "++GITWEB_LOGO++";
+# URI of GIT favicon, assumed to be image/png type
+our $favicon = "++GITWEB_FAVICON++";
 
 # source of projects list
 our $projects_list = "++GITWEB_LIST++";
                'override' => 0,
                #         => [content-encoding, suffix, program]
                'default' => ['x-gzip', 'gz', 'gzip']},
+
+       'pickaxe' => {
+               'sub' => \&feature_pickaxe,
+               'override' => 0,
+               'default' => [1]},
 );
 
 sub gitweb_check_feature {
@@ -141,6 +148,24 @@ sub feature_snapshot {
        return ($ctype, $suffix, $command);
 }
 
+# To enable system wide have in $GITWEB_CONFIG
+# $feature{'pickaxe'}{'default'} = [1];
+# To have project specific config enable override in $GITWEB_CONFIG
+# $feature{'pickaxe'}{'override'} = 1;
+# and in project config gitweb.pickaxe = 0|1;
+
+sub feature_pickaxe {
+       my ($val) = git_get_project_config('pickaxe', '--bool');
+
+       if ($val eq 'true') {
+               return (1);
+       } elsif ($val eq 'false') {
+               return (0);
+       }
+
+       return ($_[0]);
+}
+
 # rename detection options for git-diff and git-diff-tree
 # - default is '-M', with the cost proportional to
 #   (number of removed files) * (number of new files).
@@ -1222,6 +1247,9 @@ sub git_header_html {
                       'href="%s" type="application/rss+xml"/>'."\n",
                       esc_param($project), href(action=>"rss"));
        }
+       if (defined $favicon) {
+               print qq(<link rel="shortcut icon" href="$favicon" type="image/png"/>\n);
+       }
 
        print "</head>\n" .
              "<body>\n" .
@@ -1400,19 +1428,32 @@ sub git_print_page_path {
 
        if (!defined $name) {
                print "<div class=\"page_path\">/</div>\n";
-       } elsif (defined $type && $type eq 'blob') {
+       } else {
+               my @dirname = split '/', $name;
+               my $basename = pop @dirname;
+               my $fullname = '';
+
                print "<div class=\"page_path\">";
-               if (defined $hb) {
+               foreach my $dir (@dirname) {
+                       $fullname .= $dir . '/';
+                       print $cgi->a({-href => href(action=>"tree", file_name=>$fullname,
+                                                    hash_base=>$hb),
+                                     -title => $fullname}, esc_html($dir));
+                       print "/";
+               }
+               if (defined $type && $type eq 'blob') {
                        print $cgi->a({-href => href(action=>"blob_plain", file_name=>$file_name,
-                                                    hash_base=>$hb)},
-                                     esc_html($name));
+                                                    hash_base=>$hb),
+                                     -title => $name}, esc_html($basename));
+               } elsif (defined $type && $type eq 'tree') {
+                       print $cgi->a({-href => href(action=>"tree", file_name=>$file_name,
+                                                    hash_base=>$hb),
+                                     -title => $name}, esc_html($basename));
+                       print "/";
                } else {
-                       print $cgi->a({-href => href(action=>"blob_plain", file_name=>$file_name)},
-                                     esc_html($name));
+                       print esc_html($basename);
                }
                print "<br/></div>\n";
-       } else {
-               print "<div class=\"page_path\">" . esc_html($name) . "<br/></div>\n";
        }
 }
 
@@ -1587,7 +1628,7 @@ sub git_difftree_body {
                              $cgi->a({-href => href(action=>"blob", hash=>$diff{'to_id'},
                                                     hash_base=>$hash, file_name=>$diff{'file'})},
                                      "blob");
-                       if ($action == "commitdiff") {
+                       if ($action eq 'commitdiff') {
                                # link to patch
                                $patchno++;
                                print " | " .
@@ -1608,7 +1649,7 @@ sub git_difftree_body {
                                                     hash_base=>$parent, file_name=>$diff{'file'})},
                                      "blob") .
                              " | ";
-                       if ($action == "commitdiff") {
+                       if ($action eq 'commitdiff') {
                                # link to patch
                                $patchno++;
                                print " | " .
@@ -1654,7 +1695,7 @@ sub git_difftree_body {
                                                     hash_base=>$hash, file_name=>$diff{'file'})},
                                      "blob");
                        if ($diff{'to_id'} ne $diff{'from_id'}) { # modified
-                               if ($action == "commitdiff") {
+                               if ($action eq 'commitdiff') {
                                        # link to patch
                                        $patchno++;
                                        print " | " .
@@ -1696,7 +1737,7 @@ sub git_difftree_body {
                                                     hash=>$diff{'to_id'}, file_name=>$diff{'to_file'})},
                                      "blob");
                        if ($diff{'to_id'} ne $diff{'from_id'}) {
-                               if ($action == "commitdiff") {
+                               if ($action eq 'commitdiff') {
                                        # link to patch
                                        $patchno++;
                                        print " | " .
@@ -2781,7 +2822,7 @@ sub git_commit {
                      "<td class=\"link\">" .
                      $cgi->a({-href => href(action=>"commit", hash=>$par)}, "commit") .
                      " | " .
-                     $cgi->a({-href => href(action=>"commitdiff", hash=>$hash, hash_parent=>$par)}, "commitdiff") .
+                     $cgi->a({-href => href(action=>"commitdiff", hash=>$hash, hash_parent=>$par)}, "diff") .
                      "</td>" .
                      "</tr>\n";
        }
@@ -3110,8 +3151,7 @@ sub git_search {
        if (!%co) {
                die_error(undef, "Unknown commit object");
        }
-       # pickaxe may take all resources of your box and run for several minutes
-       # with every query - so decide by yourself how public you make this feature :)
+
        my $commit_search = 1;
        my $author_search = 0;
        my $committer_search = 0;
@@ -3123,6 +3163,13 @@ sub git_search {
        } elsif ($searchtext =~ s/^pickaxe\\://i) {
                $commit_search = 0;
                $pickaxe_search = 1;
+
+               # pickaxe may take all resources of your box and run for several minutes
+               # with every query - so decide by yourself how public you make this feature
+               my ($have_pickaxe) = gitweb_check_feature('pickaxe');
+               if (!$have_pickaxe) {
+                       die_error('403 Permission denied', "Permission denied");
+               }
        }
        git_header_html();
        git_print_page_nav('','', $hash,$co{'tree'},$hash);