]> git.saurik.com Git - apt.git/blobdiff - cmdline/apt-get.cc
* cmdline/apt-get.cc:
[apt.git] / cmdline / apt-get.cc
index 2062aaa16c93737f0e88df859d3718f2609d8a81..09bf572a5d6a2a9a88c01469e82172298052d3ce 100644 (file)
@@ -1409,55 +1409,46 @@ bool DoUpgrade(CommandLine &CmdL)
 // DoInstallTask - Install task from the command line                  /*{{{*/
 // ---------------------------------------------------------------------
 /* Install named task */
-bool DoInstallTask(CommandLine &CmdL)
+bool TryInstallTask(pkgDepCache &Cache, pkgProblemResolver &Fix, 
+                   bool BrokenFix,
+                   unsigned int& ExpectedInst, 
+                   const char *taskname)
 {
    const char *start, *end;
    pkgCache::PkgIterator Pkg;
+   char buf[64*1024];
+   regex_t Pattern;
 
-   CacheFile Cache;
-   if (Cache.OpenForInstall() == false || 
-       Cache.CheckDeps(CmdL.FileSize() != 1) == false)
-      return false;
-
-   // create the records parser
+   // get the records
    pkgRecords Recs(Cache);
-   
-   unsigned int ExpectedInst = 0;
-   pkgProblemResolver Fix(Cache);
-   char buf[64*1024];
 
-   for (const char **I = CmdL.FileList + 1; *I != 0; I++)
+   // build regexp for the task
+   char S[300];
+   snprintf(S, sizeof(S), "^Task:.*[^a-z]%s[^a-z].*\n", taskname);
+   regcomp(&Pattern,S, REG_EXTENDED | REG_NOSUB | REG_NEWLINE);
+   
+   bool found = false;
+   bool res = true;
+   for (Pkg = Cache.PkgBegin(); Pkg.end() == false; Pkg++)
    {
-      regex_t Pattern;
-
-      // build regexp for the task
-      char S[300];
-      snprintf(S, sizeof(S), "^Task:.*[^a-z]%s[^a-z].*\n", *I);
-      regcomp(&Pattern,S, REG_EXTENDED | REG_NOSUB | REG_NEWLINE);
-
-      for (Pkg = Cache->PkgBegin(); Pkg.end() == false; Pkg++)
-      {
-        pkgCache::VerIterator ver = (*Cache)[Pkg].CandidateVerIter(*Cache);
-        if(ver.end())
-           continue;
-        pkgRecords::Parser &parser = Recs.Lookup(ver.FileList());
-        parser.GetRec(start,end);
-        strncpy(buf, start, end-start);
-        buf[end-start] = 0x0;
-        if (regexec(&Pattern,buf,0,0,0) != 0)
-           continue;
-        TryToInstall(Pkg,Cache,Fix,false,true,ExpectedInst);
-      }
-
-      regfree(&Pattern);
+      pkgCache::VerIterator ver = Cache[Pkg].CandidateVerIter(Cache);
+      if(ver.end())
+        continue;
+      pkgRecords::Parser &parser = Recs.Lookup(ver.FileList());
+      parser.GetRec(start,end);
+      strncpy(buf, start, end-start);
+      buf[end-start] = 0x0;
+      if (regexec(&Pattern,buf,0,0,0) != 0)
+        continue;
+      res &= TryToInstall(Pkg,Cache,Fix,false,BrokenFix,ExpectedInst);
+      found = true;
    }
-
-   // Call the scored problem resolver
-   Fix.InstallProtect();
-   Fix.Resolve(true);
    
-   // prompt for install
-   return InstallPackages(Cache,false,true);
+   if(!found)
+      _error->Error(_("Couldn't find task %s"),taskname);
+
+   regfree(&Pattern);
+   return res;
 }
 
 // DoInstall - Install packages from the command line                  /*{{{*/
@@ -1496,6 +1487,18 @@ bool DoInstall(CommandLine &CmdL)
       bool Remove = DefRemove;
       char *VerTag = 0;
       bool VerIsRel = false;
+
+      // this is a task!
+      if (Length >= 1 && S[Length - 1] == '^')
+      {
+        S[--Length] = 0;
+        // tasks must always be confirmed
+        ExpectedInst += 1000;
+        // see if we can install it
+        TryInstallTask(Cache, Fix, BrokenFix, ExpectedInst, S);
+        continue;
+      }
+
       while (Cache->FindPkg(S).end() == true)
       {
         // Handle an optional end tag indicating what to do
@@ -1512,7 +1515,7 @@ bool DoInstall(CommandLine &CmdL)
            S[--Length] = 0;
            continue;
         }
-        
+
         char *Slash = strchr(S,'=');
         if (Slash != 0)
         {
@@ -2600,7 +2603,6 @@ int main(int argc,const char *argv[])
    CommandLine::Dispatch Cmds[] = {{"update",&DoUpdate},
                                    {"upgrade",&DoUpgrade},
                                    {"install",&DoInstall},
-                                   {"installtask",&DoInstallTask},
                                    {"remove",&DoInstall},
                                    {"dist-upgrade",&DoDistUpgrade},
                                    {"dselect-upgrade",&DoDSelectUpgrade},