]> git.saurik.com Git - apt.git/commitdiff
* apt-pkg/packagemanager.{cc,h}:
authorMichael Vogt <egon@bottom>
Mon, 7 Jan 2008 20:26:11 +0000 (21:26 +0100)
committerMichael Vogt <egon@bottom>
Mon, 7 Jan 2008 20:26:11 +0000 (21:26 +0100)
  - propergate the Immediate flag to make hitting the
    "E: Internal Error, Could not perform immediate configuration (2)"
    harder
* debian/control:
  - build against libdb-dev (instead of libdb4.4-dev)
* merged the apt--DoListUpdate branch, this provides a common interface
  for "apt-get update" like operations for the frontends and also provides
  hooks to run stuff in APT::Update::{Pre,Post}-Invoke

16 files changed:
apt-pkg/acquire-worker.cc
apt-pkg/algorithms.cc
apt-pkg/algorithms.h
apt-pkg/cachefile.cc
apt-pkg/cachefile.h
apt-pkg/contrib/fileutl.cc
apt-pkg/contrib/fileutl.h
apt-pkg/deb/dpkgpm.cc
apt-pkg/deb/dpkgpm.h
apt-pkg/packagemanager.cc
apt-pkg/packagemanager.h
cmdline/apt-get.cc
debian/changelog
debian/control
doc/examples/configure-index
methods/connect.cc

index 739c9e32ccacf1e4381e1872b3a3db61c3f3067a..1a754dae905cd3f8aa6e49076ed07c7098be3e65 100644 (file)
@@ -325,6 +325,7 @@ bool pkgAcquire::Worker::RunMessages()
            // set some status
            if(LookupTag(Message,"FailReason") == "Timeout" || 
               LookupTag(Message,"FailReason") == "TmpResolveFailure" ||
+              LookupTag(Message,"FailReason") == "ResolveFailure" ||
               LookupTag(Message,"FailReason") == "ConnectionRefused") 
               Owner->Status = pkgAcquire::Item::StatTransientNetworkError;
 
index 158f9c258f4b1c6c973a6c2d2d29fc5c569f6c0e..6e2b9755730c11b824dde72ce199b791a5d4972b 100644 (file)
@@ -19,7 +19,7 @@
 #include <apt-pkg/configuration.h>
 #include <apt-pkg/version.h>
 #include <apt-pkg/sptr.h>
-
+#include <apt-pkg/acquire-item.h>
     
 #include <apti18n.h>
 #include <sys/types.h>
@@ -1302,3 +1302,77 @@ void pkgPrioSortList(pkgCache &Cache,pkgCache::Version **List)
 }
                                                                        /*}}}*/
 
+// CacheFile::ListUpdate - update the cache files                      /*{{{*/
+// ---------------------------------------------------------------------
+/* This is a simple wrapper to update the cache. it will fetch stuff
+ * from the network (or any other sources defined in sources.list)
+ */
+bool ListUpdate(pkgAcquireStatus &Stat, 
+               pkgSourceList &List, 
+               int PulseInterval)
+{
+   pkgAcquire::RunResult res;
+   pkgAcquire Fetcher(&Stat);
+
+   // Populate it with the source selection
+   if (List.GetIndexes(&Fetcher) == false)
+        return false;
+
+   // Run scripts
+   RunScripts("APT::Update::Pre-Invoke");
+   
+   // check arguments
+   if(PulseInterval>0)
+      res = Fetcher.Run(PulseInterval);
+   else
+      res = Fetcher.Run();
+
+   if (res == pkgAcquire::Failed)
+      return false;
+
+   bool Failed = false;
+   bool TransientNetworkFailure = false;
+   for (pkgAcquire::ItemIterator I = Fetcher.ItemsBegin(); 
+       I != Fetcher.ItemsEnd(); I++)
+   {
+      if ((*I)->Status == pkgAcquire::Item::StatDone)
+        continue;
+
+      (*I)->Finished();
+
+      _error->Warning(_("Failed to fetch %s  %s\n"),(*I)->DescURI().c_str(),
+             (*I)->ErrorText.c_str());
+
+      if ((*I)->Status == pkgAcquire::Item::StatTransientNetworkError) 
+      {
+        TransientNetworkFailure = true;
+        continue;
+      }
+
+      Failed = true;
+   }
+   
+   // Clean out any old list files
+   // Keep "APT::Get::List-Cleanup" name for compatibility, but
+   // this is really a global option for the APT library now
+   if (!TransientNetworkFailure && !Failed &&
+       (_config->FindB("APT::Get::List-Cleanup",true) == true ||
+       _config->FindB("APT::List-Cleanup",true) == true))
+   {
+      if (Fetcher.Clean(_config->FindDir("Dir::State::lists")) == false ||
+         Fetcher.Clean(_config->FindDir("Dir::State::lists") + "partial/") == false)
+        // something went wrong with the clean
+        return false;
+   }
+   
+   if (TransientNetworkFailure == true)
+      _error->Warning(_("Some index files failed to download, they have been ignored, or old ones used instead."));
+   else if (Failed == true)
+      return _error->Error(_("Some index files failed to download, they have been ignored, or old ones used instead."));
+
+
+   // Run the scripts if all was fine
+   RunScripts("APT::Update::Post-Invoke");
+   return true;
+}
+                                                                       /*}}}*/
index b72874d8e216687c4edfd0474008f730b71b7b16..defaed57d9355aec35834272070f80edcfbfac4c 100644 (file)
@@ -33,6 +33,7 @@
 
 #include <apt-pkg/packagemanager.h>
 #include <apt-pkg/depcache.h>
+#include <apt-pkg/acquire.h>
 
 #include <iostream>
 
@@ -130,5 +131,7 @@ bool pkgAllUpgrade(pkgDepCache &Cache);
 bool pkgMinimizeUpgrade(pkgDepCache &Cache);
 
 void pkgPrioSortList(pkgCache &Cache,pkgCache::Version **List);
+
+bool ListUpdate(pkgAcquireStatus &progress, pkgSourceList &List, int PulseInterval=0);
                     
 #endif
index cccad2bf3ae95ec29f7bd8035c981cdf80721319..1a84aea54d5504ed2c0ceb126c2e64f68104290a 100644 (file)
@@ -19,6 +19,8 @@
 #include <apt-pkg/configuration.h>
 #include <apt-pkg/policy.h>
 #include <apt-pkg/pkgsystem.h>
+#include <apt-pkg/acquire-item.h>
+#include <apt-pkg/fileutl.h>
     
 #include <apti18n.h>
                                                                        /*}}}*/
@@ -107,6 +109,7 @@ bool pkgCacheFile::Open(OpProgress &Progress,bool WithLock)
 }
                                                                        /*}}}*/
 
+
 // CacheFile::Close - close the cache files                            /*{{{*/
 // ---------------------------------------------------------------------
 /* */
index d23841e5e8051319fc5b0140154217e4fad27b00..3b057951c81fdfa5dff93809ec6ef3979e396a5e 100644 (file)
@@ -19,6 +19,8 @@
 
 
 #include <apt-pkg/depcache.h>
+#include <apt-pkg/acquire.h>
+#include <apt-pkg/sourcelist.h>
 
 class pkgPolicy;
 class pkgCacheFile
index 9e13b4f60d05ebd916b15d958e095b2f941325cc..2b7e25080ef52578fbf672331a0e549ec5476073 100644 (file)
@@ -8,9 +8,12 @@
    CopyFile - Buffered copy of a single file
    GetLock - dpkg compatible lock file manipulation (fcntl)
    
-   This source is placed in the Public Domain, do with it what you will
+   Most of this source is placed in the Public Domain, do with it what 
+   you will
    It was originally written by Jason Gunthorpe <jgg@debian.org>.
    
+   The exception is RunScripts() it is under the GPLv2
+
    ##################################################################### */
                                                                        /*}}}*/
 // Include Files                                                       /*{{{*/
 
 using namespace std;
 
+// RunScripts - Run a set of scripts from a configuration subtree      /*{{{*/
+// ---------------------------------------------------------------------
+/* */
+bool RunScripts(const char *Cnf)
+{
+   Configuration::Item const *Opts = _config->Tree(Cnf);
+   if (Opts == 0 || Opts->Child == 0)
+      return true;
+   Opts = Opts->Child;
+
+   // Fork for running the system calls
+   pid_t Child = ExecFork();
+   
+   // This is the child
+   if (Child == 0)
+   {
+      if (chdir("/tmp/") != 0)
+        _exit(100);
+        
+      unsigned int Count = 1;
+      for (; Opts != 0; Opts = Opts->Next, Count++)
+      {
+        if (Opts->Value.empty() == true)
+           continue;
+        
+        if (system(Opts->Value.c_str()) != 0)
+           _exit(100+Count);
+      }
+      _exit(0);
+   }      
+
+   // Wait for the child
+   int Status = 0;
+   while (waitpid(Child,&Status,0) != Child)
+   {
+      if (errno == EINTR)
+        continue;
+      return _error->Errno("waitpid","Couldn't wait for subprocess");
+   }
+
+   // Restore sig int/quit
+   signal(SIGQUIT,SIG_DFL);
+   signal(SIGINT,SIG_DFL);   
+
+   // Check for an error code.
+   if (WIFEXITED(Status) == 0 || WEXITSTATUS(Status) != 0)
+   {
+      unsigned int Count = WEXITSTATUS(Status);
+      if (Count > 100)
+      {
+        Count -= 100;
+        for (; Opts != 0 && Count != 1; Opts = Opts->Next, Count--);
+        _error->Error("Problem executing scripts %s '%s'",Cnf,Opts->Value.c_str());
+      }
+      
+      return _error->Error("Sub-process returned an error code");
+   }
+   
+   return true;
+}
+                                                                       /*}}}*/
+
 // CopyFile - Buffered copy of a file                                  /*{{{*/
 // ---------------------------------------------------------------------
 /* The caller is expected to set things so that failure causes erasure */
index 48bd95537b182e4f2e97fc2dfe9dac7a96d978b6..73b5ea3be1a3ed410ba658810cf56e9c940ffa5f 100644 (file)
@@ -77,6 +77,7 @@ class FileFd
    virtual ~FileFd();
 };
 
+bool RunScripts(const char *Cnf);
 bool CopyFile(FileFd &From,FileFd &To);
 int GetLock(string File,bool Errors = true);
 bool FileExists(string File);
index d796146fa2080fa61f0061378e67d2b393b22149..34e166447684276082ddadec7168a7bdbb27927e 100644 (file)
@@ -14,6 +14,7 @@
 #include <apt-pkg/depcache.h>
 #include <apt-pkg/strutl.h>
 #include <apti18n.h>
+#include <apt-pkg/fileutl.h>
 
 #include <unistd.h>
 #include <stdlib.h>
@@ -95,68 +96,6 @@ bool pkgDPkgPM::Remove(PkgIterator Pkg,bool Purge)
    return true;
 }
                                                                        /*}}}*/
-// DPkgPM::RunScripts - Run a set of scripts                           /*{{{*/
-// ---------------------------------------------------------------------
-/* This looks for a list of script sto run from the configuration file,
-   each one is run with system from a forked child. */
-bool pkgDPkgPM::RunScripts(const char *Cnf)
-{
-   Configuration::Item const *Opts = _config->Tree(Cnf);
-   if (Opts == 0 || Opts->Child == 0)
-      return true;
-   Opts = Opts->Child;
-
-   // Fork for running the system calls
-   pid_t Child = ExecFork();
-   
-   // This is the child
-   if (Child == 0)
-   {
-      if (chdir("/tmp/") != 0)
-        _exit(100);
-        
-      unsigned int Count = 1;
-      for (; Opts != 0; Opts = Opts->Next, Count++)
-      {
-        if (Opts->Value.empty() == true)
-           continue;
-        
-        if (system(Opts->Value.c_str()) != 0)
-           _exit(100+Count);
-      }
-      _exit(0);
-   }      
-
-   // Wait for the child
-   int Status = 0;
-   while (waitpid(Child,&Status,0) != Child)
-   {
-      if (errno == EINTR)
-        continue;
-      return _error->Errno("waitpid","Couldn't wait for subprocess");
-   }
-
-   // Restore sig int/quit
-   signal(SIGQUIT,SIG_DFL);
-   signal(SIGINT,SIG_DFL);   
-
-   // Check for an error code.
-   if (WIFEXITED(Status) == 0 || WEXITSTATUS(Status) != 0)
-   {
-      unsigned int Count = WEXITSTATUS(Status);
-      if (Count > 100)
-      {
-        Count -= 100;
-        for (; Opts != 0 && Count != 1; Opts = Opts->Next, Count--);
-        _error->Error("Problem executing scripts %s '%s'",Cnf,Opts->Value.c_str());
-      }
-      
-      return _error->Error("Sub-process returned an error code");
-   }
-   
-   return true;
-}
-                                                                        /*}}}*/
 // DPkgPM::SendV2Pkgs - Send version 2 package info                    /*{{{*/
 // ---------------------------------------------------------------------
 /* This is part of the helper script communication interface, it sends
@@ -342,8 +281,8 @@ bool pkgDPkgPM::RunScriptsWithPkgs(const char *Cnf)
 */
 void pkgDPkgPM::DoStdin(int master)
 {
-   char input_buf[256] = {0,}; 
-   int len = read(0, input_buf, sizeof(input_buf));
+   unsigned char input_buf[256] = {0,}; 
+   ssize_t len = read(0, input_buf, sizeof(input_buf));
    if (len)
       write(master, input_buf, len);
    else
@@ -357,9 +296,9 @@ void pkgDPkgPM::DoStdin(int master)
  */
 void pkgDPkgPM::DoTerminalPty(int master)
 {
-   char term_buf[1024] = {0,};
+   unsigned char term_buf[1024] = {0,0, };
 
-   int len=read(master, term_buf, sizeof(term_buf));
+   ssize_t len=read(master, term_buf, sizeof(term_buf));
    if(len == -1 && errno == EIO)
    {
       // this happens when the child is about to exit, we
index 81a888f057a15729fc0e47c832fdd4c1b77eba73..ebc7e32bf9fc3c3ddf204b66708363fc152a308b 100644 (file)
@@ -64,7 +64,6 @@ class pkgDPkgPM : public pkgPackageManager
    vector<Item> List;
 
    // Helpers
-   bool RunScripts(const char *Cnf);
    bool RunScriptsWithPkgs(const char *Cnf);
    bool SendV2Pkgs(FILE *F);
 
index d6172c6c4c8cd82197b1dd9c95467ab2666ccf3b..c391a6036915e2f78b26591e46624465e0e23c24 100644 (file)
@@ -118,6 +118,41 @@ bool pkgPackageManager::FixMissing()
 }
                                                                        /*}}}*/
 
+// PM::ImmediateAdd - Add the immediate flag recursivly                        /*{{{*/
+// ---------------------------------------------------------------------
+/* This adds the immediate flag to the pkg and recursively to the
+   dependendies 
+ */
+void pkgPackageManager::ImmediateAdd(PkgIterator I, bool UseInstallVer)
+{
+   DepIterator D;
+   
+   if(UseInstallVer)
+   {
+      if(Cache[I].InstallVer == 0)
+        return;
+      D = Cache[I].InstVerIter(Cache).DependsList(); 
+   } else {
+      if (I->CurrentVer == 0)
+        return;
+      D = I.CurrentVer().DependsList(); 
+   }
+
+   for ( /* nothing */  ; D.end() == false; D++)
+      if (D->Type == pkgCache::Dep::Depends || D->Type == pkgCache::Dep::PreDepends)
+      {
+        if(!List->IsFlag(D.TargetPkg(), pkgOrderList::Immediate))
+        {
+           if(Debug)
+              clog << "ImmediateAdd(): Adding Immediate flag to " << I.Name() << endl;
+           List->Flag(D.TargetPkg(),pkgOrderList::Immediate);
+           ImmediateAdd(D.TargetPkg(), UseInstallVer);
+        }
+      }
+   return;
+}
+                                                                       /*}}}*/
+
 // PM::CreateOrderList - Create the ordering class                     /*{{{*/
 // ---------------------------------------------------------------------
 /* This populates the ordering list with all the packages that are
@@ -144,21 +179,15 @@ bool pkgPackageManager::CreateOrderList()
           (I->Flags & pkgCache::Flag::Important) == pkgCache::Flag::Important) &&
          NoImmConfigure == false)
       {
+        if(Debug)
+           clog << "CreateOrderList(): Adding Immediate flag for " << I.Name() << endl;
         List->Flag(I,pkgOrderList::Immediate);
-        
-        // Look for other packages to make immediate configurea
-        if (Cache[I].InstallVer != 0)
-           for (DepIterator D = Cache[I].InstVerIter(Cache).DependsList(); 
-                D.end() == false; D++)
-              if (D->Type == pkgCache::Dep::Depends || D->Type == pkgCache::Dep::PreDepends)
-                 List->Flag(D.TargetPkg(),pkgOrderList::Immediate);
+
+        // Look for other install packages to make immediate configurea
+        ImmediateAdd(I, true);
         
         // And again with the current version.
-        if (I->CurrentVer != 0)
-           for (DepIterator D = I.CurrentVer().DependsList(); 
-                D.end() == false; D++)
-              if (D->Type == pkgCache::Dep::Depends || D->Type == pkgCache::Dep::PreDepends)
-                 List->Flag(D.TargetPkg(),pkgOrderList::Immediate);
+        ImmediateAdd(I, false);
       }
       
       // Not interesting
index 53cd4c96ffc24ce93868fbb7505480a2bc363a06..a1bfdc52d7072a8a947c4511887168a88df9eaba 100644 (file)
@@ -49,6 +49,7 @@ class pkgPackageManager : protected pkgCache::Namespace
    bool Debug;
          
    bool DepAdd(pkgOrderList &Order,PkgIterator P,int Depth = 0);
+   void ImmediateAdd(PkgIterator P, bool UseInstallVer);
    virtual OrderResult OrderInstall();
    bool CheckRConflicts(PkgIterator Pkg,DepIterator Dep,const char *Ver);
    bool CreateOrderList();
index 53c657e8a748132508a53ea10ffb36a1aa39879d..258133c194b711b9bc2137060e9af5755a6516ce 100644 (file)
@@ -1351,14 +1351,15 @@ bool DoUpdate(CommandLine &CmdL)
         return _error->Error(_("Unable to lock the list directory"));
    }
    
-   // Create the download object
+   // Create the progress
    AcqTextStatus Stat(ScreenWidth,_config->FindI("quiet",0));
-   pkgAcquire Fetcher(&Stat);
-
-   
+      
    // Just print out the uris an exit if the --print-uris flag was used
    if (_config->FindB("APT::Get::Print-URIs") == true)
    {
+      // get a fetcher
+      pkgAcquire Fetcher(&Stat);
+
       // Populate it with the source selection and get all Indexes 
       // (GetAll=true)
       if (List.GetIndexes(&Fetcher,true) == false)
@@ -1371,54 +1372,14 @@ bool DoUpdate(CommandLine &CmdL)
       return true;
    }
 
-   // Populate it with the source selection
-   if (List.GetIndexes(&Fetcher) == false)
-        return false;
-   
-   // Run it
-   if (Fetcher.Run() == pkgAcquire::Failed)
-      return false;
-
-   bool Failed = false;
-   bool TransientNetworkFailure = false;
-   for (pkgAcquire::ItemIterator I = Fetcher.ItemsBegin(); I != Fetcher.ItemsEnd(); I++)
-   {
-      if ((*I)->Status == pkgAcquire::Item::StatDone)
-        continue;
-
-      (*I)->Finished();
-
-      fprintf(stderr,_("Failed to fetch %s  %s\n"),(*I)->DescURI().c_str(),
-             (*I)->ErrorText.c_str());
-
-      if ((*I)->Status == pkgAcquire::Item::StatTransientNetworkError) 
-      {
-        TransientNetworkFailure = true;
-        continue;
-      }
-
-      Failed = true;
-   }
-   
-   // Clean out any old list files
-   if (!TransientNetworkFailure &&
-       _config->FindB("APT::Get::List-Cleanup",true) == true)
-   {
-      if (Fetcher.Clean(_config->FindDir("Dir::State::lists")) == false ||
-         Fetcher.Clean(_config->FindDir("Dir::State::lists") + "partial/") == false)
-        return false;
-   }
-   
-   // Prepare the cache.   
+   // do the work
    CacheFile Cache;
+   bool res = ListUpdate(Stat, List);
+     
+   // Rebuild the cache.   
    if (Cache.BuildCaches() == false)
       return false;
    
-   if (TransientNetworkFailure == true)
-      _error->Warning(_("Some index files failed to download, they have been ignored, or old ones used instead."));
-   else if (Failed == true)
-      return _error->Error(_("Some index files failed to download, they have been ignored, or old ones used instead."));
-
    return true;
 }
                                                                        /*}}}*/
index da32f06de2a664b557eefccfd20498c8b9e2ff7f..0dec173466ec23ca71e96399eb11170d1c80cda2 100644 (file)
@@ -49,6 +49,15 @@ apt (0.7.10) UNRELEASED; urgency=low
   * apt-pkg/acquire-item.{cc,h}:
     - make the authentication download code more robust against
       servers/proxies with broken If-Range implementations
+  * apt-pkg/packagemanager.{cc,h}:
+    - propergate the Immediate flag to make hitting the 
+      "E: Internal Error, Could not perform immediate configuration (2)"
+      harder
+  * debian/control:
+    - build against libdb-dev (instead of libdb4.4-dev)
+  * merged the apt--DoListUpdate branch, this provides a common interface
+    for "apt-get update" like operations for the frontends and also provides
+    hooks to run stuff in APT::Update::{Pre,Post}-Invoke
 
   [ Chris Cheney ]
   * ftparchive/contents.cc:
index 742e8ca5c8b1e5cd7e50c810a04b4f20d22a34ab..2e9e306c886fc7220d2b7a342c589cba4764389e 100644 (file)
@@ -4,7 +4,7 @@ Priority: important
 Maintainer: APT Development Team <deity@lists.debian.org>
 Uploaders: Jason Gunthorpe <jgg@debian.org>, Adam Heath <doogie@debian.org>, Matt Zimmerman <mdz@debian.org>, Michael Vogt <mvo@debian.org>, Otavio Salvador <otavio@debian.org>
 Standards-Version: 3.7.2.2
-Build-Depends: debhelper (>= 5.0), libdb4.4-dev, gettext (>= 0.12), libcurl4-gnutls-dev | libcurl3-gnutls-dev (>= 7.15.5)
+Build-Depends: debhelper (>= 5.0), libdb-dev, gettext (>= 0.12), libcurl4-gnutls-dev | libcurl3-gnutls-dev (>= 7.15.5)
 Build-Depends-Indep: debiandoc-sgml, docbook-utils (>= 0.6.12-1)
 XS-Vcs-Bzr: http://bzr.debian.org/apt/debian-sid/
 
index ba3ed3892d5a42ed293f5eafccf81db6ab910dd0..8893b5b74808aeb1b56c245f27865efdebfcb320 100644 (file)
@@ -77,6 +77,12 @@ APT
      NoAct "false";
   };
 
+  Update
+  {
+     Pre-Invoke {"touch /var/lib/apt/pre-update-stamp"; };
+     Post-Invoke {"touch /var/lib/apt/post-update-stamp"; };
+  };
+
   Authentication
   {
      TrustCDROM "false";            // consider the CDROM always trusted
index 8c2ac6d56dab4451b41ba0208297cad60c40fbe1..aef7db3896d43de6f26bf2c2cdfd73f908fbaa69 100644 (file)
@@ -164,6 +164,7 @@ bool Connect(string Host,int Port,const char *Service,int DefPort,int &Fd,
                  DefPort = 0;
                  continue;
               }
+              Owner->SetFailExtraMsg("\nFailReason: ResolveFailure");
               return _error->Error(_("Could not resolve '%s'"),Host.c_str());
            }