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

Regex, --all-versions and more OR stuff
Author: jgg
Date: 1999-10-22 04:05:47 GMT
Regex, --all-versions and more OR stuff

Arch Librarian лет назад: 22
Родитель
Сommit
648e3cb489
7 измененных файлов с 186 добавлено и 97 удалено
  1. 100 52
      apt-pkg/algorithms.cc
  2. 19 6
      cmdline/apt-cache.cc
  3. 52 33
      cmdline/apt-get.cc
  4. 1 0
      debian/changelog
  5. 4 0
      doc/apt-cache.8.yo
  6. 2 1
      doc/apt-get.8.yo
  7. 8 5
      doc/examples/apt.conf

+ 100 - 52
apt-pkg/algorithms.cc

@@ -1,6 +1,6 @@
 // -*- mode: cpp; mode: fold -*-
 // -*- mode: cpp; mode: fold -*-
 // Description								/*{{{*/
 // Description								/*{{{*/
-// $Id: algorithms.cc,v 1.25 1999/10/02 04:14:53 jgg Exp $
+// $Id: algorithms.cc,v 1.26 1999/10/22 04:05:47 jgg Exp $
 /* ######################################################################
 /* ######################################################################
 
 
    Algorithms - A set of misc algorithms
    Algorithms - A set of misc algorithms
@@ -549,34 +549,38 @@ bool pkgProblemResolver::DoUpgrade(pkgCache::PkgIterator Pkg)
 	 if ((Flags[P->ID] & Protected) == Protected)
 	 if ((Flags[P->ID] & Protected) == Protected)
 	 {
 	 {
 	    if (Debug == true)
 	    if (Debug == true)
-	       clog << "    Reinet Failed because of protected " << P.Name() << endl;
+	       clog << "    Reinst Failed because of protected " << P.Name() << endl;
 	    Fail = true;
 	    Fail = true;
-	    break;
 	 }      
 	 }      
-      
-	 // Upgrade the package if the candidate version will fix the problem.
-	 if ((Cache[Start] & pkgDepCache::DepCVer) == pkgDepCache::DepCVer)
+	 else
 	 {
 	 {
-	    if (DoUpgrade(P) == false)
+	    // Upgrade the package if the candidate version will fix the problem.
+	    if ((Cache[Start] & pkgDepCache::DepCVer) == pkgDepCache::DepCVer)
+	    {
+	       if (DoUpgrade(P) == false)
+	       {
+		  if (Debug == true)
+		     clog << "    Reinst Failed because of " << P.Name() << endl;
+		  Fail = true;
+	       }
+	       else
+	       {
+		  Fail = false;
+		  break;
+	       }	    
+	    }
+	    else
 	    {
 	    {
+	       /* We let the algorithm deal with conflicts on its next iteration,
+		it is much smarter than us */
+	       if (Start->Type == pkgCache::Dep::Conflicts)
+		  continue;
+	       
 	       if (Debug == true)
 	       if (Debug == true)
-		  clog << "    Reinst Failed because of " << P.Name() << endl;
+		  clog << "    Reinst Failed early because of " << Start.TargetPkg().Name() << endl;
 	       Fail = true;
 	       Fail = true;
-	       break;
-	    }	 
+	    }     
 	 }
 	 }
-	 else
-	 {
-	    /* We let the algorithm deal with conflicts on its next iteration,
-	       it is much smarter than us */
-	    if (Start->Type == pkgCache::Dep::Conflicts)
-	       continue;
-	    
-	    if (Debug == true)
-	       clog << "    Reinst Failed early because of " << Start.TargetPkg().Name() << endl;
-	    Fail = true;
-	    break;
-	 }     
 	 
 	 
 	 if (Start == End)
 	 if (Start == End)
 	    break;
 	    break;
@@ -721,12 +725,29 @@ bool pkgProblemResolver::Resolve(bool BrokenFix)
 	 bool InOr = false;
 	 bool InOr = false;
 	 pkgCache::DepIterator Start;
 	 pkgCache::DepIterator Start;
 	 pkgCache::DepIterator End;
 	 pkgCache::DepIterator End;
+	 PackageKill *OldEnd;
+	 
+	 enum {OrRemove,OrKeep} OrOp = OrRemove;
 	 for (pkgCache::DepIterator D = Cache[I].InstVerIter(Cache).DependsList();
 	 for (pkgCache::DepIterator D = Cache[I].InstVerIter(Cache).DependsList();
 	      D.end() == false || InOr == true;)
 	      D.end() == false || InOr == true;)
 	 {
 	 {
 	    // Compute a single dependency element (glob or)
 	    // Compute a single dependency element (glob or)
-	    if (InOr == false)
+	    if (Start == End)
+	    {
+	       // Decide what to do
+	       if (InOr == true)
+	       {
+		  if (OldEnd == LEnd && OrOp == OrRemove)
+		     Cache.MarkDelete(I);
+		  if (OldEnd == LEnd && OrOp == OrKeep)
+		     Cache.MarkKeep(I);
+	       }
+	       
+	       OrOp = OrRemove;
 	       D.GlobOr(Start,End);
 	       D.GlobOr(Start,End);
+	       InOr = Start != End;
+	       OldEnd = LEnd;
+	    }	    
 	    else
 	    else
 	       Start++;
 	       Start++;
 
 
@@ -737,9 +758,7 @@ bool pkgProblemResolver::Resolve(bool BrokenFix)
 	    // Dep is ok
 	    // Dep is ok
 	    if ((Cache[End] & pkgDepCache::DepGInstall) == pkgDepCache::DepGInstall)
 	    if ((Cache[End] & pkgDepCache::DepGInstall) == pkgDepCache::DepGInstall)
 	       continue;
 	       continue;
-	    
-	    InOr = Start != End;
-	    
+	    	    
 	    if (Debug == true)
 	    if (Debug == true)
 	       clog << "Package " << I.Name() << " has broken dep on " << Start.TargetPkg().Name() << endl;
 	       clog << "Package " << I.Name() << " has broken dep on " << Start.TargetPkg().Name() << endl;
 
 
@@ -748,11 +767,18 @@ bool pkgProblemResolver::Resolve(bool BrokenFix)
 	       if a package has a dep on another package that cant be found */
 	       if a package has a dep on another package that cant be found */
 	    pkgCache::Version **VList = Start.AllTargets();
 	    pkgCache::Version **VList = Start.AllTargets();
 	    if (*VList == 0 && (Flags[I->ID] & Protected) != Protected &&
 	    if (*VList == 0 && (Flags[I->ID] & Protected) != Protected &&
-		Start->Type != pkgCache::Dep::Conflicts && 
+		Start->Type != pkgCache::Dep::Conflicts &&
 		Cache[I].NowBroken() == false)
 		Cache[I].NowBroken() == false)
-	    {
+	    {	       
+	       if (InOr == true)
+	       {
+		  /* No keep choice because the keep being OK could be the
+		     result of another element in the OR group! */
+		  continue;
+	       }
+	       
 	       Change = true;
 	       Change = true;
-	       Cache.MarkKeep(I);
+	       Cache.MarkKeep(I);		  
 	       break;
 	       break;
 	    }
 	    }
 	    
 	    
@@ -778,10 +804,19 @@ bool pkgProblemResolver::Resolve(bool BrokenFix)
 		  }
 		  }
 		  
 		  
 		  /* See if a keep will do, unless the package is protected,
 		  /* See if a keep will do, unless the package is protected,
-		     then installing it will be necessary */	
+		     then installing it will be necessary */
+		  bool Installed = Cache[I].Install();
 		  Cache.MarkKeep(I);
 		  Cache.MarkKeep(I);
 		  if (Cache[I].InstBroken() == false)
 		  if (Cache[I].InstBroken() == false)
 		  {
 		  {
+		     // Unwind operation will be keep now
+		     if (OrOp == OrRemove)
+			OrOp = OrKeep;
+		     
+		     // Restore
+		     if (InOr == true && Installed == true)
+			Cache.MarkInstall(I,false);
+		     
 		     if (Debug == true)
 		     if (Debug == true)
 			clog << "  Holding Back " << I.Name() << " rather than change " << Start.TargetPkg().Name() << endl;
 			clog << "  Holding Back " << I.Name() << " rather than change " << Start.TargetPkg().Name() << endl;
 		  }		  
 		  }		  
@@ -807,7 +842,7 @@ bool pkgProblemResolver::Resolve(bool BrokenFix)
 	       }
 	       }
 	       else
 	       else
 	       {
 	       {
-		  // Skip this if it is protected
+		  // Skip adding to the kill list if it is protected
 		  if ((Flags[Pkg->ID] & Protected) != 0)
 		  if ((Flags[Pkg->ID] & Protected) != 0)
 		     continue;
 		     continue;
 		  
 		  
@@ -822,11 +857,20 @@ bool pkgProblemResolver::Resolve(bool BrokenFix)
 
 
 	    // Hm, nothing can possibly satisify this dep. Nuke it.
 	    // Hm, nothing can possibly satisify this dep. Nuke it.
 	    if (VList[0] == 0 && Start->Type != pkgCache::Dep::Conflicts &&
 	    if (VList[0] == 0 && Start->Type != pkgCache::Dep::Conflicts &&
-		(Flags[I->ID] & Protected) != Protected && InOr == false)
+		(Flags[I->ID] & Protected) != Protected)
 	    {
 	    {
+	       bool Installed = Cache[I].Install();
 	       Cache.MarkKeep(I);
 	       Cache.MarkKeep(I);
 	       if (Cache[I].InstBroken() == false)
 	       if (Cache[I].InstBroken() == false)
 	       {
 	       {
+		  // Unwind operation will be keep now
+		  if (OrOp == OrRemove)
+		     OrOp = OrKeep;
+		  
+		  // Restore
+		  if (InOr == true && Installed == true)
+		     Cache.MarkInstall(I,false);
+		  
 		  if (Debug == true)
 		  if (Debug == true)
 		     clog << "  Holding Back " << I.Name() << " because I can't find " << Start.TargetPkg().Name() << endl;
 		     clog << "  Holding Back " << I.Name() << " because I can't find " << Start.TargetPkg().Name() << endl;
 	       }	       
 	       }	       
@@ -834,47 +878,51 @@ bool pkgProblemResolver::Resolve(bool BrokenFix)
 	       {
 	       {
 		  if (Debug == true)
 		  if (Debug == true)
 		     clog << "  Removing " << I.Name() << " because I can't find " << Start.TargetPkg().Name() << endl;
 		     clog << "  Removing " << I.Name() << " because I can't find " << Start.TargetPkg().Name() << endl;
-		  Cache.MarkDelete(I);
+		  if (InOr == false)
+		     Cache.MarkDelete(I);
 	       }
 	       }
 
 
 	       Change = true;
 	       Change = true;
 	       Done = true;
 	       Done = true;
 	    }
 	    }
 	    
 	    
+	    delete [] VList;
+	    
 	    // Try some more
 	    // Try some more
 	    if (InOr == true)
 	    if (InOr == true)
 	       continue;
 	       continue;
 	    
 	    
-	    delete [] VList;
 	    if (Done == true)
 	    if (Done == true)
 	       break;
 	       break;
 	 }
 	 }
 	 
 	 
 	 // Apply the kill list now
 	 // Apply the kill list now
 	 if (Cache[I].InstallVer != 0)
 	 if (Cache[I].InstallVer != 0)
+	 {
 	    for (PackageKill *J = KillList; J != LEnd; J++)
 	    for (PackageKill *J = KillList; J != LEnd; J++)
-         {
-	    Change = true;
-	    if ((Cache[J->Dep] & pkgDepCache::DepGNow) == 0)
 	    {
 	    {
-	       if (J->Dep->Type == pkgCache::Dep::Conflicts)
+	       Change = true;
+	       if ((Cache[J->Dep] & pkgDepCache::DepGNow) == 0)
+	       {
+		  if (J->Dep->Type == pkgCache::Dep::Conflicts)
+		  {
+		     if (Debug == true)
+			clog << "  Fixing " << I.Name() << " via remove of " << J->Pkg.Name() << endl;
+		     Cache.MarkDelete(J->Pkg);
+		  }
+	       }
+	       else
 	       {
 	       {
 		  if (Debug == true)
 		  if (Debug == true)
-		     clog << "  Fixing " << I.Name() << " via remove of " << J->Pkg.Name() << endl;
-		  Cache.MarkDelete(J->Pkg);
+		     clog << "  Fixing " << I.Name() << " via keep of " << J->Pkg.Name() << endl;
+		  Cache.MarkKeep(J->Pkg);
 	       }
 	       }
-	    }
-	    else
-	    {
-	       if (Debug == true)
-		  clog << "  Fixing " << I.Name() << " via keep of " << J->Pkg.Name() << endl;
-	       Cache.MarkKeep(J->Pkg);
-	    }
-	    
-	    if (Counter > 1)
-	       Scores[J->Pkg->ID] = Scores[I->ID];
-	 }      
-      }
+	       
+	       if (Counter > 1)
+		  Scores[J->Pkg->ID] = Scores[I->ID];
+	    }      
+	 }
+      }      
    }
    }
 
 
    if (Debug == true)
    if (Debug == true)

+ 19 - 6
cmdline/apt-cache.cc

@@ -1,6 +1,6 @@
 // -*- mode: cpp; mode: fold -*-
 // -*- mode: cpp; mode: fold -*-
 // Description								/*{{{*/
 // Description								/*{{{*/
-// $Id: apt-cache.cc,v 1.40 1999/10/18 04:15:25 jgg Exp $
+// $Id: apt-cache.cc,v 1.41 1999/10/22 04:05:47 jgg Exp $
 /* ######################################################################
 /* ######################################################################
    
    
    apt-cache - Manages the cache files
    apt-cache - Manages the cache files
@@ -589,11 +589,23 @@ bool ShowPackage(CommandLine &CmdL)
       }
       }
       
       
       // Find the proper version to use. We should probably use the DepCache.
       // Find the proper version to use. We should probably use the DepCache.
-      pkgCache::VerIterator V = Cache.GetCandidateVer(Pkg);
-      if (V.end() == true || V.FileList().end() == true)
-	 continue;
-      if (DisplayRecord(V) == false)
-	 return false;
+      if (_config->FindB("APT::Cache::AllVersions","true") == true)
+      {
+	 pkgCache::VerIterator V;
+	 for (V = Pkg.VersionList(); V.end() == false; V++)
+	 {
+	    if (DisplayRecord(V) == false)
+	       return false;
+	 }
+      }
+      else
+      {
+	 pkgCache::VerIterator V = Cache.GetCandidateVer(Pkg);
+	 if (V.end() == true || V.FileList().end() == true)
+	    continue;
+	 if (DisplayRecord(V) == false)
+	    return false;
+      }      
    }
    }
    return true;
    return true;
 }
 }
@@ -698,6 +710,7 @@ int main(int argc,const char *argv[])
       {'i',"important","APT::Cache::Important",0},
       {'i',"important","APT::Cache::Important",0},
       {'f',"full","APT::Cache::ShowFull",0},
       {'f',"full","APT::Cache::ShowFull",0},
       {'g',"no-generate","APT::Cache::NoGenerate",0},
       {'g',"no-generate","APT::Cache::NoGenerate",0},
+      {'a',"all-versions","APT::Cache::AllVersions",0},
       {0,"names-only","APT::Cache::NamesOnly",0},
       {0,"names-only","APT::Cache::NamesOnly",0},
       {'c',"config-file",0,CommandLine::ConfigFile},
       {'c',"config-file",0,CommandLine::ConfigFile},
       {'o',"option",0,CommandLine::ArbItem},
       {'o',"option",0,CommandLine::ArbItem},

+ 52 - 33
cmdline/apt-get.cc

@@ -1,6 +1,6 @@
 // -*- mode: cpp; mode: fold -*-
 // -*- mode: cpp; mode: fold -*-
 // Description								/*{{{*/
 // Description								/*{{{*/
-// $Id: apt-get.cc,v 1.81 1999/10/21 06:35:00 jgg Exp $
+// $Id: apt-get.cc,v 1.82 1999/10/22 04:05:47 jgg Exp $
 /* ######################################################################
 /* ######################################################################
    
    
    apt-get - Cover for dpkg
    apt-get - Cover for dpkg
@@ -167,7 +167,7 @@ void ShowBroken(ostream &out,CacheFile &Cache,bool Now)
 	  
 	  
       // Print out each package and the failed dependencies
       // Print out each package and the failed dependencies
       out <<"  " <<  I.Name() << ":";
       out <<"  " <<  I.Name() << ":";
-      int Indent = strlen(I.Name()) + 3;
+      unsigned Indent = strlen(I.Name()) + 3;
       bool First = true;
       bool First = true;
       if (Cache[I].InstVerIter(Cache).end() == true)
       if (Cache[I].InstVerIter(Cache).end() == true)
       {
       {
@@ -185,43 +185,62 @@ void ShowBroken(ostream &out,CacheFile &Cache,bool Now)
 	 if (Cache->IsImportantDep(End) == false || 
 	 if (Cache->IsImportantDep(End) == false || 
 	     (Cache[End] & pkgDepCache::DepGInstall) == pkgDepCache::DepGInstall)
 	     (Cache[End] & pkgDepCache::DepGInstall) == pkgDepCache::DepGInstall)
 	    continue;
 	    continue;
-	 
-	 if (First == false)
-	    for (int J = 0; J != Indent; J++)
-	       out << ' ';
-	 First = false;
 
 
-	 out << ' ' << End.DepType() << ": " << End.TargetPkg().Name();
-	 
-	 // Show a quick summary of the version requirements
-	 if (End.TargetVer() != 0)
-	    out << " (" << End.CompType() << " " << End.TargetVer() << 
-	    ")";
-	 
-	 /* Show a summary of the target package if possible. In the case
-	    of virtual packages we show nothing */	 
-	 pkgCache::PkgIterator Targ = End.TargetPkg();
-	 if (Targ->ProvidesList == 0)
+	 bool FirstOr = true;
+	 while (1)
 	 {
 	 {
-	    out << " but ";
-	    pkgCache::VerIterator Ver = Cache[Targ].InstVerIter(Cache);
-	    if (Ver.end() == false)
-	       out << Ver.VerStr() << (Now?" is installed":" is to be installed");
+	    if (First == false)
+	       for (unsigned J = 0; J != Indent; J++)
+		  out << ' ';
+	    First = false;
+
+	    if (FirstOr == false)
+	    {
+	       for (unsigned J = 0; J != strlen(End.DepType()) + 3; J++)
+		  out << ' ';
+	    }
 	    else
 	    else
+	       out << ' ' << End.DepType() << ": ";
+	    FirstOr = false;
+	    
+	    out << Start.TargetPkg().Name();
+	 
+	    // Show a quick summary of the version requirements
+	    if (Start.TargetVer() != 0)
+	       out << " (" << Start.CompType() << " " << Start.TargetVer() << 
+	       ")";
+	    
+	    /* Show a summary of the target package if possible. In the case
+	       of virtual packages we show nothing */	 
+	    pkgCache::PkgIterator Targ = Start.TargetPkg();
+	    if (Targ->ProvidesList == 0)
 	    {
 	    {
-	       if (Cache[Targ].CandidateVerIter(Cache).end() == true)
+	       out << " but ";
+	       pkgCache::VerIterator Ver = Cache[Targ].InstVerIter(Cache);
+	       if (Ver.end() == false)
+		  out << Ver.VerStr() << (Now?" is installed":" is to be installed");
+	       else
 	       {
 	       {
-		  if (Targ->ProvidesList == 0)
-		     out << "it is not installable";
+		  if (Cache[Targ].CandidateVerIter(Cache).end() == true)
+		  {
+		     if (Targ->ProvidesList == 0)
+			out << "it is not installable";
+		     else
+			out << "it is a virtual package";
+		  }		  
 		  else
 		  else
-		     out << "it is a virtual package";
-	       }		  
-	       else
-		  out << (Now?"it is not installed":"it is not going to be installed");
-	    }	       
-	 }
-	 
-	 out << endl;
+		     out << (Now?"it is not installed":"it is not going to be installed");
+	       }	       
+	    }
+	    
+	    if (Start != End)
+	       cout << " or";
+	    out << endl;
+	    
+	    if (Start == End)
+	       break;
+	    Start++;
+	 }	 
       }	    
       }	    
    }   
    }   
 }
 }

+ 1 - 0
debian/changelog

@@ -22,6 +22,7 @@ apt (0.3.13.1) unstable; urgency=low
   * apt-cache showsrc Closes: #45799
   * apt-cache showsrc Closes: #45799
   * De-Refs Single Pure virtual packages. Closes: #42437
   * De-Refs Single Pure virtual packages. Closes: #42437
   * Regexs for install. Closes: #35304
   * Regexs for install. Closes: #35304
+  * Dependency reports now show OR group relations
   
   
  -- Jason Gunthorpe <jgg@debian.org>  Fri,  3 Sep 1999 09:04:28 -0700
  -- Jason Gunthorpe <jgg@debian.org>  Fri,  3 Sep 1999 09:04:28 -0700
  
  

+ 4 - 0
doc/apt-cache.8.yo

@@ -199,6 +199,10 @@ See bf(APT::Cache::Important).
 dit(bf(-f --full))
 dit(bf(-f --full))
 Print full package records when searching. See bf(APT::Cache::ShowFull).
 Print full package records when searching. See bf(APT::Cache::ShowFull).
 
 
+dit(bf(-a --all-versions))
+Print full records for all available versions, this is only applicable to the
+show command. See bf(APT::Cache::AllVersions)
+
 dit(bf(-g --no-generate))
 dit(bf(-g --no-generate))
 Do not perform automatic package cache regeneration, use the cache as it is.
 Do not perform automatic package cache regeneration, use the cache as it is.
 See bf(APT::Cache::NoGenerate).
 See bf(APT::Cache::NoGenerate).

+ 2 - 1
doc/apt-get.8.yo

@@ -81,7 +81,8 @@ may be used to override decisions made by apt-get's conflict resolution system.
 If no package matches the given expression and the expression contains one
 If no package matches the given expression and the expression contains one
 of '.', '?' or '*' then it is assumed to be a POSIX regex and it is applied
 of '.', '?' or '*' then it is assumed to be a POSIX regex and it is applied
 to all package names in the database. Any matches are then installed (or
 to all package names in the database. Any matches are then installed (or
-removed).
+removed). Note that matching is done by substring so 'lo*' matches 'how-lo'
+and 'lowest'. If this is undesired prefix with a '^' character.
 
 
 dit(bf(remove))
 dit(bf(remove))
 bf(remove) is identical to bf(install) except that packages are removed
 bf(remove) is identical to bf(install) except that packages are removed

+ 8 - 5
doc/examples/apt.conf

@@ -1,7 +1,9 @@
-// $Id: apt.conf,v 1.38 1999/10/03 21:09:27 jgg Exp $
+// $Id: apt.conf,v 1.39 1999/10/22 04:05:48 jgg Exp $
 /* This file is an index of all APT configuration directives. It should
 /* This file is an index of all APT configuration directives. It should
    NOT actually be used as a real config file, though it is a completely
    NOT actually be used as a real config file, though it is a completely
-   valid file.
+   valid file. Most of the options have sane default values, unless
+   you have specific needs you should NOT include arbitary items in a custom
+   configuration.
    
    
    In some instances involving filenames it is possible to set the default
    In some instances involving filenames it is possible to set the default
    directory when the path is evaluated. This means you can use relative
    directory when the path is evaluated. This means you can use relative
@@ -41,6 +43,7 @@ APT
   Cache 
   Cache 
   {
   {
      Important "false";
      Important "false";
+     AllVersions "false";
   };
   };
 
 
   CDROM 
   CDROM 
@@ -164,8 +167,8 @@ DSelect
 
 
 DPkg 
 DPkg 
 {
 {
-   // Probably don't want to set this one..
-   Options {"--force-downgrade";}
+   // Probably don't want to use force-downgrade..
+   Options {"--force-overwrite";"--force-downgrade";}
    
    
    // Auto re-mounting of a readonly /usr
    // Auto re-mounting of a readonly /usr
    Pre-Invoke {"mount -o remount,rw /usr";};
    Pre-Invoke {"mount -o remount,rw /usr";};
@@ -199,4 +202,4 @@ Debug
 
 
 /* Whatever you do, do not use this configuration file!! Take out ONLY
 /* Whatever you do, do not use this configuration file!! Take out ONLY
    the portions you need */
    the portions you need */
-ThisIsNotAValidConfigFile
+This Is Not A Valid Config File