]> git.saurik.com Git - apt.git/blobdiff - apt-pkg/deb/dpkgpm.cc
* cmdline/apt-get.cc:
[apt.git] / apt-pkg / deb / dpkgpm.cc
index 4c44cd01a2ad062b06c545688434c3cb18efd0d1..a63c4e4125479839f8243b48a399733adef83b09 100644 (file)
@@ -8,9 +8,6 @@
    ##################################################################### */
                                                                        /*}}}*/
 // Includes                                                            /*{{{*/
-#ifdef __GNUG__
-#pragma implementation "apt-pkg/dpkgpm.h"
-#endif
 #include <apt-pkg/dpkgpm.h>
 #include <apt-pkg/error.h>
 #include <apt-pkg/configuration.h>
@@ -388,7 +385,7 @@ bool pkgDPkgPM::Go(int OutStatusFd)
    // the dpkg states that are already done; the string is the package
    // the int is the state that is already done (e.g. a package that is
    // going to be install is already in state "half-installed")
-   map<string,int> PackageOpsDone;
+   map<string,unsigned int> PackageOpsDone;
 
    // init the PackageOps map, go over the list of packages that
    // that will be [installed|configured|removed|purged] and add
@@ -474,6 +471,8 @@ bool pkgDPkgPM::Go(int OutStatusFd)
         case Item::Install:
         Args[n++] = "--unpack";
         Size += strlen(Args[n-1]);
+        Args[n++] = "--auto-deconfigure";
+        Size += strlen(Args[n-1]);
         break;
       }
       
@@ -636,6 +635,8 @@ bool pkgDPkgPM::Go(int OutStatusFd)
         {
            if (_config->FindB("Debug::pkgDPkgProgressReporting",false) == true)
               std::clog << "ignoring line: not enough ':'" << std::endl;
+           // reset the line buffer
+           line[0]=0;
            continue;
         }
 
@@ -709,14 +710,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;
       }      
    }