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,
'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";