]> git.saurik.com Git - apt.git/blobdiff - apt-pkg/edsp.cc
don't change owner/perms/times through file:// symlinks
[apt.git] / apt-pkg / edsp.cc
index 805a37bb391d726c4922aedcdd41c9625216c1a2..ef2401f9ecc0df5829e7bd20d52dd9bd38fa27c0 100644 (file)
@@ -439,7 +439,7 @@ bool EDSP::WriteScenario(pkgDepCache &Cache, FileFd &output, OpProgress *Progres
            Progress->Progress(p);
       }
    }
-   return true;
+   return Okay;
 }
                                                                        /*}}}*/
 // EDSP::WriteLimitedScenario - to the given file descriptor           /*{{{*/
@@ -911,14 +911,14 @@ bool EDSP::WriteSolutionStanza(FileFd &output, char const * const Type, pkgCache
                                                                        /*}}}*/
 // EDSP::WriteProgess - pulse to the given file descriptor             /*{{{*/
 bool EDSP::WriteProgress(unsigned short const percent, const char* const message, FILE* output) {
-       fprintf(output, "Progress: %s\n", TimeRFC1123(time(NULL)).c_str());
+       fprintf(output, "Progress: %s\n", TimeRFC1123(time(NULL), true).c_str());
        fprintf(output, "Percentage: %d\n", percent);
        fprintf(output, "Message: %s\n\n", message);
        fflush(output);
        return true;
 }
 bool EDSP::WriteProgress(unsigned short const percent, const char* const message, FileFd &output) {
-       return WriteOkay(output, "Progress: ", TimeRFC1123(time(NULL)), "\n",
+       return WriteOkay(output, "Progress: ", TimeRFC1123(time(NULL), true), "\n",
              "Percentage: ", percent, "\n",
              "Message: ", message, "\n\n") && output.Flush();
 }
@@ -1026,8 +1026,20 @@ bool EDSP::ResolveExternal(const char* const solver, pkgDepCache &Cache,
                        return false;
                auto const dumpdir = flNotFile(dumpfile);
                FileFd output;
-               if (CreateAPTDirectoryIfNeeded(dumpdir, dumpdir) == false ||
-                     output.Open(dumpfile, FileFd::WriteOnly | FileFd::Exclusive | FileFd::Create, FileFd::Extension, 0644) == false)
+               _error->PushToStack();
+               bool errored_out = CreateAPTDirectoryIfNeeded(dumpdir, dumpdir) == false ||
+                  output.Open(dumpfile, FileFd::WriteOnly | FileFd::Exclusive | FileFd::Create, FileFd::Extension, 0644) == false;
+               std::vector<std::string> downgrademsgs;
+               while (_error->empty() == false)
+               {
+                  std::string msg;
+                  _error->PopMessage(msg);
+                  downgrademsgs.emplace_back(std::move(msg));
+               }
+               _error->RevertToStack();
+               for (auto && msg : downgrademsgs)
+                  _error->Warning("%s", msg.c_str());
+               if (errored_out)
                        return _error->WarningE("EDSP::Resolve", _("Could not open file '%s'"), dumpfile.c_str());
                bool Okay = EDSP::WriteRequest(Cache, output, flags, nullptr);
                return Okay && EDSP::WriteScenario(Cache, output, nullptr);
@@ -1074,28 +1086,54 @@ bool EDSP::ResolveExternal(const char* const solver, pkgDepCache &Cache,
 bool EIPP::OrderInstall(char const * const solver, pkgPackageManager * const PM,       /*{{{*/
                         unsigned int const flags, OpProgress * const Progress)
 {
+   if (strcmp(solver, "internal") == 0)
+   {
+      auto const dumpfile = _config->FindFile("Dir::Log::Planner");
+      if (dumpfile.empty())
+        return false;
+      auto const dumpdir = flNotFile(dumpfile);
+      FileFd output;
+      _error->PushToStack();
+      bool errored_out = CreateAPTDirectoryIfNeeded(dumpdir, dumpdir) == false ||
+           output.Open(dumpfile, FileFd::WriteOnly | FileFd::Exclusive | FileFd::Create, FileFd::Extension, 0644) == false;
+      std::vector<std::string> downgrademsgs;
+      while (_error->empty() == false)
+      {
+        std::string msg;
+        _error->PopMessage(msg);
+        downgrademsgs.emplace_back(std::move(msg));
+      }
+      _error->RevertToStack();
+      for (auto && msg : downgrademsgs)
+        _error->Warning("%s", msg.c_str());
+      if (errored_out)
+        return _error->WarningE("EIPP::OrderInstall", _("Could not open file '%s'"), dumpfile.c_str());
+      bool Okay = EIPP::WriteRequest(PM->Cache, output, flags, nullptr);
+      return Okay && EIPP::WriteScenario(PM->Cache, output, nullptr);
+   }
+
    int solver_in, solver_out;
-   pid_t const solver_pid = ExecuteExternal("planer", solver, "Dir::Bin::Planers", &solver_in, &solver_out);
+   pid_t const solver_pid = ExecuteExternal("planner", solver, "Dir::Bin::Planners", &solver_in, &solver_out);
    if (solver_pid == 0)
       return false;
 
    FileFd output;
    if (output.OpenDescriptor(solver_in, FileFd::WriteOnly | FileFd::BufferedWrite, true) == false)
-      return _error->Errno("OrderInstall", "Opening planer %s stdin on fd %d for writing failed", solver, solver_in);
+      return _error->Errno("EIPP::OrderInstall", "Opening planner %s stdin on fd %d for writing failed", solver, solver_in);
 
    bool Okay = output.Failed() == false;
    if (Progress != NULL)
-      Progress->OverallProgress(0, 100, 5, _("Execute external planer"));
+      Progress->OverallProgress(0, 100, 5, _("Execute external planner"));
    Okay &= EIPP::WriteRequest(PM->Cache, output, flags, Progress);
    if (Progress != NULL)
-      Progress->OverallProgress(5, 100, 20, _("Execute external planer"));
+      Progress->OverallProgress(5, 100, 20, _("Execute external planner"));
    Okay &= EIPP::WriteScenario(PM->Cache, output, Progress);
    output.Close();
 
    if (Progress != NULL)
-      Progress->OverallProgress(25, 100, 75, _("Execute external planer"));
+      Progress->OverallProgress(25, 100, 75, _("Execute external planner"));
 
-   // we don't tell the external planers about boring things
+   // we don't tell the external planners about boring things
    for (auto Pkg = PM->Cache.PkgBegin(); Pkg.end() == false; ++Pkg)
    {
       if (Pkg->CurrentState == pkgCache::State::ConfigFiles && PM->Cache[Pkg].Purge() == true)
@@ -1113,7 +1151,7 @@ bool EIPP::WriteRequest(pkgDepCache &Cache, FileFd &output,               /*{{{*/
                        OpProgress * const Progress)
 {
    if (Progress != NULL)
-      Progress->SubProgress(Cache.Head().PackageCount, _("Send request to planer"));
+      Progress->SubProgress(Cache.Head().PackageCount, _("Send request to planner"));
    unsigned long p = 0;
    string del, inst, reinst;
    for (pkgCache::PkgIterator Pkg = Cache.PkgBegin(); Pkg.end() == false; ++Pkg, ++p)
@@ -1150,7 +1188,7 @@ bool EIPP::WriteRequest(pkgDepCache &Cache, FileFd &output,               /*{{{*/
       WriteOkay(Okay, output, "Install:", inst, "\n");
    if (reinst.empty() == false)
       WriteOkay(Okay, output, "ReInstall:", reinst, "\n");
-   WriteOkay(Okay, output, "Planer: ", _config->Find("APT::Planer", "internal"), "\n");
+   WriteOkay(Okay, output, "Planner: ", _config->Find("APT::Planner", "internal"), "\n");
    if ((flags & Request::IMMEDIATE_CONFIGURATION_ALL) != 0)
       WriteOkay(Okay, output, "Immediate-Configuration: yes\n");
    else if ((flags & Request::NO_IMMEDIATE_CONFIGURATION) != 0)
@@ -1203,7 +1241,7 @@ template<typename forVersion> void forAllInterestingVersions(pkgDepCache &Cache,
 bool EIPP::WriteScenario(pkgDepCache &Cache, FileFd &output, OpProgress * const Progress)
 {
    if (Progress != NULL)
-      Progress->SubProgress(Cache.Head().PackageCount, _("Send scenario to planer"));
+      Progress->SubProgress(Cache.Head().PackageCount, _("Send scenario to planner"));
    unsigned long p = 0;
    bool Okay = output.Failed() == false;
    std::vector<std::string> archs = APT::Configuration::getArchitectures();
@@ -1270,7 +1308,7 @@ bool EIPP::WriteScenario(pkgDepCache &Cache, FileFd &output, OpProgress * const
         continue;
       forAllInterestingVersions(Cache, Pkg, WriteVersion);
    }
-   return true;
+   return Okay;
 }
                                                                        /*}}}*/
 // EIPP::ReadResponse - from the given file descriptor                 /*{{{*/
@@ -1304,13 +1342,13 @@ bool EIPP::ReadResponse(int const input, pkgPackageManager * const PM, OpProgres
       } else if (section.Exists("Error") == true) {
         std::string msg = SubstVar(SubstVar(section.FindS("Message"), "\n .\n", "\n\n"), "\n ", "\n");
         if (msg.empty() == true) {
-           msg = _("External planer failed without a proper error message");
+           msg = _("External planner failed without a proper error message");
            _error->Error("%s", msg.c_str());
         } else
-           _error->Error("External planer failed with: %s", msg.substr(0,msg.find('\n')).c_str());
+           _error->Error("External planner failed with: %s", msg.substr(0,msg.find('\n')).c_str());
         if (Progress != NULL)
            Progress->Done();
-        std::cerr << "The planer encountered an error of type: " << section.FindS("Error") << std::endl;
+        std::cerr << "The planner encountered an error of type: " << section.FindS("Error") << std::endl;
         std::cerr << "The following information might help you to understand what is wrong:" << std::endl;
         std::cerr << msg << std::endl << std::endl;
         return false;
@@ -1347,7 +1385,7 @@ bool EIPP::ReadResponse(int const input, pkgPackageManager * const PM, OpProgres
       else if (strcmp(type, "Remove") == 0)
         PM->Remove(Pkg, PM->Cache[Pkg].Purge());
    }
-   return true;
+   return in.Failed() == false;
 }
                                                                        /*}}}*/
 bool EIPP::ReadRequest(int const input, std::list<std::pair<std::string,PKG_ACTION>> &actions,/*{{{*/
@@ -1382,7 +1420,7 @@ bool EIPP::ReadRequest(int const input, std::list<std::pair<std::string,PKG_ACTI
            _config->Set("APT::Architecture", line);
         else if (LineStartsWithAndStrip(line, "Architectures:"))
            _config->Set("APT::Architectures", SubstVar(line, " ", ","));
-        else if (LineStartsWithAndStrip(line, "Planer:"))
+        else if (LineStartsWithAndStrip(line, "Planner:"))
            ; // purely informational line
         else if (LineStartsWithAndStrip(line, "Immediate-Configuration:"))
         {
@@ -1403,9 +1441,6 @@ bool EIPP::ReadRequest(int const input, std::list<std::pair<std::string,PKG_ACTI
       }
    }
    return false;
-
-
-   return false;
 }
                                                                        /*}}}*/
 bool EIPP::ApplyRequest(std::list<std::pair<std::string,PKG_ACTION>> &actions,/*{{{*/