summary refs log tree commit diff
diff options
context:
space:
mode:
authorEelco Dolstra <eelco.dolstra@logicblox.com>2013-07-30 11:45:54 +0200
committerEelco Dolstra <eelco.dolstra@logicblox.com>2013-07-30 12:05:36 +0200
commit74c52ac8ad9d5e7383de4a7f495d087f14ce51a7 (patch)
tree18d41d6a31c8a928410aa6e2ddb649b7f9bacbd0
parent44731b5251cc5771cf4582ee3a2223c9379f0c4c (diff)
downloadnixpkgs-74c52ac8ad9d5e7383de4a7f495d087f14ce51a7.tar
nixpkgs-74c52ac8ad9d5e7383de4a7f495d087f14ce51a7.tar.gz
nixpkgs-74c52ac8ad9d5e7383de4a7f495d087f14ce51a7.tar.bz2
nixpkgs-74c52ac8ad9d5e7383de4a7f495d087f14ce51a7.tar.lz
nixpkgs-74c52ac8ad9d5e7383de4a7f495d087f14ce51a7.tar.xz
nixpkgs-74c52ac8ad9d5e7383de4a7f495d087f14ce51a7.tar.zst
nixpkgs-74c52ac8ad9d5e7383de4a7f495d087f14ce51a7.zip
nixpkgs-lint: Add support for filtering by maintainer
For instance, you can now say "nixpkgs-lint -m alice" to show only
packages maintained by Alice.

Also added command-line parsing.
-rwxr-xr-xmaintainers/scripts/nixpkgs-lint.pl54
1 files changed, 43 insertions, 11 deletions
diff --git a/maintainers/scripts/nixpkgs-lint.pl b/maintainers/scripts/nixpkgs-lint.pl
index 0b1519ef15c..c82cf75e3f8 100755
--- a/maintainers/scripts/nixpkgs-lint.pl
+++ b/maintainers/scripts/nixpkgs-lint.pl
@@ -3,25 +3,43 @@
 use strict;
 use List::Util qw(min);
 use XML::Simple qw(:strict);
-use Data::Dumper;
+use Getopt::Long qw(:config gnu_getopt);
 
+# Parse the command line.
+my $path = "<nixpkgs>";
 my $filter = "*";
+my $maintainer;
 
-my $xml = `nix-env -f . -qa '$filter' --xml --meta --drv-path`;
+sub showHelp {
+    print <<EOF;
+Usage: $0 [--package=NAME] [--maintainer=REGEXP] [--file=PATH]
 
-my $info = XMLin($xml, KeyAttr => { 'item' => '+attrPath', 'meta' => 'name' }, ForceArray => 1, SuppressEmpty => '' ) or die "cannot parse XML output";
-
-#print Dumper($info);
+Check Nixpkgs for common errors/problems.
 
-my %pkgsByName;
+  -p, --package        filter packages by name (default is ‘*’)
+  -m, --maintainer     filter packages by maintainer (case-insensitive regexp)
+  -f, --file           path to Nixpkgs (default is ‘<nixpkgs>’)
 
-foreach my $attr (sort keys %{$info->{item}}) {
-    my $pkg = $info->{item}->{$attr};
-    #print STDERR "attr = $attr, name = $pkg->{name}\n";
-    $pkgsByName{$pkg->{name}} //= [];
-    push @{$pkgsByName{$pkg->{name}}}, $pkg;
+Examples:
+  \$ nixpkgs-lint -f /my/nixpkgs -p firefox
+  \$ nixpkgs-lint -f /my/nixpkgs -m eelco
+EOF
+    exit 0;
 }
 
+GetOptions("package|p=s" => \$filter,
+           "maintainer|m=s" => \$maintainer,
+           "file|f=s" => \$path,
+           "help" => sub { showHelp() }
+    )
+    or die("syntax: $0 ...\n");
+
+# Evaluate Nixpkgs into an XML representation.
+my $xml = `nix-env -f '$path' -qa '$filter' --xml --meta --drv-path`;
+die "$0: evaluation of ‘$path’ failed\n" if $? != 0;
+
+my $info = XMLin($xml, KeyAttr => { 'item' => '+attrPath', 'meta' => 'name' }, ForceArray => 1, SuppressEmpty => '' ) or die "cannot parse XML output";
+
 # Check meta information.
 print "=== Package meta information ===\n\n";
 my $nrMissingMaintainers = 0;
@@ -44,6 +62,11 @@ foreach my $attr (sort keys %{$info->{item}}) {
         @maintainers = ($x->{value});
     }
 
+    if (defined $maintainer && scalar(grep { $_ =~ /$maintainer/i } @maintainers) == 0) {
+        delete $info->{item}->{$attr};
+        next;
+    }
+
     if (scalar @maintainers == 0) {
         print "$attr: Lacks a maintainer\n";
         $nrMissingMaintainers++;
@@ -86,6 +109,15 @@ print "\n";
 # Find packages that have the same name.
 print "=== Package name collisions ===\n\n";
 
+my %pkgsByName;
+
+foreach my $attr (sort keys %{$info->{item}}) {
+    my $pkg = $info->{item}->{$attr};
+    #print STDERR "attr = $attr, name = $pkg->{name}\n";
+    $pkgsByName{$pkg->{name}} //= [];
+    push @{$pkgsByName{$pkg->{name}}}, $pkg;
+}
+
 my $nrCollisions = 0;
 foreach my $name (sort keys %pkgsByName) {
     my @pkgs = @{$pkgsByName{$name}};