X-Git-Url: https://git.donarmstrong.com/?p=wannabuild.git;a=blobdiff_plain;f=bin%2Fwanna-build;h=1fb5b901fab48469bb6b5759083d1b5f51a34579;hp=a6975dd871223ee6d39c5ac7dd2a5848e405dff0;hb=33f375d471ae7ba49c41eaa6771c79f75d6ad33e;hpb=b0d2541fcb7e8d11dd9d79a882f715d5c212164d diff --git a/bin/wanna-build b/bin/wanna-build index a6975dd..1fb5b90 100755 --- a/bin/wanna-build +++ b/bin/wanna-build @@ -3,7 +3,7 @@ # wanna-build: coordination script for Debian buildds # Copyright (C) 1998 Roman Hodek # Copyright (C) 2005-2008 Ryan Murray -# Copyright (C) 2010 Andreas Barth +# Copyright (C) 2010,2011 Andreas Barth # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License as @@ -70,7 +70,8 @@ our ($verbose, $mail_logs, $list_order, $list_state, $short_date, $list_min_age, $list_max_age, $dbbase, @curr_time, $build_priority, %new_vers, $binNMUver, %merge_srcvers, %merge_binsrc, $printformat, $ownprintformat, $privmode, $extra_depends, $extra_conflicts, - %distributions, %distribution_aliases, $actions + %distributions, %distribution_aliases, $actions, + $sshwrapper, ); our $Pas = '/org/buildd.debian.org/etc/packages-arch-specific/Packages-arch-specific'; our $simulate = 0; @@ -95,7 +96,7 @@ sub _set_mode { $op_mode = "$_[0]" } sub _option_deprecated { warn "Option $_[0] is deprecated" } -GetOptions( +my @wannabuildoptions = ( # this is not supported by all operations (yet)! 'simulate' => \$simulate, 'simulate-edos' => \$simulate_edos, @@ -160,6 +161,15 @@ GetOptions( when ('s') { $distribution = 'stable'; } when ('t') { $distribution = 'testing'; } when ('u') { $distribution = 'unstable'; } + + if ($distribution eq 'any-priv') { + $privmode = 1; + $distribution = 'any'; + } + if ($distribution eq 'any-unpriv') { + $privmode = 0; + $distribution = 'any'; + } } }, 'order|O=s' => sub { @@ -169,13 +179,18 @@ GetOptions( }, 'message|m=s' => \$fail_reason, 'database|b=s' => sub { + # If they didn't specify an arch, try to get it from database name which + # is in the form of $arch/build-db + # This is for backwards compatibity with older versions that didn't + # specify the arch yet. warn "database is deprecated, please use 'arch' instead.\n"; - $conf::dbbase = $_[1]; + $_[1] =~ m#^([^/]+)#; + $arch ||= $1; }, 'arch|A=s' => \$arch, 'user|U=s' => \$user, 'min-age|a=i' => \$list_min_age, - 'max-age=i' => \$list_max_age, + 'max-age=i' => sub { $list_min_age = -1 * ($_[1]); }, 'format=s' => \$printformat, 'own-format=s' => \$ownprintformat, 'Pas=s' => \$Pas, @@ -188,8 +203,12 @@ GetOptions( 'manual-edit' => \&_set_mode, 'distribution-architectures' => \&_set_mode, 'distribution-aliases' => \&_set_mode, -) or usage(); -$list_min_age = -1 * $list_max_age if $list_max_age; + + 'ssh-wrapper' => \$sshwrapper, + 'recorduser' => \$recorduser, + ); + +GetOptions(@wannabuildoptions) or usage(); my $dbh; @@ -201,18 +220,9 @@ END { } $distribution ||= "sid"; -if ($distribution eq 'any-priv') { - $privmode = 1; - $distribution = 'any'; -} -if ($distribution eq 'any-unpriv') { - $privmode = 0; - $distribution = 'any'; -} my $schema_suffix = ''; -$recorduser //= (not -t and $user//"" =~ /^buildd_/); -if ((isin( $op_mode, qw(list info)) && $distribution !~ /security/ && !$recorduser && !($privmode)) || $simulate) { +if ((isin( $op_mode, qw(list info distribution-architectures distribution-aliases)) && $distribution !~ /security/ && !$recorduser && !($privmode)) || $simulate) { $dbh = DBI->connect("DBI:Pg:service=wanna-build") || die "FATAL: Cannot open database: $DBI::errstr\n"; $schema_suffix = '_public'; @@ -259,13 +269,6 @@ if (!isin ( $op_mode, qw(list) ) && ( !$distribution || $distribution =~ /[ ,]/) die "multiple distributions are only allowed for list"; } -# If they didn't specify an arch, try to get it from database name which -# is in the form of $arch/build-db -# This is for backwards compatibity with older versions that didn't -# specify the arch yet. -$conf::dbbase =~ m#^([^/]+)#; -$arch ||= $1; - # TODO: Check that it's an known arch (for that dist), and give # a proper error. @@ -340,22 +343,12 @@ $list_order ||= $yamlmap->{"list-order"}{'default'}; $api //= $yamlmap->{"api"}; $api //= 0; -process(); - -$dbh->commit; -$dbh->disconnect; - -if ($mail_logs && $conf::log_mail) { - send_mail( $conf::log_mail, - "wanna-build $distribution state changes $curr_date", - "State changes at $curr_date for distribution ". - "$distribution:\n\n$mail_logs\n" ); +if (isin($op_mode, qw) && defined @conf::admin_users && !isin( $real_user, @conf::admin_users) && !$simulate ) { + die "This operation is restricted to admin users"; +} +if (!isin($op_mode, qw)) { + die "need an architecture" unless $arch; } - -exit 0; - - -sub process { SWITCH: foreach ($op_mode) { /^set-(.+)/ && do { @@ -371,9 +364,6 @@ sub process { last SWITCH; }; /^forget-user/ && do { - die "This operation is restricted to admin users\n" - if (defined @conf::admin_users and - !isin( $real_user, @conf::admin_users)); forget_users( @ARGV ); last SWITCH; }; @@ -382,8 +372,6 @@ sub process { last SWITCH; }; /^merge-v3/ && do { - die "This operation is restricted to admin users\n" - if (defined @conf::admin_users and !isin( $real_user, @conf::admin_users) and !$simulate); # call with installed-packages+ . installed-sources+ [ . available-for-build-packages* [ . consider-as-installed-source* ] ] # in case available-for-build-packages is not specified, installed-packages are used lock_table() unless $simulate; @@ -410,12 +398,7 @@ sub process { last SWITCH; }; /^import/ && do { - die "This operation is restricted to admin users\n" - if (defined @conf::admin_users and - !isin( $real_user, @conf::admin_users)); - $dbh->do("DELETE from " . table_name() . - " WHERE distribution = ?", undef, - $distribution) + $dbh->do("DELETE from ".table_name()." WHERE distribution = ?", undef, $distribution) or die $dbh->errstr; forget_users(); read_db( $import_from ); @@ -447,18 +430,31 @@ sub process { update_user_info($user); } } + + +$dbh->commit unless $simulate; +$dbh->disconnect; + +if ($mail_logs && $conf::log_mail) { + send_mail( $conf::log_mail, + "wanna-build $distribution state changes $curr_date", + "State changes at $curr_date for distribution ". + "$distribution:\n\n$mail_logs\n" ); } +exit 0; + BEGIN { $actions = { 'set-building' => { 'noversion' => 1, 'nopkgdef' => 1, }, 'set-built' => { 'builder' => 1, to => 'Built', action => 'built', 'from' => [qw]}, 'set-attempted' => { 'builder' => 1, to => 'Build-Attempted', action => 'attempted', 'from' => [qw]}, - 'set-uploaded' => { 'builder' => 1, 'noversion' => 1 }, - 'set-dep-wait' => { 'builder' => 1, }, - 'set-update' => { 'noversion' => 1, } - + 'set-uploaded' => { 'builder' => 1, to => 'Uploaded', action => 'uploaded', 'from' => [qw], binversion => 1, }, + 'set-failed' => { 'builder' => 1, to => 'Failed', action => 'failed', from => [qw], warnfrom => [qw], }, + 'set-dep-wait' => { 'builder' => 1, warnfrom => [qw], }, + 'set-update' => { 'noversion' => 1, }, + 'set-needs-build' => { builder => 1, to => 'BD-Uninstallable', action => 'give-back'}, }; } @@ -485,45 +481,88 @@ sub add_packages { } } if ($actions->{$op_mode} && $actions->{$op_mode}->{'builder'}) { - if ($pkg->{'builder'} && $user ne $pkg->{'builder'}) { + if (($pkg->{'builder'} && $user ne $pkg->{'builder'}) && + !($pkg->{'builder'} =~ /^(\w+)-\w+/ && $1 eq $user) && + !$opt_override) { print "$pkg->{'package'}: not taken by you, but by $pkg->{'builder'}. Skipping.\n"; next; } } if (!($actions->{$op_mode}) || !($actions->{$op_mode}->{'noversion'})) { - if ( !pkg_version_eq($pkg,$version)) { - print "$pkg->{package}: version mismatch ($pkg->{'version'} by $pkg->{'builder'})\n"; + my $nmuver = binNMU_version($pkg->{version}, $pkg->{'binary_nmu_version'}); + if ((!pkg_version_eq($pkg,$version) || $actions->{$op_mode}->{'binversion'}) && !version_eq( $nmuver, $version )) { + print "$pkg->{package}: version mismatch ($nmuver"; + print " by $pkg->{'builder'}" if $pkg->{'builder'}; + print ")\n"; next; } } if ($actions->{$op_mode} && $actions->{$op_mode}->{'from'}) { - if (!isin($pkg->{'state'}, @{$actions->{$op_mode}->{'from'}})) { - print "$name: skiping: state is $pkg->{'state'}, not in ".join(", ",@{$actions->{$op_mode}->{'from'}})."\n"; + if (!isin($pkg->{'state'}, @{$actions->{$op_mode}->{'from'}}, @{$actions->{$op_mode}->{'warnfrom'}})) { + print "$name: skiping: state is $pkg->{'state'}, not in ".join(", ",@{$actions->{$op_mode}->{'from'}}, @{$actions->{$op_mode}->{'warnfrom'}})."\n"; next; } } + if ($actions->{$op_mode} && $actions->{$op_mode}->{'warnfrom'}) { + if (isin($pkg->{'state'}, @{$actions->{$op_mode}->{'warnfrom'}})) { + print "$name: warning: state is $pkg->{'state'}, processing anyways.\n"; + } + } if ($op_mode eq "set-building") { add_one_building( $name, $version, $pkg ); } - elsif ($op_mode eq "set-built") { - 1; - } - elsif ($op_mode eq "set-attempted") { - 1; - } - elsif ($op_mode eq "set-uploaded") { - add_one_uploaded( $name, $version, $pkg ); - } elsif ($op_mode eq "set-failed") { - add_one_failed( $pkg ); + print "$pkg->{'package'}: already registered as failed; will append new message\n" if $pkg->{'state'} eq "Failed"; + $pkg->{'builder'} = $user; + $pkg->{'failed'} .= "\n" if $pkg->{'failed'}; + $pkg->{'failed'} .= $fail_reason; } elsif ($op_mode eq "set-not-for-us") { add_one_notforus( $pkg ); } elsif ($op_mode eq "set-needs-build") { - add_one_needsbuild( $pkg ); + my $state = $pkg->{'state'}; + + if ($state eq "BD-Uninstallable") { + if ($opt_override) { + print "$name: Forcing uninstallability mark to be removed. This is not permanent and might be reset with the next trigger run\n"; + + change_state( \$pkg, 'Needs-Build' ); + delete $pkg->{'builder'}; + delete $pkg->{'depends'}; + log_ta( $pkg, "--give-back" ); + update_source_info($pkg); + print "$name: given back\n" if $verbose; + next; + } + else { + print "$name: has uninstallable build-dependencies. Skipping\n (use --override to clear dependency list and give back anyway)\n"; + next; + } + } + elsif ($state eq "Dep-Wait") { + if ($opt_override) { + print "$name: Forcing source dependency list to be cleared\n"; + } + else { + print "$name: waiting for source dependencies. Skipping\n (use --override to clear dependency list and give back anyway)\n"; + next; + } + } + elsif (!isin( $state, qw(Building Built Build-Attempted))) { + print "$name: not taken for building (state is $state)."; + if ($opt_override) { + print "\n$name: Forcing give-back\n"; + } + else { + print " Skipping.\n"; + next; + } + } + $pkg->{'builder'} = undef; + $pkg->{'depends'} = undef; } elsif ($op_mode eq "set-dep-wait") { add_one_depwait( $pkg ); @@ -538,7 +577,10 @@ sub add_packages { set_one_binnmu( $name, $version, $pkg ); } elsif ($op_mode eq "set-update") { - set_one_update( $pkg ); + $pkg->{'version'} =~ s/\+b[0-9]+$//; + + log_ta( $pkg, "--update" ); + update_source_info($pkg); } if ($actions->{$op_mode} && $actions->{$op_mode}->{'action'} && $actions->{$op_mode}->{'to'}) { @@ -558,17 +600,14 @@ sub add_one_building { $ok = 1; my $pkg = shift; if (defined($pkg)) { - if ($pkg->{'state'} eq "Not-For-Us") { - $ok = 0; - $reason = "not suitable for this architecture"; - } - elsif ($pkg->{'state'} =~ /^Dep-Wait/) { - $ok = 0; - $reason = "not all source dependencies available yet"; - } - elsif ($pkg->{'state'} =~ /^BD-Uninstallable/) { + my $pkgnack = { + 'Not-For-Us' => 'not suitable for this architecture', + 'Dep-Wait' => 'not all source dependencies available yet', + 'BD-Uninstallable' => 'source dependencies are not installable', + }; + if ($pkgnack->{$pkg->{'state'}}) { $ok = 0; - $reason = "source dependencies are not installable"; + $reason = $pkgnack->{$pkg->{'state'}}; } elsif ($pkg->{'state'} eq "Uploaded" && (version_lesseq($version, $pkg->{'version'}))) { @@ -711,87 +750,6 @@ sub add_one_building { } -sub add_one_uploaded { - my $name = shift; - my $version = shift; - my $pkg = shift; - - if ($pkg->{'state'} eq "Uploaded" && - pkg_version_eq($pkg,$version)) { - print "$name: already uploaded\n"; - return; - } - if (!isin( $pkg->{'state'}, qw(Building Built Build-Attempted))) { - print "$name: not taken for building (state is $pkg->{'state'}). ", - "Skipping.\n"; - return; - } - # strip epoch -- buildd-uploader used to go based on the filename. - # (to remove at some point) - my $pkgver; - ($pkgver = $pkg->{'version'}) =~ s/^\d+://; - $version =~ s/^\d+://; # for command line use - if ($pkg->{'binary_nmu_version'} ) { - my $nmuver = binNMU_version($pkgver, $pkg->{'binary_nmu_version'}); - if (!version_eq( $nmuver, $version )) { - print "$name: version mismatch ($nmuver registered). ", - "Skipping.\n"; - return; - } - } elsif (!version_eq($pkgver, $version)) { - print "$name: version mismatch ($pkg->{'version'} registered). ", - "Skipping.\n"; - return; - } - - change_state( \$pkg, 'Uploaded' ); - log_ta( $pkg, "--uploaded" ); - update_source_info($pkg); - print "$name: registered as uploaded\n" if $verbose; -} - -sub add_one_failed { - my $pkg = shift; - my $state = $pkg->{'state'}; - my $name = $pkg->{'package'}; - - if ($state eq "Not-For-Us") { - print "$name: not suitable for this architecture anyway. Skipping.\n"; - return; - } - elsif ($state eq "Failed-Removed") { - print "$name: failed previously and doesn't need building. Skipping.\n"; - return; - } - elsif ($state eq "Installed") { - print "$name: Is already installed in archive. Skipping.\n"; - return; - } - elsif ($pkg->{'builder'} && - (($user ne $pkg->{'builder'}) && - !($pkg->{'builder'} =~ /^(\w+)-\w+/ && $1 eq $user))) { - print "$name: not taken by you, but by ". - "$pkg->{'builder'}. Skipping.\n"; - return; - } - - if (isin($state, qw)) { - print "add_one_failed: $name: Warning: not registered for building previously (but $state), processing anyway.\n"; - } - elsif ($state eq "Failed") { - print "$name: already registered as failed; will append new message\n" - if $fail_reason; - } - - change_state( \$pkg, 'Failed' ); - $pkg->{'builder'} = $user; - $pkg->{'failed'} .= "\n" if $pkg->{'failed'}; - $pkg->{'failed'} .= $fail_reason; - log_ta( $pkg, "--failed" ); - update_source_info($pkg); - print "$name: registered as failed\n" if $verbose; -} - sub add_one_notforus { my $pkg = shift; my $state = $pkg->{'state'}; @@ -841,71 +799,6 @@ sub add_one_notforus { update_source_info($pkg); } -sub add_one_needsbuild { - my $pkg = shift; - my $state = $pkg->{'state'}; - my $name = $pkg->{'package'}; - - if ($state eq "BD-Uninstallable") { - if ($opt_override) { - print "$name: Forcing uninstallability mark to be removed. This is not permanent and might be reset with the next trigger run\n"; - - change_state( \$pkg, 'Needs-Build' ); - delete $pkg->{'builder'}; - delete $pkg->{'depends'}; - log_ta( $pkg, "--give-back" ); - update_source_info($pkg); - print "$name: given back\n" if $verbose; - return; - } - else { - print "$name: has uninstallable build-dependencies. Skipping\n", - " (use --override to clear dependency list and ", - "give back anyway)\n"; - return; - } - } - elsif ($state eq "Dep-Wait") { - if ($opt_override) { - print "$name: Forcing source dependency list to be cleared\n"; - } - else { - print "$name: waiting for source dependencies. Skipping\n", - " (use --override to clear dependency list and ", - "give back anyway)\n"; - return; - } - } - elsif (!isin( $state, qw(Building Built Build-Attempted))) { - print "$name: not taken for building (state is $state)."; - if ($opt_override) { - print "\n$name: Forcing give-back\n"; - } - else { - print " Skipping.\n"; - return; - } - } - if (defined ($pkg->{'builder'}) && $user ne $pkg->{'builder'} && - !($pkg->{'builder'} =~ /^(\w+)-\w+/ && $1 eq $user) && - !$opt_override) { - print "$name: not taken by you, but by ". - "$pkg->{'builder'}. Skipping.\n"; - return; - } - if (!defined $distributions{$distribution}{noadw}) { - change_state( \$pkg, 'BD-Uninstallable' ); - $pkg->{'bd_problem'} = "Installability of build dependencies not tested yet"; - } else { - change_state( \$pkg, 'Needs-Build' ); - } - $pkg->{'builder'} = undef; - $pkg->{'depends'} = undef; - log_ta( $pkg, "--give-back" ); - update_source_info($pkg); - print "$name: given back\n" if $verbose; -} - sub set_one_binnmu { my $name = shift; my $version = shift; @@ -928,11 +821,7 @@ sub set_one_binnmu { $pkg->{'binary_nmu_changelog'} = $fail_reason; $pkg->{'notes'} = 'out-of-date'; delete $pkg->{'buildpri'}; - if (defined $distributions{$distribution}{noadw}) { - change_state( \$pkg, 'Installed' ); - } else { - change_state( \$pkg, 'BD-Uninstallable' ); - } + change_state( \$pkg, 'BD-Uninstallable' ); } log_ta( $pkg, "--binNMU" ); update_source_info($pkg); @@ -954,14 +843,7 @@ sub set_one_binnmu { return; } - if (!defined $distributions{$distribution}{noadw}) { - change_state( \$pkg, 'BD-Uninstallable' ); - $pkg->{'bd_problem'} = "Installability of build dependencies not tested yet"; - } - else - { - change_state( \$pkg, 'Needs-Build' ); - } + change_state( \$pkg, 'BD-Uninstallable' ); delete $pkg->{'builder'}; delete $pkg->{'depends'}; $pkg->{'binary_nmu_version'} = $binNMUver; @@ -976,16 +858,8 @@ sub set_one_binnmu { sub set_one_buildpri { my $key = shift; my $pkg = shift; - my $state = $pkg->{'state'}; my $name = $pkg->{'package'}; - if ($state eq "Not-For-Us") { - print "$name: not suitable for this architecture. Skipping.\n"; - return; - } elsif ($state eq "Failed-Removed") { - print "$name: failed previously and doesn't need building. Skipping.\n"; - return; - } if ( $build_priority ) { $pkg->{$key} = $build_priority; } else { @@ -1004,11 +878,6 @@ sub add_one_depwait { print "$name: merging with previously registered dependencies\n"; } - if (isin( $state, qw(Needs-Build Failed BD-Uninstallable))) { - print "$name: Warning: not registered for building previously, ". - "but processing anyway.\n"; - } - if (isin( $state, qw)) { print "add_one_depwait: $name: skiping in state $state\n"; return; @@ -1033,13 +902,6 @@ sub add_one_depwait { print "$name: registered as waiting for dependencies\n" if $verbose || $simulate; } -sub set_one_update { - my $pkg = shift; - $pkg->{'version'} =~ s/\+b[0-9]+$//; - - log_ta( $pkg, "--update" ); - update_source_info($pkg); -} # for sorting priorities and sections BEGIN { @@ -1563,6 +1425,7 @@ sub change_state { my $newstate = shift; my $state = \$pkg->{'state'}; + $newstate = 'Needs-Build' if $newstate eq 'BD-Uninstallable' && $distributions{$distribution}{noadw}; return if defined($$state) and $$state eq $newstate; $pkg->{'previous_state'} = $$state if defined($$state); $pkg->{'state_change'} = $curr_date; @@ -1575,9 +1438,8 @@ sub change_state { ($pkg->{'old_failed'} // ""); delete $pkg->{'failed'}; } - if (defined($$state) and $$state eq 'BD-Uninstallable') { - delete $pkg->{'bd_problem'}; - } + delete $pkg->{'bd_problem'} if ($$state//"") eq 'BD-Uninstallable'; + $pkg->{'bd_problem'} = "Installability of build dependencies not tested yet" if $newstate eq 'BD-Uninstallable'; $$state = $newstate; } @@ -1822,12 +1684,12 @@ sub call_edos_depcheck { # If such a "binary" package is installable, the corresponding source package is buildable. print $SOURCES "Package: source---$key\n"; print $SOURCES "Version: $pkg->{'version'}\n"; - my $t = &filterarch($srcs->{$key}{'dep'} || $srcs->{$key}{'depends'}, $arch); - my $tt = &filterarch($pkg->{'extra_depends'}, $arch); + my $t = &filterarch($srcs->{$key}{'dep'} || $srcs->{$key}{'depends'}, $args->{'arch'}); + my $tt = &filterarch($pkg->{'extra_depends'}, $args->{'arch'}); $t = $t ? ($tt ? "$t, $tt" : $t) : $tt; print $SOURCES "Depends: $t\n" if $t; - my $u = &filterarch($srcs->{$key}{'conf'} || $srcs->{$key}{'conflicts'}, $arch); - my $uu = &filterarch($pkg->{'extra_conflicts'}, $arch); + my $u = &filterarch($srcs->{$key}{'conf'} || $srcs->{$key}{'conflicts'}, $args->{'arch'}); + my $uu = &filterarch($pkg->{'extra_conflicts'}, $args->{'arch'}); $u = $u ? ($uu ? "$u, $uu" : $u) : $uu; print $SOURCES "Conflicts: $u\n" if $u; print $SOURCES "Architecture: all\n";