gitweb: speed up project listing on large work trees by limiting find depth
Signed-off-by: Luke Lu <git@vicaya.com> Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
This commit is contained in:
@ -35,6 +35,10 @@ our $GIT = "++GIT_BINDIR++/git";
|
||||
#our $projectroot = "/pub/scm";
|
||||
our $projectroot = "++GITWEB_PROJECTROOT++";
|
||||
|
||||
# fs traversing limit for getting project list
|
||||
# the number is relative to the projectroot
|
||||
our $project_maxdepth = "++GITWEB_PROJECT_MAXDEPTH++";
|
||||
|
||||
# target of the home link on top of all pages
|
||||
our $home_link = $my_uri || "/";
|
||||
|
||||
@ -1509,6 +1513,7 @@ sub git_get_projects_list {
|
||||
# remove the trailing "/"
|
||||
$dir =~ s!/+$!!;
|
||||
my $pfxlen = length("$dir");
|
||||
my $pfxdepth = ($dir =~ tr!/!!);
|
||||
|
||||
File::Find::find({
|
||||
follow_fast => 1, # follow symbolic links
|
||||
@ -1519,6 +1524,11 @@ sub git_get_projects_list {
|
||||
return if (m!^[/.]$!);
|
||||
# only directories can be git repositories
|
||||
return unless (-d $_);
|
||||
# don't traverse too deep (Find is super slow on os x)
|
||||
if (($File::Find::name =~ tr!/!!) - $pfxdepth > $project_maxdepth) {
|
||||
$File::Find::prune = 1;
|
||||
return;
|
||||
}
|
||||
|
||||
my $subdir = substr($File::Find::name, $pfxlen + 1);
|
||||
# we check related file in $projectroot
|
||||
|
||||
Reference in New Issue
Block a user