openSUSE-release-tools/repo_checker.pl

165 lines
3.6 KiB
Perl
Raw Normal View History

2013-03-21 20:48:17 +01:00
#! /usr/bin/perl -w
2013-03-21 11:34:18 +01:00
use File::Basename;
use File::Temp qw/ tempdir /;
use XML::Simple;
use Data::Dumper;
use Cwd;
2013-03-21 20:48:17 +01:00
use strict;
2014-04-10 09:01:57 +02:00
BEGIN {
my ($wd) = $0 =~ m-(.*)/- ;
$wd ||= '.';
unshift @INC, $wd;
}
require CreatePackageDescr;
2013-03-26 16:57:16 +01:00
my $ret = 0;
my $arch = shift @ARGV;
my @directories = split(/\,/, shift @ARGV);
2013-03-21 20:37:23 +01:00
my %toignore;
my %whitelist;
my $filter = 1;
while (@ARGV) {
my $switch = shift @ARGV;
if ( $switch eq "-f" ) {
my $toignore = shift @ARGV;
open( TOIGNORE, $toignore ) || die "can't open $toignore";
while (<TOIGNORE>) {
chomp;
$toignore{$_} = 1;
}
close(TOIGNORE);
}
elsif ( $switch eq "-w" ) {
%whitelist = map { $_ => 1 } split(/\,/, shift @ARGV);
}
elsif ( $switch eq "--no-filter" ) {
$filter = 0;
}
else {
print "read the source luke: $switch ? \n";
exit(1);
}
2013-03-21 20:37:23 +01:00
}
2013-03-21 11:34:18 +01:00
2013-03-24 07:48:00 +01:00
my %targets;
sub write_package {
my ($package, $packages_fd, $written_names) = @_;
2013-03-24 07:48:00 +01:00
my $name = basename($package);
if ($name =~ m/^[a-z0-9]{32}-/) { # repo cache
$name =~ s,^[^-]+-(.*)\.rpm,$1,;
} else {
$name =~ s,^(.*)-[^-]+-[^-]+.rpm,$1,;
}
2013-03-21 11:34:18 +01:00
if ( defined $written_names->{$name} ) {
return;
2013-03-21 20:37:23 +01:00
}
$written_names->{$name} = $package;
2013-06-27 19:31:13 +02:00
my $out = CreatePackageDescr::package_snippet($package);
if ($out eq "" || $out =~ m/=Pkg: /) {
print STDERR "ERROR: empty package snippet for: $name\n";
exit(126);
}
print $packages_fd $out;
return $name;
2013-03-21 20:37:23 +01:00
}
2013-03-21 20:48:17 +01:00
my @rpms;
2017-03-16 17:04:20 +01:00
my $tmpdir = tempdir( "repochecker-XXXXXXX", TMPDIR => 1, CLEANUP => 1 );
my $pfile = $tmpdir . "/packages";
open( my $packages_fd, ">", $pfile ) || die 'can not open';
print $packages_fd "=Ver: 2.0\n";
2013-03-21 21:07:15 +01:00
my $written_names = {};
my $first_layer = 1;
2013-03-21 20:48:17 +01:00
foreach my $directory (@directories) {
@rpms = glob("$directory/*.rpm");
foreach my $package (@rpms) {
my $name = write_package( $package, $packages_fd, $written_names );
if ($first_layer && $name && !exists($whitelist{$name})) {
$targets{$name} = 1;
}
}
if ($first_layer) {
foreach my $key (keys %toignore) {
if (!defined($written_names->{$key})) {
$written_names->{$key} = "simulate overridden";
}
}
$first_layer = 0;
}
2013-03-21 20:48:17 +01:00
}
close($packages_fd);
2013-03-21 20:37:23 +01:00
my $error_file = $tmpdir . "/error_file";
open(INSTALL, "/usr/bin/installcheck $arch $pfile 2> $error_file |")
|| die 'exec installcheck';
my $inc = 0;
while (<INSTALL>) {
2013-03-21 21:07:15 +01:00
chomp;
next if (/^unknown line:.*Flx/);
if ($_ =~ /^[^ ]/) {
$inc = 0;
}
if ( $_ =~ /^can't install (.*)-[^-]+-[^-]+:$/ ) {
if ( !$filter || defined $targets{$1} ) {
$inc = 1;
$ret = 1;
2013-03-24 07:48:00 +01:00
}
}
if ($inc) {
print "$_\n";
}
2013-03-24 07:48:00 +01:00
}
close(INSTALL);
open(ERROR, '<', $error_file);
while (<ERROR>) {
chomp;
print STDERR "$_\n";
$ret = 1;
}
close(ERROR);
my $cmd = sprintf( "perl %s/findfileconflicts $pfile", dirname($0) );
open(CONFLICTS, "$cmd 2> $error_file |") || die 'exec fileconflicts';
$inc = 0;
while (<CONFLICTS>) {
2013-03-24 07:48:00 +01:00
chomp;
if ($_ =~ /^[^ ]/) {
2013-04-02 15:15:42 +02:00
$inc = 0;
}
if ( $_ =~ /^found conflict of (.*)-[^-]+-[^-]+ with (.*)-[^-]+-[^-]+:$/ ) {
if ( !$filter || defined $targets{$1} || defined $targets{$2} ) {
$inc = 1;
$ret = 1;
2013-03-24 07:48:00 +01:00
}
}
2013-04-02 15:15:42 +02:00
if ($inc) {
print "$_\n";
2013-04-02 15:15:42 +02:00
}
2013-03-21 21:07:15 +01:00
}
close(CONFLICTS);
2013-03-21 21:07:15 +01:00
open(ERROR, '<', $error_file);
while (<ERROR>) {
chomp;
print STDERR "$_\n";
$ret = 1;
}
close(ERROR);
2013-03-26 16:57:16 +01:00
exit($ret);