X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=bin%2Fwanna-build;h=8a11d11005a23d4e98f0393b627cfa1e4d48b834;hb=857063ceccb2baf9fbd1676235f31e9b60653d4f;hp=3e1c3e84bda37a0f4964bf5ede6d0bb74a8f27f3;hpb=d83c8a44d7cb06e72d9e29549405b8259e2ce270;p=wannabuild.git diff --git a/bin/wanna-build b/bin/wanna-build index 3e1c3e8..8a11d11 100755 --- a/bin/wanna-build +++ b/bin/wanna-build @@ -56,7 +56,7 @@ our ($verbose, $mail_logs, $list_order, $list_state, $category, %catval, %short_category, $short_date, $list_min_age, $dbbase, @curr_time, $build_priority, %new_vers, $binNMUver, %merge_srcvers, %merge_binsrc, - $printformat, $ownprintformat + $printformat, $ownprintformat, $privmode ); # global vars @@ -242,8 +242,25 @@ while( @ARGV && $ARGV[0] =~ /^-/ ) { $op_mode = $category ? "set-failed" : "set-building" if !$op_mode; # default operation $distribution ||= "unstable"; -die "Bad distribution '$distribution'\n" - if !isin($distribution, keys %conf::distributions); +if ($distribution eq 'any-priv') { + $privmode = 'yes'; + $distribution = 'any'; +} +if ($distribution eq 'any-unpriv') { + $privmode = 'no'; + $distribution = 'any'; +} +undef $distribution if $distribution eq 'any'; +if ($distribution) { + my @dists = split(/[, ]+/, $distribution); + foreach my $dist (@dists) { + die "Bad distribution '$distribution'\n" + if !isin($dist, keys %conf::distributions); + } +} +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 @@ -333,7 +350,7 @@ END { } my $schema_suffix = ''; -if (isin( $op_mode, qw(list info)) && $distribution !~ /security/ && !(not -t and $user =~ /-/)) { +if (isin( $op_mode, qw(list info)) && $distribution !~ /security/ && !(not -t and $user =~ /-/) && !($privmode eq 'yes')) { $dbh = DBI->connect("DBI:Pg:service=wanna-build") || die "FATAL: Cannot open database: $DBI::errstr\n"; $schema_suffix = '_public'; @@ -1883,6 +1900,7 @@ R max time of last (successful) build (formated) S Package state s Time in this state in full seconds since epoch t time of state change +T time since state change u Builder (e.g. buildd_mipsel-rem) v Package version V full Package version (i.e. with +b.., = %v%{+b}B%B @@ -1924,8 +1942,9 @@ Text could contain further %. To start with !, use %! return $pkg->{'package'}."#".$arch."-bd-problem\n". join("\\0a",split("\n",$pkg->{'bd_problem'}))."\\0a\n"; }, $pkg, $var), 'B' => make_fmt( sub { return $pkg->{'binary_nmu_version'} if defined $pkg->{'binary_nmu_version'}; }, $pkg, $var), - 'd' => make_fmt( $distribution, $pkg, $var), + 'd' => make_fmt( $pkg->{'distribution'}, $pkg, $var), 't' => make_fmt( $pkg->{'state_change'}, $pkg, $var), + 'T' => make_fmt( sub { return seconds2time(time() - floor(str2time($pkg->{'state_change'}))); }, $pkg, $var), 'o' => make_fmt( $pkg->{'successtime'}, $pkg, $var), 'O' => make_fmt( sub { return seconds2time ( $pkg->{'successtime'}); }, $pkg, $var), 'q' => make_fmt( $pkg->{'anytime'}, $pkg, $var), @@ -2342,24 +2361,19 @@ sub call_edos_depcheck { #print "I would look at these sources with edos-depcheck:\n"; #print join " ", keys %interesting_packages,"\n"; - my $tmpfile_pattern = "/tmp/wanna-build-interesting-sources-$distribution.$$-"; - my ($tmpfile, $i); - for( $i = 0;; ++$i ) { - $tmpfile = $tmpfile_pattern . $i; - last if ! -e $tmpfile; - } - - open SOURCES, '>', $tmpfile or die "Could not open temporary file $tmpfile\n"; + my $tmpfile_pattern = "/tmp/wanna-build-interesting-sources-$distribution.$$-XXXXX"; + use File::Temp qw/ tempfile /; + my ($SOURCES, $tmpfile) = tempfile( $tmpfile_pattern, UNLINK => 1 ); for my $key (keys %interesting_packages) { my $pkg = $db->{$key}; - print SOURCES "Package: $key\n"; - print SOURCES "Version: $pkg->{'version'}\n"; - print SOURCES "Build-Depends: $srcs->{$key}{'dep'}\n" if $srcs->{$key}{'dep'}; - print SOURCES "Build-Conflicts: $srcs->{$key}{'conf'}\n" if $srcs->{$key}{'conf'}; - print SOURCES "Architecture: all\n"; - print SOURCES "\n"; + print $SOURCES "Package: $key\n"; + print $SOURCES "Version: $pkg->{'version'}\n"; + print $SOURCES "Build-Depends: $srcs->{$key}{'dep'}\n" if $srcs->{$key}{'dep'}; + print $SOURCES "Build-Conflicts: $srcs->{$key}{'conf'}\n" if $srcs->{$key}{'conf'}; + print $SOURCES "Architecture: all\n"; + print $SOURCES "\n"; } - close SOURCES; + close $SOURCES; if (open(EDOS,"-|","wb-edos-builddebcheck", "-a", $arch, $packagesfile, $tmpfile)) { @@ -2502,15 +2516,11 @@ sub pkg_history_table_name { sub get_readonly_source_info { my $name = shift; # SELECT FLOOR(EXTRACT('epoch' FROM age(localtimestamp, '2010-01-22 23:45')) / 86400) -- change to that? - my $q = 'SELECT rel, priority, state_change, permbuildpri, section, buildpri, failed, state, binary_nmu_changelog, bd_problem, version, package, distribution, installed_version, notes, failed_category, builder, old_failed, previous_state, binary_nmu_version, depends, extract(days from date_trunc(\'days\', now() - state_change)) as state_days, successtime.build_time as successtime, anytime.build_time as anytime FROM ' . - table_name() . - ' left join ( '. - 'select distinct on (package, distribution) build_time, package, distribution from '.pkg_history_table_name().' where result = \'successful\' order by package, distribution, timestamp desc '. - ' ) as successtime using (package, distribution) '. - ' left join ( '. - 'select distinct on (package, distribution) build_time, package, distribution from '.pkg_history_table_name().' order by package, distribution, timestamp desc'. - ' ) as anytime using (package, distribution) '. - ' WHERE package = ? AND distribution = ?'; + my $q = "SELECT rel, priority, state_change, permbuildpri, section, buildpri, failed, state, binary_nmu_changelog, bd_problem, version, package, distribution, installed_version, notes, failed_category, builder, old_failed, previous_state, binary_nmu_version, depends, extract(days from date_trunc('days', now() - state_change)) as state_days" + . ", (SELECT max(build_time) FROM ".pkg_history_table_name()." WHERE pkg_history.package = packages.package AND pkg_history.distribution = packages.distribution AND result = 'successful') AS successtime" + . ", (SELECT max(build_time) FROM ".pkg_history_table_name()." WHERE pkg_history.package = packages.package AND pkg_history.distribution = packages.distribution ) AS anytime" + . " FROM " . table_name() + . ' WHERE package = ? AND distribution = ?'; my $pkg = $dbh->selectrow_hashref( $q, undef, $name, $distribution); return $pkg; @@ -2528,26 +2538,35 @@ sub get_source_info { sub get_all_source_info { my %options = @_; - my $q = 'SELECT rel, priority, state_change, permbuildpri, section, buildpri, failed, state, binary_nmu_changelog, bd_problem, version, package, distribution, installed_version, notes, failed_category, builder, old_failed, previous_state, binary_nmu_version, depends, extract(days from date_trunc(\'days\', now() - state_change)) as state_days, successtime.build_time as successtime, anytime.build_time as anytime FROM ' . - table_name() . - ' left join ( '. - 'select distinct on (package, distribution) build_time, package, distribution from '.pkg_history_table_name().' where result = \'successful\' order by package, distribution, timestamp desc '. - ' ) as successtime using (package, distribution) '. - ' left join ( '. - 'select distinct on (package, distribution) build_time, package, distribution from '.pkg_history_table_name().' order by package, distribution, timestamp desc'. - ' ) as anytime using (package, distribution) ' - . ' WHERE distribution = ? '; - my @args = ($distribution); + my $q = "SELECT rel, priority, state_change, permbuildpri, section, buildpri, failed, state, binary_nmu_changelog, bd_problem, version, package, distribution, installed_version, notes, failed_category, builder, old_failed, previous_state, binary_nmu_version, depends, extract(days from date_trunc('days', now() - state_change)) as state_days" +# . ", (SELECT max(build_time) FROM ".pkg_history_table_name()." WHERE pkg_history.package = packages.package AND pkg_history.distribution = packages.distribution AND result = 'successful') AS successtime" +# . ", (SELECT max(build_time) FROM ".pkg_history_table_name()." WHERE pkg_history.package = packages.package AND pkg_history.distribution = packages.distribution ) AS anytime" + . ", successtime.build_time as successtime, anytime.build_time as anytime" + . " FROM " . table_name() + . " left join ( " + . "select distinct on (package, distribution) build_time, package, distribution from ".pkg_history_table_name()." where result = 'successful' order by package, distribution, timestamp " + . " ) as successtime using (package, distribution) " + . " left join ( " + . "select distinct on (package, distribution) build_time, package, distribution from ".pkg_history_table_name()." order by package, distribution, timestamp desc" + . " ) as anytime using (package, distribution) " + . " WHERE TRUE "; + my @args = (); + if ($distribution) { + my @dists = split(/[, ]+/, $distribution); + $q .= ' AND ( distribution = ? '.(' OR distribution = ? ' x $#dists).' )'; + foreach my $d ( @dists ) { + push @args, ($d); + } + } if ($options{state} && uc($options{state}) ne "ALL") { $q .= ' AND upper(state) = ? '; push @args, uc($options{state}); } - if ($options{user}) { + if ($options{user} && uc($options{state}) ne "NEEDS-BUILD") { # if it's NEEDS-BUILD, we don't look at users #this basically means "this user, or no user at all": - $q .= ' AND (builder = ? OR upper(state) = ?)'; + $q .= " AND (builder = ? OR upper(state) = 'NEEDS-BUILD')"; push @args, $options{user}; - push @args, "NEEDS-BUILD"; } if ($options{category}) {