]> git.saurik.com Git - apt.git/commitdiff
don't sent uninstallable rc-only versions via EDSP
authorDavid Kalnischkies <david@kalnischkies.de>
Tue, 10 May 2016 12:51:30 +0000 (14:51 +0200)
committerDavid Kalnischkies <david@kalnischkies.de>
Tue, 10 May 2016 12:51:30 +0000 (14:51 +0200)
Versions which are only available in dpkg/status aren't installable and
apt doesn't pick them as candidate for this reason – for the same reason
such packages shouldn't be sent to an external solver via EDSP. The
packages are pinned to -1, but if the solver has strict pinning disabled
it could end up picking this version anyhow – which is a request apt can
not satisfy.

Reported-By: Maximiliano Curia <maxy@debian.org> on IRC
apt-pkg/edsp.cc
test/integration/test-ubuntu-bug-761175-remove-purge

index 610f9379ef4b160dc8cd1d70ce571c60cee7022c..77928379f5ab66d104671803ff326e44d6324e39 100644 (file)
@@ -176,6 +176,24 @@ static void WriteScenarioLimitedDependency(FILE* output,
       fprintf(output, "Provides: %s\n", provides.c_str()+2);
 }
                                                                        /*}}}*/
+static bool SkipUnavailableVersions(pkgDepCache &Cache, pkgCache::PkgIterator const &Pkg, pkgCache::VerIterator const &Ver)/*{{{*/
+{
+   /* versions which aren't current and aren't available in
+      any "online" source file are bad, expect if they are the choosen
+      candidate: The exception is for build-dep implementation as it creates
+      such pseudo (package) versions and removes them later on again.
+      We filter out versions at all so packages in 'rc' state only available
+      in dpkg/status aren't passed to solvers as they can't be installed. */
+   if (Pkg->CurrentVer != 0)
+      return false;
+   if (Cache.GetCandidateVersion(Pkg) == Ver)
+      return false;
+   for (pkgCache::VerFileIterator I = Ver.FileList(); I.end() == false; ++I)
+      if (I.File().Flagged(pkgCache::Flag::NotSource) == false)
+        return false;
+   return true;
+}
+                                                                       /*}}}*/
 // EDSP::WriteScenario - to the given file descriptor                  /*{{{*/
 bool EDSP::WriteScenario(pkgDepCache &Cache, FILE* output, OpProgress *Progress)
 {
@@ -190,6 +208,8 @@ bool EDSP::WriteScenario(pkgDepCache &Cache, FILE* output, OpProgress *Progress)
         continue;
       for (pkgCache::VerIterator Ver = Pkg.VersionList(); Ver.end() == false; ++Ver, ++p)
       {
+        if (SkipUnavailableVersions(Cache, Pkg, Ver))
+           continue;
         WriteScenarioVersion(Cache, output, Pkg, Ver);
         WriteScenarioDependency(output, Ver);
         fprintf(output, "\n");
@@ -211,6 +231,8 @@ bool EDSP::WriteLimitedScenario(pkgDepCache &Cache, FILE* output,
    for (APT::PackageSet::const_iterator Pkg = pkgset.begin(); Pkg != pkgset.end(); ++Pkg, ++p)
       for (pkgCache::VerIterator Ver = Pkg.VersionList(); Ver.end() == false; ++Ver)
       {
+        if (SkipUnavailableVersions(Cache, Pkg, Ver))
+           continue;
         WriteScenarioVersion(Cache, output, Pkg, Ver);
         WriteScenarioLimitedDependency(output, Ver, pkgset);
         fprintf(output, "\n");
index 00f289b535dbe811775d6baef66b780f869256fd..aae394ad8c6dad05fb97be972fedd62e7f68591c 100755 (executable)
@@ -23,35 +23,62 @@ buildcompizpkg 'all' 'all' '2.0' 'unstable'
 setupaptarchive
 
 runtests() {
-       testdpkgnotinstalled compiz-core-$1
-       testsuccess aptget install compiz-core-$1 -t "${2:-unstable}"
-       testdpkginstalled compiz-core-$1
+       local PKG="$1"
+       local RELEASE="${2}"
+       shift 2
+       testdpkgnotinstalled compiz-core-${PKG}
+       testsuccess aptget install compiz-core-${PKG} -t "${RELEASE}" "$@"
+       testdpkginstalled compiz-core-${PKG}
 
-       testsuccess aptget remove compiz-core-$1 -y
-       testdpkgnotinstalled compiz-core-$1
-       testdpkgstatus 'rc' '1' "compiz-core-$1"
+       testsuccess aptget remove compiz-core-${PKG} -y "$@"
+       testdpkgnotinstalled compiz-core-${PKG}
+       testdpkgstatus 'rc' '1' "compiz-core-${PKG}"
 
-       testsuccessequal "Reading package lists...
+       if [ -z "$1" ]; then
+               testsuccessequal "Reading package lists...
 Building dependency tree...
 Reading state information...
 The following packages will be REMOVED:
-  compiz-core-$1*
+  compiz-core-${PKG}*
 0 upgraded, 0 newly installed, 1 to remove and 0 not upgraded.
-Purg compiz-core-$1" aptget purge compiz-core-$1 -s
-       testsuccess aptget purge compiz-core-$1 -y
+Purg compiz-core-${PKG}" aptget purge compiz-core-${PKG} -s "$@"
+       else
+               # check that the rc-version isn't passed to the external resolver if its only in dpkg/status
+               export APT_EDSP_DUMP_FILENAME="${TMPWORKINGDIRECTORY}/dump-${PKG}.edsp"
+               testfailure aptget purge compiz-core-${PKG} -y "$@" -s --solver dump
+               testsuccessequal '2' grep -c "^Package: compiz-core-${PKG}\$" "$APT_EDSP_DUMP_FILENAME"
+               mv rootdir/etc/apt/sources.list.d/apt-test-stable-deb.list rootdir/etc/apt/sources.list.d/apt-test-stable-deb.disabled
+               testfailure aptget purge compiz-core-${PKG} -y "$@" -s --solver dump
+               testsuccessequal '1' grep -c "^Package: compiz-core-${PKG}\$" "$APT_EDSP_DUMP_FILENAME"
+               mv rootdir/etc/apt/sources.list.d/apt-test-stable-deb.disabled rootdir/etc/apt/sources.list.d/apt-test-stable-deb.list
+
+               testsuccessequal "Reading package lists...
+Building dependency tree...
+Reading state information...
+Execute external solver...
+The following packages will be REMOVED:
+  compiz-core-${PKG}*
+0 upgraded, 0 newly installed, 1 to remove and 0 not upgraded.
+Purg compiz-core-${PKG}" aptget purge compiz-core-${PKG} -s "$@"
+       fi
+       testsuccess aptget purge compiz-core-${PKG} -y "$@"
        echo -n '' > rootdir/var/lib/dpkg/available # dpkg -l < 1.16.2 reads the available file by default, where the package can be found
-       testequalor2 "dpkg-query: no packages found matching compiz-core-$1" "No packages found matching compiz-core-$1." dpkg -l compiz-core-$1
+       testequalor2 "dpkg-query: no packages found matching compiz-core-${PKG}" "No packages found matching compiz-core-${PKG}." dpkg -l compiz-core-${PKG}
+}
+runtestround() {
+       runtests 'native' 'unstable' "$@"
+       runtests 'all' 'unstable' "$@"
+       runtests 'native' 'stable' "$@"
+       runtests 'all' 'stable' "$@"
 }
+testround() {
+       msgmsg 'Test in multi arch environment' "$@"
+       configarchitecture 'amd64' 'i386'
+       runtestround "$@"
 
-msgmsg 'Test in multi arch environment'
-runtests 'native'
-runtests 'all'
-runtests 'native' 'stable'
-runtests 'all' 'stable'
-
-msgmsg 'Test in single arch environment'
-configarchitecture 'amd64'
-runtests 'native'
-runtests 'all'
-runtests 'native' 'stable'
-runtests 'all' 'stable'
+       msgmsg 'Test in single arch environment' "$@"
+       configarchitecture 'amd64'
+       runtestround "$@"
+}
+testround
+testround --solver apt