# a proper error.
if ($verbose) {
- my $version = '$Revision: db181a534e9d $ $Date: 2008/03/26 06:20:22 $ $Author: rmurray $';
- $version =~ s/(^\$| \$ .*$)//g;
+ my $version = '$Id$';
+ $version =~ s/^.* ([a-f0-9]+) .*$/$1/g;
print "wanna-build $version for ".($distribution//"sid")." on $arch\n";
}
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};
}
}
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;
@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;
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
# 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});
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');
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;
Usage: $prgname <options...> <package_version...>
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
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)
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;
}
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;
}
sub lock_table {
return if $simulate;
- $dbh->do('LOCK TABLE ' . table_name() .
- ' IN EXCLUSIVE MODE', undef) 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 {