Просмотр исходного кода

doesn't execute autoremove marker setting if an external solver is called
and instead rely on the Autoremove tagging to show us what could be done.

(apt-internal-solver doesn't support this currently as it doesn't load
the auto-information into the cache)

David Kalnischkies лет назад: 15
Родитель
Сommit
76d4aab06d
3 измененных файлов с 23 добавлено и 2 удалено
  1. 2 0
      apt-pkg/algorithms.cc
  2. 3 0
      apt-pkg/depcache.cc
  3. 18 2
      apt-pkg/edsp.cc

+ 2 - 0
apt-pkg/algorithms.cc

@@ -756,6 +756,8 @@ bool pkgProblemResolver::Resolve(bool BrokenFix)
 
       if (EDSP::ReadResponse(solver_out, Cache) == false)
 	 return _error->Error("Reading solver response failed");
+
+      return true;
    }
    return ResolveInternal(BrokenFix);
 }

+ 3 - 0
apt-pkg/depcache.cc

@@ -1609,6 +1609,9 @@ bool pkgDepCache::MarkFollowsSuggests()
 // pkgDepCache::MarkRequired - the main mark algorithm			/*{{{*/
 bool pkgDepCache::MarkRequired(InRootSetFunc &userFunc)
 {
+   if (_config->Find("APT::Solver::Name", "internal") != "internal")
+      return true;
+
    bool follow_recommends;
    bool follow_suggests;
    bool debug_autoremove = _config->FindB("Debug::pkgAutoRemove",false);

+ 18 - 2
apt-pkg/edsp.cc

@@ -227,9 +227,12 @@ bool EDSP::ReadResponse(int const input, pkgDepCache &Cache) {
 	   would be too easy for a (buggy) solver to segfault APT… */
 	unsigned long long const VersionCount = Cache.Head().VersionCount;
 	unsigned long VerIdx[VersionCount];
-	for (pkgCache::PkgIterator P = Cache.PkgBegin(); P.end() == false; ++P)
+	for (pkgCache::PkgIterator P = Cache.PkgBegin(); P.end() == false; ++P) {
 		for (pkgCache::VerIterator V = P.VersionList(); V.end() == false; ++V)
 			VerIdx[V->ID] = V.Index();
+		Cache[P].Marked = true;
+		Cache[P].Garbage = false;
+	}
 
 	FileFd in;
 	in.OpenDescriptor(input, FileFd::ReadOnly);
@@ -252,7 +255,9 @@ bool EDSP::ReadResponse(int const input, pkgDepCache &Cache) {
 			else
 				std::clog << msg << std::endl;
 			continue;
-		} else
+		} else if (section.Exists("Autoremove") == true)
+			type = "Autoremove";
+		else
 			continue;
 
 		size_t const id = section.FindULL(type.c_str(), VersionCount);
@@ -270,6 +275,10 @@ bool EDSP::ReadResponse(int const input, pkgDepCache &Cache) {
 			Cache.MarkInstall(Ver.ParentPkg(), false, false);
 		else if (type == "Remove")
 			Cache.MarkDelete(Ver.ParentPkg(), false);
+		else if (type == "Autoremove") {
+			Cache[Ver.ParentPkg()].Marked = false;
+			Cache[Ver.ParentPkg()].Garbage = true;
+		}
 	}
 	return true;
 }
@@ -423,6 +432,13 @@ bool EDSP::WriteSolution(pkgDepCache &Cache, FILE* output)
 	 if (Debug == true)
 	    fprintf(output, "Package: %s\nVersion: %s\n", Pkg.FullName().c_str(), Cache.GetCandidateVer(Pkg).VerStr());
       }
+      else if (Cache[Pkg].Garbage == true)
+      {
+	 fprintf(output, "Autoremove: %d\n", Pkg.CurrentVer()->ID);
+	 if (Debug == true)
+	    fprintf(output, "Package: %s\nVersion: %s\n", Pkg.FullName().c_str(), Pkg.CurrentVer().VerStr());
+	    fprintf(stderr, "Autoremove: %s\nVersion: %s\n", Pkg.FullName().c_str(), Pkg.CurrentVer().VerStr());
+      }
       else
 	 continue;
       fprintf(output, "\n");