X-Git-Url: https://git.saurik.com/apt.git/blobdiff_plain/8a9cd8995f4a5392de9843ff65795c5345d2573a..4172c78468a04078c97146dbc2e2979e63906f5b:/apt-pkg/deb/dpkgpm.cc

diff --git a/apt-pkg/deb/dpkgpm.cc b/apt-pkg/deb/dpkgpm.cc
index 667db8ff2..3204fc1bb 100644
--- a/apt-pkg/deb/dpkgpm.cc
+++ b/apt-pkg/deb/dpkgpm.cc
@@ -355,28 +355,28 @@ bool pkgDPkgPM::Go(int OutStatusFd)
    static const struct DpkgState DpkgStatesOpMap[][5] = {
       // Install operation
       { 
-	 {"half-installed", _("Preparing %s")}, 
-	 {"unpacked", _("Unpacking %s") }, 
+	 {"half-installed", N_("Preparing %s")}, 
+	 {"unpacked", N_("Unpacking %s") }, 
 	 {NULL, NULL}
       },
       // Configure operation
       { 
-	 {"unpacked",_("Preparing to configure %s") },
-	 {"half-configured", _("Configuring %s") },
-	 { "installed", _("Installed %s")},
+	 {"unpacked",N_("Preparing to configure %s") },
+	 {"half-configured", N_("Configuring %s") },
+	 { "installed", N_("Installed %s")},
 	 {NULL, NULL}
       },
       // Remove operation
       { 
-	 {"half-configured", _("Preparing for removal of %s")},
-	 {"half-installed", _("Removing %s")},
-	 {"config-files",  _("Removed %s")},
+	 {"half-configured", N_("Preparing for removal of %s")},
+	 {"half-installed", N_("Removing %s")},
+	 {"config-files",  N_("Removed %s")},
 	 {NULL, NULL}
       },
       // Purge operation
       { 
-	 {"config-files", _("Preparing to completely remove %s")},
-	 {"not-installed", _("Completely removed %s")},
+	 {"config-files", N_("Preparing to completely remove %s")},
+	 {"not-installed", N_("Completely removed %s")},
 	 {NULL, NULL}
       },
    };
@@ -624,9 +624,22 @@ bool pkgDPkgPM::Go(int OutStatusFd)
 	    
 	 */
 	 char* list[5];
+	 //        dpkg sends multiline error messages sometimes (see
+	 //        #374195 for a example. we should support this by
+	 //        either patching dpkg to not send multiline over the
+	 //        statusfd or by rewriting the code here to deal with
+	 //        it. for now we just ignore it and not crash
 	 TokSplitString(':', line, list, sizeof(list)/sizeof(list[0]));
 	 char *pkg = list[1];
 	 char *action = _strstrip(list[2]);
+	 if( pkg == NULL || action == NULL) 
+	 {
+	    if (_config->FindB("Debug::pkgDPkgProgressReporting",false) == true)
+	       std::clog << "ignoring line: not enough ':'" << std::endl;
+	    // reset the line buffer
+	    line[0]=0;
+	    continue;
+	 }
 
 	 if(strncmp(action,"error",strlen("error")) == 0)
 	 {
@@ -664,7 +677,7 @@ bool pkgDPkgPM::Go(int OutStatusFd)
 	 {
 	    // only read the translation if there is actually a next
 	    // action
-	    const char *translation = states[PackageOpsDone[pkg]].str;
+	    const char *translation = _(states[PackageOpsDone[pkg]].str);
 	    char s[200];
 	    snprintf(s, sizeof(s), translation, pkg);
 
@@ -698,14 +711,23 @@ bool pkgDPkgPM::Go(int OutStatusFd)
       // Check for an error code.
       if (WIFEXITED(Status) == 0 || WEXITSTATUS(Status) != 0)
       {
-	 RunScripts("DPkg::Post-Invoke");
-	 if (WIFSIGNALED(Status) != 0 && WTERMSIG(Status) == SIGSEGV)
-	    return _error->Error("Sub-process %s received a segmentation fault.",Args[0]);
-
-	 if (WIFEXITED(Status) != 0)
-	    return _error->Error("Sub-process %s returned an error code (%u)",Args[0],WEXITSTATUS(Status));
+	 // if it was set to "keep-dpkg-runing" then we won't return
+	 // here but keep the loop going and just report it as a error
+	 // for later
+	 bool stopOnError = _config->FindB("Dpkg::StopOnError",true);
 	 
-	 return _error->Error("Sub-process %s exited unexpectedly",Args[0]);
+	 if(stopOnError)
+	    RunScripts("DPkg::Post-Invoke");
+
+	 if (WIFSIGNALED(Status) != 0 && WTERMSIG(Status) == SIGSEGV) 
+	    _error->Error("Sub-process %s received a segmentation fault.",Args[0]);
+	 else if (WIFEXITED(Status) != 0)
+	    _error->Error("Sub-process %s returned an error code (%u)",Args[0],WEXITSTATUS(Status));
+	 else 
+	    _error->Error("Sub-process %s exited unexpectedly",Args[0]);
+
+	 if(stopOnError)
+	    return false;
       }      
    }