[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Restructuring check scripts



Hi,

Russ Allbery wrote:

> Raphael Geissert writes:
[...]
> Why did you move the arguments to the run method into object data?  I
> think they're better left as arguments that are passed to every check
> function.  It's one fewer level of indirection.

I though setting up once and calling many was better. I didn't like the
amount of changes needed, but I decided to go on and see what you'd say.

> 
>> diff --git a/lib/Checker.pm b/lib/Checker.pm
>> index 7aa7e23..642204f 100644
>> --- a/lib/Checker.pm
>> +++ b/lib/Checker.pm
>> @@ -40,7 +40,9 @@ sub runcheck {
>>  require "$LINTIAN_ROOT/checks/$name";
>>  
>>  $name =~ s/[-.]/_/g;
>> -    eval { &{'Lintian::'.$name.'::run'}($pkg, $type, $info) };
>> +    my $check;
>> +    eval "\$check = Lintian::$name->new(\$pkg, \$type, \$info)" and eval
>> {$check->run()};
> 
> You can use the same method in the code that you're replacing to avoid
> the string eval.

Indeed, I don't know why I didn't notice it.

> However, I don't think the parent class here is 
> useful; I would just move the run code from below directly into
> Checker.pm rather than creating the parent object.
> 

You mean blessing the object directly in run()?

>> +sub run {
>> +    my $self = shift;
>> +    my $class = ref $self;
>> +    my @table;
>> +
>> +    eval("\@table = keys %". $class ."::;");
> 
> Unnecessary eval

I prefer the cleaner approach without disabling strict references; but am
going to do it without the eval only because of the performance penalty.

> plus this will pick up symbols that aren't methods.

I don't expect it to have any side effect since a) there's not much in
object's symbols table, b) it would be less likely for a variable to be
called check_*, and c) well, it can be mitigated :)

> 
>     {
>         no strict 'refs';
>         my @table = grep { defined &{$class . '::'} } keys %{$class .

"my"? I don't think it would be of any use then ;)
Oh, and "defined &{$class . '::' *. $_*}" :)

>         '::'};
>     }
> 

Okay, using that.

>> +    for my $symbol (@table) {
> 
> sort @table.  We want to run checks in a predictable order.

Why? Anything relying on a predictable order is likely to be bogus.
That's why for example the tests use sort(1) on lintian's output.

> 
>> +    next unless $symbol =~ m/^check_/;
>> +    $self->$symbol;
>> +    }
>> +    1;
>> +}
> 
> Please use an explicit return as a matter of style rather than falling
> off the end of the sub and returning the last evaluated value.
> 

Okay.

By the way, sorry for my recent behaviour/mood, I had some RL issues.

Cheers,
-- 
Raphael Geissert - Debian Maintainer
www.debian.org - get.debian.net

Attachment: lintian-checks.mbox
Description: application/mbox


Reply to: