summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Vogt <mvo@debian.org>2014-09-05 12:03:28 +0200
committerMichael Vogt <mvo@debian.org>2014-09-05 12:05:21 +0200
commitd059cc2668f284a7db77a15d1d742326d464e963 (patch)
treee0dab302f628dccb6cea44ec49f90eea91100bc0
parent3b5607fc31371190470074371793cb8500b5139e (diff)
Fix incorrect upgradable listing in "apt list" (thanks to Michael Musenbrock)
The "apt list" command was using only the pkgDepCache but not the pkgPolicy to figure out if a package is upgradable. This lead to incorrect display of upgradable package when the user used the policy to pin-down packages. Thanks to Michael Musenbrock for the initial patch. Closes: #753297
-rw-r--r--apt-private/private-cacheset.cc5
-rw-r--r--apt-private/private-output.cc5
-rwxr-xr-xtest/integration/test-bug-753297-upgradable34
3 files changed, 42 insertions, 2 deletions
diff --git a/apt-private/private-cacheset.cc b/apt-private/private-cacheset.cc
index e37e7b227..159e1d8f1 100644
--- a/apt-private/private-cacheset.cc
+++ b/apt-private/private-cacheset.cc
@@ -55,7 +55,10 @@ bool GetLocalitySortedVersionSet(pkgCacheFile &CacheFile,
}
else if (_config->FindB("APT::Cmd::Upgradable") == true)
{
- if(P.CurrentVer() && state.Upgradable())
+ pkgPolicy *policy = CacheFile.GetPolicy();
+ if(P.CurrentVer() &&
+ state.Upgradable() &&
+ policy->GetCandidateVer(P) != P.CurrentVer())
{
pkgPolicy *policy = CacheFile.GetPolicy();
output_set.insert(policy->GetCandidateVer(P));
diff --git a/apt-private/private-output.cc b/apt-private/private-output.cc
index 8f1fb886e..2120b7a83 100644
--- a/apt-private/private-output.cc
+++ b/apt-private/private-output.cc
@@ -229,7 +229,10 @@ void ListSingleVersion(pkgCacheFile &CacheFile, pkgRecords &records, /*{{{*/
std::string CandidateVerStr = GetCandidateVersion(CacheFile, P);
std::string InstalledVerStr = GetInstalledVersion(CacheFile, P);
std::string StatusStr;
- if(P.CurrentVer() == V && state.Upgradable() && state.CandidateVer != NULL)
+ if(P.CurrentVer() == V &&
+ state.Upgradable() &&
+ state.CandidateVer != NULL &&
+ policy->GetCandidateVer(P) != P.CurrentVer())
{
strprintf(StatusStr, _("[installed,upgradable to: %s]"),
CandidateVerStr.c_str());
diff --git a/test/integration/test-bug-753297-upgradable b/test/integration/test-bug-753297-upgradable
new file mode 100755
index 000000000..068704b3e
--- /dev/null
+++ b/test/integration/test-bug-753297-upgradable
@@ -0,0 +1,34 @@
+#!/bin/sh
+set -e
+
+TESTDIR=$(readlink -f $(dirname $0))
+. $TESTDIR/framework
+setupenvironment
+configarchitecture 'i386'
+
+cat > rootdir/etc/apt/preferences <<EOF
+Package: *
+Pin: release testing
+Pin-Priority: 600
+
+Package: *
+Pin: release unstable
+Pin-Priority: 1
+EOF
+
+insertinstalledpackage 'foo' 'all' '1'
+insertpackage 'testing' 'foo' 'all' '1'
+insertpackage 'testing-updates' 'foo' 'all' '2'
+insertpackage 'unstable' 'foo' 'all' '3'
+
+insertinstalledpackage 'bar' 'all' '1'
+insertpackage 'testing' 'bar' 'all' '2'
+
+setupaptarchive
+
+testequal "Listing...
+bar/testing 2 all [upgradable from: 1]" apt list --upgradable
+
+testequal "Listing...
+bar/testing 2 all [upgradable from: 1]
+foo/testing,now 1 all [installed]" apt list