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

* apt-pkg/policy.cc:
- get the candidate right for a not-installed pseudo package if
his non-pseudo friend is installed

David Kalnischkies лет назад: 16
Родитель
Сommit
9ee8287e5e
3 измененных файлов с 27 добавлено и 14 удалено
  1. 21 11
      apt-pkg/policy.cc
  2. 2 2
      apt-pkg/policy.h
  3. 4 1
      debian/changelog

+ 21 - 11
apt-pkg/policy.cc

@@ -115,7 +115,7 @@ bool pkgPolicy::InitDefaults()
 // ---------------------------------------------------------------------
 /* Evaluate the package pins and the default list to deteremine what the
    best package is. */
-pkgCache::VerIterator pkgPolicy::GetCandidateVer(pkgCache::PkgIterator Pkg)
+pkgCache::VerIterator pkgPolicy::GetCandidateVer(pkgCache::PkgIterator const &Pkg)
 {
    // Look for a package pin and evaluate it.
    signed Max = GetPriority(Pkg);
@@ -147,6 +147,16 @@ pkgCache::VerIterator pkgPolicy::GetCandidateVer(pkgCache::PkgIterator Pkg)
     */
    for (pkgCache::VerIterator Ver = Pkg.VersionList(); Ver.end() == false; Ver++)
    {
+      /* Lets see if this version is the installed version */
+      bool instVer = (Pkg.CurrentVer() == Ver);
+      if (Ver.Pseudo() == true && instVer == false)
+      {
+	 pkgCache::PkgIterator const allPkg = Ver.ParentPkg().Group().FindPkg("all");
+	 if (allPkg->CurrentVer != 0 && allPkg.CurrentVer()->Hash == Ver->Hash &&
+	     strcmp(allPkg.CurVersion(), Ver.VerStr()) == 0)
+	    instVer = true;
+      }
+
       for (pkgCache::VerFileIterator VF = Ver.FileList(); VF.end() == false; VF++)
       {
 	 /* If this is the status file, and the current version is not the
@@ -155,9 +165,9 @@ pkgCache::VerIterator pkgPolicy::GetCandidateVer(pkgCache::PkgIterator Pkg)
 	    out bogus entries that may be due to config-file states, or
 	    other. */
 	 if ((VF.File()->Flags & pkgCache::Flag::NotSource) == pkgCache::Flag::NotSource &&
-	     Pkg.CurrentVer() != Ver)
+	     instVer == false)
 	    continue;
-	 	 	 
+
 	 signed Prio = PFPriority[VF.File()->ID];
 	 if (Prio > Max)
 	 {
@@ -171,7 +181,7 @@ pkgCache::VerIterator pkgPolicy::GetCandidateVer(pkgCache::PkgIterator Pkg)
 	 }	 
       }      
       
-      if (Pkg.CurrentVer() == Ver && Max < 1000)
+      if (instVer == true && Max < 1000)
       {
 	 /* Elevate our current selection (or the status file itself)
 	    to the Pseudo-status priority. */
@@ -189,6 +199,7 @@ pkgCache::VerIterator pkgPolicy::GetCandidateVer(pkgCache::PkgIterator Pkg)
    // will always be a candidate (Closes: #512318)
    if (!Pref.IsGood() && MaxAlt > 0)
        Pref = PrefAlt;
+
    return Pref;
 }
 									/*}}}*/
@@ -238,15 +249,14 @@ void pkgPolicy::CreatePin(pkgVersionMatch::MatchType Type,string Name,
 // Policy::GetMatch - Get the matching version for a package pin	/*{{{*/
 // ---------------------------------------------------------------------
 /* */
-pkgCache::VerIterator pkgPolicy::GetMatch(pkgCache::PkgIterator Pkg)
+pkgCache::VerIterator pkgPolicy::GetMatch(pkgCache::PkgIterator const &Pkg)
 {
    const Pin &PPkg = Pins[Pkg->ID];
-   if (PPkg.Type != pkgVersionMatch::None)
-   {
-      pkgVersionMatch Match(PPkg.Data,PPkg.Type);
-      return Match.Find(Pkg);
-   }
-   return pkgCache::VerIterator(*Pkg.Cache());
+   if (PPkg.Type == pkgVersionMatch::None)
+      return pkgCache::VerIterator(*Pkg.Cache());
+
+   pkgVersionMatch Match(PPkg.Data,PPkg.Type);
+   return Match.Find(Pkg);
 }
 									/*}}}*/
 // Policy::GetPriority - Get the priority of the package pin		/*{{{*/

+ 2 - 2
apt-pkg/policy.h

@@ -72,10 +72,10 @@ class pkgPolicy : public pkgDepCache::Policy
    inline signed short GetPriority(pkgCache::PkgFileIterator const &File) 
        {return PFPriority[File->ID];};
    signed short GetPriority(pkgCache::PkgIterator const &Pkg);
-   pkgCache::VerIterator GetMatch(pkgCache::PkgIterator Pkg);
+   pkgCache::VerIterator GetMatch(pkgCache::PkgIterator const &Pkg);
 
    // Things for the cache interface.
-   virtual pkgCache::VerIterator GetCandidateVer(pkgCache::PkgIterator Pkg);
+   virtual pkgCache::VerIterator GetCandidateVer(pkgCache::PkgIterator const &Pkg);
    virtual bool IsImportantDep(pkgCache::DepIterator Dep) {return pkgDepCache::Policy::IsImportantDep(Dep);};
    bool InitDefaults();
    

+ 4 - 1
debian/changelog

@@ -81,8 +81,11 @@ apt (0.7.26~exp6) UNRELEASED; urgency=low
       looking code copycat from wget
   * ftparchive/writer.cc:
     - add ValidTime option to generate a Valid-Until header in Release file
+  * apt-pkg/policy.cc:
+    - get the candidate right for a not-installed pseudo package if
+      his non-pseudo friend is installed
 
- -- David Kalnischkies <kalnischkies@gmail.com>  Wed, 09 Jun 2010 10:52:31 +0200
+ -- David Kalnischkies <kalnischkies@gmail.com>  Wed, 09 Jun 2010 14:20:19 +0200
 
 apt (0.7.26~exp5) experimental; urgency=low