X-Git-Url: http://git.annexia.org/?a=blobdiff_plain;f=smock%2Fsmock.pl;h=ff492ca5bc14260ba9072db1e25931475e0d5208;hb=f72bec607c7b8a31fdeba4938099784608ecc007;hp=38c7375ae3ecfebee68877fbf33217b73ba6498d;hpb=2e829d16505ec555be1f6c8f5d831f32d82bf316;p=fedora-mingw.git diff --git a/smock/smock.pl b/smock/smock.pl index 38c7375..ff492ca 100755 --- a/smock/smock.pl +++ b/smock/smock.pl @@ -27,6 +27,9 @@ use File::Temp qw(tempfile); my @arches = (); my @distros = (); my $localrepo = $ENV{HOME} . "/public_html/smock/yum"; +my $dryrun = 0; +my $keepgoing = 0; +my $chain = 0; my $help = 0; my $man = 0; @@ -34,6 +37,9 @@ GetOptions ( "arch=s" => \@arches, "distro=s" => \@distros, "localrepo=s" => \$localrepo, + "dryrun" => \$dryrun, + "keepgoing" => \$keepgoing, + "chain" => \$chain, "help|?" => \$help, "man" => \$man ) or pod2usage (2); @@ -87,6 +93,27 @@ You can list this option several times to build several distributions. Local repository. Defaults to C<$HOME/public_html/smock/yum> +=item B<--dryrun> + +Don't run any commands, just print the packages in the order +in which they must be built. + +=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<--chain> + +Don't run any commands, just print the packages in the correct +format for chain building. See: +L + =back =cut @@ -181,30 +208,85 @@ sub dependency_in 0; } -my @names = keys %srpms; -foreach my $name (@names) { +foreach my $name (keys %srpms) { my @buildrequires = @{$srpms{$name}->{buildrequires}}; - @buildrequires = grep { $_ = dependency_in ($_, @names) } @buildrequires; + @buildrequires = + grep { $_ = dependency_in ($_, keys %srpms) } @buildrequires; $srpms{$name}{buildrequires} = \@buildrequires; } -# Now sort the SRPMs into the correct order for building +# 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. -my ($fh, $filename) = tempfile (); +sub tsort +{ + my @names = @_; -foreach my $name (@names) { - my @buildrequires = @{$srpms{$name}->{buildrequires}}; - foreach (@buildrequires) { - print $fh "$_ $name\n" + 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"; } -close $fh; -my @buildorder = 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. -#foreach (@buildorder) { -# print "$_\n"; -#} +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. @@ -241,7 +323,9 @@ if (! -d "$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 -f $localrepo/scratch/*"; +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. @@ -265,17 +349,27 @@ foreach my $arch (@arches) { print "*** building $name-$version-$release $arch $distro ***\n"; createrepo ($arch, $distro); - system ("mock -r $distro-$arch --resultdir $localrepo/scratch $srpm_filename") == 0 - or die "Build failed, return code $?\nLeaving the logs in $localrepo/scratch\n"; - - # Build was a success so move the final RPMs into the - # mock repo for next time. - system ("mv $localrepo/scratch/*.src.rpm $localrepo/$distro/src/SRPMS") == 0 or die "mv"; - system ("mv $localrepo/scratch/*.rpm $localrepo/$distro/$arch/RPMS") == 0 or die "mv"; - my_mkdir "$localrepo/$distro/$arch/logs/$name-$version-$release"; - system ("mv $localrepo/scratch/*.log $localrepo/$distro/$arch/logs/$name-$version-$release/") == 0 or die "mv"; - createrepo ($arch, $distro); + my $scratchdir = "$localrepo/scratch/$name-$distro-$arch"; + mkdir $scratchdir; + + if (system ("mock -r $distro-$arch --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"; + print STDERR "Build failed, return code $?\nLeaving the logs in $scratchdir\n"; + exit 1 unless $keepgoing; + } } else { @@ -284,3 +378,11 @@ foreach my $arch (@arches) { } } } + +if (@errors) { + print "\n\n\nBuild failed for the following packages:\n"; + print " $_\n" foreach @errors; + exit 1 +} + +exit 0