Browse Source

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
debian/1.8.y
Michael Vogt 7 years ago
parent
commit
d059cc2668
  1. 5
      apt-private/private-cacheset.cc
  2. 5
      apt-private/private-output.cc
  3. 34
      test/integration/test-bug-753297-upgradable

5
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));

5
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());

34
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
Loading…
Cancel
Save