[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