From 320153c99614351713a2a1bb03971a3950facfab Mon Sep 17 00:00:00 2001 From: Jamie Cameron Date: Mon, 4 Jan 2010 17:09:09 -0800 Subject: [PATCH] Fix detection of pinned versions on APT, complete manual updates check --- package-updates/package-updates-lib.pl | 60 -------------------------- software/apt-lib.pl | 41 ++++++++++++++++-- 2 files changed, 38 insertions(+), 63 deletions(-) diff --git a/package-updates/package-updates-lib.pl b/package-updates/package-updates-lib.pl index 5e2061d25..327fef666 100644 --- a/package-updates/package-updates-lib.pl +++ b/package-updates/package-updates-lib.pl @@ -85,9 +85,6 @@ if ($nocache || $expired == 2 || push(@rv, $avail); } - # Set pinned versions - &set_pinned_versions(\@rv); - # Filter out dupes and sort by name @rv = &filter_duplicates(\@rv); @@ -487,63 +484,6 @@ elsif ($software::update_system eq "apt") { } } -# set_pinned_versions(&packages) -# If on Debian, set available package versions based on APT pinning -sub set_pinned_versions -{ -my ($avail) = @_; -my @davail = grep { $_->{'system'} eq 'apt' } @$avail; -return 0 if (!@davail); -my %namemap = map { $_->{'name'}, $_ } @davail; -my $rv; -if (&has_command("apt-show-versions")) { - # Use apt-show-versions to find possible upgrades, including backports - # and pinned versions. - my $out = &backquote_command( - "LANG='' LC_ALL='' apt-show-versions 2>/dev/null"); - foreach my $l (split(/\r?\n/, $out)) { - if ($l =~ /^(\S+)\/\S+\s+upgradeable\s+from\s+(\S+)\s+to\s+(\S+)/) { - # Possible upgrade shown .. apply new version to - # avail object - my ($name, $oldver, $newver) = ($1, $2, $3); - my $pkg = $namemap{$name}; - if ($pkg) { - ($pkg->{'epoch'}, $pkg->{'version'}) = - &split_epoch($newver); - $rv++; - } - } - elsif ($l =~ /^(\S+)\/\S+\s+uptodate\s+(\S+)/) { - # Package shown to be up to date - my ($name, $newver) = ($1, $2); - my $pkg = $namemap{$name}; - if ($pkg) { - ($pkg->{'epoch'}, $pkg->{'version'}) = - &split_epoch($newver); - $rv++; - } - } - } - } -if (&has_command("apt-cache")) { - # Use apt-cache to see pinned versions. This excludes backports though. - my $out = &backquote_command( - "LANG='' LC_ALL='' apt-cache policy 2>/dev/null"); - foreach my $l (split(/\r?\n/, $out)) { - if ($l =~ /\s+(\S+)\s+\-\>\s+(\S+)/) { - my ($name, $pin) = ($1, $2); - my $pkg = $namemap{$name}; - if ($pkg) { - ($pkg->{'epoch'}, $pkg->{'version'}) = - &split_epoch($ver); - $rv++; - } - } - } - } -return $rv; -} - # split_epoch(version) # Splits a version formatted like 5:x.yy into an epoch and real version sub split_epoch diff --git a/software/apt-lib.pl b/software/apt-lib.pl index 072246770..87238ee0f 100755 --- a/software/apt-lib.pl +++ b/software/apt-lib.pl @@ -167,6 +167,7 @@ foreach my $s (&update_system_search('.*')) { } } +&set_pinned_versions(\@rv); return @rv; } @@ -194,7 +195,8 @@ return @rv; sub update_system_updates { if (&has_command("apt-show-versions")) { - # This awesome command can give us all updates in one hit + # This awesome command can give us all updates in one hit, and takes + # pinned versions and backports into account local @rv; &open_execute_command(PKGS, "LANG='' LC_ALL='' apt-show-versions", 1, 1); @@ -213,7 +215,7 @@ if (&has_command("apt-show-versions")) { return @rv; } else { - # Need to manually compose by calling dpkg and apt-cache showpkg .. + # Need to manually compose by calling dpkg and apt-cache showpkg local %packages; local $n = &list_packages(); local %currentmap; @@ -257,12 +259,45 @@ else { } $pkg->{'version'} = $ver; $pkg->{'epoch'} = $epoch; - push(@rv, $pkg); + local $newer = + $pkg->{'epoch'} <=> $pkg->{'oldepoch'} || + &compare_versions($pkg->{'version'}, + $pkg->{'oldversion'}); + if ($newer > 0) { + push(@rv, $pkg); + } } } close(PKGS); } + &set_pinned_versions(\@rv); return @rv; } } +# set_pinned_versions(&package-list) +# Updates the version and epoch fields in a list of available packages based +# on pinning. +sub set_pinned_versions +{ +local ($pkgs) = @_; +local %pkgmap = map { $_->{'name'}, $_ } @$pkgs; +&open_execute_command(PKGS, + "LANG='' LC_ALL='' apt-cache policy", 1, 1); +while() { + s/\r|\n//g; + if (/\s+(\S+)\s+\-\>\s+(\S+)/) { + my ($name, $pin) = ($1, $2); + my $pkg = $pkgmap{$name}; + if ($pkg) { + $pkg->{'version'} = $pin; + $pkg->{'epoch'} = undef; + if ($pkg->{'version'} =~ s/^(\S+)://) { + $pkg->{'epoch'} = $1; + } + } + } + } +close(PKGS); +} +