This may be redundant, or it may be useful.  All I know is that it
works for me:  The following script will verify the contents of your
cooker/misc/rpmslist against the actual contents of your RPMS
and report on

    - packages missing in the RPMS
    - multiple versions of the same package
    - packages in RPMS but missing in your rpmslist
    - total count and size of all rpms for each CD

This is based on the mkcd.pl so as to be as compatible with it as
possible (same regexs &c).  You can also take the output list of
extra packages and simply cut and paste into your rpmslist.

#!/usr/bin/perl
########################################################################
# Perl Program: chklist.pl
#
# Mandrake Cooker utility program to check your rpmslist file against
# the actual files in your Mandrake/RPMS directory.  Given the same
# repository directory as the mkcd.pl script, this script will check
# for duplicate packages (same package different versions), packages
# listed in the rpmslist but missing from the RPMS and packages found
# in the RPMS but missing from the rpmslist.
# 
# The output report will also list the total size can count of all RPMS
# for each CD (but remember to leave some room on CD1!)
# 
# This program is licensed under the GNU General Public License
#
# Created: Sat Jul 14 14:28:31 EDT 2001
# $Log: chklist.pl,v $
# Revision 1.2  2001/07/14 18:39:54  garym
# added documentation
#
# Revision 1.1  2001/07/14 18:32:43  garym
# Initial release to the cooker mailing list
#
#
# Author:  Gary Lawrence Murphy <[EMAIL PROTECTED]>
# Copyright:  2001 TeleDynamics Communications Inc (www.teledyn.com)
# Version: $Id: chklist.pl,v 1.2 2001/07/14 18:39:54 garym Exp $
########################################################################
my $version = '$Id: chklist.pl,v 1.2 2001/07/14 18:39:54 garym Exp $';
my ($rep,$verbose) = @ARGV;
$rep or usage();

open A, "$rep/Mandrake/base/rpmslist";
my ($count,$size,$num,@a);
my @cd;
my %list;
my %count;
my %size;

while(<A>){
        /<\/CD>/ and $num = 0;
        /<CD num=(\d+)>/ and do { $num = $1; push @cd, $num};
        /(?:<.*>)*([^<]*)\n/; 
        $1 and do {
                push @{$list{$num}}, $1;
        }
}
close A;
print "\nPACKAGE DUPLICATES " . ("=" x 50) . "\n";
my $dir = "$rep/Mandrake/RPMS";
my %rpms;
opendir DIR, $dir or die "unable to opendir $dir: !$\n";
foreach (readdir DIR) {
        my ($file, $pkg) 
          = /(([^\/]*)-[^-]*-[^-]*\.[^\/\.]*\.rpm)$/ or next;
        $rpms{$pkg} and do {
          print "\n$pkg\t $file / " . $rpms{$pkg};
          next;
          };
        $file and do {
          $rpms{$pkg} = $file;
        };
}
print "\n";

foreach my $disk (@cd){
  print "\nCD $disk " . "=" x 64;
  foreach my $pkg (@{$list{$disk}}) {
    if ( $rpms{$pkg} && !($rpms{$pkg} eq "") ) {
      $count{$disk}++;
      $size{$disk} += -s "$dir/" . $rpms{$pkg};
      if ($verbose) {
        print "\n";
        print -s "$dir/" . $rpms{$pkg};
        print "\t$pkg";
      }
      undef $rpms{$pkg};
    } else {
      print "\nmissing $pkg";
    }
  }
  print "\n\tDISK $disk TOTALS:\n\t\tfile count: " . $count{$disk};
  print "\n\t\ttotal size: " . $size{$disk};
  print " (" . int($size{$disk} / 1024 / 1024) . "M)";
}

print "\nUNREFERENCED PACKAGES " . ("=" x 47) . "\n";
foreach my $pkg (sort keys %rpms) {
  $rpms{$pkg} and do {
    print "\n$pkg";
    print "\t" . $rpms{$pkg} if $verbose;
    };
}
print "\n";


########################################################################
sub usage {
  print "
Cooker chklist version $version
Copyright 2001 by Teledynamics (www.teledyn.com)

  Verify cooker/Mandrake/RPMS against cooker/misc/rpmslist and
  report missing or extra files and disk sizes.

  usage:

  $0 <cooker dir>
\n";
  exit;
}

# 2001 by TeleDynamics Communications Inc - [EMAIL PROTECTED]


Reply via email to