Bläddra i källkod

edsp: try to read responses even if writing failed

If a solver/planner exits before apt is done writing we will generate
write errors. Solvers like 'dump' can be pretty quick in failing but
produce a valid EDSP error report apt should read, parse and display
instead of just discarding even through we had write errors.
David Kalnischkies 10 år sedan
förälder
incheckning
b60c8a89c2
1 ändrade filer med 20 tillägg och 15 borttagningar
  1. 20 15
      apt-pkg/edsp.cc

+ 20 - 15
apt-pkg/edsp.cc

@@ -1061,20 +1061,21 @@ bool EDSP::ResolveExternal(const char* const solver, pkgDepCache &Cache,
 		return _error->Errno("ResolveExternal", "Opening solver %s stdin on fd %d for writing failed", solver, solver_in);
 
 	bool Okay = output.Failed() == false;
-	if (Progress != NULL)
+	if (Okay && Progress != NULL)
 		Progress->OverallProgress(0, 100, 5, _("Execute external solver"));
 	Okay &= EDSP::WriteRequest(Cache, output, flags, Progress);
-	if (Progress != NULL)
+	if (Okay && Progress != NULL)
 		Progress->OverallProgress(5, 100, 20, _("Execute external solver"));
 	Okay &= EDSP::WriteScenario(Cache, output, Progress);
 	output.Close();
 
-	if (Progress != NULL)
+	if (Okay && Progress != NULL)
 		Progress->OverallProgress(25, 100, 75, _("Execute external solver"));
 	if (Okay && EDSP::ReadResponse(solver_out, Cache, Progress) == false)
 		return false;
 
-	return ExecWait(solver_pid, solver);
+	bool const waited = ExecWait(solver_pid, solver);
+	return Okay && waited;
 }
 bool EDSP::ResolveExternal(const char* const solver, pkgDepCache &Cache,
 			 bool const upgrade, bool const distUpgrade,
@@ -1118,28 +1119,32 @@ bool EIPP::OrderInstall(char const * const solver, pkgPackageManager * const PM,
       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)
+   if (Okay && Progress != NULL)
       Progress->OverallProgress(0, 100, 5, _("Execute external planner"));
    Okay &= EIPP::WriteRequest(PM->Cache, output, flags, Progress);
-   if (Progress != NULL)
+   if (Okay && Progress != NULL)
       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 planner"));
-
-   // we don't tell the external planners about boring things
-   for (auto Pkg = PM->Cache.PkgBegin(); Pkg.end() == false; ++Pkg)
+   if (Okay)
    {
-      if (Pkg->CurrentState == pkgCache::State::ConfigFiles && PM->Cache[Pkg].Purge() == true)
-	 PM->Remove(Pkg, true);
+      if (Progress != nullptr)
+	 Progress->OverallProgress(25, 100, 75, _("Execute external planner"));
+
+      // 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)
+	    PM->Remove(Pkg, true);
+      }
    }
 
-   if (Okay && EIPP::ReadResponse(solver_out, PM, Progress) == false)
+   if (EIPP::ReadResponse(solver_out, PM, Progress) == false)
       return false;
 
-   return ExecWait(solver_pid, solver);
+   bool const waited = ExecWait(solver_pid, solver);
+   return Okay && waited;
 }
 									/*}}}*/
 bool EIPP::WriteRequest(pkgDepCache &Cache, FileFd &output,		/*{{{*/