Merge branch 'bl/gitweb-project-filter'
* bl/gitweb-project-filter: gitweb: Make project search respect project_filter gitweb: improve usability of projects search form gitweb: place links to parent directories in page header gitweb: show active project_filter in project_list page header gitweb: limit links to alternate forms of project_list to active project_filter gitweb: add project_filter to limit project list to a subdirectory gitweb: prepare git_get_projects_list for use outside 'forks'. gitweb: move hard coded .git suffix out of git_get_projects_list
This commit is contained in:
commit
715d130460
@ -760,6 +760,7 @@ our @cgi_param_mapping = (
|
|||||||
search_use_regexp => "sr",
|
search_use_regexp => "sr",
|
||||||
ctag => "by_tag",
|
ctag => "by_tag",
|
||||||
diff_style => "ds",
|
diff_style => "ds",
|
||||||
|
project_filter => "pf",
|
||||||
# this must be last entry (for manipulation from JavaScript)
|
# this must be last entry (for manipulation from JavaScript)
|
||||||
javascript => "js"
|
javascript => "js"
|
||||||
);
|
);
|
||||||
@ -976,7 +977,7 @@ sub evaluate_path_info {
|
|||||||
|
|
||||||
our ($action, $project, $file_name, $file_parent, $hash, $hash_parent, $hash_base,
|
our ($action, $project, $file_name, $file_parent, $hash, $hash_parent, $hash_base,
|
||||||
$hash_parent_base, @extra_options, $page, $searchtype, $search_use_regexp,
|
$hash_parent_base, @extra_options, $page, $searchtype, $search_use_regexp,
|
||||||
$searchtext, $search_regexp);
|
$searchtext, $search_regexp, $project_filter);
|
||||||
sub evaluate_and_validate_params {
|
sub evaluate_and_validate_params {
|
||||||
our $action = $input_params{'action'};
|
our $action = $input_params{'action'};
|
||||||
if (defined $action) {
|
if (defined $action) {
|
||||||
@ -994,6 +995,13 @@ sub evaluate_and_validate_params {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
our $project_filter = $input_params{'project_filter'};
|
||||||
|
if (defined $project_filter) {
|
||||||
|
if (!validate_pathname($project_filter)) {
|
||||||
|
die_error(404, "Invalid project_filter parameter");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
our $file_name = $input_params{'file_name'};
|
our $file_name = $input_params{'file_name'};
|
||||||
if (defined $file_name) {
|
if (defined $file_name) {
|
||||||
if (!validate_pathname($file_name)) {
|
if (!validate_pathname($file_name)) {
|
||||||
@ -2829,10 +2837,9 @@ sub git_get_project_url_list {
|
|||||||
|
|
||||||
sub git_get_projects_list {
|
sub git_get_projects_list {
|
||||||
my $filter = shift || '';
|
my $filter = shift || '';
|
||||||
|
my $paranoid = shift;
|
||||||
my @list;
|
my @list;
|
||||||
|
|
||||||
$filter =~ s/\.git$//;
|
|
||||||
|
|
||||||
if (-d $projects_list) {
|
if (-d $projects_list) {
|
||||||
# search in directory
|
# search in directory
|
||||||
my $dir = $projects_list;
|
my $dir = $projects_list;
|
||||||
@ -2841,7 +2848,7 @@ sub git_get_projects_list {
|
|||||||
my $pfxlen = length("$dir");
|
my $pfxlen = length("$dir");
|
||||||
my $pfxdepth = ($dir =~ tr!/!!);
|
my $pfxdepth = ($dir =~ tr!/!!);
|
||||||
# when filtering, search only given subdirectory
|
# when filtering, search only given subdirectory
|
||||||
if ($filter) {
|
if ($filter && !$paranoid) {
|
||||||
$dir .= "/$filter";
|
$dir .= "/$filter";
|
||||||
$dir =~ s!/+$!!;
|
$dir =~ s!/+$!!;
|
||||||
}
|
}
|
||||||
@ -2866,6 +2873,10 @@ sub git_get_projects_list {
|
|||||||
}
|
}
|
||||||
|
|
||||||
my $path = substr($File::Find::name, $pfxlen + 1);
|
my $path = substr($File::Find::name, $pfxlen + 1);
|
||||||
|
# paranoidly only filter here
|
||||||
|
if ($paranoid && $filter && $path !~ m!^\Q$filter\E/!) {
|
||||||
|
next;
|
||||||
|
}
|
||||||
# we check related file in $projectroot
|
# we check related file in $projectroot
|
||||||
if (check_export_ok("$projectroot/$path")) {
|
if (check_export_ok("$projectroot/$path")) {
|
||||||
push @list, { path => $path };
|
push @list, { path => $path };
|
||||||
@ -3731,7 +3742,12 @@ sub run_highlighter {
|
|||||||
sub get_page_title {
|
sub get_page_title {
|
||||||
my $title = to_utf8($site_name);
|
my $title = to_utf8($site_name);
|
||||||
|
|
||||||
return $title unless (defined $project);
|
unless (defined $project) {
|
||||||
|
if (defined $project_filter) {
|
||||||
|
$title .= " - " . to_utf8($project_filter);
|
||||||
|
}
|
||||||
|
return $title;
|
||||||
|
}
|
||||||
$title .= " - " . to_utf8($project);
|
$title .= " - " . to_utf8($project);
|
||||||
|
|
||||||
return $title unless (defined $action);
|
return $title unless (defined $action);
|
||||||
@ -3825,12 +3841,27 @@ sub print_header_links {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub print_nav_breadcrumbs_path {
|
||||||
|
my $dirprefix = undef;
|
||||||
|
while (my $part = shift) {
|
||||||
|
$dirprefix .= "/" if defined $dirprefix;
|
||||||
|
$dirprefix .= $part;
|
||||||
|
print $cgi->a({-href => href(project => undef,
|
||||||
|
project_filter => $dirprefix,
|
||||||
|
action => "project_list")},
|
||||||
|
esc_html($part)) . " / ";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
sub print_nav_breadcrumbs {
|
sub print_nav_breadcrumbs {
|
||||||
my %opts = @_;
|
my %opts = @_;
|
||||||
|
|
||||||
print $cgi->a({-href => esc_url($home_link)}, $home_link_str) . " / ";
|
print $cgi->a({-href => esc_url($home_link)}, $home_link_str) . " / ";
|
||||||
if (defined $project) {
|
if (defined $project) {
|
||||||
print $cgi->a({-href => href(action=>"summary")}, esc_html($project));
|
my @dirname = split '/', $project;
|
||||||
|
my $projectbasename = pop @dirname;
|
||||||
|
print_nav_breadcrumbs_path(@dirname);
|
||||||
|
print $cgi->a({-href => href(action=>"summary")}, esc_html($projectbasename));
|
||||||
if (defined $action) {
|
if (defined $action) {
|
||||||
my $action_print = $action ;
|
my $action_print = $action ;
|
||||||
if (defined $opts{-action_extra}) {
|
if (defined $opts{-action_extra}) {
|
||||||
@ -3843,6 +3874,8 @@ sub print_nav_breadcrumbs {
|
|||||||
print " / $opts{-action_extra}";
|
print " / $opts{-action_extra}";
|
||||||
}
|
}
|
||||||
print "\n";
|
print "\n";
|
||||||
|
} elsif (defined $project_filter) {
|
||||||
|
print_nav_breadcrumbs_path(split '/', $project_filter);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3965,9 +3998,11 @@ sub git_footer_html {
|
|||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
print $cgi->a({-href => href(project=>undef, action=>"opml"),
|
print $cgi->a({-href => href(project=>undef, action=>"opml",
|
||||||
|
project_filter => $project_filter),
|
||||||
-class => $feed_class}, "OPML") . " ";
|
-class => $feed_class}, "OPML") . " ";
|
||||||
print $cgi->a({-href => href(project=>undef, action=>"project_index"),
|
print $cgi->a({-href => href(project=>undef, action=>"project_index",
|
||||||
|
project_filter => $project_filter),
|
||||||
-class => $feed_class}, "TXT") . "\n";
|
-class => $feed_class}, "TXT") . "\n";
|
||||||
}
|
}
|
||||||
print "</div>\n"; # class="page_footer"
|
print "</div>\n"; # class="page_footer"
|
||||||
@ -5125,6 +5160,34 @@ sub git_patchset_body {
|
|||||||
|
|
||||||
# . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
|
# . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
|
||||||
|
|
||||||
|
sub git_project_search_form {
|
||||||
|
my ($searchtext, $search_use_regexp);
|
||||||
|
|
||||||
|
my $limit = '';
|
||||||
|
if ($project_filter) {
|
||||||
|
$limit = " in '$project_filter/'";
|
||||||
|
}
|
||||||
|
|
||||||
|
print "<div class=\"projsearch\">\n";
|
||||||
|
print $cgi->startform(-method => 'get', -action => $my_uri) .
|
||||||
|
$cgi->hidden(-name => 'a', -value => 'project_list') . "\n";
|
||||||
|
print $cgi->hidden(-name => 'pf', -value => $project_filter). "\n"
|
||||||
|
if (defined $project_filter);
|
||||||
|
print $cgi->textfield(-name => 's', -value => $searchtext,
|
||||||
|
-title => "Search project by name and description$limit",
|
||||||
|
-size => 60) . "\n" .
|
||||||
|
"<span title=\"Extended regular expression\">" .
|
||||||
|
$cgi->checkbox(-name => 'sr', -value => 1, -label => 're',
|
||||||
|
-checked => $search_use_regexp) .
|
||||||
|
"</span>\n" .
|
||||||
|
$cgi->submit(-name => 'btnS', -value => 'Search') .
|
||||||
|
$cgi->end_form() . "\n" .
|
||||||
|
$cgi->a({-href => href(project => undef, searchtext => undef,
|
||||||
|
project_filter => $project_filter)},
|
||||||
|
esc_html("List all projects$limit")) . "<br />\n";
|
||||||
|
print "</div>\n";
|
||||||
|
}
|
||||||
|
|
||||||
# fills project list info (age, description, owner, category, forks)
|
# fills project list info (age, description, owner, category, forks)
|
||||||
# for each project in the list, removing invalid projects from
|
# for each project in the list, removing invalid projects from
|
||||||
# returned list
|
# returned list
|
||||||
@ -5981,7 +6044,7 @@ sub git_project_list {
|
|||||||
die_error(400, "Unknown order parameter");
|
die_error(400, "Unknown order parameter");
|
||||||
}
|
}
|
||||||
|
|
||||||
my @list = git_get_projects_list();
|
my @list = git_get_projects_list($project_filter, $strict_export);
|
||||||
if (!@list) {
|
if (!@list) {
|
||||||
die_error(404, "No projects found");
|
die_error(404, "No projects found");
|
||||||
}
|
}
|
||||||
@ -5992,11 +6055,8 @@ sub git_project_list {
|
|||||||
insert_file($home_text);
|
insert_file($home_text);
|
||||||
print "</div>\n";
|
print "</div>\n";
|
||||||
}
|
}
|
||||||
print $cgi->startform(-method => "get") .
|
|
||||||
"<p class=\"projsearch\">Search:\n" .
|
git_project_search_form($searchtext, $search_use_regexp);
|
||||||
$cgi->textfield(-name => "s", -value => $searchtext) . "\n" .
|
|
||||||
"</p>" .
|
|
||||||
$cgi->end_form() . "\n";
|
|
||||||
git_project_list_body(\@list, $order);
|
git_project_list_body(\@list, $order);
|
||||||
git_footer_html();
|
git_footer_html();
|
||||||
}
|
}
|
||||||
@ -6007,7 +6067,9 @@ sub git_forks {
|
|||||||
die_error(400, "Unknown order parameter");
|
die_error(400, "Unknown order parameter");
|
||||||
}
|
}
|
||||||
|
|
||||||
my @list = git_get_projects_list($project);
|
my $filter = $project;
|
||||||
|
$filter =~ s/\.git$//;
|
||||||
|
my @list = git_get_projects_list($filter);
|
||||||
if (!@list) {
|
if (!@list) {
|
||||||
die_error(404, "No forks found");
|
die_error(404, "No forks found");
|
||||||
}
|
}
|
||||||
@ -6020,7 +6082,7 @@ sub git_forks {
|
|||||||
}
|
}
|
||||||
|
|
||||||
sub git_project_index {
|
sub git_project_index {
|
||||||
my @projects = git_get_projects_list();
|
my @projects = git_get_projects_list($project_filter, $strict_export);
|
||||||
if (!@projects) {
|
if (!@projects) {
|
||||||
die_error(404, "No projects found");
|
die_error(404, "No projects found");
|
||||||
}
|
}
|
||||||
@ -6066,7 +6128,9 @@ sub git_summary {
|
|||||||
|
|
||||||
if ($check_forks) {
|
if ($check_forks) {
|
||||||
# find forks of a project
|
# find forks of a project
|
||||||
@forklist = git_get_projects_list($project);
|
my $filter = $project;
|
||||||
|
$filter =~ s/\.git$//;
|
||||||
|
@forklist = git_get_projects_list($filter);
|
||||||
# filter out forks of forks
|
# filter out forks of forks
|
||||||
@forklist = filter_forks_from_projects_list(\@forklist)
|
@forklist = filter_forks_from_projects_list(\@forklist)
|
||||||
if (@forklist);
|
if (@forklist);
|
||||||
@ -7857,7 +7921,7 @@ sub git_atom {
|
|||||||
}
|
}
|
||||||
|
|
||||||
sub git_opml {
|
sub git_opml {
|
||||||
my @list = git_get_projects_list();
|
my @list = git_get_projects_list($project_filter, $strict_export);
|
||||||
if (!@list) {
|
if (!@list) {
|
||||||
die_error(404, "No projects found");
|
die_error(404, "No projects found");
|
||||||
}
|
}
|
||||||
@ -7868,11 +7932,17 @@ sub git_opml {
|
|||||||
-content_disposition => 'inline; filename="opml.xml"');
|
-content_disposition => 'inline; filename="opml.xml"');
|
||||||
|
|
||||||
my $title = esc_html($site_name);
|
my $title = esc_html($site_name);
|
||||||
|
my $filter = " within subdirectory ";
|
||||||
|
if (defined $project_filter) {
|
||||||
|
$filter .= esc_html($project_filter);
|
||||||
|
} else {
|
||||||
|
$filter = "";
|
||||||
|
}
|
||||||
print <<XML;
|
print <<XML;
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<opml version="1.0">
|
<opml version="1.0">
|
||||||
<head>
|
<head>
|
||||||
<title>$title OPML Export</title>
|
<title>$title OPML Export$filter</title>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<outline text="git RSS feeds">
|
<outline text="git RSS feeds">
|
||||||
|
@ -520,8 +520,13 @@ div.search {
|
|||||||
right: 12px
|
right: 12px
|
||||||
}
|
}
|
||||||
|
|
||||||
p.projsearch {
|
div.projsearch {
|
||||||
text-align: center;
|
text-align: center;
|
||||||
|
margin: 20px 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.projsearch form {
|
||||||
|
margin-bottom: 2px;
|
||||||
}
|
}
|
||||||
|
|
||||||
td.linenr {
|
td.linenr {
|
||||||
|
Loading…
Reference in New Issue
Block a user