X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=bin%2Fwanna-build;h=57134d7d46d79a6a2f7ec2a2cd3f39267fb14a54;hb=6c64427ef615db5fc98e676e11e50e3c90706fe8;hp=fd9d3a2dc7cc3446069af9d0b444ea3cf95b2dc1;hpb=2be65c76d44ad230276a886b49aca56951b05b78;p=wannabuild.git diff --git a/bin/wanna-build b/bin/wanna-build index fd9d3a2..57134d7 100755 --- a/bin/wanna-build +++ b/bin/wanna-build @@ -150,6 +150,7 @@ GetOptions( reupload-wait bd-uninstallable ) ]; }, 'dist|d=s' => sub { + $distribution = $_[1]; given ( $_[1] ) { when ( [qw< a all >] ) { $info_all_dists = 1; @@ -182,8 +183,8 @@ GetOptions( 'extra-conflicts=s' => \$extra_conflicts, # special actions - 'export' => sub { _set_mode(@_); $export_to = $_[1]; }, - 'import' => sub { _set_mode(@_); $import_from = $_[1]; }, + 'export=s' => sub { _set_mode(@_); $export_to = $_[1]; }, + 'import=s' => sub { _set_mode(@_); $import_from = $_[1]; }, 'manual-edit' => \&_set_mode, 'distribution-architectures' => \&_set_mode, 'distribution-aliases' => \&_set_mode, @@ -464,42 +465,59 @@ sub add_packages { "(bad format)\n"; next; } + my $pkg = get_source_info($name); + if (!isin($op_mode, qw) && (!defined($pkg))) { + print "$name: not registered yet.\n"; + next; + } + if (isin($op_mode, qw)) { + if ($pkg->{'builder'} && $user ne $pkg->{'builder'}) { + print "$pkg->{'package'}: not taken by you, but by $pkg->{'builder'}. Skipping.\n"; + next; + } + } + if (!isin($op_mode, qw)) { + if ( !pkg_version_eq($pkg,$version)) { + print "$pkg->{package}: version mismatch ($pkg->{'version'} by $pkg->{'builder'})\n"; + next; + } + } if ($op_mode eq "set-building") { - add_one_building( $name, $version ); + add_one_building( $name, $version, $pkg ); } elsif ($op_mode eq "set-built") { - add_one_built( $name, $version ); + add_one_built( $pkg ); } elsif ($op_mode eq "set-attempted") { - add_one_attempted( $name, $version ); + add_one_attempted( $pkg ); } elsif ($op_mode eq "set-uploaded") { - add_one_uploaded( $name, $version ); + add_one_uploaded( $name, $version, $pkg ); } elsif ($op_mode eq "set-failed") { - add_one_failed( $name, $version ); + add_one_failed( $pkg ); } elsif ($op_mode eq "set-not-for-us") { - add_one_notforus( $name, $version ); + add_one_notforus( $pkg ); } elsif ($op_mode eq "set-needs-build") { - add_one_needsbuild( $name, $version ); + add_one_needsbuild( $pkg ); } elsif ($op_mode eq "set-dep-wait") { - add_one_depwait( $name, $version ); + add_one_depwait( $pkg ); } elsif ($op_mode eq "set-build-priority") { - set_one_buildpri( $name, $version, 'buildpri' ); + set_one_buildpri( 'buildpri', $pkg ); } elsif ($op_mode eq "set-permanent-build-priority") { - set_one_buildpri( $name, $version, 'permbuildpri' ); + set_one_buildpri( 'permbuildpri', $pkg ); } elsif ($op_mode eq "set-binary-nmu") { - set_one_binnmu( $name, $version ); + set_one_binnmu( $name, $version, $pkg ); } elsif ($op_mode eq "set-update") { - set_one_update( $name, $version ); + set_one_update( $pkg ); } } } @@ -510,7 +528,7 @@ sub add_one_building { my( $ok, $reason ); $ok = 1; - my $pkg = get_source_info($name); + my $pkg = shift; if (defined($pkg)) { if ($pkg->{'state'} eq "Not-For-Us") { $ok = 0; @@ -665,30 +683,15 @@ sub add_one_building { } sub add_one_attempted { - my $name = shift; - my $version = shift; - my $pkg = get_source_info($name); - - if (!defined($pkg)) { - print "$name: not registered yet.\n"; - return; - } + my $pkg = shift; + my $state = $pkg->{'state'}; + my $name = $pkg->{'package'}; if (($pkg->{'state'} ne "Building") && ($pkg->{'state'} ne "Build-Attempted")) { print "$name: not taken for building (state is $pkg->{'state'}). ", "Skipping.\n"; return; } - if ($pkg->{'builder'} ne $user) { - print "$name: not taken by you, but by $pkg->{'builder'}. Skipping.\n"; - return; - } - elsif ( !pkg_version_eq($pkg, $version) ) { - print "$name: version mismatch ". - "$(pkg->{'version'} ". - "by $pkg->{'builder'})\n"; - return; - } change_state( \$pkg, 'Build-Attempted' ); log_ta( $pkg, "--attempted" ); @@ -697,30 +700,16 @@ sub add_one_attempted { } sub add_one_built { - my $name = shift; - my $version = shift; - my $pkg = get_source_info($name); - - if (!defined($pkg)) { - print "$name: not registered yet.\n"; - return; - } + my $pkg = shift; + my $state = $pkg->{'state'}; + my $name = $pkg->{'package'}; if (($pkg->{'state'} ne "Building") && ($pkg->{'state'} ne "Build-Attempted")) { print "$name: not taken for building (state is $pkg->{'state'}). ", "Skipping.\n"; return; } - if ($pkg->{'builder'} ne $user) { - print "$name: not taken by you, but by $pkg->{'builder'}. Skipping.\n"; - return; - } - elsif ( !pkg_version_eq($pkg, $version) ) { - print "$name: version mismatch ". - "$(pkg->{'version'} ". - "by $pkg->{'builder'})\n"; - return; - } + change_state( \$pkg, 'Built' ); log_ta( $pkg, "--built" ); update_source_info($pkg); @@ -730,12 +719,7 @@ sub add_one_built { sub add_one_uploaded { my $name = shift; my $version = shift; - my $pkg = get_source_info($name); - - if (!defined($pkg)) { - print "$name: not registered yet.\n"; - return; - } + my $pkg = shift; if ($pkg->{'state'} eq "Uploaded" && pkg_version_eq($pkg,$version)) { @@ -747,10 +731,6 @@ sub add_one_uploaded { "Skipping.\n"; return; } - if ($pkg->{'builder'} ne $user) { - print "$name: not taken by you, but by $pkg->{'builder'}. Skipping.\n"; - return; - } # strip epoch -- buildd-uploader used to go based on the filename. # (to remove at some point) my $pkgver; @@ -776,16 +756,9 @@ sub add_one_uploaded { } sub add_one_failed { - my $name = shift; - my $version = shift; - my $state; - my $pkg = get_source_info($name); - - if (!defined($pkg)) { - print "$name: not registered yet.\n"; - return; - } - $state = $pkg->{'state'}; + 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"; @@ -806,28 +779,9 @@ sub add_one_failed { "$pkg->{'builder'}. Skipping.\n"; return; } - elsif ( !pkg_version_eq($pkg, $version) ) { - print "$name: version mismatch ". - "$(pkg->{'version'} ". - "by $pkg->{'builder'})\n"; - return; - } - if ($state eq "Needs-Build") { - print "$name: Warning: not registered for building previously, ". - "but processing anyway.\n"; - } - elsif ($state eq "Uploaded") { - print "$name: Warning: marked as uploaded previously, ". - "but processing anyway.\n"; - } - elsif ($state eq "Dep-Wait") { - print "$name: Warning: marked as waiting for dependencies, ". - "but processing anyway.\n"; - } - elsif ($state eq "BD-Uninstallable") { - print "$name: Warning: marked as having uninstallable build-dependencies, ". - "but processing anyway.\n"; + 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" @@ -838,20 +792,15 @@ sub add_one_failed { $pkg->{'builder'} = $user; $pkg->{'failed'} .= "\n" if $pkg->{'failed'}; $pkg->{'failed'} .= $fail_reason; - if (defined $pkg->{'permbuildpri'}) { - $pkg->{'buildpri'} = $pkg->{'permbuildpri'}; - } else { - delete $pkg->{'buildpri'}; - } log_ta( $pkg, "--failed" ); update_source_info($pkg); print "$name: registered as failed\n" if $verbose; } sub add_one_notforus { - my $name = shift; - my $version = shift; - my $pkg = get_source_info($name); + my $pkg = shift; + my $state = $pkg->{'state'}; + my $name = $pkg->{'package'}; if ($pkg->{'state'} eq 'Not-For-Us') { # reset Not-For-Us state in case it's called twice; this is @@ -880,7 +829,6 @@ sub add_one_notforus { $pkg->{'package'} = $name; delete $pkg->{'builder'}; delete $pkg->{'depends'}; - delete $pkg->{'buildpri'}; delete $pkg->{'binary_nmu_version'}; delete $pkg->{'binary_nmu_changelog'}; log_ta( $pkg, "--no-build" ); @@ -899,16 +847,9 @@ sub add_one_notforus { } sub add_one_needsbuild { - my $name = shift; - my $version = shift; - my $state; - my $pkg = get_source_info($name); - - if (!defined($pkg)) { - print "$name: not registered; can't give back.\n"; - return; - } - $state = $pkg->{'state'}; + my $pkg = shift; + my $state = $pkg->{'state'}; + my $name = $pkg->{'package'}; if ($state eq "BD-Uninstallable") { if ($opt_override) { @@ -957,11 +898,6 @@ sub add_one_needsbuild { "$pkg->{'builder'}. Skipping.\n"; return; } - if (!pkg_version_eq($pkg, $version)) { - print "$name: version mismatch ($pkg->{'version'} registered). ", - "Skipping.\n"; - return; - } if (!defined $distributions{$distribution}{noadw}) { change_state( \$pkg, 'BD-Uninstallable' ); $pkg->{'bd_problem'} = "Installability of build dependencies not tested yet"; @@ -978,21 +914,8 @@ sub add_one_needsbuild { sub set_one_binnmu { my $name = shift; my $version = shift; - my $pkg = get_source_info($name); - my $state; - - if (!defined($pkg)) { - print "$name: not registered; can't register for binNMU.\n"; - return; - } - my $db_ver = $pkg->{'version'}; - - if (!version_eq($db_ver, $version)) { - print "$name: version mismatch ($db_ver registered). ", - "Skipping.\n"; - return; - } - $state = $pkg->{'state'}; + my $pkg = shift; + my $state = $pkg->{'state'}; if (defined $pkg->{'binary_nmu_version'}) { if ($binNMUver == 0) { @@ -1001,6 +924,7 @@ sub set_one_binnmu { delete $pkg->{'depends'}; delete $pkg->{'binary_nmu_version'}; delete $pkg->{'binary_nmu_changelog'}; + delete $pkg->{'buildpri'}; } elsif ($binNMUver <= $pkg->{'binary_nmu_version'}) { print "$name: already building binNMU $pkg->{'binary_nmu_version'}\n"; return; @@ -1008,8 +932,7 @@ sub set_one_binnmu { $pkg->{'binary_nmu_version'} = $binNMUver; $pkg->{'binary_nmu_changelog'} = $fail_reason; $pkg->{'notes'} = 'out-of-date'; - $pkg->{'buildpri'} = $pkg->{'permbuildpri'} - if (defined $pkg->{'permbuildpri'}); + delete $pkg->{'buildpri'}; if (defined $distributions{$distribution}{noadw}) { change_state( \$pkg, 'Installed' ); } else { @@ -1049,23 +972,17 @@ sub set_one_binnmu { $pkg->{'binary_nmu_version'} = $binNMUver; $pkg->{'binary_nmu_changelog'} = $fail_reason; $pkg->{'notes'} = 'out-of-date'; + delete $pkg->{'buildpri'}; log_ta( $pkg, "--binNMU" ); update_source_info($pkg); print "${name}: registered for binNMU $fullver\n" if $verbose; } sub set_one_buildpri { - my $name = shift; - my $version = shift; my $key = shift; - my $pkg = get_source_info($name); - my $state; - - if (!defined($pkg)) { - print "$name: not registered; can't set priority.\n"; - return; - } - $state = $pkg->{'state'}; + 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"; @@ -1074,36 +991,19 @@ sub set_one_buildpri { print "$name: failed previously and doesn't need building. Skipping.\n"; return; } - if (!pkg_version_eq($pkg, $version)) { - print "$name: version mismatch ($pkg->{'version'} registered). ", - "Skipping.\n"; - return; - } - if ( $build_priority == 0 ) { - delete $pkg->{'buildpri'} - if $key eq 'permbuildpri' and defined $pkg->{'buildpri'} - and $pkg->{'buildpri'} == $pkg->{$key}; - delete $pkg->{$key}; - } else { - $pkg->{'buildpri'} = $build_priority - if $key eq 'permbuildpri'; + if ( $build_priority ) { $pkg->{$key} = $build_priority; + } else { + delete $pkg->{$key}; } update_source_info($pkg); print "$name: set to build priority $build_priority\n" if $verbose; } sub add_one_depwait { - my $name = shift; - my $version = shift; - my $state; - my $pkg = get_source_info($name); - - if (!defined($pkg)) { - print "$name: not registered yet.\n"; - return; - } - $state = $pkg->{'state'}; + my $pkg = shift; + my $state = $pkg->{'state'}; + my $name = $pkg->{'package'}; if ($state eq "Dep-Wait") { print "$name: merging with previously registered dependencies\n"; @@ -1113,46 +1013,19 @@ sub add_one_depwait { print "$name: Warning: not registered for building previously, ". "but processing anyway.\n"; } - elsif ($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 ($state eq "Uploaded") { - print "$name: Is already uploaded. Skipping.\n"; - return; - } - elsif ($pkg->{'builder'} && - $user ne $pkg->{'builder'}) { - print "$name: not taken by you, but by ". - "$pkg->{'builder'}. Skipping.\n"; - return; - } - elsif ( !pkg_version_eq($pkg,$version)) { - print "$name: version mismatch ". - "($pkg->{'version'} ". - "by $pkg->{'builder'})\n"; - return; - } - elsif ($fail_reason =~ /^\s*$/ || + + if (isin( $state, qw)) { + print "add_one_depwait: $name: skiping in state $state\n"; + return; + } + + if ($fail_reason =~ /^\s*$/ || !parse_deplist( $fail_reason, 1 )) { print "$name: Bad dependency list\n"; return; } change_state( \$pkg, 'Dep-Wait' ); $pkg->{'builder'} = $user; - if (defined $pkg->{'permbuildpri'}) { - $pkg->{'buildpri'} = $pkg->{'permbuildpri'}; - } else { - delete $pkg->{'buildpri'}; - } my $deplist = parse_deplist( $pkg->{'depends'} ); my $new_deplist = parse_deplist( $fail_reason ); # add new dependencies, maybe overwriting old entries @@ -1160,27 +1033,19 @@ sub add_one_depwait { $deplist->{$_} = $new_deplist->{$_}; } $pkg->{'depends'} = build_deplist($deplist); - log_ta( $pkg, "--dep-wait" ); - update_source_info($pkg); - print "$name: registered as waiting for dependencies\n" if $verbose; + log_ta( $pkg, "--dep-wait" ) unless $simulate; + update_source_info($pkg) unless $simulate; + print "$name: registered as waiting for dependencies\n" if $verbose || $simulate; } sub set_one_update { - my $name = shift; - my $version = shift; - my $pkg = get_source_info($name); - - if (!defined($pkg)) { - print "$name: not registered yet.\n"; - return; - } + my $pkg = shift; $pkg->{'version'} =~ s/\+b[0-9]+$//; log_ta( $pkg, "--update" ); update_source_info($pkg); } - # for sorting priorities and sections BEGIN { %prioval = ( required => -5, @@ -1256,7 +1121,7 @@ sub sort_list_func { my $map_funcs = { 'C' => ['<->', sub { return $_[0]->{'calprio'}; }], 'W' => ['<->', sub { return $_[0]->{'state_days'}; }], - 'P' => ['<->', sub { return $_[0]->{'buildpri'}; }], + 'P' => ['<->', sub { return ($_[0]->{'buildpri'}//0) + ($_[0]->{'permbuildpri'}//0); }], 'p' => ['<=>', sub { return $prioval{$_[0]->{'priority'}//""}//0; }], 's' => ['<=>', sub { return $sectval{$_[0]->{'section'}//""}//0; }], 'n' => ['cmp', sub { return $_[0]->{'package'}; }], @@ -1279,7 +1144,7 @@ sub sort_list_func { sub calculate_prio { my $priomap = $yamlmap->{priority}; my $pkg = shift; - my @s=split("/", $pkg->{'section'}); + my @s=split("/", $pkg->{'section'}//""); $pkg->{'component'} = $s[0] if $s[1]; $pkg->{'component'} ||= 'main'; $pkg->{'calprio'} = 0; @@ -1401,7 +1266,7 @@ Text could contain further %. To start with !, use %! no warnings; my $c = "$pkg->{'priority'}:$pkg->{'notes'}"; $c .= ":PREV-FAILED" if $pkg->{'previous_state'} && $pkg->{'previous_state'} =~ /^Failed/; - $c .= ":bp{" . $pkg->{'buildpri'} . "}" if defined $pkg->{'buildpri'}; + $c .= ":bp{" . (($pkg->{'buildpri'}//0)+($pkg->{'permbuildpri'}//0)) . "}" if (($pkg->{'buildpri'}//0)+($pkg->{'permbuildpri'}//0)); $c .= ":binNMU{" . $pkg->{'binary_nmu_version'} . "}" if defined $pkg->{'binary_nmu_version'}; $c .= ":calprio{". $pkg->{'calprio'}."}"; $c .= ":days{". $pkg->{'state_days'}."}"; @@ -1458,6 +1323,7 @@ sub list_packages { undef $printformat if ($ownprintformat && $ownprintformat eq 'none'); foreach $pkg (sort sort_list_func @list) { + no warnings; if ($printformat) { print print_format($printformat, $pkg, {'cnt' => $cnt, 'scnt' => \%scnt})."\n"; ++$cnt; @@ -1563,6 +1429,7 @@ sub info_packages { } sub forget_packages { + no warnings; my( $name, $pkg, $key, $data ); foreach $name (@_) { @@ -1782,6 +1649,7 @@ sub parse_deplist { my $verify = shift; my %result; + return $verify ? 0 : \%result unless $deps; foreach (split( /\s*,\s*/, $deps )) { if ($verify) { # verification requires > starting prompts, no | crap @@ -2357,12 +2225,13 @@ sub parse_all_v3 { foreach my $name (keys %$srcs) { next if $name eq '_binary'; - # state = installed, out-of-date, uncompiled, not-for-us, auto-not-for-us + # state = installed, out-of-date, uncompiled, packages-arch-specific, overwritten-by-arch-all, arch-not-in-arch-list, arch-all-only my $pkgs = $srcs->{$name}; + next if isin($pkgs->{'status'}, qw ); my $pkg = $db->{$name}; unless ($pkg) { - next SRCS if $pkgs->{'status'} eq 'not-for-us'; + next SRCS if $pkgs->{'status'} eq 'packages-arch-specific'; my $logstr = sprintf("merge-v3 %s %s_%s (%s, %s):", $vars->{'time'}, $name, $pkgs->{'version'}, $vars->{'arch'}, $vars->{'suite'}); # does at least one binary exist in the database and is more recent - if so, we're probably just outdated, ignore the source package @@ -2374,18 +2243,22 @@ sub parse_all_v3 { } $pkg->{'package'} = $name; } + $pkg->{'version'} ||= ""; + $pkg->{'state'} ||= ""; my $logstr = sprintf("merge-v3 %s %s_%s", $vars->{'time'}, $name, $pkgs->{'version'}). ($pkgs->{'binnmu'} ? ";b".$pkgs->{'binnmu'} : ""). sprintf(" (%s, %s, previous: %s", $vars->{'arch'}, $vars->{'suite'}, $pkg->{'version'}//""). ($pkg->{'binary_nmu_version'} ? ";b".$pkg->{'binary_nmu_version'} : ""). - ", $pkg->{'state'}):"; + ", $pkg->{'state'}".($pkg->{'notes'} ? "/".$pkg->{'notes'} : "")."):"; if (isin($pkgs->{'status'}, qw (installed related)) && $pkgs->{'version'} eq $pkg->{'version'} && ($pkgs->{'binnmu'}//0) < int($pkg->{'binary_nmu_version'}//0)) { $pkgs->{'status'} = 'out-of-date'; } - if (isin($pkgs->{'status'}, qw (installed related auto-not-for-us))) { + if (isin($pkgs->{'status'}, qw )) { my $change = 0; - my $tstate = {'installed' => 'Installed', 'related' => 'Installed', 'auto-not-for-us' => 'Auto-Not-For-Us'}->{$pkgs->{'status'}}; + my $tstate = {'installed' => 'Installed', 'related' => 'Installed', + 'arch-not-in-arch-list' => 'Auto-Not-For-Us', 'packages-arch-specific' => 'Auto-Not-For-Us', 'overwritten-by-arch-all' => 'Auto-Not-For-Us', 'arch-all-only' => 'Auto-Not-For-Us', + }->{$pkgs->{'status'}}; next if isin( $pkg->{'state'}, qw) && isin( $tstate, qw); # if the package is currently current, the status is Installed, not not-for-us if ($pkg->{'state'} ne $tstate) { @@ -2405,9 +2278,12 @@ sub parse_all_v3 { $change++; } } - if (isin($pkgs->{'status'}, qw (related)) and $pkg->{'notes'} ne "related") { - $pkg->{'notes'} = "related"; - $change++; + if (isin($pkgs->{'status'}, qw )) { + my $tnotes = $pkgs->{'status'}; + if (($pkg->{'notes'}//"") ne $tnotes) { + $pkg->{'notes'} = $tnotes; + $change++; + } } if ($change) { print "$logstr set to $tstate/".($pkg->{'notes'}//"")."\n" if $verbose || $simulate; @@ -2417,21 +2293,6 @@ sub parse_all_v3 { next; } - if ($pkgs->{'status'} eq 'not-for-us') { - next if isin( $pkg->{'state'}, qw(Not-For-Us Installed Failed-Removed)); - - if (isin( $pkg->{'state'}, qw(Failed Build-Attempted Built))) { - change_state( \$pkg, "Failed-Removed" ); - log_ta( $pkg, "--merge-v3: Failed-Removed" ) unless $simulate; - update_source_info($pkg) unless $simulate; - print "$logstr (virtually) deleted from database\n" if $verbose || $simulate; - next; - } - - print "$logstr should delete (not-for-us according to P-a-s)\n" if $verbose || $simulate || 1; # not implemented yet on purpose - next; - } - # only uncompiled / out-of-date are left, so check if anything new if (!(isin($pkgs->{'status'}, qw (uncompiled out-of-date)))) { print "$logstr package in unknown state: $pkgs->{'status'}\n"; @@ -2463,6 +2324,7 @@ sub parse_all_v3 { delete $pkg->{'builder'}; delete $pkg->{'binary_nmu_version'} unless $pkgs->{'binnmu'}; delete $pkg->{'binary_nmu_changelog'} unless $pkgs->{'binnmu'}; + delete $pkg->{'buildpri'}; log_ta( $pkg, "--merge-v3: needs-build" ) unless $simulate; update_source_info($pkg) unless $simulate; print "$logstr set to needs-builds\n" if $simulate || $verbose;