X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=bin%2Fwanna-build;h=313bc0b7d490a773bfc657fdad4eea3e0d7e9cfe;hb=166ff5a00320bdce3b06dd34a5dfcd9e567568bd;hp=785effb6be45ecc5400ec37c49baf410859e63a5;hpb=162274bfcba6861853de42dc36e51cf5e5ed7815;p=wannabuild.git diff --git a/bin/wanna-build b/bin/wanna-build index 785effb..313bc0b 100755 --- a/bin/wanna-build +++ b/bin/wanna-build @@ -173,13 +173,12 @@ my %options = code => sub { die "Argument of --min-age must be a non-zero number\n" if $list_min_age == 0; - $list_min_age *= 24*60*60; } }, "max-age" => { arg => \$list_min_age, code => sub { die "Argument of --max-age must be a non-zero number\n" if $list_min_age == 0; - $list_min_age *= -24*60*60; + $list_min_age *= -1; } }, # special actions import => { arg => \$import_from, mode => "import" }, @@ -303,8 +302,7 @@ END { } my $schema_suffix = ''; -# TODO: Base this on something else, like an option that is passed. -if ($real_user eq 'nobody') { +if (isin( $op_mode, qw(list info)) && $distribution !~ /security/ && !(not -t and $user =~ /-/)) { $dbh = DBI->connect("DBI:Pg:service=wanna-build") || die "FATAL: Cannot open database: $DBI::errstr\n"; $schema_suffix = '_public'; @@ -1761,19 +1759,10 @@ sub list_packages { my %scnt; my $ctime = time; - my $db = get_all_source_info(); + my $db = get_all_source_info(state => $state, user => $user, category => $category, list_min_age => $list_min_age); foreach $name (keys %$db) { next if $name =~ /^_/; - $pkg = $db->{$name}; - next if $state ne "all" && $pkg->{'state'} !~ /^\Q$state\E$/i; - next if $user && (lc($state) ne 'needs-build' and $pkg->{'builder'} ne $user); - next if $category && $pkg->{'state'} eq "Failed" && - $pkg->{'failed_category'} ne $category; - next if ($list_min_age > 0 && - ($ctime-parse_date($pkg->{'state_change'})) < $list_min_age)|| - ($list_min_age < 0 && - ($ctime-parse_date($pkg->{'state_change'})) > -$list_min_age); - push( @list, $pkg ); + push @list, $db->{$name}; } foreach $pkg (sort sort_list_func @list) { @@ -1832,7 +1821,7 @@ sub info_packages { foreach $dist (@dists) { my $pname = "$name" . ($info_all_dists ? "($dist)" : ""); - $pkg = get_source_info($name); + $pkg = get_readonly_source_info($name); if (!defined( $pkg )) { print "$pname: not registered\n"; next; @@ -2418,6 +2407,14 @@ sub user_table_name { return '"' . $arch . $schema_suffix . '".users'; } +sub get_readonly_source_info { + my $name = shift; + my $pkg = $dbh->selectrow_hashref('SELECT * FROM ' . + table_name() . ' WHERE package = ? AND distribution = ?', + undef, $name, $distribution); + return $pkg; +} + sub get_source_info { my $name = shift; my $pkg = $dbh->selectrow_hashref('SELECT * FROM ' . @@ -2428,9 +2425,40 @@ sub get_source_info { } sub get_all_source_info { - my $db = $dbh->selectall_hashref('SELECT * FROM ' . table_name() . - ' WHERE distribution = ?', - 'package', undef, $distribution); + my %options = @_; + + my $q = 'SELECT * FROM ' . table_name() + . ' WHERE distribution = ? '; + my @args = ($distribution); + if (uc($options{state}) ne "ALL") { + $q .= ' AND upper(state) = ? '; + push @args, uc($options{state}); + } + + if ($options{user}) { + #this basically means "this user, or no user at all": + $q .= ' AND (builder = ? OR upper(state) = ?)'; + push @args, $options{user}; + push @args, "NEEDS-BUILD"; + } + + if ($options{category}) { + $q .= ' AND failed_category <> ? AND upper(state) = ? '; + push @args, $options{category}; + push @args, "FAILED"; + } + + if ($options{list_min_age} > 0) { + $q .= ' AND age(state_change::timestamp) > ? '; + push @args, $options{list_min_age} . " days"; + } + + if ($options{list_min_age} < 0) { + $q .= ' AND age(state_change::timestamp) < ? days '; + push @args, -$options{list_min_age} . " days"; + } + + my $db = $dbh->selectall_hashref($q, 'package', undef, @args); return $db; }