Fix incorrect upgradable listing in "apt list" (thanks to Michael Musenbrock)
authorMichael Vogt <mvo@debian.org>
Fri, 5 Sep 2014 10:03:28 +0000 (12:03 +0200)
committerMichael Vogt <mvo@debian.org>
Fri, 5 Sep 2014 10:05:21 +0000 (12:05 +0200)
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

apt-private/private-cacheset.cc
apt-private/private-output.cc
test/integration/test-bug-753297-upgradable [new file with mode: 0755]

index e37e7b2..159e1d8 100644 (file)
@@ -55,7 +55,10 @@ bool GetLocalitySortedVersionSet(pkgCacheFile &CacheFile,
       }
       else if (_config->FindB("APT::Cmd::Upgradable") == true)
       {
       }
       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));
          {
              pkgPolicy *policy = CacheFile.GetPolicy();
              output_set.insert(policy->GetCandidateVer(P));
index 8f1fb88..2120b7a 100644 (file)
@@ -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;
       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());
       {
          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 (executable)
index 0000000..068704b
--- /dev/null
@@ -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