Bladeren bron

factor out the detection of self-conflicts into Dep::IsIgnorable

David Kalnischkies 14 jaren geleden
bovenliggende
commit
854341141d
4 gewijzigde bestanden met toevoegingen van 39 en 27 verwijderingen
  1. 2 0
      apt-pkg/cacheiterators.h
  2. 2 11
      apt-pkg/depcache.cc
  3. 1 1
      apt-pkg/packagemanager.cc
  4. 34 15
      apt-pkg/pkgcache.cc

+ 2 - 0
apt-pkg/cacheiterators.h

@@ -283,6 +283,8 @@ class pkgCache::DepIterator : public Iterator<Dependency, DepIterator> {
 	inline bool Reverse() const {return Type == DepRev;};
 	bool IsCritical() const;
 	bool IsNegative() const;
+	bool IsIgnorable(PrvIterator const &Prv) const;
+	bool IsIgnorable(PkgIterator const &Pkg) const;
 	void GlobOr(DepIterator &Start,DepIterator &End);
 	Version **AllTargets() const;
 	bool SmartTargetPkg(PkgIterator &Result) const;

+ 2 - 11
apt-pkg/depcache.cc

@@ -371,19 +371,10 @@ bool pkgDepCache::CheckDep(DepIterator Dep,int Type,PkgIterator &Res)
    
    // Check the providing packages
    PrvIterator P = Dep.TargetPkg().ProvidesList();
-   PkgIterator Pkg = Dep.ParentPkg();
    for (; P.end() != true; ++P)
    {
-      if (Dep.IsNegative() == true)
-      {
-	 /* Provides may never be applied against the same package (or group)
-	    if it is a conflicts. See the comment above. */
-	 if (P.OwnerPkg()->Group == Pkg->Group)
-	    continue;
-	 // Implicit group-conflicts should not be applied on providers of other groups
-	 if (Pkg->Group == Dep.TargetPkg()->Group && P.OwnerPkg()->Group != Pkg->Group)
-	    continue;
-      }
+      if (Dep.IsIgnorable(P) == true)
+	 continue;
 
       // Check if the provides is a hit
       if (Type == NowVersion)

+ 1 - 1
apt-pkg/packagemanager.cc

@@ -250,7 +250,7 @@ bool pkgPackageManager::CheckRConflicts(PkgIterator Pkg,DepIterator D,
 	 continue;
       
       // Ignore self conflicts, ignore conflicts from irrelevent versions
-      if (D.ParentPkg() == Pkg || D.ParentVer() != D.ParentPkg().CurrentVer())
+      if (D.IsIgnorable(Pkg) || D.ParentVer() != D.ParentPkg().CurrentVer())
 	 continue;
       
       if (Cache.VS().CheckDep(Ver,D->CompareOp,D.TargetVer()) == false)

+ 34 - 15
apt-pkg/pkgcache.cc

@@ -619,13 +619,12 @@ pkgCache::Version **pkgCache::DepIterator::AllTargets() const
       // Walk along the actual package providing versions
       for (VerIterator I = DPkg.VersionList(); I.end() == false; ++I)
       {
-	 if (Owner->VS->CheckDep(I.VerStr(),S->CompareOp,TargetVer()) == false)
+	 if (IsIgnorable(I.ParentPkg()) == true)
 	    continue;
 
-	 if (IsNegative() == true &&
-	     ParentPkg() == I.ParentPkg())
+	 if (Owner->VS->CheckDep(I.VerStr(),S->CompareOp,TargetVer()) == false)
 	    continue;
-	 
+
 	 Size++;
 	 if (Res != 0)
 	    *End++ = I;
@@ -634,19 +633,11 @@ pkgCache::Version **pkgCache::DepIterator::AllTargets() const
       // Follow all provides
       for (PrvIterator I = DPkg.ProvidesList(); I.end() == false; ++I)
       {
-	 if (Owner->VS->CheckDep(I.ProvideVersion(),S->CompareOp,TargetVer()) == false)
+	 if (IsIgnorable(I) == true)
 	    continue;
 
-	 if (IsNegative() == true)
-	 {
-	    /* Provides may never be applied against the same package (or group)
-	       if it is a conflicts. See the comment above. */
-	    if (I.OwnerPkg()->Group == ParentPkg()->Group)
-	       continue;
-	    // Implicit group-conflicts should not be applied on providers of other groups
-	    if (ParentPkg()->Group == TargetPkg()->Group && I.OwnerPkg()->Group != ParentPkg()->Group)
-	       continue;
-	 }
+	 if (Owner->VS->CheckDep(I.ProvideVersion(),S->CompareOp,TargetVer()) == false)
+	    continue;
 
 	 Size++;
 	 if (Res != 0)
@@ -689,6 +680,34 @@ void pkgCache::DepIterator::GlobOr(DepIterator &Start,DepIterator &End)
    }
 }
 									/*}}}*/
+// DepIterator::IsIgnorable - should this packag/providr be ignored?	/*{{{*/
+// ---------------------------------------------------------------------
+/* Deps like self-conflicts should be ignored as well as implicit conflicts
+   on virtual packages. */
+bool pkgCache::DepIterator::IsIgnorable(PkgIterator const &Pkg) const
+{
+   if (ParentPkg() == TargetPkg())
+      return IsNegative();
+
+   return false;
+}
+bool pkgCache::DepIterator::IsIgnorable(PrvIterator const &Prv) const
+{
+   if (IsNegative() == false)
+      return false;
+
+   PkgIterator const Pkg = ParentPkg();
+   /* Provides may never be applied against the same package (or group)
+      if it is a conflicts. See the comment above. */
+   if (Prv.OwnerPkg()->Group == Pkg->Group)
+      return true;
+   // Implicit group-conflicts should not be applied on providers of other groups
+   if (Pkg->Group == TargetPkg()->Group && Prv.OwnerPkg()->Group != Pkg->Group)
+      return true;
+
+   return false;
+}
+									/*}}}*/
 // ostream operator to handle string representation of a dependecy	/*{{{*/
 // ---------------------------------------------------------------------
 /* */