X-Git-Url: https://git.donarmstrong.com/?p=wannabuild.git;a=blobdiff_plain;f=bin%2Fwanna-build;h=6845901f17ad360e79e793d4df690732b9a20cc7;hp=b7c2215fc068470f59017b4e26f8e0866e986e81;hb=9b315fcde020ff11f6b29fd3d444a9e272b0e2c0;hpb=21f9ffb4e8e35650a38dbf299ede785eefcb1dc2 diff --git a/bin/wanna-build b/bin/wanna-build index b7c2215..6845901 100755 --- a/bin/wanna-build +++ b/bin/wanna-build @@ -385,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}; @@ -401,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; @@ -1180,6 +1185,12 @@ sub list_packages { @list = grep { my $i = $_->{'component'}; grep { $i eq $_ } split /[, ]+/, $yamlmap->{"restrict"}{'component'} } @list; # extra depends / conflicts only from api 1 on @list = grep { !$_->{'extra_depends'} and !$_->{'extra_conflicts'} } @list if $api < 1 ; + # filter out packages for needs-build in noautobuild state - same could exist for weaknoautobuild if buildds would tell us what they do + if (($state eq 'needs-build') && ($yamlmap->{"restrict"}) && ($yamlmap->{"restrict"}{"noautobuild"})) { + foreach my $key (map {keys %$_} @{$yamlmap->{"restrict"}{"noautobuild"}}) { + @list = grep { $_->{'package'} ne $key } @list; + } + } # first adjust ownprintformat, then set printformat accordingly $printformat ||= $yamlmap->{"format"}{$ownprintformat} if $ownprintformat; @@ -1657,7 +1668,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 @@ -1665,13 +1678,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}); @@ -1744,6 +1758,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'); @@ -1776,12 +1791,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; @@ -1795,7 +1811,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. Defaults to unstable. --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 @@ -1815,10 +1834,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) @@ -1830,13 +1859,16 @@ Options: automatically choosen --import FILE: Import database from a ASCII file FILE --export FILE: Export database to a ASCII file FILE + --format string, --own-format name: specify how the listing of packages + should look like. Please check the source for details. Own-Format + definitions are in ~/.wanna-build.yaml within the format section. + +There are more options not relevant for normal usage - please check source +if you need them. The remaining arguments (depending on operation) usually start with "name_version", the trailer is ignored. This allows to pass the names of .dsc files, for which file name completion can be used. ---merge-packages and --merge-quinn take Package/quin--diff file names -on the command line or read stdin. --list needs nothing more on the -command line. --info takes source package names (without version). EOF exit 1; } @@ -1885,9 +1917,9 @@ sub get_readonly_source_info { sub get_source_info { my $name = shift; return get_readonly_source_info($name) if $simulate; + lock_table(); my $pkg = $dbh->selectrow_hashref('SELECT *, extract(days from date_trunc(\'days\', now() - state_change)) as state_days, floor(extract(epoch from now()) - extract(epoch from state_change)) as state_time FROM ' . - table_name() . ' WHERE package = ? AND distribution = ?' . - ' FOR UPDATE', + table_name() . ' WHERE package = ? AND distribution = ?', undef, $name, $distribution); return $pkg; } @@ -2082,8 +2114,10 @@ sub add_user_info { sub lock_table { return if $simulate; - $dbh->do('SELECT 1 FROM ' . table_name() . - ' WHERE distribution = ? FOR UPDATE', undef, $distribution) or die $dbh->errstr; + $q = 'SELECT 1 AS result FROM public.locks' . + ' WHERE architecture = ? AND distribution = ? FOR UPDATE'; + my $result = $dbh->selectrow_hashref($q, undef, $arch, $distribution) or die $dbh->errstr; + die unless $result->{'result'} == 1; } sub parse_argv { @@ -2119,8 +2153,10 @@ sub parse_all_v3 { # does at least one binary exist in the database and is more recent - if so, we're probably just outdated, ignore the source package for my $bin (@{$pkgs->{'binary'}}) { - if ($binary->{$bin} and vercmp($pkgs->{'version'}, $binary->{$bin}->{'version'}) < 0) { - print "$logstr skipped because binaries (assumed to be) overwritten\n" if $verbose || $simulate; + if ($binary->{$bin} and $binary->{$bin}->{'arch'} ne 'all' and vercmp($pkgs->{'version'}, $binary->{$bin}->{'version'}) < 0) { + print Dumper($binary->{$bin}) . "\n"; + print "$logstr skipped because binaries (assumed to be) overwritten (" . + $bin . ", " . $pkgs->{'version'} . " vs. " . $binary->{$bin}->{'version'} . ")\n" if $verbose || $simulate; next SRCS; } }