From: Mark Rada Date: Fri, 07 Aug 2009 17:56:03 GMT Subject: Re: Gitweb giving me some warnings in Apache's error_log Message-ID: <88f4c4ee0908071056g5d9da83ft77d56ec2e5e84bac@mail.gmail.com> In-Reply-To: Let me double check my understanding. The warnings will not occur if Gitweb is run as a regular CGI script because then it won't be nested inside a call from ModPerl::Registry? Will it also not complain if I provided my own $project_list in the first place? Also, I looked at some examples from the second and third page of an article on the subject, http://www.perl.com/pub/a/2002/05/07/mod_perl.html? and it looks "fixable". Is there a particular reason why any of them are not desirable? Note: I haven't tried anything yet, just wondering if you know off hand -- Mark A Rada (ferrous26) marada@uwaterloo.ca On Fri, Aug 7, 2009 at 10:14 AM, Jakub Narebski wrote: > Mark A Rada writes: > >> It doesn't seem to cause any other problems, but I don't know if it is >> significant or not. >> >> [Fri Aug  7 08:51:13 2009] gitweb.cgi: Variable "$project_maxdepth" >> may be unavailable at /var/www/private/gitweb/cgi-bin/gitweb.cgi line >> 2296. >> [Fri Aug  7 08:51:13 2009] gitweb.cgi: Variable "$projectroot" may be >> unavailable at /var/www/private/gitweb/cgi-bin/gitweb.cgi line 2304. >> >> >> Apache 2.2.12/ mod_perl 2.04/ perl 5.8.8 > > From perldiag(1) manpage: > >  Variable "%s" may be unavailable > >    (W closure) An inner (nested) anonymous subroutine is inside a >    named subroutine, and outside that is another subroutine; and the >    anonymous (innermost) subroutine is referencing a lexical variable >    defined in the outermost subroutine.  For example: > >      sub outermost { my $a; sub middle { sub { $a } } } > >    If the anonymous subroutine is called or referenced (directly or >    indirectly) from the outermost subroutine, it will share the >    variable as you would expect.  But if the anonymous subroutine is >    called or referenced when the outermost subroutine is not active, >    it will see the value of the shared variable as it was before and >    during the *first* call to the outermost subroutine, which is >    probably not what you want. > >    In these circumstances, it is usually best to make the middle >    subroutine anonymous, using the "sub {}" syntax.  Perl has >    specific support for shared variables in nested anonymous >    subroutines; a named subroutine in between interferes with this >    feature. > > The warning is about 'wanted' anonymous subroutine passed to > File::Find::find.  The "middle" subroutine is git_get_projects_list, > and the "outermost" is mod_perl / ModPerl::Registry request loop. > > We can't make git_get_projects_list anonymous, but anonymous > subroutine is not called or referenced outside git_get_projects_list, > nor it is called or referenced outside mod_perl request/event loop. > > This warning is harmless... but I do not know how to silence it. > > -- > Jakub Narebski > Poland > ShadeHawk on #git >