load custom checks from ~/.lintian/checks?
hi,
i just wondered how am i supposed to add my own checks to lintian. It
seems the only way to do this (without beeing root) is to copy the stuff
from /usr/share/lintian to $HOME and use the --root switch to change
$LINTIAN_ROOT.
I think it would be very nice if lintian could check ~/.lintian/checks
for checks and load them, just like linda does. Attached is a (i guess
pretty hackish patch) against trunk which does this.
:~$ perl lintian --root /home/abi/lintian/trunk/ /home/abi/strnew/*.deb
E: streamripper: my-custom-check
:~$ ls -1 ~/.lintian/checks
my-custom-check
my-custom-check.desc
bye,
- michael
Index: frontend/lintian
===================================================================
--- frontend/lintian (revision 585)
+++ frontend/lintian (working copy)
@@ -892,76 +892,86 @@
$Tags::show_overrides = $show_overrides;
use warnings;
-# load information about checker scripts
-opendir(CHECKDIR, "$LINTIAN_ROOT/checks")
- or fail("cannot read directory $LINTIAN_ROOT/checks");
+my @checkdirs = ( $LINTIAN_ROOT );
+if ( -d $ENV{HOME}."/.lintian/checks/" ) {
+ push @checkdirs, $ENV{HOME}."/.lintian/"
+}
-for my $f (readdir CHECKDIR) {
- next unless $f =~ /\.desc$/;
- print "N: Reading checker description file $f ...\n" if $debug >= 2;
+foreach my $DIR (@checkdirs) {
+
+ # load information about checker scripts
+ opendir(CHECKDIR, "$DIR/checks")
+ or fail("cannot read directory $DIR/checks: $!");
- my @secs = read_dpkg_control("$LINTIAN_ROOT/checks/$f");
- my $script;
- ($script = $secs[0]->{'check-script'})
- or fail("error in description file $f: `Check-Script:' not defined");
+ for my $f (readdir CHECKDIR) {
+ next unless $f =~ /\.desc$/;
+ print "N: Reading checker description file $f ...\n" if $debug >= 2;
- # ignore check `lintian' (this check is a special case and contains the
- # tag info for the lintian frontend--this script here)
- if ($secs[0]->{'check-script'} ne 'lintian') {
+ my @secs = read_dpkg_control("$DIR/checks/$f");
+ my $script;
+ ($script = $secs[0]->{'check-script'})
+ or fail("error in description file $f: `Check-Script:' not defined");
- delete $secs[0]->{'check-script'};
- $check_info{$script}->{'script'} = $script;
- my $p = $check_info{$script};
+ # ignore check `lintian' (this check is a special case and contains the
+ # tag info for the lintian frontend--this script here)
+ if ($secs[0]->{'check-script'} ne 'lintian') {
- set_value($f,$p,'type',$secs[0],1);
- # convert Type:
- my ($b,$s,$u) = ( "", "", "" );
- for (split(/\s*,\s*/o,$p->{'type'})) {
- if ($_ eq 'binary') {
- $b = 'b';
- } elsif ($_ eq 'source') {
- $s = 's';
- } elsif ($_ eq 'udeb') {
- $u = 'u';
- } else {
- fail("unknown type $_ specified in description file $f");
+ delete $secs[0]->{'check-script'};
+ $check_info{$script}->{'script'} = $DIR."/checks/".$script;
+ my $p = $check_info{$script};
+
+ set_value($f,$p,'type',$secs[0],1);
+ # convert Type:
+ my ($b,$s,$u) = ( "", "", "" );
+ for (split(/\s*,\s*/o,$p->{'type'})) {
+ if ($_ eq 'binary') {
+ $b = 'b';
+ } elsif ($_ eq 'source') {
+ $s = 's';
+ } elsif ($_ eq 'udeb') {
+ $u = 'u';
+ } else {
+ fail("unknown type $_ specified in description file $f");
+ }
}
- }
- $p->{'type'} = "$s$b$u";
+ $p->{'type'} = "$s$b$u";
- set_value($f,$p,'unpack-level',$secs[0],1);
- set_value($f,$p,'abbrev',$secs[0],1);
+ set_value($f,$p,'unpack-level',$secs[0],1);
+ set_value($f,$p,'abbrev',$secs[0],1);
- if (exists $secs[0]->{'needs-info'} && defined $secs[0]->{'needs-info'}) {
- for (split(/\s*,\s*/o,$secs[0]->{'needs-info'})) {
- $p->{$_} = 1;
- }
- delete $secs[0]->{'needs-info'};
- }
+ if (exists $secs[0]->{'needs-info'} && defined $secs[0]->{'needs-info'}) {
+ for (split(/\s*,\s*/o,$secs[0]->{'needs-info'})) {
+ $p->{$_} = 1;
+ }
+ delete $secs[0]->{'needs-info'};
+ }
- # ignore Info: and other fields for now...
- delete $secs[0]->{'info'};
- delete $secs[0]->{'standards-version'};
- delete $secs[0]->{'author'};
+ # ignore Info: and other fields for now...
+ delete $secs[0]->{'info'};
+ delete $secs[0]->{'standards-version'};
+ delete $secs[0]->{'author'};
- for (keys %{$secs[0]}) {
- print STDERR "warning: unused tag $_ in description file $f\n";
- }
+ for (keys %{$secs[0]}) {
+ print STDERR "warning: unused tag $_ in description file $f\n";
+ }
- if ($debug >= 2) {
- for (sort keys %$p) {
- print "N: $_: $p->{$_}\n";
+ if ($debug >= 2) {
+ for (sort keys %$p) {
+ print "N: $_: $p->{$_}\n";
+ }
}
- }
- shift(@secs);
- map Tags::add_tag($_), @secs;
- } # end: if ne lintian
+ shift(@secs);
+ map Tags::add_tag($_), @secs;
+ } # end: if ne lintian
-}
+ }
closedir(CHECKDIR);
+}
+
+
# }}}
# {{{ Again some lone code the author just dumped where his cursor just happened to be
@@ -1283,7 +1293,7 @@
next PACKAGE;
}
- my $returnvalue = Checker::runcheck($pkg, $long_type, $check);
+ my $returnvalue = Checker::runcheck($pkg, $long_type, $check, $ci->{script});
# Set exit_code correctly if there was not yet an exit code
$exit_code = $returnvalue unless $exit_code;
Index: lib/Checker.pm
===================================================================
--- lib/Checker.pm (revision 585)
+++ lib/Checker.pm (working copy)
@@ -51,6 +51,7 @@
my $pkg = shift;
my $type = shift;
my $name = shift;
+ my $script = shift;
# Will be set to 2 if error is encountered
my $return = 0;
@@ -60,7 +61,7 @@
my $check = $checks{$name};
# require has a anti-require-twice cache
- require "$LINTIAN_ROOT/checks/$name";
+ require "$script";
#print STDERR "Now running $name...\n";
$name =~ s/[-.]/_/g;
Reply to: