Subject: Re: [PATCH] gitweb: speed up project listing on large work trees by limiting find depth

From: "Shawn O. Pearce" <[email-masked]>
Date: Wed, 17 Oct 2007 00:00:28 -0400

Luke Lu <[email-masked]> wrote:
> Resubmitting patch after passing gitweb regression tests.
...
> @@ -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;
> +				}

Thanks.  I'm squashing this into your patch.  I'm not sure what
the impact is of altering $File::Find::name in the middle of the
find algorithm and I'm not sure we want to figure that out later.
We found out the hard way today that altering a non-local'd $_
in the function is what was causing the breakage.

diff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl
index 48e21da..9f47c3f 100755
--- a/gitweb/gitweb.perl
+++ b/gitweb/gitweb.perl
@@ -1525,7 +1525,8 @@ sub git_get_projects_list {
 				# 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) {
+				local $_ = $File::Find::name;
+				if (tr!/!! - $pfxdepth > $project_maxdepth) {
 					$File::Find::prune = 1;
 					return;
 				}
-- 
Shawn.