forget => { mode => "forget" },
'forget-user' => { mode => 'forget-user' },
update => { mode => "set-update" },
- "pretend-avail" => { short => "p", mode => "pretend-avail" },
"merge-v3" => { mode => "merge-v3" },
info => { short => "i", mode => "info" },
'binNMU' => { mode => 'set-binary-nmu', arg => \$binNMUver,
forget_packages( @ARGV );
last SWITCH;
};
- /^pretend-avail/ && do {
- pretend_avail( @ARGV );
- last SWITCH;
- };
/^merge-v3/ && do {
die "This operation is restricted to admin users\n"
if (defined @conf::admin_users and !isin( $real_user, @conf::admin_users) and !$simulate);
}
-sub pretend_avail {
- my ($package, $name, $version, $installed);
-
- foreach $package (@_) {
- $package =~ s,^.*/,,; # strip path
- $package =~ s/\.(dsc|diff\.gz|tar\.gz|deb)$//; # strip extension
- $package =~ s/_[\w\d]+\.changes$//; # strip extension
- if ($package =~ /^([\w\d.+-]+)_([\w\d:.+~-]+)/) {
- ($name,$version) = ($1,$2);
- }
- else {
- warn "$package: can't extract package name and version ".
- "(bad format)\n";
- next;
- }
- $installed->{$name}{'version'} = $version;
- }
-
- check_dep_wait( "--pretend-avail", $installed );
-}
-
-sub check_dep_wait {
- my $action = shift;
- my $installed = shift;
-
- # check all packages in state Dep-Wait if dependencies are all
- # available now
- my $name;
- my $db = get_all_source_info();
- foreach $name (keys %$db) {
- next if $name =~ /^_/;
- my $pkg = $db->{$name};
- next if $pkg->{'state'} ne "Dep-Wait";
- my $deps = $pkg->{'depends'};
- if (!$deps) {
- print "$name: was in state Dep-Wait, but with empty ",
- "dependencies!\n";
- goto make_needs_build;
- }
- my $deplist = parse_deplist($deps);
- my $new_deplist;
- my $allok = 1;
- my @removed_deps;
- foreach (keys %$deplist) {
- if (!exists $installed->{$_} ||
- ($deplist->{$_}->{'rel'} && $deplist->{$_}->{'version'} &&
- !version_compare( $installed->{$_}{'version'},
- $deplist->{$_}->{'rel'},
- $deplist->{$_}->{'version'}))) {
- $allok = 0;
- $new_deplist->{$_} = $deplist->{$_};
- }
- else {
- push( @removed_deps, $_ );
- }
- }
- if ($allok) {
- make_needs_build:
- change_state( \$pkg, 'Needs-Build' );
- log_ta( $pkg, $action );
- delete $pkg->{'builder'};
- delete $pkg->{'depends'};
- print "$name ($pkg->{'version'}) has all ",
- "dependencies available now\n" if $verbose;
- $new_vers{$name}++;
- update_source_info($pkg);
- }
- elsif (@removed_deps) {
- $pkg->{'depends'} = build_deplist( $new_deplist );
- print "$name ($pkg->{'version'}): some dependencies ",
- "(@removed_deps) available now, but not all yet\n"
- if $verbose;
- update_source_info($pkg);
- }
- }
-}
-
-
# for sorting priorities and sections
BEGIN {
%prioval = ( required => -5,
'C' => ['<->', sub { return $_[0]->{'calprio'}; }],
'W' => ['<->', sub { return $_[0]->{'state_days'}; }],
'P' => ['<->', sub { return $_[0]->{'buildpri'}; }],
- 'p' => ['<=>', sub { return $prioval{$_[0]->{'priority'}}; }],
- 's' => ['<=>', sub { return $sectval{$_[0]->{'section'}}; }],
+ 'p' => ['<=>', sub { return $prioval{$_[0]->{'priority'}//""}//0; }],
+ 's' => ['<=>', sub { return $sectval{$_[0]->{'section'}//""}//0; }],
'n' => ['cmp', sub { return $_[0]->{'package'}; }],
'b' => ['cmp', sub { return $_[0]->{'builder'}; }],
- 'c' => ['<=>', sub { return ($_[0]->{'notes'} =~ /^(out-of-date|partial)/) ? 0: ($_[0]->{'notes'} =~ /^uncompiled/) ? 2 : 1; }],
+ 'c' => ['<=>', sub { return ($_[0]->{'notes'}//"" =~ /^(out-of-date|partial)/) ? 0: ($_[0]->{'notes'}//"" =~ /^uncompiled/) ? 2 : 1; }],
'f' => ['<=>', sub { return $catval{ $_[0]->{'failed_category'} ? $_[0]->{'failed_category'}: "none" }; }],
- 'S' => ['<=>', sub { return $prioval{$_[0]->{'priority'}} > $prioval{'standard'}; }],
+ 'S' => ['<->', sub { return isin($_[0]->{'priority'}, qw(required important standard)); }],
'T' => ['<->', sub { return $_[0]->{'state_time'} % 86400;} ], # Fractions of a day
};
foreach my $letter (split( //, $list_order )) {
my $r;
- $r = &{$map_funcs->{$letter}[1]}($b) <=> &{$map_funcs->{$letter}[1]}($a) if $map_funcs->{$letter}[0] eq '<->';
- $r = &{$map_funcs->{$letter}[1]}($a) <=> &{$map_funcs->{$letter}[1]}($b) if $map_funcs->{$letter}[0] eq '<=>';
- $r = &{$map_funcs->{$letter}[1]}($a) cmp &{$map_funcs->{$letter}[1]}($b) if $map_funcs->{$letter}[0] eq 'cmp';
+ $r = (&{$map_funcs->{$letter}[1]}($b)//0 ) <=> (&{$map_funcs->{$letter}[1]}($a)//0 ) if $map_funcs->{$letter}[0] eq '<->';
+ $r = (&{$map_funcs->{$letter}[1]}($a)//0 ) <=> (&{$map_funcs->{$letter}[1]}($b)//0 ) if $map_funcs->{$letter}[0] eq '<=>';
+ $r = (&{$map_funcs->{$letter}[1]}($a)//"") cmp (&{$map_funcs->{$letter}[1]}($b)//"") if $map_funcs->{$letter}[0] eq 'cmp';
return $r if $r != 0;
}
return 0;
'S' => make_fmt( $pkg->{'state'}, $pkg, $var),
'u' => make_fmt( $pkg->{'builder'}, $pkg, $var),
'X' => make_fmt( sub {
+ 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'};
BD-Uninstallable, until the installability of its Build-Dependencies
were verified. This happens at each call of --merge-all, usually
every 15 minutes.
- --pretend-avail: Pretend that given packages are available now and give
- free packages waiting for them
-i SRC_PKG, --info SRC_PKG: Show information for source package
-l STATE, --list=STATE: List all packages in state STATE; can be
combined with -U to restrict to a specific user; STATE can
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))) {
+ if (isin($pkgs->{'status'}, qw (installed related auto-not-for-us))) {
my $change = 0;
- if ($pkg->{'state'} ne 'Installed') {
- change_state( \$pkg, 'Installed');
- delete $pkg->{'depends'};
- delete $pkg->{'extra_depends'};
- delete $pkg->{'extra_conflicts'};
+ my $tstate = {'installed' => 'Installed', 'related' => 'Installed', 'auto-not-for-us' => 'Auto-Not-For-Us'}->{$pkgs->{'status'}};
+ next if isin( $pkg->{'state'}, qw<Not-For-Us Failed Failed-Removed Dep-Wait Dep-Wait-Removed>) && isin( $tstate, qw<Auto-Not-For-Us>);
+ # if the package is currently current, the status is Installed, not not-for-us
+ if ($pkg->{'state'} ne $tstate) {
+ change_state( \$pkg, $tstate);
+ if (isin( $tstate, qw<Installed>)) {
+ delete $pkg->{'depends'};
+ delete $pkg->{'extra_depends'};
+ delete $pkg->{'extra_conflicts'};
+ }
$change++;
}
my $attrs = { 'version' => 'version', 'installed_version' => 'version', 'binary_nmu_version' => 'binnmu', 'section' => 'section', 'priority' => 'priority' };
foreach my $k (keys %$attrs) {
+ next if isin( $tstate, qw<Auto-Not-For-Us>) && isin( $k, qw<installed_version binary_nmu_version>);
if (($pkg->{$k}//"") ne ($pkgs->{$attrs->{$k}}//"")) {
$pkg->{$k} = $pkgs->{$attrs->{$k}};
$change++;
$change++;
}
if ($change) {
- print "$logstr set to installed/".($pkg->{'notes'}//"")."\n" if $verbose || $simulate;
- log_ta( $pkg, "--merge-v3: installed" ) unless $simulate;
+ print "$logstr set to $tstate/".($pkg->{'notes'}//"")."\n" if $verbose || $simulate;
+ log_ta( $pkg, "--merge-v3: $tstate" ) unless $simulate;
update_source_info($pkg) unless $simulate;
}
next;
next;
}
- if ($pkgs->{'status'} eq 'auto-not-for-us') {
- next if isin( $pkg->{'state'}, qw(Not-For-Us Failed Failed-Removed Dep-Wait Dep-Wait-Removed Auto-Not-For-Us));
- # if the package is currently current, the status is Installed, not not-for-us
-
- change_state( \$pkg, "Auto-Not-For-Us" );
- log_ta( $pkg, "--merge-v3: Auto-Not-For-Us" ) unless $simulate;
- update_source_info($pkg) unless $simulate;
- print "$logstr set to auto-not-for-us\n" if $verbose || $simulate;
- next SRCS;
- }
-
# 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";