X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=bin%2Fwanna-build;h=a41c7c75084bb2815ca03ccafe6a64183b6de806;hb=58fde48525456155b0c5d7c6928182bfd5a82d6f;hp=7c6e9b26ab864e9dccc138278cbf93ba5c93bbb7;hpb=4133f401dd03e195b058cd94d425fa1adbe5df67;p=wannabuild.git diff --git a/bin/wanna-build b/bin/wanna-build index 7c6e9b2..a41c7c7 100755 --- a/bin/wanna-build +++ b/bin/wanna-build @@ -23,6 +23,8 @@ use strict; use warnings; use 5.010; +die "wanna-build disabled" if -f "/org/wanna-build/NO-WANNA-BUILD"; + package conf; use vars qw< $basedir $dbbase $transactlog $mailprog $buildd_domain >; @@ -271,9 +273,9 @@ if (!isin ( $op_mode, qw(list) ) && ( ($distribution//"") =~ /[ ,]/)) { # a proper error. if ($verbose) { - my $version = '$Revision: db181a534e9d $ $Date: 2008/03/26 06:20:22 $ $Author: rmurray $'; - $version =~ s/(^\$| \$ .*$)//g; - print "wanna-build $version for $distribution on $arch\n"; + my $version = '$Id$'; + $version =~ s/^.* ([a-f0-9]+) .*$/$1/g; + print "wanna-build $version for ".($distribution//"sid")." on $arch\n"; } if (!@ARGV && !isin( $op_mode, qw(list merge-quinn merge-partial-quinn import export @@ -383,13 +385,16 @@ undef $distribution if $distribution eq 'any'; lock_table() unless $simulate; my $replacemap = { '%ARCH%' => $arch, '%SUITE%' => $distribution }; map { my $k = $_; grep { $k =~ s,$_,$replacemap->{$_}, } keys %{$replacemap}; $_ = $k; } @ARGV; - my @ipkgs = &parse_argv( \@ARGV, '.'); - my @isrcs = &parse_argv( \@ARGV, '.'); - my @bpkgs = &parse_argv( \@ARGV, '.'); - my @psrcs = &parse_argv( \@ARGV, '.'); + my @ipkgs = &parse_argv( \@ARGV, '.'); # installed packages + my @isrcs = &parse_argv( \@ARGV, '.'); # installed sources + my @bpkgs = &parse_argv( \@ARGV, '.'); # packages available for building (edos-debcheck) + my @psrcs = &parse_argv( \@ARGV, '.'); # consider as installed sources use WB::QD; my $srcs = WB::QD::readsourcebins($arch, $Pas, \@isrcs, \@ipkgs); if (@psrcs) { + # Installed sources of the base suite: only add them as related, not + # installed; skip the entries if we got something in installed + # sources already. my $psrcs = WB::QD::readsourcebins($arch, $Pas, \@psrcs, []); foreach my $k (keys %$$psrcs) { next if $$srcs->{$k}; @@ -399,6 +404,8 @@ undef $distribution if $distribution eq 'any'; } } parse_all_v3($$srcs, {'arch' => $arch, 'suite' => $distribution, 'time' => $curr_date}); + # The packages passed to edos-debcheck are normally the binaries available, + # unless you've also a base suite the builder will take packages from. @bpkgs = @ipkgs unless @bpkgs; call_edos_depcheck( {'arch' => $arch, 'pkgs' => \@bpkgs, 'srcs' => $$srcs, 'depwait' => 1 }); last SWITCH; @@ -1559,7 +1566,7 @@ sub build_deplist { sub filterarch { return "" unless $_[0]; - return Dpkg::Deps::parse($_[0], ("reduce_arch" => 1, "host_arch" => $_[1]))->dump(); + return Dpkg::Deps::deps_parse($_[0], ("reduce_arch" => 1, "host_arch" => $_[1]))->output(); } sub wb_edos_builddebcheck { @@ -1606,9 +1613,9 @@ sub wb_edos_builddebcheck { } } - print "calling: edos-debcheck $edosoptions < $sourcesfile ".join('', map {" '-base FILE' ".$_ } @$packagefiles)."\n"; + print "calling: edos-debcheck $edosoptions < $sourcesfile ".join('', map {" -I ".$_ } @$packagefiles)."\n"; open(my $result_cmd, '-|', - "edos-debcheck $edosoptions < $sourcesfile ".join('', map {" '-base FILE' ".$_ } @$packagefiles)); + "edos-debcheck $edosoptions < $sourcesfile ".join('', map {" -I ".$_ } @$packagefiles)); my $explanation=""; my $result={}; @@ -1655,7 +1662,9 @@ sub call_edos_depcheck { my $args = shift; my $srcs = $args->{'srcs'}; my $key; - + + # Do not dispatch edos-debcheck if BD-Uninstallable is deactivated for the target. + # ("noadw") Depwait will always be 1 in normal use. return if defined ($distributions{$distribution}{noadw}) && not defined $args->{'depwait'}; # We need to check all of needs-build, as any new upload could make @@ -1663,13 +1672,14 @@ sub call_edos_depcheck { # We also check everything in bd-uninstallable, as any new upload could # make that work again my (%interesting_packages, %interesting_packages_depwait); - my $db = get_all_source_info(); + my $db = get_all_source_info(); # TODO: Filter for needs-build bd-uninst dep-wait, that's all we need. foreach $key (keys %$db) { my $pkg = $db->{$key}; if (defined $pkg and isin($pkg->{'state'}, qw/Needs-Build BD-Uninstallable/) and not defined ($distributions{$distribution}{noadw})) { - $interesting_packages{$key} = undef; + $interesting_packages{$key} = undef; # add key to interesting packages } if (defined $pkg and isin($pkg->{'state'}, qw/Dep-Wait/) and defined $args->{'depwait'}) { + # Depwaits are checked by creating pseudo binaries for edos-debcheck, so collect them. $interesting_packages_depwait{$key} = undef; # we always check for BD-Uninstallability in depwait - could be that depwait is satisfied but package is uninstallable $interesting_packages{$key} = undef unless defined ($distributions{$distribution}{noadw}); @@ -1742,6 +1752,7 @@ sub call_edos_depcheck { for my $key (keys %interesting_packages) { next if defined $interesting_packages_depwait{$key}; my $pkg = $db->{$key}; + # (defined $interesting_packages{$key}) => edos found an uninstallability my $change = (defined $interesting_packages{$key} and $pkg->{'state'} eq 'Needs-Build') || (not defined $interesting_packages{$key} and $pkg->{'state'} eq 'BD-Uninstallable'); @@ -1774,12 +1785,13 @@ sub call_edos_depcheck { next; } my $pkg = $db->{$key}; - if (defined $interesting_packages{$key}) { - change_state( \$pkg, 'BD-Uninstallable' ); - $pkg->{'bd_problem'} = $interesting_packages{$key}; - } else { - change_state( \$pkg, 'Needs-Build' ); - } + # The depwait could be cleared with the result still being uninstallable. + if (defined $interesting_packages{$key}) { + change_state( \$pkg, 'BD-Uninstallable' ); + $pkg->{'bd_problem'} = $interesting_packages{$key}; + } else { + change_state( \$pkg, 'Needs-Build' ); + } log_ta( $pkg, "edos_depcheck: depwait" ) unless $simulate; update_source_info($pkg) unless $simulate; print "edos-builddebchange changed state of ${key}_$pkg->{'version'} ($args->{'arch'}) from dep-wait to $pkg->{'state'}\n" if $verbose || $simulate; @@ -1793,7 +1805,10 @@ sub usage { Usage: $prgname Options: -v, --verbose: Verbose execution. - -A arch: Architecture this operation is for. + --simulate: Do not actually execute the action. + (Not yet implemented for all operations. Check the source.) + -A arch: Architecture this operation is for. (REQUIRED) + -d dist: Distribution/suite this operation is for. (REQUIRED) --take: Take package for building [default operation] -f, --failed: Record in database that a build failed due to deficiencies in the package (that aren't fixable without a new @@ -1813,10 +1828,20 @@ Options: BD-Uninstallable, until the installability of its Build-Dependencies were verified. This happens at each call of --merge-all, usually every 15 minutes. + --build-priority=VALUE: Adjust the build priority of the currently + queued build. + --permanent-build-priority=VALUE: Adjust the permanent build + priority of a source package in a given distribution. + --extra-depends=BUILD-DEPENDS: Specify additional build-dependencies + used for the build. + --extra-conflicts=BUILD-DEPENDS: Specify additional build-conflicts + used for the build. -i SRC_PKG, --info SRC_PKG: Show information for source package -l STATE, --list=STATE: List all packages in state STATE; can be combined with -U to restrict to a specific user; STATE can also be 'all' + --min-age=VALUE, --max-age=VALUE: Filter the output of --list + by the age of the builds. -m MESSAGE, --message=MESSAGE: Give reason why package failed or source dependency list (used with -f, --dep-wait, and --binNMU) @@ -2080,8 +2105,8 @@ sub add_user_info { sub lock_table { return if $simulate; - $dbh->do('LOCK TABLE ' . table_name() . - ' IN EXCLUSIVE MODE', undef) or die $dbh->errstr; + $dbh->do('SELECT 1 FROM ' . table_name() . + ' WHERE distribution = ? FOR UPDATE', undef, $distribution) or die $dbh->errstr; } sub parse_argv {