Re: [PATCH] gitweb: speed up project listing on large work trees by limiting find depth
- From
- Luke Lu <git@vicaya.com>
- Date
- Oct 17, 2007, 04:19 UTC
- Message-ID
- <6B74E96C-37ED-4D6A-8A98-C90B61EFA181@vicaya.com>
- In-Reply-To
- <20071017040028.GT13801@spearce.org>
On Oct 16, 2007, at 9:00 PM, Shawn O. Pearce wrote:
Show 19 quoted lines
> Luke Lu <git@vicaya.com> 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.This is generally a good advice. But tr!/!! doesn't alter the string at all (OK, replicates it), unless you use the /d option. tr/stuff// is an idiom to count stuff. Check perldoc perlop for details. I don't think it's necessary.
Show 18 quoted lines
>
> 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.