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

[SCM] Debian package checker branch, master, updated. 2.2.18-76-g497084a



The following commit has been merged in the master branch:
commit ebdac3152275cc56dcbe0504530a724809b921bf
Author: Russ Allbery <rra@debian.org>
Date:   Fri Dec 25 16:08:59 2009 -0800

    Support multiple versions of a package in the archive
    
    * unpack/list-{bin,src,udeb}pkg:
      + [RA] Support multiple versions of a package in the archive and
        include only the latest version in the Lintian package list.

diff --git a/debian/changelog b/debian/changelog
index 6562997..3ac82f9 100755
--- a/debian/changelog
+++ b/debian/changelog
@@ -201,6 +201,9 @@ lintian (2.3.0) UNRELEASED; urgency=low
     + [RA] Suppress checking the syntax of the lintian output if neither
       Test-For nor Test-Against are set and Sort: no is set.
 
+  * unpack/list-{bin,src,udeb}pkg:
+    + [RA] Support multiple versions of a package in the archive and
+      include only the latest version in the Lintian package list.
   * unpack/unpack-binpkg-l2:
     + [RA] Report errors from dpkg-deb or tar on stderr if either exit
       with non-zero status.
diff --git a/unpack/list-binpkg b/unpack/list-binpkg
index 81d5501..0ccd7f2 100755
--- a/unpack/list-binpkg
+++ b/unpack/list-binpkg
@@ -2,17 +2,17 @@
 # list-binpkg -- lintian helper script
 
 # Copyright (C) 1998 Christian Schwarz
-# 
+#
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
 # the Free Software Foundation; either version 2 of the License, or
 # (at your option) any later version.
-# 
+#
 # This program is distributed in the hope that it will be useful,
 # but WITHOUT ANY WARRANTY; without even the implied warranty of
 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 # GNU General Public License for more details.
-# 
+#
 # You should have received a copy of the GNU General Public License
 # along with this program.  If not, you can find it on the World Wide
 # Web at http://www.gnu.org/copyleft/gpl.html, or write to the Free
@@ -21,6 +21,9 @@
 
 use strict;
 
+use lib "$ENV{'LINTIAN_ROOT'}/lib";
+use Lintian::Relation::Version qw(versions_lte);
+
 # turn file buffering off:
 $| = 1;
 
@@ -102,24 +105,29 @@ my $total = 0;
 foreach my $packages_file (@packages_files) {
     my $pkgs_file = $packages_file->{'file'};
     if (-e $pkgs_file) {
-	    print "N: Parsing $pkgs_file ...\n" if $verbose;
-	    open(IN, '<', $pkgs_file) or fail("cannot open Packages file $pkgs_file: $!");
+	print "N: Parsing $pkgs_file ...\n" if $verbose;
+	open(IN, '<', $pkgs_file)
+	    or fail("cannot open Packages file $pkgs_file: $!");
     } elsif (-e "$pkgs_file.gz") {
-	    print "N: Parsing $pkgs_file.gz ...\n" if $verbose;
-	    open (IN, '-|', 'gzip', '-dc', "$pkgs_file.gz")
-		or fail("cannot open Packages file $pkgs_file.gz: $!");
+	print "N: Parsing $pkgs_file.gz ...\n" if $verbose;
+	open (IN, '-|', 'gzip', '-dc', "$pkgs_file.gz")
+	    or fail("cannot open Packages file $pkgs_file.gz: $!");
     } else {
-	    fail("No packages file $pkgs_file");
+	fail("No packages file $pkgs_file");
     }
 
     my $line;
 
     while (!eof(IN)) {
-	do { $line = <IN> } until ($line =~ m/^Architecture: (.*)$/m);
-	my $arch = $1;
-	do { $line = <IN> } until ($line =~ m/^Filename: (.*)$/m);
-	my $deb_file = $1;
-	do { $line = <IN> } until ($line =~ m/^\s*$/m);
+	my ($arch, $deb_file);
+	do {
+	    $line = <IN>;
+	    if ($line =~ /^Architecture: (.*)$/m) {
+		$arch = $1;
+	    } elsif ($line =~ /^Filename: (.*)$/m) {
+		$deb_file = $1;
+	    }
+	} until (not defined($line) or $line =~ /^\s*$/m);
 
 	my @stat;
 	# get timestamp...
@@ -155,10 +163,12 @@ foreach my $packages_file (@packages_files) {
 	    $pkg = $data->{'package'};
 	}
 
-	# check for duplicates
+	# Check for duplicates.	 In the case of a duplicate, we take the one
+	# with the latest version.
 	if (exists $packages{$pkg}) {
-	    print "E: general: duplicate-binary-package $pkg\n";
-	    next;
+	    if (versions_lte($data->{version}, $packages{$pkg}{version})) {
+		next;
+	    }
 	}
 
 	unless (exists $data->{'source-version'}) {
@@ -170,30 +180,37 @@ foreach my $packages_file (@packages_files) {
 	    }
 	}
 
-	# write entry to output file
-	print OUT join(';',
-		       $pkg,
-		       $data->{'version'},
-		       $data->{'source'},
-		       $data->{'source-version'},
-		       $deb_file,
-		       $timestamp,
-		       $packages_file->{'area'}
-		       ),"\n";
-	printf "N: Listed %s binary package %s %s\n",$status,$pkg,$data->{'version'} if $verbose;
+	# Save entry for writing to output file.
+	$data->{file} = $deb_file;
+	$data->{timestamp} = $timestamp;
+	$data->{area} = $packages_file->{area};
+	$data->{status} = $status;
+	$packages{$pkg} = $data;
 
 	# remove record from hash
 	delete $binary_info{$pkg} if $status eq 'unchanged';
-	$packages{$pkg} = 1;
 	$total++;
     }
     close(IN) or fail("cannot close input pipe: $!");
 }
-
+for my $pkg (sort keys %packages) {
+    print OUT join(';',
+		   $pkg,
+		   $packages{$pkg}{version},
+		   $packages{$pkg}{source},
+		   $packages{$pkg}{'source-version'},
+		   $packages{$pkg}{file},
+		   $packages{$pkg}{timestamp},
+		   $packages{$pkg}{area}
+		  ),"\n";
+    printf "N: Listed %s binary package %s %s\n", $packages{$pkg}{status},
+	$pkg, $packages{$pkg}{version} if $verbose;
+}
 close(OUT) or fail("cannot close output pipe: $!");
 
 if ($verbose) {
-    # all packages that are still included in %binary_info have disappeared from the archive...
+    # All packages that are still included in %binary_info have disappeared
+    # from the archive.
     for my $pkg (sort keys %binary_info) {
 	print "N: Removed binary package $pkg from list\n";
     }
@@ -216,3 +233,9 @@ sub safe_get_deb_info {
     $data->{'source'} or ($data->{'source'} = $data->{'package'});
     return $data;
 }
+
+# Local Variables:
+# indent-tabs-mode: t
+# cperl-indent-level: 4
+# End:
+# vim: syntax=perl sw=4 ts=4 noet shiftround
diff --git a/unpack/list-srcpkg b/unpack/list-srcpkg
index c926aa0..cfe2ce1 100755
--- a/unpack/list-srcpkg
+++ b/unpack/list-srcpkg
@@ -2,17 +2,17 @@
 # list-srcpkg -- lintian helper script
 
 # Copyright (C) 1998 Christian Schwarz
-# 
+#
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
 # the Free Software Foundation; either version 2 of the License, or
 # (at your option) any later version.
-# 
+#
 # This program is distributed in the hope that it will be useful,
 # but WITHOUT ANY WARRANTY; without even the implied warranty of
 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 # GNU General Public License for more details.
-# 
+#
 # You should have received a copy of the GNU General Public License
 # along with this program.  If not, you can find it on the World Wide
 # Web at http://www.gnu.org/copyleft/gpl.html, or write to the Free
@@ -21,6 +21,9 @@
 
 use strict;
 
+use lib "$ENV{'LINTIAN_ROOT'}/lib";
+use Lintian::Relation::Version qw(versions_lte);
+
 # turn file buffering off:
 $| = 1;
 
@@ -159,42 +162,53 @@ foreach my $sources (@sources) {
       $pkg = $data->{'source'};
     }
 
-    # check for duplicates
+    # Check for duplicates.  In the case of a duplicate, we take the one with
+    # the latest version.
     if (exists $packages{$pkg}) {
-      print "E: general: duplicate-source-package $pkg\n";
-      next;
+      if (versions_lte($data->{version}, $packages{$pkg}{version})) {
+        next;
+      }
     }
 
-    # write entry to output file
-    for (qw/version maintainer uploaders architecture standards-version binary files/) {
+    # Save entry for writing to output file.
+    $data->{file} = $dsc_file;
+    $data->{area} = $sources->{area};
+    $data->{timestamp} = $timestamp;
+    $data->{status} = $status;
+    for (qw(version maintainer uploaders architecture standards-version
+            binary files)) {
       $data->{$_} =~ tr/;\n/_ / if $data->{$_};
     }
-    print OUT join(';',
-                  $pkg,
-                  $data->{'version'},
-                  $data->{'maintainer'},
-                  $data->{'uploaders'} || '',
-                  $data->{'architecture'},
-                  $sources->{'area'},
-                  $data->{'standards-version'},
-                  $data->{'binary'},
-                  $data->{'files'},
-                  $dsc_file,
-                  $timestamp,
-                  ),"\n";
-    printf "N: Listed %s source package %s %s\n",$status,$pkg,$data->{'version'} if $verbose;
+    $packages{$pkg} = $data;
 
     # remove record from hash
     delete $source_info{$pkg} if $status eq 'unchanged';
-    $packages{$pkg} = 1;
     $total++;
   }
   close(IN) or fail("cannot close input pipe: $!");
 }
+for my $pkg (sort keys %packages) {
+  print OUT join(';',
+                 $pkg,
+                 $packages{$pkg}{version},
+                 $packages{$pkg}{maintainer},
+                 $packages{$pkg}{uploaders} || '',
+                 $packages{$pkg}{architecture},
+                 $packages{$pkg}{area},
+                 $packages{$pkg}{'standards-version'},
+                 $packages{$pkg}{binary},
+                 $packages{$pkg}{files},
+                 $packages{$pkg}{file},
+                 $packages{$pkg}{timestamp},
+                ),"\n";
+  printf "N: Listed %s source package %s %s\n", $packages{$pkg}{status},
+      $pkg, $packages{$pkg}{version} if $verbose;
+}
 close(OUT) or fail("cannot close output pipe: $!");
 
 if ($verbose) {
-  # all packages that are still included in %source_info have disappeared from the archive...
+  # All packages that are still included in %source_info have disappeared from
+  # the archive.
   for my $pkg (sort keys %source_info) {
     print "N: Removed source package $pkg from list\n";
   }
diff --git a/unpack/list-udebpkg b/unpack/list-udebpkg
index c8597eb..3de3f00 100755
--- a/unpack/list-udebpkg
+++ b/unpack/list-udebpkg
@@ -3,17 +3,17 @@
 
 # Copyright (C) 1998 Christian Schwarz
 # Copyright (C) 2004 Frank Lichtenheld
-# 
+#
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
 # the Free Software Foundation; either version 2 of the License, or
 # (at your option) any later version.
-# 
+#
 # This program is distributed in the hope that it will be useful,
 # but WITHOUT ANY WARRANTY; without even the implied warranty of
 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 # GNU General Public License for more details.
-# 
+#
 # You should have received a copy of the GNU General Public License
 # along with this program.  If not, you can find it on the World Wide
 # Web at http://www.gnu.org/copyleft/gpl.html, or write to the Free
@@ -22,6 +22,9 @@
 
 use strict;
 
+use lib "$ENV{'LINTIAN_ROOT'}/lib";
+use Lintian::Relation::Version qw(versions_lte);
+
 # turn file buffering off:
 $| = 1;
 
@@ -104,10 +107,11 @@ foreach my $packages_file (@packages_files) {
     my $pkgs_file = $packages_file->{'file'};
     if (-e $pkgs_file) {
         print "N: Parsing $pkgs_file ...\n" if $verbose;
-        open(IN, '<', $pkgs_file) or fail("cannot open Packages file $pkgs_file: $!");
+        open(IN, '<', $pkgs_file)
+            or fail("cannot open Packages file $pkgs_file: $!");
     } elsif (-e "$pkgs_file.gz") {
         print "N: Parsing $pkgs_file.gz ...\n" if $verbose;
-         open(IN, '-|', 'gzip', '-dc', "$pkgs_file.gz")
+        open(IN, '-|', 'gzip', '-dc', "$pkgs_file.gz")
             or fail("cannot open Packages file $pkgs_file.gz: $!");
     } else {
         warn("No packages file $pkgs_file, skipping");
@@ -157,13 +161,15 @@ foreach my $packages_file (@packages_files) {
 	    $pkg = $data->{'package'};
         }
 
-        # check for duplicates
+        # Check for duplicates.  In the case of a duplicate, we take the one
+        # with the latest version.
         if (exists $packages{$pkg}) {
-	    print "E: general: duplicate-udeb-package $pkg\n";
-	    next;
+            if (versions_lte($data->{version}, $packages{$pkg}{version})) {
+                next;
+            }
         }
 
-         unless (exists $data->{'source-version'}) {
+        unless (exists $data->{'source-version'}) {
 	    if ($data->{'source'} =~ /^([-+\.\w]+)\s+\((.+)\)$/) {
 	        $data->{'source'} = $1;
 	        $data->{'source-version'} = $2;
@@ -172,29 +178,36 @@ foreach my $packages_file (@packages_files) {
 	    }
         }
 
-        # write entry to output file
-        print OUT join(';',
-		       $pkg,
-		       $data->{'version'},
-		       $data->{'source'},
-		       $data->{'source-version'},
-		       $deb_file,
-		       $timestamp,
-		       $packages_file->{'area'},
-		       ),"\n";
-        printf "N: Listed %s udeb package %s %s\n",$status,$pkg,$data->{'version'} if $verbose;
+        # Save entry for writing to output file.
+        $data->{file} = $deb_file;
+        $data->{timestamp} = $timestamp;
+        $data->{area} = $packages_file->{area};
+        $data->{status} = $status;
+        $packages{$pkg} = $data;
 
         # remove record from hash
         delete $udeb_info{$pkg} if $status eq 'unchanged';
-        $packages{$pkg} = 1;
         $total++;
     }
     close(IN) or fail("cannot close input pipe: $!");
 }
+for my $pkg (sort keys %packages) {
+    print OUT join(';',
+                   $pkg,
+                   $packages{$pkg}{version},
+                   $packages{$pkg}{source},
+                   $packages{$pkg}{'source-version'},
+                   $packages{$pkg}{file},
+                   $packages{$pkg}{timestamp},
+                   $packages{$pkg}{area}
+                  ),"\n";
+    printf "N: Listed %s udeb package %s %s\n", $packages{$pkg}{status},
+        $pkg, $packages{$pkg}{version} if $verbose;
+}
 close(OUT) or fail("cannot close output pipe: $!");
-
 if ($verbose) {
-    # all packages that are still included in %udeb_info have disappeared from the archive...
+    # All packages that are still included in %udeb_info have disappeared from
+    # the archive.
     for my $pkg (sort keys %udeb_info) {
 	print "N: Removed udeb package $pkg from list\n";
     }
@@ -217,3 +230,9 @@ sub safe_get_deb_info {
     $data->{'source'} or ($data->{'source'} = $data->{'package'});
     return $data;
 }
+
+# Local Variables:
+# indent-tabs-mode: nil
+# cperl-indent-level: 4
+# End:
+# vim: syntax=perl sw=4 ts=4 et shiftround

-- 
Debian package checker


Reply to: