From 42f8ee313d2b18bd5cb8bfe2d594fadba3dd7a9f Mon Sep 17 00:00:00 2001 From: Anas Nashif Date: Thu, 26 Apr 2012 11:42:02 +0100 Subject: [PATCH] initialize --- depbuild.pl | 408 +++++++++++++++++++++++++++++++++++++++++++++++ deps.pl | 20 +++ penv.pl | 88 +++++++++++ smock_smock.pl | 418 +++++++++++++++++++++++++++++++++++++++++++++++++ solv.pl | 14 ++ 5 files changed, 948 insertions(+) create mode 100644 depbuild.pl create mode 100644 deps.pl create mode 100644 penv.pl create mode 100644 smock_smock.pl create mode 100755 solv.pl diff --git a/depbuild.pl b/depbuild.pl new file mode 100644 index 0000000..3fa5c05 --- /dev/null +++ b/depbuild.pl @@ -0,0 +1,408 @@ +#!/usr/bin/perl -w +# +# SMOCK - Simpler Mock +# by Dan Berrange and Richard W.M. Jones. +# Copyright (C) 2008 Red Hat Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +BEGIN { + my ($wd) = $0 =~ m-(.*)/- ; + $wd ||= '.'; + unshift @INC, "$wd/build"; + unshift @INC, "$wd"; + unshift @INC, "$ENV{'VIRTUAL_ENV'}/usr/lib/build" +} + +use strict; + +use Getopt::Long; +use Pod::Usage; +use File::Temp qw(tempfile); +use Build; +use Build::Rpm; +use Data::Dumper; + +my $arch = ""; +my $chain = 0; +my $dist = ""; +my $dryrun = 0; +my $help = 0; +my $keepgoing = 0; +my $localrepo = $ENV{TIZEN_BUILD_ROOT} . "/local/repos"; +my $man = 0; +my $overwrite = 0; +my $suffix = ""; + +GetOptions ( + "arch=s" => \$arch, + "chain" => \$chain, + "dist=s" => \$dist, + "dryrun" => \$dryrun, + "help|?" => \$help, + "keepgoing" => \$keepgoing, + "localrepo=s" => \$localrepo, + "man" => \$man, + "overwrite" => \$overwrite, + "suffix=s" => \$suffix, + ) or pod2usage (2); +pod2usage (1) if $help; +pod2usage (-exitstatus => 0, -verbose => 2) if $man; + +=pod + +=head1 NAME + + smock - Simpler mock + +=head1 SYNOPSIS + + smock.pl --arch=i386 --arch=x86_64 --distro=fedora-10 list of SRPMs ... + +=head1 DESCRIPTION + +This is a wrapper around I which lets you build a whole group of +mutually dependent SRPMs in one go. + +The smock command will work out the correct order in which to build +the SRPMs, and makes the result of previous RPM builds available as +dependencies for later builds. + +Smock also works incrementally. It won't rebuild RPMs which were +built already in a previous run, which means if a package fails to +build, you can just fix it and rerun the same smock command. (In the +unlikely case that you want to force smock to rebuild RPMs then you +must bump the release number or delete the binary RPM from the +localrepo directory). + +B Please read the README file first. You need to set up mock +and optionally a web server before you can use this command. + +=head1 OPTIONS + +=over 4 + +=item B<--arch> + +Specify the architecture(s) to build, eg. i386, x86_64. You can +list this option several times to build several architectures. + +=item B<--chain> + +Don't run any commands, just print the packages in the correct +format for chain building. See: +L + +=item B<--distro> + +Specify the distribution(s) to build, eg. fedora-9, fedora-10. +You can list this option several times to build several distributions. + +=item B<--dryrun> + +Don't run any commands, just print the packages in the order +in which they must be built. + +=item B<--help> + +Print this help. + +=item B<--keepgoing> + +Don't exit if a package fails, but keep building. + +Note that this isn't always safe because new packages may be built +against older packages, in the case where the older package couldn't +be rebuilt because of an error. + +However, it is very useful. + +=item B<--localrepo> + +Local repository. Defaults to C<$HOME/public_html/smock/yum> + +=item B<--man> + +Show this help using man. + +=item B<--overwrite> + +Overwrite existing files that are already in the repository. By default the +build of an SRPM is skipped if there is already a package with the same name, +version and release in the localrepo. With this option, the new build +overwrites the old one. This may lead to unexpected results, if the new build +does not create the same subpackages as the old one, because then the old +subpackages will still be accessible in the repository. + +=item B<--suffix> + +Append a suffix to the mock configuration file in order to use +a custom one. + +=back + +=cut + +my @packs = @ARGV; + +if (0 == @packs) { + die "specify one or more SRPMs to build on the command line\n" +} + +# Resolve the names, dependency list, etc. of the SRPMs that were +# specified. + + +sub get_lines +{ + local $_; + open PIPE, "$_[0] |" or die "$_[0]: $!"; + my @lines; + foreach () { + chomp; + push @lines, $_; + } + close PIPE; + return @lines; +} + +my %packs = (); +foreach my $spec (@packs) { + my $dist="tizen"; + my $archs="i586"; + my $configdir="$ENV{TIZEN_BUILD_ROOT}/obs-configs"; + my $config = Build::read_config_dist($dist, $archs, $configdir); + #print Dumper($config); + my $pack = Build::Rpm::parse($config, $spec); + my $name = $pack->{name}; + my $version = $pack->{version}; + my $release = $pack->{release}; + my @buildrequires = $pack->{deps}; + $packs{$name} = { + name => $name, + version => $version, + release => $release, + deps => @buildrequires, + filename => $spec + } +} + +#print Dumper(%packs); + +# We don't care about buildrequires unless they refer to other +# packages that we are building. So filter them on this condition. + +sub is_member_of +{ + my $item = shift; + + foreach (@_) { + return 1 if $item eq $_; + } + 0; +} + +sub dependency_in +{ + my $dep = shift; # eg. dbus-devel + + while ($dep) { + return $dep if is_member_of ($dep, @_); + my $newdep = $dep; + $newdep =~ s/-\w+$//; # eg. dbus-devel -> dbus + last if $newdep eq $dep; + $dep = $newdep; + } + 0; +} + +foreach my $name (keys %packs) { + my @buildrequires = @{$packs{$name}->{deps}}; + @buildrequires = + grep { $_ = dependency_in ($_, keys %packs) } @buildrequires; + $packs{$name}{deps} = \@buildrequires; +} + +# This function takes a list of package names and sorts them into the +# correct order for building, given the existing %packs hash +# containing buildrequires. We use the external 'tsort' program. + +sub tsort +{ + my @names = @_; + + my ($fh, $filename) = tempfile (); + + foreach my $name (@names) { + my @buildrequires = @{$packs{$name}->{deps}}; + foreach (@buildrequires) { + print $fh "$_ $name\n" + } + # Add a self->self dependency. This ensures that any + # packages which don't have or appear as a dependency of + # any other package still get built. + print $fh "$name $name\n" + } + close $fh; + + get_lines "tsort $filename"; +} + +# Sort the initial list of package names. + +my @names = sort keys %packs; +my @buildorder = tsort (@names); + +# With --chain flag we print the packages in groups for chain building. + +if ($chain) { + my %group = (); + my $name; + + print 'make chain-build CHAIN="'; + + foreach $name (@buildorder) { + my @br = @{$packs{$name}->{deps}}; + + # If a BR occurs within the current group, then start the next group. + my $occurs = 0; + foreach (@br) { + if (exists $group{$_}) { + $occurs = 1; + last; + } + } + + if ($occurs) { + %group = (); + print ": "; + } + + $group{$name} = 1; + print "$name "; + } + print "\"\n"; + + exit 0 +} + +# With --dryrun flag we just print the packages in build order then exit. + +if ($dryrun) { + foreach (@buildorder) { + print "$_\n"; + } + + exit 0 +} + +# Now we can build each SRPM. + +sub my_mkdir +{ + local $_ = $_[0]; + + if (! -d $_) { + mkdir ($_, 0755) or die "mkdir $_: $!" + } +} + +sub createrepo +{ + my $arch = shift; + my $dist = shift; + + my_mkdir "$localrepo"; + my_mkdir "$localrepo/$dist"; + my_mkdir "$localrepo/$dist/src"; + my_mkdir "$localrepo/$dist/src/SRPMS"; + system ("cd $localrepo/$dist/src && rm -rf repodata && createrepo -q .") == 0 + or die "createrepo failed: $?\n"; + + my_mkdir "$localrepo/$dist/$arch"; + my_mkdir "$localrepo/$dist/$arch/RPMS"; + my_mkdir "$localrepo/$dist/$arch/logs"; + + system ("cd $localrepo/$dist/$arch && rm -rf repodata && createrepo -q --exclude 'logs/*rpm' .") == 0 + or die "createrepo failed: $?\n"; +} + +my @errors = (); + +# NB: Need to do the arch/distro in the outer loop to work +# around the caching bug in mock/yum. + foreach my $name (@buildorder) { + my $version = $packs{$name}->{version}; + my $release = $packs{$name}->{release}; + my $srpm_filename = $packs{$name}->{filename}; + + $release =~ s/\.fc?\d+$//; # "1.fc9" -> "1" + + # Does the built (binary) package exist already? + my $pattern = "$localrepo/$dist/$arch/RPMS/$name-$version-$release.*.rpm"; + #print "pattern = $pattern\n"; + my @binaries = glob $pattern; + + if (@binaries != 0 && $overwrite) { + print "*** overwriting $name-$version-$release $arch $dist ***\n"; + } + + if (@binaries == 0 || $overwrite) + { + # Rebuild the package. + print "*** building $name-$version-$release $arch $dist ***\n"; + + createrepo ($arch, $dist); + + my $scratchdir = "$ENV{TIZEN_BUILD_ROOT}/local/scratch"; + + $ENV{'BUILD_DIR'} = "$ENV{'VIRTUAL_ENV'}/usr/lib/build"; + my $pattern = "$localrepo/$dist/$arch/repodata/*.xml"; + my @repomd = glob $pattern; + + #my $repos = "--repository http://192.168.1.41:82/Tizen:/Base/standard/ "; + my $repos = "--repository http://download.tz.otcshare.org/live/Tizen:/Base/standard/ "; + if (@repomd != 0 ) { + $repos .= "--rpms $localrepo/$dist/$arch/RPMS "; + } + if (system ("sudo BUILD_ROOT=$ENV{TIZEN_BUILD_ROOT}/local/scratch BUILD_DIR=\"$ENV{'VIRTUAL_ENV'}/usr/lib/build\" build --clean --cachedir $ENV{TIZEN_BUILD_ROOT}/local/cache --dist $dist --configdir $ENV{TIZEN_BUILD_ROOT}/obs-configs $repos $srpm_filename") == 0) { + # Build was a success so move the final RPMs into the + # mock repo for next time. + system ("cp $scratchdir/home/abuild/rpmbuild/SRPMS/*.rpm $localrepo/$dist/src/SRPMS") == 0 or die "mv"; + system ("cp $scratchdir/home/abuild/rpmbuild/RPMS/*/*.rpm $localrepo/$dist/$arch/RPMS") == 0 or die "mv"; + my_mkdir "$localrepo/$dist/$arch/logs/$name-$version-$release"; + system ("cp $scratchdir/.build.log $localrepo/$dist/$arch/logs/$name-$version-$release/log") == 0 or die "mv"; + + createrepo ($arch, $dist); + + } + else { + push @errors, "$name-$dist-$arch$suffix"; + print STDERR "Build failed, return code $?\nLeaving the logs in $scratchdir\n"; + exit 1 unless $keepgoing; + } + } + else + { + print "skipping $name-$version-$release $arch $dist\n"; + } + } + +if (@errors) { + print "\n\n\nBuild failed for the following packages:\n"; + print " $_\n" foreach @errors; + exit 1 +} + +exit 0 diff --git a/deps.pl b/deps.pl new file mode 100644 index 0000000..2cf6cc5 --- /dev/null +++ b/deps.pl @@ -0,0 +1,20 @@ +#!/usr/bin/perl +BEGIN { + my ($wd) = $0 =~ m-(.*)/- ; + $wd ||= '.'; + unshift @INC, "$wd/build"; + unshift @INC, "$wd"; + unshift @INC, "$ENV{'VIRTUAL_ENV'}/lib/build" +} + +use strict; +use Build; +use Build::Rpm; +use Data::Dumper; +my $dist="tizen"; +my $archs="i586"; +my $configdir="/home/nashif/localbuild/builder/configs"; +my $config = Build::read_config_dist($dist, $archs, $configdir); + +my $spec = Build::Rpm::parse($config, $ARGV[0]); +print Dumper($spec); diff --git a/penv.pl b/penv.pl new file mode 100644 index 0000000..dc283cc --- /dev/null +++ b/penv.pl @@ -0,0 +1,88 @@ +#!/usr/bin/env perl +use strict; +use warnings; +use Cwd qw(abs_path); +use File::Path qw(mkpath); +use File::Basename; + +if ( !$ARGV[0] ) { + print "Usage: penv.pl \n"; + exit; +} + +my $abs = abs_path( $ARGV[0] ); + +mkpath "$abs/bin"; + +open my $file, '>', "$abs/bin/activate-perl"; +while () { + $_ =~ s/{{ PENV }}/$abs/g; + print $file $_; +} +close($file); + +__DATA__ +# This file must be used with "source bin/activate" *from bash* +# you cannot run it directly + +deactivate () { + # reset old environment variables + if [ -n "$_OLD_VIRTUAL_PATH" ] ; then + PATH="$_OLD_VIRTUAL_PATH" + export PATH + unset _OLD_VIRTUAL_PATH + fi + + unset MODULEBUILDRC + unset PERL_MM_OPT + unset PERL5LIB + + # This should detect bash and zsh, which have a hash command that must + # be called to get it to forget past commands. Without forgetting + # past commands the $PATH changes we made may not be respected + if [ -n "$BASH" -o -n "$ZSH_VERSION" ] ; then + hash -r + fi + + if [ -n "$_OLD_VIRTUAL_PS1" ] ; then + PS1="$_OLD_VIRTUAL_PS1" + export PS1 + unset _OLD_VIRTUAL_PS1 + fi + + unset VIRTUAL_ENV + if [ ! "$1" = "nondestructive" ] ; then + # Self destruct! + unset -f deactivate + fi +} + +# unset irrelavent variables +deactivate nondestructive + +VIRTUAL_ENV="{{ PENV }}" +export VIRTUAL_ENV + +_OLD_VIRTUAL_PATH="$PATH" +PATH="$VIRTUAL_ENV/bin:$PATH" +export PATH + +if [ -z "$VIRTUAL_ENV_DISABLE_PROMPT" ] ; then + _OLD_VIRTUAL_PS1="$PS1" + if [ "`basename \"$VIRTUAL_ENV\"`" = "__" ] ; then + # special case for Aspen magic directories + # see http://www.zetadev.com/software/aspen/ + PS1="[`basename \`dirname \"$VIRTUAL_ENV\"\``] $PS1" + else + PS1="(`basename \"$VIRTUAL_ENV\"`)$PS1" + fi + export PS1 +fi + +# This should detect bash and zsh, which have a hash command that must +# be called to get it to forget past commands. Without forgetting +# past commands the $PATH changes we made may not be respected +if [ -n "$BASH" -o -n "$ZSH_VERSION" ] ; then + hash -r +fi +eval $(perl -I{{ PENV }}/perl5/lib/perl5 -Mlocal::lib={{ PENV }}) diff --git a/smock_smock.pl b/smock_smock.pl new file mode 100644 index 0000000..d0d0042 --- /dev/null +++ b/smock_smock.pl @@ -0,0 +1,418 @@ +#!/usr/bin/perl -w +# +# SMOCK - Simpler Mock +# by Dan Berrange and Richard W.M. Jones. +# Copyright (C) 2008 Red Hat Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +use strict; + +use Getopt::Long; +use Pod::Usage; +use File::Temp qw(tempfile); + +my @arches = (); +my $chain = 0; +my @distros = (); +my $dryrun = 0; +my $help = 0; +my $keepgoing = 0; +my $localrepo = $ENV{HOME} . "/public_html/smock/yum"; +my $man = 0; +my $overwrite = 0; +my $suffix = ""; + +GetOptions ( + "arch=s" => \@arches, + "chain" => \$chain, + "distro=s" => \@distros, + "dryrun" => \$dryrun, + "help|?" => \$help, + "keepgoing" => \$keepgoing, + "localrepo=s" => \$localrepo, + "man" => \$man, + "overwrite" => \$overwrite, + "suffix=s" => \$suffix, + ) or pod2usage (2); +pod2usage (1) if $help; +pod2usage (-exitstatus => 0, -verbose => 2) if $man; + +=pod + +=head1 NAME + + smock - Simpler mock + +=head1 SYNOPSIS + + smock.pl --arch=i386 --arch=x86_64 --distro=fedora-10 list of SRPMs ... + +=head1 DESCRIPTION + +This is a wrapper around I which lets you build a whole group of +mutually dependent SRPMs in one go. + +The smock command will work out the correct order in which to build +the SRPMs, and makes the result of previous RPM builds available as +dependencies for later builds. + +Smock also works incrementally. It won't rebuild RPMs which were +built already in a previous run, which means if a package fails to +build, you can just fix it and rerun the same smock command. (In the +unlikely case that you want to force smock to rebuild RPMs then you +must bump the release number or delete the binary RPM from the +localrepo directory). + +B Please read the README file first. You need to set up mock +and optionally a web server before you can use this command. + +=head1 OPTIONS + +=over 4 + +=item B<--arch> + +Specify the architecture(s) to build, eg. i386, x86_64. You can +list this option several times to build several architectures. + +=item B<--chain> + +Don't run any commands, just print the packages in the correct +format for chain building. See: +L + +=item B<--distro> + +Specify the distribution(s) to build, eg. fedora-9, fedora-10. +You can list this option several times to build several distributions. + +=item B<--dryrun> + +Don't run any commands, just print the packages in the order +in which they must be built. + +=item B<--help> + +Print this help. + +=item B<--keepgoing> + +Don't exit if a package fails, but keep building. + +Note that this isn't always safe because new packages may be built +against older packages, in the case where the older package couldn't +be rebuilt because of an error. + +However, it is very useful. + +=item B<--localrepo> + +Local repository. Defaults to C<$HOME/public_html/smock/yum> + +=item B<--man> + +Show this help using man. + +=item B<--overwrite> + +Overwrite existing files that are already in the repository. By default the +build of an SRPM is skipped if there is already a package with the same name, +version and release in the localrepo. With this option, the new build +overwrites the old one. This may lead to unexpected results, if the new build +does not create the same subpackages as the old one, because then the old +subpackages will still be accessible in the repository. + +=item B<--suffix> + +Append a suffix to the mock configuration file in order to use +a custom one. + +=back + +=cut + +my @srpms = @ARGV; + +if (0 == @arches) { + die "smock: specify one or more architectures using --arch=\n" +} + +if (0 == @distros) { + die "smock: specify one or more distros using --distro=\n" +} + +if (0 == @srpms) { + die "smock: specify one or more SRPMs to build on the command line\n" +} + +# Resolve the names, dependency list, etc. of the SRPMs that were +# specified. + +sub get_one_line +{ + open PIPE, "$_[0] |" or die "$_[0]: $!"; + my $line = ; + chomp $line; + close PIPE; + return $line; +} + +sub get_lines +{ + local $_; + open PIPE, "$_[0] |" or die "$_[0]: $!"; + my @lines; + foreach () { + chomp; + push @lines, $_; + } + close PIPE; + return @lines; +} + +my %srpms = (); +foreach my $srpm (@srpms) { + my $name = get_one_line "rpm -q --qf '%{name}' -p '$srpm'"; + my $version = get_one_line "rpm -q --qf '%{version}' -p '$srpm'"; + my $release = get_one_line "rpm -q --qf '%{release}' -p '$srpm'"; + + my @buildrequires = get_lines "rpm -q --requires -p '$srpm' | + grep -Eo '^[^[:space:]]+'"; + + #print "Filename: $srpm\n"; + #print " name = $name\n"; + #print " version = $version\n"; + #print " release = $release\n"; + #print " buildrequires = ", join (",", @buildrequires), "\n"; + + $srpms{$name} = { + name => $name, + version => $version, + release => $release, + buildrequires => \@buildrequires, + filename => $srpm + } +} + +# We don't care about buildrequires unless they refer to other +# packages that we are building. So filter them on this condition. + +sub is_member_of +{ + my $item = shift; + + foreach (@_) { + return 1 if $item eq $_; + } + 0; +} + +sub dependency_in +{ + my $dep = shift; # eg. dbus-devel + + while ($dep) { + return $dep if is_member_of ($dep, @_); + my $newdep = $dep; + $newdep =~ s/-\w+$//; # eg. dbus-devel -> dbus + last if $newdep eq $dep; + $dep = $newdep; + } + 0; +} + +foreach my $name (keys %srpms) { + my @buildrequires = @{$srpms{$name}->{buildrequires}}; + @buildrequires = + grep { $_ = dependency_in ($_, keys %srpms) } @buildrequires; + $srpms{$name}{buildrequires} = \@buildrequires; +} + +# This function takes a list of package names and sorts them into the +# correct order for building, given the existing %srpms hash +# containing buildrequires. We use the external 'tsort' program. + +sub tsort +{ + my @names = @_; + + my ($fh, $filename) = tempfile (); + + foreach my $name (@names) { + my @buildrequires = @{$srpms{$name}->{buildrequires}}; + foreach (@buildrequires) { + print $fh "$_ $name\n" + } + # Add a self->self dependency. This ensures that any + # packages which don't have or appear as a dependency of + # any other package still get built. + print $fh "$name $name\n" + } + close $fh; + + get_lines "tsort $filename"; +} + +# Sort the initial list of package names. + +my @names = sort keys %srpms; +my @buildorder = tsort (@names); + +# With --chain flag we print the packages in groups for chain building. + +if ($chain) { + my %group = (); + my $name; + + print 'make chain-build CHAIN="'; + + foreach $name (@buildorder) { + my @br = @{$srpms{$name}->{buildrequires}}; + + # If a BR occurs within the current group, then start the next group. + my $occurs = 0; + foreach (@br) { + if (exists $group{$_}) { + $occurs = 1; + last; + } + } + + if ($occurs) { + %group = (); + print ": "; + } + + $group{$name} = 1; + print "$name "; + } + print "\"\n"; + + exit 0 +} + +# With --dryrun flag we just print the packages in build order then exit. + +if ($dryrun) { + foreach (@buildorder) { + print "$_\n"; + } + + exit 0 +} + +# Now we can build each SRPM. + +sub my_mkdir +{ + local $_ = $_[0]; + + if (! -d $_) { + mkdir ($_, 0755) or die "mkdir $_: $!" + } +} + +sub createrepo +{ + my $arch = shift; + my $distro = shift; + + my_mkdir "$localrepo/$distro"; + my_mkdir "$localrepo/$distro/src"; + my_mkdir "$localrepo/$distro/src/SRPMS"; + system ("cd $localrepo/$distro/src && rm -rf repodata && createrepo -q .") == 0 + or die "createrepo failed: $?\n"; + + my_mkdir "$localrepo/$distro/$arch"; + my_mkdir "$localrepo/$distro/$arch/RPMS"; + my_mkdir "$localrepo/$distro/$arch/logs"; + + system ("cd $localrepo/$distro/$arch && rm -rf repodata && createrepo -q --exclude 'logs/*rpm' .") == 0 + or die "createrepo failed: $?\n"; +} + +if (! -d "$localrepo/scratch") { + mkdir "$localrepo/scratch" + or die "mkdir $localrepo/scratch: $!\nIf you haven't set up a local repository yet, you must read the README file.\n"; +} + +system "rm -rf $localrepo/scratch/*"; + +my @errors = (); + +# NB: Need to do the arch/distro in the outer loop to work +# around the caching bug in mock/yum. +foreach my $arch (@arches) { + foreach my $distro (@distros) { + foreach my $name (@buildorder) { + my $version = $srpms{$name}->{version}; + my $release = $srpms{$name}->{release}; + my $srpm_filename = $srpms{$name}->{filename}; + + $release =~ s/\.fc?\d+$//; # "1.fc9" -> "1" + + # Does the built (binary) package exist already? + my $pattern = "$localrepo/$distro/$arch/RPMS/$name-$version-$release.*.rpm"; + #print "pattern = $pattern\n"; + my @binaries = glob $pattern; + + if (@binaries != 0 && $overwrite) { + print "*** overwriting $name-$version-$release $arch $distro ***\n"; + } + + if (@binaries == 0 || $overwrite) + { + # Rebuild the package. + print "*** building $name-$version-$release $arch $distro ***\n"; + + createrepo ($arch, $distro); + + my $scratchdir = "$localrepo/scratch/$name-$distro-$arch"; + mkdir $scratchdir; + + if (system ("mock -r $distro-$arch$suffix --resultdir $scratchdir $srpm_filename") == 0) { + # Build was a success so move the final RPMs into the + # mock repo for next time. + system ("mv $scratchdir/*.src.rpm $localrepo/$distro/src/SRPMS") == 0 or die "mv"; + system ("mv $scratchdir/*.rpm $localrepo/$distro/$arch/RPMS") == 0 or die "mv"; + my_mkdir "$localrepo/$distro/$arch/logs/$name-$version-$release"; + system ("mv $scratchdir/*.log $localrepo/$distro/$arch/logs/$name-$version-$release/") == 0 or die "mv"; + system "rm -rf $scratchdir"; + + createrepo ($arch, $distro); + + } + else { + push @errors, "$name-$distro-$arch$suffix"; + print STDERR "Build failed, return code $?\nLeaving the logs in $scratchdir\n"; + exit 1 unless $keepgoing; + } + } + else + { + print "skipping $name-$version-$release $arch $distro\n"; + } + } + } +} + +if (@errors) { + print "\n\n\nBuild failed for the following packages:\n"; + print " $_\n" foreach @errors; + exit 1 +} + +exit 0 diff --git a/solv.pl b/solv.pl new file mode 100755 index 0000000..5f525b6 --- /dev/null +++ b/solv.pl @@ -0,0 +1,14 @@ +#!/usr/bin/perl +BEGIN { + my ($wd) = $0 =~ m-(.*)/- ; + $wd ||= '.'; + unshift @INC, "$wd/build"; + unshift @INC, "$wd"; +} + +use BSSolv; + +my $pool = BSSolv::pool->new(); +$pool->createwhatprovides(); + +print $pool; -- 2.34.1