X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=bin%2Fwanna-build;h=4e46b67ec3b92c583ba3f2bb7e55c2649ba86125;hb=41285392dd9b71b9a5f43a3df0a0a9769f127526;hp=313bc0b7d490a773bfc657fdad4eea3e0d7e9cfe;hpb=166ff5a00320bdce3b06dd34a5dfcd9e567568bd;p=wannabuild.git diff --git a/bin/wanna-build b/bin/wanna-build index 313bc0b..4e46b67 100755 --- a/bin/wanna-build +++ b/bin/wanna-build @@ -44,7 +44,7 @@ use WannaBuild; our ($verbose, $mail_logs, $list_order, $list_state, $curr_date, $op_mode, $user, $real_user, $distribution, - $fail_reason, $opt_override, $import_from, $opt_create_db, + $fail_reason, $opt_override, $import_from, $export_to, $opt_create_db, %prioval, %sectval, $info_all_dists, $arch, $category, %catval, %short_category, @@ -181,6 +181,7 @@ my %options = $list_min_age *= -1; } }, # special actions + export => { arg => \$export_to, mode => "export" }, import => { arg => \$import_from, mode => "import" }, "manual-edit" => { mode => "manual-edit" }, ); @@ -250,7 +251,7 @@ if ($verbose) { print "wanna-build $version for $distribution on $arch\n"; } -if (!@ARGV && !isin( $op_mode, qw(list merge-quinn merge-partial-quinn import +if (!@ARGV && !isin( $op_mode, qw(list merge-quinn merge-partial-quinn import export merge-packages manual-edit merge-sources))) { warn "No packages given.\n"; @@ -363,6 +364,7 @@ sub process { die "This operation is restricted to admin users\n" if (defined @conf::admin_users and !isin( $real_user, @conf::admin_users)); + lock_table(); parse_quinn_diff(1); last SWITCH; }; @@ -370,6 +372,7 @@ sub process { die "This operation is restricted to admin users\n" if (defined @conf::admin_users and !isin( $real_user, @conf::admin_users)); + lock_table(); parse_quinn_diff(0); last SWITCH; }; @@ -377,6 +380,7 @@ sub process { die "This operation is restricted to admin users\n" if (defined @conf::admin_users and !isin( $real_user, @conf::admin_users)); + lock_table(); parse_packages(); last SWITCH; }; @@ -384,6 +388,7 @@ sub process { die "This operation is restricted to admin users\n" if (defined @conf::admin_users and !isin( $real_user, @conf::admin_users)); + lock_table(); parse_sources(0); last SWITCH; }; @@ -395,6 +400,7 @@ sub process { die "This operation is restricted to admin users\n" if (defined @conf::admin_users and !isin( $real_user, @conf::admin_users)); + lock_table(); my @ARGS = @ARGV; @ARGV = ( $ARGS[0] ); my $pkgs = parse_packages(); @@ -417,6 +423,10 @@ sub process { read_db( $import_from ); last SWITCH; }; + /^export/ && do { + export_db( $export_to ); + last SWITCH; + }; die "Unexpected operation mode $op_mode\n"; } @@ -1016,8 +1026,14 @@ sub set_one_binnmu { return; } - change_state( \$pkg, 'BD-Uninstallable' ); - $pkg->{'bd_problem'} = "Installability of build dependencies not tested yet"; + if ($distribution eq "unstable") { + change_state( \$pkg, 'BD-Uninstallable' ); + $pkg->{'bd_problem'} = "Installability of build dependencies not tested yet"; + } + else + { + change_state( \$pkg, 'Needs-Build' ); + } delete $pkg->{'builder'}; delete $pkg->{'depends'}; $pkg->{'binary_nmu_version'} = $binNMUver; @@ -1146,6 +1162,8 @@ sub parse_sources { my $name; my $full = shift; + my $db = get_all_source_info(); + local($/) = ""; # read in paragraph mode while( <> ) { my( $version, $arch, $section, $priority, $builddep, $buildconf, $binaries ); @@ -1166,7 +1184,7 @@ sub parse_sources { $pkgs{$name}{'bin'} = $binaries; $pkgs{$name}{'dep'} = $builddep; $pkgs{$name}{'conf'} = $buildconf; - my $pkg = get_source_info($name); + my $pkg = $db->{$name}; if (defined $pkg) { my $change = 0; @@ -1244,6 +1262,7 @@ sub parse_sources { sub parse_packages { my $installed; + my $pkgs = get_all_source_info(); local($/) = ""; # read in paragraph mode while( <> ) { my( $name, $version, $depends, $source, $sourcev, $architecture, $provides, $binaryv, $binnmu ); @@ -1285,7 +1304,7 @@ sub parse_packages { next if defined($merge_srcvers{$name}) and $merge_srcvers{$name} eq $version; $merge_srcvers{$name} = $version; - my $pkg = get_source_info($name); + my $pkg = $pkgs->{$name}; if (defined $pkg) { if (isin( $pkg->{'state'}, qw(Not-For-Us)) || @@ -1434,6 +1453,8 @@ sub parse_quinn_diff { my %quinn_pkgs; my $dubious = ""; + my $pkgs = get_all_source_info(); + while( <> ) { my $change = 0; next if !m,^([-\w\d/]*)/ # section @@ -1448,7 +1469,7 @@ sub parse_quinn_diff { $priority = "unknown" if $priority eq "-"; $priority = "standard" if ($name eq "debian-installer"); - my $pkg = get_source_info($name); + my $pkg = $pkgs->{$name}; # Always update section and priority. if (defined($pkg)) { @@ -1979,6 +2000,32 @@ sub check_entry { ) ); } +sub export_db { + my $file = shift; + my($name,$pkg,$key); + + print "Writing ASCII database to $file..." if $verbose >= 1; + open( F, ">$file" ) or + die "Can't open export $file: $!\n"; + + my $db = get_all_source_info(); + foreach $name (keys %$db) { + next if $name =~ /^_/; + my $pkg = $db->{$name}; + foreach $key (keys %{$pkg}) { + my $val = $pkg->{$key}; + next if !defined($val); + $val =~ s/\n*$//; + $val =~ s/^/ /mg; + $val =~ s/^ +$/ ./mg; + print F "$key: $val\n"; + } + print F "\n"; + } + close( F ); + print "done\n" if $verbose >= 1; +} + sub change_state { my $pkgr = shift; my $pkg = $$pkgr; @@ -2015,13 +2062,13 @@ sub log_ta { "changed from $prevstate to $pkg->{'state'} ". "by $real_user as $user"; - my $transactlog = db_transactlog(); - if (!open( LOG, ">>$transactlog" )) { - warn "Can't open log file $transactlog: $!\n"; - return; - } - print LOG "$curr_date: $str\n"; - close( LOG ); + $dbh->do('INSERT INTO ' . transactions_table_name() . + ' (package, distribution, version, action, ' . + ' prevstate, state, real_user, set_user, time) ' . + ' values (?, ?, ?, ?, ?, ?, ?, ?, ?)', + undef, $pkg->{'package'}, $distribution, + $pkg->{'version'}, $action, $prevstate, $pkg->{'state'}, + $real_user, $user, 'now()') or die $dbh->errstr; if (!($prevstate eq 'Failed' && $pkg->{'state'} eq 'Failed')) { $str .= " (with --override)" @@ -2053,10 +2100,6 @@ sub send_mail { close( PIPE ); } -sub db_transactlog { - return "$conf::basedir/$arch/$conf::transactlog"; -} - # for parsing input to dep-wait sub parse_deplist { my $deps = shift; @@ -2268,7 +2311,7 @@ sub call_edos_depcheck { open SOURCES, '>', $tmpfile or die "Could not open temporary file $tmpfile\n"; for my $key (keys %interesting_packages) { - my $pkg = get_source_info($key); + 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'}; @@ -2304,7 +2347,7 @@ sub call_edos_depcheck { unlink( $tmpfile ); for my $key (keys %interesting_packages) { - my $pkg = get_source_info($key); + my $pkg = $db->{$key}; my $change = (defined $interesting_packages{$key} and $pkg->{'state'} eq 'Needs-Build') || (not defined $interesting_packages{$key} and $pkg->{'state'} eq 'BD-Uninstallable'); @@ -2377,6 +2420,7 @@ Options: if -l is missing, set user name to be entered in db; usually automatically choosen --import FILE: Import database from a ASCII file FILE + --export FILE: Export database to a ASCII file FILE The remaining arguments (depending on operation) usually start with "name_version", the trailer is ignored. This allows to pass the names @@ -2407,6 +2451,10 @@ sub user_table_name { return '"' . $arch . $schema_suffix . '".users'; } +sub transactions_table_name { + return '"' . $arch . $schema_suffix . '".transactions'; +} + sub get_readonly_source_info { my $name = shift; my $pkg = $dbh->selectrow_hashref('SELECT * FROM ' . @@ -2419,7 +2467,7 @@ sub get_source_info { my $name = shift; my $pkg = $dbh->selectrow_hashref('SELECT * FROM ' . table_name() . ' WHERE package = ? AND distribution = ?' . - 'FOR UPDATE', + ' FOR UPDATE', undef, $name, $distribution); return $pkg; } @@ -2430,7 +2478,7 @@ sub get_all_source_info { my $q = 'SELECT * FROM ' . table_name() . ' WHERE distribution = ? '; my @args = ($distribution); - if (uc($options{state}) ne "ALL") { + if ($options{state} && uc($options{state}) ne "ALL") { $q .= ' AND upper(state) = ? '; push @args, uc($options{state}); } @@ -2557,3 +2605,9 @@ sub add_user_info { or die $dbh->errstr; } +sub lock_table() +{ + $dbh->do('LOCK TABLE ' . table_name() . + ' IN EXCLUSIVE MODE', undef) or die $dbh->errstr; +} +