]> git.donarmstrong.com Git - wannabuild.git/blobdiff - bin/wanna-build
Rename variable to avoid confusion.
[wannabuild.git] / bin / wanna-build
index 313bc0b7d490a773bfc657fdad4eea3e0d7e9cfe..4e46b67ec3b92c583ba3f2bb7e55c2649ba86125 100755 (executable)
@@ -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;
+}
+