Przeglądaj źródła

for install, do all installs first and then the removes and vice versa

David Kalnischkies 16 lat temu
rodzic
commit
e67c08344d
1 zmienionych plików z 54 dodań i 38 usunięć
  1. 54 38
      cmdline/apt-get.cc

+ 54 - 38
cmdline/apt-get.cc

@@ -1640,24 +1640,27 @@ bool DoInstall(CommandLine &CmdL)
    unsigned int AutoMarkChanged = 0;
    pkgProblemResolver Fix(Cache);
 
-   unsigned short fallback = 0;
+   static const unsigned short MOD_REMOVE = 1;
+   static const unsigned short MOD_INSTALL = 2;
+
+   unsigned short fallback = MOD_INSTALL;
    if (strcasecmp(CmdL.FileList[0],"remove") == 0)
-      fallback = 1;
+      fallback = MOD_REMOVE;
    else if (strcasecmp(CmdL.FileList[0], "purge") == 0)
    {
       _config->Set("APT::Get::Purge", true);
-      fallback = 1;
+      fallback = MOD_REMOVE;
    }
    else if (strcasecmp(CmdL.FileList[0], "autoremove") == 0)
    {
       _config->Set("APT::Get::AutomaticRemove", "true");
-      fallback = 1;
+      fallback = MOD_REMOVE;
    }
 
    std::list<APT::VersionSet::Modifier> mods;
-   mods.push_back(APT::VersionSet::Modifier(0, "+",
+   mods.push_back(APT::VersionSet::Modifier(MOD_INSTALL, "+",
 		APT::VersionSet::Modifier::POSTFIX, APT::VersionSet::CANDINST));
-   mods.push_back(APT::VersionSet::Modifier(1, "-",
+   mods.push_back(APT::VersionSet::Modifier(MOD_REMOVE, "-",
 		APT::VersionSet::Modifier::POSTFIX, APT::VersionSet::INSTCAND));
    CacheSetHelperAPTGet helper(c0out);
    std::map<unsigned short, APT::VersionSet> verset = APT::VersionSet::GroupedFromCommandLine(Cache,
@@ -1666,41 +1669,54 @@ bool DoInstall(CommandLine &CmdL)
    if (_error->PendingError() == true)
       return false;
 
+   unsigned short order[] = { 0, 0, 0 };
+   if (fallback == MOD_INSTALL) {
+      order[0] = MOD_INSTALL;
+      order[1] = MOD_REMOVE;
+   } else {
+      order[0] = MOD_REMOVE;
+      order[1] = MOD_INSTALL;
+   }
+
    // new scope for the ActionGroup
    {
       pkgDepCache::ActionGroup group(Cache);
-      for (APT::VersionSet::const_iterator Ver = verset[0].begin();
-	   Ver != verset[0].end(); ++Ver)
-      {
-	 pkgCache::PkgIterator Pkg = Ver.ParentPkg();
-	 Cache->SetCandidateVersion(Ver);
-
-	 if (TryToInstall(Pkg, Cache, Fix, false, BrokenFix) == false)
-	    return false;
-
-	 // see if we need to fix the auto-mark flag
-	 // e.g. apt-get install foo
-	 // where foo is marked automatic
-	 if (Cache[Pkg].Install() == false &&
-	     (Cache[Pkg].Flags & pkgCache::Flag::Auto) &&
-	     _config->FindB("APT::Get::ReInstall",false) == false &&
-	     _config->FindB("APT::Get::Only-Upgrade",false) == false &&
-	     _config->FindB("APT::Get::Download-Only",false) == false)
-	 {
-	    ioprintf(c1out,_("%s set to manually installed.\n"),
-			Pkg.FullName(true).c_str());
-	    Cache->MarkAuto(Pkg,false);
-	    AutoMarkChanged++;
-	 }
-      }
-
-      for (APT::VersionSet::const_iterator Ver = verset[1].begin();
-	   Ver != verset[1].end(); ++Ver)
+      for (unsigned short i = 0; order[i] != 0; ++i)
       {
-	 pkgCache::PkgIterator Pkg = Ver.ParentPkg();
+	 if (order[i] == MOD_INSTALL)
+	    for (APT::VersionSet::const_iterator Ver = verset[MOD_INSTALL].begin();
+		 Ver != verset[MOD_INSTALL].end(); ++Ver)
+	    {
+	       pkgCache::PkgIterator Pkg = Ver.ParentPkg();
+	       Cache->SetCandidateVersion(Ver);
+
+	       if (TryToInstall(Pkg, Cache, Fix, false, BrokenFix) == false)
+		  return false;
+
+	       // see if we need to fix the auto-mark flag
+	       // e.g. apt-get install foo
+	       // where foo is marked automatic
+	       if (Cache[Pkg].Install() == false &&
+		   (Cache[Pkg].Flags & pkgCache::Flag::Auto) &&
+		   _config->FindB("APT::Get::ReInstall",false) == false &&
+		   _config->FindB("APT::Get::Only-Upgrade",false) == false &&
+		   _config->FindB("APT::Get::Download-Only",false) == false)
+	       {
+		  ioprintf(c1out,_("%s set to manually installed.\n"),
+				Pkg.FullName(true).c_str());
+		  Cache->MarkAuto(Pkg,false);
+		  AutoMarkChanged++;
+	       }
+	    }
+	 else if (order[i] == MOD_REMOVE)
+	    for (APT::VersionSet::const_iterator Ver = verset[MOD_REMOVE].begin();
+		 Ver != verset[MOD_REMOVE].end(); ++Ver)
+	    {
+	       pkgCache::PkgIterator Pkg = Ver.ParentPkg();
 
-	 if (TryToInstall(Pkg, Cache, Fix, true, BrokenFix) == false)
-	    return false;
+	       if (TryToInstall(Pkg, Cache, Fix, true, BrokenFix) == false)
+		  return false;
+	    }
       }
 
       if (_error->PendingError() == true)
@@ -1752,7 +1768,7 @@ bool DoInstall(CommandLine &CmdL)
 
    /* Print out a list of packages that are going to be installed extra
       to what the user asked */
-   if (Cache->InstCount() != verset[0].size())
+   if (Cache->InstCount() != verset[MOD_INSTALL].size())
    {
       string List;
       string VersionsList;
@@ -1879,7 +1895,7 @@ bool DoInstall(CommandLine &CmdL)
 
    // See if we need to prompt
    // FIXME: check if really the packages in the set are going to be installed
-   if (Cache->InstCount() == verset[0].size() && Cache->DelCount() == 0)
+   if (Cache->InstCount() == verset[MOD_INSTALL].size() && Cache->DelCount() == 0)
       return InstallPackages(Cache,false,false);
 
    return InstallPackages(Cache,false);