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

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: