[Pkg-multidistrotools-commits] r11 - multidistrotools/trunk/scripts

raphink-guest at alioth.debian.org raphink-guest at alioth.debian.org
Tue Dec 18 12:34:37 UTC 2007


Author: raphink-guest
Date: 2007-12-18 12:34:36 +0000 (Tue, 18 Dec 2007)
New Revision: 11

Added:
   multidistrotools/trunk/scripts/compare-src-bin.pl
Log:

Add compare-src-bin.pl as a replacement to compare-src-bin.bash
This new script is slower but fixes the bug related to the order of fields in Sources and Packages files.



Added: multidistrotools/trunk/scripts/compare-src-bin.pl
===================================================================
--- multidistrotools/trunk/scripts/compare-src-bin.pl	                        (rev 0)
+++ multidistrotools/trunk/scripts/compare-src-bin.pl	2007-12-18 12:34:36 UTC (rev 11)
@@ -0,0 +1,164 @@
+#!/usr/bin/perl
+#
+# compare-src-bin.bash - Raphael Pinson <raphink at gmail.com>
+# 
+# Given a distribution in mdt, this script compares the binaries that should be
+# produced by the sources with the ones really present in the repository
+# 
+# The result can be useful to detect binary only uploads or FTBFS packages
+#
+
+use strict;
+use warnings;
+use File::HomeDir;
+use List::MoreUtils qw(uniq);
+use YAML;
+
+my $home   = File::HomeDir->my_home;
+my $mdtdir = "$home/.multidistrotools";
+
+my ($dist) = @ARGV;
+
+my $listdir = "$mdtdir/$dist/var/lib/apt/lists";
+
+
+if (! $dist) {
+   die "Usage: mdt compare-src-bin etch";
+}
+
+
+# Sources
+my %src;
+
+# Binaries generated by Sources
+my %src_bin;
+
+# Binaries
+my %bin;
+
+opendir(LISTDIR, $listdir) || die "Could not open dir $listdir : $!\n"; 
+my @all_files = readdir(LISTDIR);
+closedir(LISTDIR);
+
+my @src_files = grep { /.*_Sources$/ } @all_files;
+my @bin_files = grep { /.*_Packages$/ } @all_files;
+
+
+######################################
+### Functions 
+######################################
+
+
+sub parseFile {
+   my ($file) = @_;
+
+   # Parse a source file and returns results as a hash
+
+   open(FILE, "$file") || die("Could not open $file : $!\n");
+
+   # Use %tmp hash to store tmp data
+   my %tmp;
+   my %result;
+
+   while (my $line = <FILE>) {
+      if ( $line =~ m|^$| ) {
+         # Commit data if empty line
+	 if ( $tmp{'Package'} ) {
+	    #print "Committing data for $tmp{'Package'}\n";
+	    while ( my ($field, $data) = each(%tmp) ) {
+	       if ( $field ne "Package" ) {
+                  $result{$tmp{'Package'}}{$field} = $data;
+	       }
+	    }
+	    # Reset %tmp
+	    %tmp = ();
+	 } else {
+            warn "No Package field found. Not committing data.\n";
+	 }
+      } elsif ( $line =~ m|^[a-zA-Z]| ) {
+         # Gather data
+         my ($field, $data) = $line =~ m|([a-zA-z-]+): (.*)$|;
+	 if ($data) {
+	    $tmp{$field} = $data;
+	 }
+      }
+   }
+   close(FILE);
+
+   return \%result;
+}
+
+
+
+
+
+# Read sources
+foreach my $src_file (@src_files) {
+   my $parsed_file = parseFile("$listdir/$src_file");
+   foreach my $package ( keys(%{$parsed_file} ) ) {
+      if ( $src{$package} ) {
+         warn "Source $package is already listed. Not overriding.\n";
+      } else {
+         $src{$package} = $parsed_file->{$package};
+      }
+   }
+}
+
+
+# Build %src_bin hash
+foreach my $package ( keys(%src) ) {
+   if ( $src{$package}{'Binary'} ) {
+      my @binries = split(", ", $src{$package}{'Binary'});
+      my $version  = $src{$package}{'Version'};
+      foreach my $binry (@binries) {
+	 if ( $src_bin{$binry} ) {
+	    # TODO: replace if new version is newer (use dpkg --compare-version?)
+            warn "There is already a version for binry $binry. Not replacing.\n";
+	 } else {
+	    $src_bin{$binry} = $version;
+	 }
+      }
+   } else {
+      warn "Source $package has no binries!\n";
+   }
+}
+
+
+
+# Read binries
+foreach my $bin_file (@bin_files) {
+   my $parsed_file = parseFile("$listdir/$bin_file");
+   foreach my $package ( keys(%{$parsed_file} ) ) {
+      if ( $bin{$package} ) {
+         warn "Binary $package is already listed. Not overriding.\n";
+      } else {
+         $bin{$package} = $parsed_file->{$package};
+      }
+   }
+}
+
+
+# Get entire list of packages
+my @all_packages = uniq sort ( keys(%src_bin), keys(%bin) );
+
+foreach my $package (@all_packages) {
+   my $line = "$package ";
+   if ( $src_bin{$package} ) {
+      $line .= "$src_bin{$package} ";
+   } else {
+      $line .= "NOTFOUND ";
+   }
+
+   if ( $bin{$package} ) {
+      $line .= "$bin{$package}{'Version'} ";
+   } else {
+      $line .= "NOTFOUND ";
+   }
+
+   print "$line\n";
+}
+
+
+
+# test
+#print YAML::Dump( { 'bin' => { %bin } } );


Property changes on: multidistrotools/trunk/scripts/compare-src-bin.pl
___________________________________________________________________
Name: svn:executable
   + *




More information about the Pkg-multidistrotools-commits mailing list