By gosh, I think it works
authorArch Librarian <arch@canonical.com>
Mon, 20 Sep 2004 16:51:32 +0000 (16:51 +0000)
committerArch Librarian <arch@canonical.com>
Mon, 20 Sep 2004 16:51:32 +0000 (16:51 +0000)
Author: jgg
Date: 1998-11-22 03:20:30 GMT
By gosh, I think it works

apt-pkg/acquire-item.cc
apt-pkg/acquire-item.h
apt-pkg/deb/dpkgpm.cc
apt-pkg/init.cc
apt-pkg/packagemanager.cc
apt-pkg/packagemanager.h
cmdline/apt-get.cc
doc/Bugs
doc/examples/apt.conf

index 532d4e6..cfd0e5d 100644 (file)
@@ -1,6 +1,6 @@
 // -*- mode: cpp; mode: fold -*-
 // Description                                                         /*{{{*/
-// $Id: acquire-item.cc,v 1.12 1998/11/13 07:08:48 jgg Exp $
+// $Id: acquire-item.cc,v 1.13 1998/11/22 03:20:30 jgg Exp $
 /* ######################################################################
 
    Acquire Item - Item to acquire
@@ -224,6 +224,14 @@ void pkgAcqIndex::Done(string Message,unsigned long Size,string MD5)
    Mode = "gzip";
 }
                                                                        /*}}}*/
+// AcqIndex::Describe - Describe the Item                              /*{{{*/
+// ---------------------------------------------------------------------
+/* */
+string pkgAcqIndex::Describe()
+{
+   return Location->PackagesURI();
+}
+                                                                       /*}}}*/
 
 // AcqIndexRel::pkgAcqIndexRel - Constructor                           /*{{{*/
 // ---------------------------------------------------------------------
@@ -302,13 +310,23 @@ void pkgAcqIndexRel::Done(string Message,unsigned long Size,string MD5)
    Rename(DestFile,FinalFile);
 }
                                                                        /*}}}*/
+// AcqIndexRel::Describe - Describe the Item                           /*{{{*/
+// ---------------------------------------------------------------------
+/* */
+string pkgAcqIndexRel::Describe()
+{
+   return Location->ReleaseURI();
+}
+                                                                       /*}}}*/
 
 // AcqArchive::AcqArchive - Constructor                                        /*{{{*/
 // ---------------------------------------------------------------------
 /* */
 pkgAcqArchive::pkgAcqArchive(pkgAcquire *Owner,pkgSourceList *Sources,
-                            pkgRecords *Recs,pkgCache::VerIterator const &Version) :
-               Item(Owner), Version(Version), Sources(Sources), Recs(Recs)
+                            pkgRecords *Recs,pkgCache::VerIterator const &Version,
+                            string &StoreFilename) :
+               Item(Owner), Version(Version), Sources(Sources), Recs(Recs), 
+               StoreFilename(StoreFilename)
 {
    // Select a source
    pkgCache::VerFileIterator Vf = Version.FileList();
@@ -355,7 +373,7 @@ pkgAcqArchive::pkgAcqArchive(pkgAcquire *Owner,pkgSourceList *Sources,
            Complete = true;
            Local = true;
            Status = StatDone;
-           DestFile = FinalFile;
+           StoreFilename = DestFile = FinalFile;
            return;
         }
         
@@ -415,11 +433,11 @@ void pkgAcqArchive::Done(string Message,unsigned long Size,string Md5Hash)
    }
 
    Complete = true;
-   
-   // We have to copy it into place
+
+   // Reference filename
    if (FileName != DestFile)
    {
-      DestFile = FileName;
+      StoreFilename = DestFile = FileName;
       Local = true;
       return;
    }
@@ -429,7 +447,16 @@ void pkgAcqArchive::Done(string Message,unsigned long Size,string Md5Hash)
    FinalFile += flNotDir(DestFile);
    Rename(DestFile,FinalFile);
    
-   DestFile = FinalFile;
+   StoreFilename = DestFile = FinalFile;
    Complete = true;
 }
                                                                        /*}}}*/
+// AcqArchive::Describe - Describe the Item                            /*{{{*/
+// ---------------------------------------------------------------------
+/* */
+string pkgAcqArchive::Describe()
+{
+   return Desc.URI;
+}
+                                                                       /*}}}*/
+
index 67e2023..d550b33 100644 (file)
@@ -1,6 +1,6 @@
 // -*- mode: cpp; mode: fold -*-
 // Description                                                         /*{{{*/
-// $Id: acquire-item.h,v 1.9 1998/11/13 07:08:50 jgg Exp $
+// $Id: acquire-item.h,v 1.10 1998/11/22 03:20:31 jgg Exp $
 /* ######################################################################
 
    Acquire Item - Item to acquire
@@ -46,7 +46,7 @@ class pkgAcquire::Item
    unsigned long ID;
    bool Complete;
    bool Local;
-   
+
    // Number of queues we are inserted into
    unsigned int QueueCounter;
    
@@ -56,7 +56,8 @@ class pkgAcquire::Item
    virtual void Failed(string Message);
    virtual void Done(string Message,unsigned long Size,string Md5Hash);
    virtual void Start(string Message,unsigned long Size);
-
+   virtual string Describe() = 0;
+   
    virtual string Custom600Headers() {return string();};
       
    Item(pkgAcquire *Owner);
@@ -77,6 +78,7 @@ class pkgAcqIndex : public pkgAcquire::Item
    
    virtual void Done(string Message,unsigned long Size,string Md5Hash);   
    virtual string Custom600Headers();
+   virtual string Describe();
 
    pkgAcqIndex(pkgAcquire *Owner,const pkgSourceList::Item *Location);
 };
@@ -93,6 +95,7 @@ class pkgAcqIndexRel : public pkgAcquire::Item
    
    virtual void Done(string Message,unsigned long Size,string Md5Hash);   
    virtual string Custom600Headers();
+   virtual string Describe();
    
    pkgAcqIndexRel(pkgAcquire *Owner,const pkgSourceList::Item *Location);
 };
@@ -107,13 +110,16 @@ class pkgAcqArchive : public pkgAcquire::Item
    pkgSourceList *Sources;
    pkgRecords *Recs;
    string MD5;
+   string &StoreFilename;
    
    public:
    
    virtual void Done(string Message,unsigned long Size,string Md5Hash);
+   virtual string Describe();
    
    pkgAcqArchive(pkgAcquire *Owner,pkgSourceList *Sources,
-                pkgRecords *Recs,pkgCache::VerIterator const &Version);
+                pkgRecords *Recs,pkgCache::VerIterator const &Version,
+                string &StoreFilename);
 };
 
 #endif
index 75a5c77..dfdc0c4 100644 (file)
@@ -1,6 +1,6 @@
 // -*- mode: cpp; mode: fold -*-
 // Description                                                         /*{{{*/
-// $Id: dpkgpm.cc,v 1.1 1998/11/13 04:23:39 jgg Exp $
+// $Id: dpkgpm.cc,v 1.2 1998/11/22 03:20:35 jgg Exp $
 /* ######################################################################
 
    DPKG Package Manager - Provide an interface to dpkg
@@ -83,45 +83,67 @@ bool pkgDPkgPM::Go()
    {
       vector<Item>::iterator J = I;
       for (; J != List.end() && J->Op == I->Op; J++);
-      
+
       // Generate the argument list
       const char *Args[400];
       if (J - I > 350)
         J = I + 350;
       
-      int n= 0;
-      Args[n++] = "dpkg";
+      unsigned int n = 0;
+      unsigned long Size = 0;
+      Args[n++] = _config->Find("Dir::Bin::dpkg","dpkg").c_str();
+      Size += strlen(Args[n-1]);
       
       switch (I->Op)
       {
         case Item::Remove:
         Args[n++] = "--force-depends";
+        Size += strlen(Args[n-1]);
         Args[n++] = "--force-remove-essential";
+        Size += strlen(Args[n-1]);
         Args[n++] = "--remove";
+        Size += strlen(Args[n-1]);
         break;
         
         case Item::Configure:
         Args[n++] = "--configure";
+        Size += strlen(Args[n-1]);
         break;
         
         case Item::Install:
         Args[n++] = "--unpack";
+        Size += strlen(Args[n-1]);
         break;
       }
       
       // Write in the file or package names
       if (I->Op == Item::Install)
-        for (;I != J; I++)
+      {
+        for (;I != J && Size < 1024; I++)
+        {
            Args[n++] = I->File.c_str();
+           Size += strlen(Args[n-1]);
+        }
+      }      
       else
-        for (;I != J; I++)
+      {
+        for (;I != J && Size < 1024; I++)
+        {
            Args[n++] = I->Pkg.Name();
+           Size += strlen(Args[n-1]);
+        }       
+      }      
       Args[n] = 0;
+      J = I;
+      
+      if (_config->FindB("Debug::pkgDPkgPM",false) == true)
+      {
+        for (unsigned int k = 0; k != n; k++)
+           clog << Args[k] << ' ';
+        clog << endl;
+        continue;
+      }
       
-/*      for (int k = 0; k != n; k++)
-        cout << Args[k] << ' ';
-      cout << endl;*/
-
       cout << flush;
       clog << flush;
       cerr << flush;
index e0ab468..3343e19 100644 (file)
@@ -1,6 +1,6 @@
 // -*- mode: cpp; mode: fold -*-
 // Description                                                         /*{{{*/
-// $Id: init.cc,v 1.12 1998/11/06 02:52:21 jgg Exp $
+// $Id: init.cc,v 1.13 1998/11/22 03:20:32 jgg Exp $
 /* ######################################################################
 
    Init - Initialize the package library
@@ -45,6 +45,7 @@ bool pkgInitialize(Configuration &Cnf)
    Cnf.Set("Dir::Etc::sourcelist","sources.list");
    Cnf.Set("Dir::Etc::main","apt.conf");
    Cnf.Set("Dir::Bin::methods","/usr/lib/apt/methods");
+   Cnf.Set("Dir::Bin::dpkg","/usr/bin/dpkg");
    
    // Read the main config file
    string FName = Cnf.FindFile("Dir::Etc::main");
index 2b47d42..e6222f0 100644 (file)
@@ -1,6 +1,6 @@
 // -*- mode: cpp; mode: fold -*-
 // Description                                                         /*{{{*/
-// $Id: packagemanager.cc,v 1.5 1998/11/13 04:23:30 jgg Exp $
+// $Id: packagemanager.cc,v 1.6 1998/11/22 03:20:33 jgg Exp $
 /* ######################################################################
 
    Package Manager - Abstacts the package manager
@@ -22,6 +22,8 @@
 #include <apt-pkg/error.h>
 #include <apt-pkg/version.h>
 #include <apt-pkg/acquire-item.h>
+#include <apt-pkg/algorithms.h>
+#include <apt-pkg/configuration.h>
                                                                        /*}}}*/
 
 // PM::PackageManager - Constructor                                    /*{{{*/
@@ -31,6 +33,7 @@ pkgPackageManager::pkgPackageManager(pkgDepCache &Cache) : Cache(Cache)
 {
    FileNames = new string[Cache.Head().PackageCount];
    List = 0;
+   Debug = _config->FindB("Debug::pkgPackageManager",false);
 }
                                                                        /*}}}*/
 // PM::PackageManager - Destructor                                     /*{{{*/
@@ -57,7 +60,8 @@ bool pkgPackageManager::GetArchives(pkgAcquire *Owner,pkgSourceList *Sources,
          Cache[I].Delete() == true)
         continue;
       
-      new pkgAcqArchive(Owner,Sources,Recs,Cache[I].InstVerIter(Cache));
+      new pkgAcqArchive(Owner,Sources,Recs,Cache[I].InstVerIter(Cache),
+                       FileNames[I->ID]);
    }
    return true;
 }
@@ -68,16 +72,11 @@ bool pkgPackageManager::GetArchives(pkgAcquire *Owner,pkgSourceList *Sources,
    be downloaded. */
 bool pkgPackageManager::FixMissing()
 {
-   unsigned char *Touch = new unsigned char[Cache.Head().PackageCount];
+   pkgProblemResolver Resolve(Cache);
+   
    for (PkgIterator I = Cache.PkgBegin(); I.end() == false; I++)
    {
-      // Create the status list that ResolveConflicts needs
-      if ((Cache[I].DepState & pkgDepCache::DepNowMin) == pkgDepCache::DepNowMin)
-        Touch[I->ID] = (1 << 0) | (1 << 1);
-      else
-        Touch[I->ID] = 1 << 1;
-      
-      if (Cache[I].Keep() == true)
+     if (Cache[I].Keep() == true)
         continue;
       if (FileNames[I->ID].empty() == false || Cache[I].Delete() == true)
         continue;
@@ -85,10 +84,7 @@ bool pkgPackageManager::FixMissing()
    }
    
    // Now downgrade everything that is broken
-//   Cache.ResolveConflicts(Touch);
-   delete [] Touch;
-
-   return Cache.BrokenCount() == 0;
+   return Resolve.ResolveByKeep() == true && Cache.BrokenCount() == 0;   
 }
                                                                        /*}}}*/
 
@@ -450,10 +446,16 @@ bool pkgPackageManager::OrderInstall()
       if ((I->Flags & pkgCache::Flag::ImmediateConf) == pkgCache::Flag::ImmediateConf)
         List->Flag(I,pkgOrderList::Immediate);
    }
+
+   if (Debug == true)
+      clog << "Begining to order" << endl;
    
    if (List->OrderUnpack() == false)
       return _error->Error("Internal ordering error");
 
+   if (Debug == true)
+      clog << "Done ordering" << endl;
+
    for (pkgOrderList::iterator I = List->begin(); I != List->end(); I++)
    {
       PkgIterator Pkg(Cache,*I);
index c6ab82d..e0e9dc1 100644 (file)
@@ -1,6 +1,6 @@
 // -*- mode: cpp; mode: fold -*-
 // Description                                                         /*{{{*/
-// $Id: packagemanager.h,v 1.5 1998/11/13 04:23:31 jgg Exp $
+// $Id: packagemanager.h,v 1.6 1998/11/22 03:20:34 jgg Exp $
 /* ######################################################################
 
    Package Manager - Abstacts the package manager
@@ -42,6 +42,7 @@ class pkgPackageManager
    string *FileNames;
    pkgDepCache &Cache;
    pkgOrderList *List;
+   bool Debug;
    
    // Bring some usefull types into the local scope
    typedef pkgCache::PkgIterator PkgIterator;
index 215a431..e00cf53 100644 (file)
@@ -1,6 +1,6 @@
 // -*- mode: cpp; mode: fold -*-
 // Description                                                         /*{{{*/
-// $Id: apt-get.cc,v 1.14 1998/11/14 08:11:55 jgg Exp $
+// $Id: apt-get.cc,v 1.15 1998/11/22 03:20:36 jgg Exp $
 /* ######################################################################
    
    apt-get - Cover for dpkg
@@ -110,8 +110,7 @@ void ShowList(ostream &out,string Title,string List)
    description. */
 void ShowBroken(ostream &out,pkgDepCache &Cache)
 {
-   out << "Sorry, but the following packages are broken - this means they have unmet" << endl;
-   out << "dependencies:" << endl;
+   out << "Sorry, but the following packages have unmet dependencies:" << endl;
    pkgCache::PkgIterator I = Cache.PkgBegin();
    for (;I.end() != true; I++)
    {
@@ -128,10 +127,15 @@ void ShowBroken(ostream &out,pkgDepCache &Cache)
         continue;
       }
       
-      for (pkgCache::DepIterator D = Cache[I].InstVerIter(Cache).DependsList(); D.end() == false; D++)
+      for (pkgCache::DepIterator D = Cache[I].InstVerIter(Cache).DependsList(); D.end() == false;)
       {
-        if (Cache.IsImportantDep(D) == false || (Cache[D] &
-                                                 pkgDepCache::DepInstall) != 0)
+        // Compute a single dependency element (glob or)
+        pkgCache::DepIterator Start;
+        pkgCache::DepIterator End;
+        D.GlobOr(Start,End);
+        
+        if (Cache.IsImportantDep(End) == false || 
+            (Cache[End] & pkgDepCache::DepGInstall) == pkgDepCache::DepGInstall)
            continue;
         
         if (First == false)
@@ -139,17 +143,17 @@ void ShowBroken(ostream &out,pkgDepCache &Cache)
               out << ' ';
         First = false;
 
-        cout << ' ' << D.DepType() << ": ";
+        cout << ' ' << End.DepType() << ": " << End.TargetPkg().Name();
         
         // Show a quick summary of the version requirements
-        if (D.TargetVer() != 0)
-           out << " (" << D.CompType() << " " << D.TargetVer() << 
+        if (End.TargetVer() != 0)
+           out << " (" << End.CompType() << " " << End.TargetVer() << 
            ")";
         
         /* Show a summary of the target package if possible. In the case
          of virtual packages we show nothing */
         
-        pkgCache::PkgIterator Targ = D.TargetPkg();
+        pkgCache::PkgIterator Targ = End.TargetPkg();
         if (Targ->ProvidesList == 0)
         {
            out << " but ";
@@ -494,7 +498,7 @@ bool InstallPackages(pkgDepCache &Cache,bool ShwKept,bool Ask = true)
       return _error->Error("The list of sources could not be read.");
    
    // Create the package manager and prepare to download
-   pkgPackageManager PM(Cache);
+   pkgDPkgPM PM(Cache);
    if (PM.GetArchives(&Fetcher,&List,&Recs) == false)
       return false;
 
@@ -531,8 +535,31 @@ bool InstallPackages(pkgDepCache &Cache,bool ShwKept,bool Ask = true)
    // Run it
    if (Fetcher.Run() == false)
       return false;
+
+   // Print out errors
+   bool Failed = false;
+   for (pkgAcquire::Item **I = Fetcher.ItemsBegin(); I != Fetcher.ItemsEnd(); I++)
+   {
+      if ((*I)->Status == pkgAcquire::Item::StatDone &&
+         (*I)->Complete == true)
+        continue;
+      
+      cerr << "Failed to fetch " << (*I)->Describe() << endl;
+      cerr << "  " << (*I)->ErrorText << endl;
+      Failed = true;
+   }
    
-   return true;
+   if (Failed == true && _config->FindB("APT::Fix-Missing",false) == false)
+      return _error->Error("Unable to fetch some archives, maybe try with --fix-missing?");
+
+   // Try to deal with missing package files
+/*   if (PM.FixMissing() == false)
+   {
+      cerr << "Unable to correct missing packages." << endl;
+      return _error->Error("Aborting Install.");
+   }*/
+   
+   return PM.DoInstall();
 }
                                                                        /*}}}*/
 
@@ -941,7 +968,8 @@ int main(int argc,const char *argv[])
       {'y',"assume-yes","APT::Get::Assume-Yes",0},      
       {'f',"fix-broken","APT::Get::Fix-Broken",0},
       {'u',"show-upgraded","APT::Get::Show-Upgraded",0},
-      {'m',"ignore-missing","APT::Get::Fix-Broken",0},
+      {'m',"ignore-missing","APT::Get::Fix-Missing",0},
+      {0,"fix-missing","APT::Get::Fix-Missing",0},
       {0,"ignore-hold","APT::Ingore-Hold",0},      
       {0,"no-upgrade","APT::Get::no-upgrade",0},      
       {'c',"config-file",0,CommandLine::ConfigFile},
index 1c7aac8..5220262 100644 (file)
--- a/doc/Bugs
+++ b/doc/Bugs
  Summary: The man pages have references to several non-existent items,
           ftp.conf is only one of them.
  Status: Fix the man pages. This certainly will be done in 0.3.0
-#28391: apt-get install without upgrading
- Summary: Make install leave the package in the keep state if it is already
-          installed
- Status: Will be implemented in 0.3.0
 
 -- Fixed but unclosed things
 #25026: apt: Why do you list the packages you're _not_ doing anything to instead of the ones you are?
          though it failed. I'm paying very close attention to this in
         0.3.x. Not to mention that the clean behavior will be 
         configurable..
+#28391: apt-get install without upgrading
+ Summary: Make install leave the package in the keep state if it is already
+          installed
+ Status: Will be implemented in 0.3.0
+        Try the --no-upgrade options
         
 -- Silly things
 #26592: apt: Problems with ftpd in SunOS 5.6
index 2519fa2..ddd7d51 100644 (file)
@@ -1,4 +1,4 @@
-// $Id: apt.conf,v 1.11 1998/11/11 06:54:18 jgg Exp $
+// $Id: apt.conf,v 1.12 1998/11/22 03:20:38 jgg Exp $
 /* This file is an index of all APT configuration directives. It should
    NOT actually be used as a real config file, though it is a completely
    valid file.
@@ -25,6 +25,7 @@ APT {
      Simulate "false";
      Assume-Yes "false";
      Fix-Broken "false";  
+     Fix-Missing "false";     
      Show-Upgraded "false";
   };
   
@@ -73,6 +74,7 @@ Dir
   Bin {
      methods "/home/jgg/work/apt/build/bin/methods/";
      gzip "/bin/gzip";
+     dpkg "/usr/bin/dpkg";
   };
 };
 
@@ -86,6 +88,7 @@ Debug {
   pkgProblemResolver "false";
   pkgAcquire "false";
   pkgAcquire::Worker "false";
+  pkgDPkgPM "false";
   
   pkgInitialize "false";   // This one will dump the configuration space
 }