#!/usr/bin/perl use strict; use warnings; use RPM2; use Data::Dumper; sub compare($$); my $releases = 2; my $rpm_flags = RPM2->vsf_nodsa; my $repodir = '/releases/7'; my $stagedir = '/builds'; my @repos = qw( /releases/7/smeos/i386/CentOS/RPMS /releases/7/smeupdates/i386/RPMS /releases/7/smeupdates-testing/i386/RPMS /releases/7/smeextras/i386/RPMS /releases/7/smeaddons/i386/RPMS /releases/7/smetest/i386/RPMS /releases/7/smedev/i386/RPMS /builds/rpms/RPMS/i386 /builds/rpms/RPMS/i586 /builds/rpms/RPMS/i686 /builds/rpms/RPMS/noarch /builds/RPMS ); my $devrepo = (grep { m{/sme} } reverse @repos)[0]; my @srcrepos = qw( /mirrors/centos/4/fasttrack/SRPMS /mirrors/centos/4/updates/SRPMS /mirrors/centos/4/os/SRPMS /mirrors/centos/4/extras/SRPMS /mirrors/rpmforge/dag/source /mirrors/atrpms/src/el4-i386/atrpms/stable /builds/rpms/SRPMS ); my %repohash; my %srcrepohash; my %changed; my %copy; my @remove; %{$srcrepohash{$stagedir}} = map { $_ => 0 } grep { /\.rpm$/ } readdir SRPMS if ( opendir SRPMS, "$stagedir/SRPMS" ); closedir SRPMS; print "\n"; foreach my $repo ( @repos ) { if ( $repo =~ m{^(.*/[0-9]+/sme[^/]*)/} ) { my $srcrepo = $1; %{$srcrepohash{$srcrepo}} = map { $_ => 0 } grep { /\.rpm$/ } readdir SRPMS if ( opendir SRPMS, "$srcrepo/SRPMS" ); closedir SRPMS; } opendir RPMS, $repo; foreach my $rpm ( grep { m{\.rpm} } readdir RPMS ) { my $header = RPM2->open_package("$repo/$rpm", $rpm_flags); my $pkg = $header->tag("NAME").".".$header->tag("ARCH"); if ( $repo =~ m{/builds/RPMS} ) { push @{$repohash{$pkg}{$stagedir}}, $header; } elsif ( $repo =~ m{/builds/} ) { push @{$repohash{$pkg}{builds}}, $header; } elsif ( $repo =~ m{^(.*/[0-9]+/sme[^/]*)/} ) { my $pos = $1; push @{$repohash{$pkg}{$pos}}, $header; } } closedir RPMS; } my %sources; foreach my $repo ( reverse @srcrepos ) { my %temp_repo = map { $_ => $repo } grep { /\.rpm$/ } readdir SRPMS if ( opendir SRPMS, $repo ); closedir SRPMS; %sources = (%sources, %temp_repo); } foreach my $pkg ( keys %repohash ) { foreach my $repo ( @repos ) { if ( $repo =~ m{/builds/RPMS} ) { next unless $repohash{$pkg}{latest} || $repohash{$pkg}{$stagedir}; my ($latest, @rest) = sort { $b cmp $a } @{$repohash{$pkg}{$stagedir}}; delete $repohash{$pkg}{$stagedir}; push @remove, map { $_->filename } @rest if @rest; if ( $repohash{$pkg}{latest} ) { if ($repohash{$pkg}{latest} ne $latest ) { push @remove, $latest->filename; push @{$copy{"$stagedir/RPMS"}}, $repohash{$pkg}{latest}->filename; $repohash{$pkg}{$stagedir} = $repohash{$pkg}{latest}; } else { $repohash{$pkg}{$stagedir} = $latest; } } else { push @remove, $latest->filename; } } elsif ( $repo =~ m{^(.*/[0-9]+/sme[^/]*)/} ) { my $pos = $1; next unless $repohash{$pkg}{$pos}; if ( $pos =~ m{/smedev$} ) { next unless $repohash{$pkg}{latest}; my @rest = grep { $_ le $repohash{$pkg}{latest} } @{$repohash{$pkg}{$pos}}; if ( @rest ) { push @remove, map { $_->filename } @rest; $changed{$pos}++; @{$repohash{$pkg}{$pos}} = grep { $_ gt $repohash{$pkg}{latest} } @{$repohash{$pkg}{$pos}}; delete $repohash{$pkg}{$pos}; } } else { my ($latest, @rest) = sort { $b cmp $a } @{$repohash{$pkg}{$pos}}; delete $repohash{$pkg}{$pos}; if ( $repohash{$pkg}{latest} && $repohash{$pkg}{latest} ge $latest ) { push @rest, $latest; } else { $repohash{$pkg}{latest} = $latest; $repohash{$pkg}{$pos} = $latest; } if ( @rest ) { push @remove, map { $_->filename } @rest; $changed{$pos}++; } } } } } foreach my $pkg ( sort grep { $repohash{$_}{builds} } keys %repohash ) { my %versions = (); foreach my $ver ( sort { $b cmp $a } @{$repohash{$pkg}{builds}} ) { next if $repohash{$pkg}{latest} && $repohash{$pkg}{latest} ge $ver; $versions{$ver->tag("VERSION")}++; if ( $versions{$ver->tag("VERSION")} > $releases || (scalar keys %versions) > $releases ) { foreach my $rpm ( grep { $ver eq $_ } @{$repohash{$pkg}{"$repodir/smedev"}} ) { push @remove, $rpm->filename; @{$repohash{$pkg}{"$repodir/smedev"}} = grep { $rpm ne $_ } @{$repohash{$pkg}{"$repodir/smedev"}}; $changed{"$repodir/smedev"}++; } } else { print "Possible update " . $ver->filename . "\n" if $repohash{$pkg}{latest}; if ( ! grep { $ver eq $_ } @{$repohash{$pkg}{"$repodir/smedev"}} ) { push @{$copy{$devrepo}}, $ver->filename; push @{$repohash{$pkg}{"$repodir/smedev"}}, $ver; $changed{"$repodir/smedev"}++; } } } } foreach my $pkg ( grep { $repohash{$_}{"$repodir/smedev"} } keys %repohash ) { foreach my $rpm ( @{$repohash{$pkg}{"$repodir/smedev"}} ) { unless ( grep { $rpm eq $_ } @{$repohash{$pkg}{builds}} ) { push @remove, $rpm->filename; @{$repohash{$pkg}{"$repodir/smedev"}} = grep { $rpm ne $_ } @{$repohash{$pkg}{"$repodir/smedev"}}; $changed{"$repodir/smedev"}++; } } } print "\n"; foreach my $repo ( sort keys %srcrepohash ) { foreach my $pkg ( sort grep { $repohash{$_}{$repo} } keys %repohash ) { my @rpms = ref($repohash{$pkg}{$repo}) eq "ARRAY" ? @{$repohash{$pkg}{$repo}} : ($repohash{$pkg}{$repo}); foreach my $rpm ( sort @rpms ) { my $src = $rpm->tag("SOURCERPM"); my @sources = (); push @sources, $src; push @sources, $src if ($src =~ s/\.2\.el4\.rf\./\.rf\./); push @sources, $src if ($src =~ s/\.el4\.rf\./\.rf\./); push @sources, $src if ($src =~ s/\.el4\.at\./\.at\./); push @sources, $src if ($src =~ s/\.rf\./\.dag\./); my $found = 0; foreach my $source ( @sources ) { if ( $sources{$source} ) { unless ( -f "$repo/SRPMS/$source" ) { push @{$copy{"$repo/SRPMS"}}, "$sources{$source}/$source"; $changed{$repo}++; } $srcrepohash{$repo}{$source}++; $found++; last; } elsif ( -f "$repo/SRPMS/$source" ) { print "Found missing source $repo/SRPMS/$source for ".$rpm->as_nvre()."\n"; $srcrepohash{$repo}{$source}++; $found++; } } print "Can't find source for ".$rpm->as_nvre()."\n" unless $found; } } foreach my $rpm ( keys %{$srcrepohash{$repo}} ) { unless ( $srcrepohash{$repo}{$rpm} ) { push @remove, "$repo/SRPMS/$rpm"; $changed{$repo}++; } } } print "\n"; foreach my $repo ( sort keys %copy ) { foreach my $rpm ( sort keys %{{ map { $_ => 1 } @{$copy{$repo}} }} ) { print "copying $rpm to $repo/\n"; system(qw(cp --preserve=timestamps), $rpm, "$repo/"); } } print "\n"; foreach my $rpm ( sort keys %{{ map { $_ => 1 } @remove }} ) { print "removing $rpm\n"; unlink $rpm; } print "\n"; foreach my $repo ( sort keys %changed ) { next if $repo =~ m{^/builds}; print "rebuilding $repo/i386...\n"; system(qw(createrepo), "$repo/i386"); system(qw(repoview), "$repo/i386"); }