]> git.saurik.com Git - apt.git/blobdiff - cmdline/apt-get.cc
Wow
[apt.git] / cmdline / apt-get.cc
index 1bf87349bdabc43d8b9e5b2ad1102a7fe25f0c0e..cc73339fd9dbae2475dd5bde5db01bea27a3b94a 100644 (file)
@@ -1,6 +1,6 @@
 // -*- mode: cpp; mode: fold -*-
 // Description                                                         /*{{{*/
-// $Id: apt-get.cc,v 1.3 1998/10/19 23:45:36 jgg Exp $
+// $Id: apt-get.cc,v 1.10 1998/11/13 07:09:02 jgg Exp $
 /* ######################################################################
    
    apt-get - Cover for dpkg
 #include <apt-pkg/sourcelist.h>
 #include <apt-pkg/pkgcachegen.h>
 #include <apt-pkg/algorithms.h>
+#include <apt-pkg/acquire-item.h>
+#include <apt-pkg/dpkgpm.h>
+#include <strutl.h>
 
 #include <config.h>
 
+#include "acqprogress.h"
+
 #include <fstream.h>
+#include <termios.h>
+#include <sys/ioctl.h>
+#include <signal.h>
                                                                        /*}}}*/
 
 ostream c0out;
@@ -44,6 +52,27 @@ ostream c2out;
 ofstream devnull("/dev/null");
 unsigned int ScreenWidth = 80;
 
+// YnPrompt - Yes No Prompt.                                           /*{{{*/
+// ---------------------------------------------------------------------
+/* Returns true on a Yes.*/
+bool YnPrompt()
+{
+   if (_config->FindB("APT::Get::Assume-Yes",false) == true)
+   {
+      c2out << 'Y' << endl;
+      return true;
+   }
+   
+   char C = 0;
+   char Jnk = 0;
+   read(STDIN_FILENO,&C,1);
+   while (C != '\n' && Jnk != '\n') read(STDIN_FILENO,&Jnk,1);
+   
+   if (!(C == 'Y' || C == 'y' || C == '\n' || C == '\r'))
+      return false;
+   return true;
+}
+                                                                       /*}}}*/
 // ShowList - Show a list                                              /*{{{*/
 // ---------------------------------------------------------------------
 /* This prints out a string of space seperated words with a title and 
@@ -242,7 +271,7 @@ void ShowEssential(ostream &out,pkgDepCache &Dep)
    pkgCache::PkgIterator I = Dep.PkgBegin();
    string List;
    bool *Added = new bool[Dep.HeaderP->PackageCount];
-   for (int I = 0; I != Dep.HeaderP->PackageCount; I++)
+   for (unsigned int I = 0; I != Dep.HeaderP->PackageCount; I++)
       Added[I] = false;
    
    for (;I.end() != true; I++)
@@ -415,8 +444,9 @@ bool CacheFile::Open()
 // ---------------------------------------------------------------------
 /* This displays the informative messages describing what is going to 
    happen and then calls the download routines */
-bool InstallPackages(pkgDepCache &Cache,bool ShwKept)
+bool InstallPackages(pkgDepCache &Cache,bool ShwKept,bool Ask = true)
 {
+   // Show all the various warning indicators
    ShowDel(c1out,Cache);
    ShowNew(c1out,Cache);
    if (ShwKept == true)
@@ -437,7 +467,66 @@ bool InstallPackages(pkgDepCache &Cache,bool ShwKept)
    if (Cache.DelCount() == 0 && Cache.InstCount() == 0 && 
        Cache.BadCount() == 0)
       return true;   
+
+   // Run the simulator ..
+   if (_config->FindB("APT::Get::Simulate") == true)
+   {
+      pkgSimulate PM(Cache);
+      return PM.DoInstall();
+   }
+   
+   // Create the text record parser
+   pkgRecords Recs(Cache);
+   
+   // Create the download object
+   AcqTextStatus Stat(ScreenWidth,_config->FindI("quiet",0));   
+   pkgAcquire Fetcher(&Stat);
+
+   // Read the source list
+   pkgSourceList List;
+   if (List.ReadMainList() == false)
+      return _error->Error("The list of sources could not be read.");
+   
+   // Create the package manager and prepare to download
+   pkgPackageManager PM(Cache);
+   if (PM.GetArchives(&Fetcher,&List,&Recs) == false)
+      return false;
+
+   unsigned long FetchBytes = Fetcher.FetchNeeded();
+   unsigned long DebBytes = Fetcher.TotalNeeded();
+   if (DebBytes != Cache.DebSize())
+      c0out << "How odd.. The sizes didn't match, email apt@packages.debian.org" << endl;
+   
+   c1out << "Need to get ";
+   if (DebBytes != FetchBytes)
+      c1out << SizeToStr(FetchBytes) << '/' << SizeToStr(DebBytes);
+   else
+      c1out << SizeToStr(DebBytes);
       
+   c1out << " of archives. After unpacking ";
+   
+   if (Cache.UsrSize() >= 0)
+      c1out << SizeToStr(Cache.UsrSize()) << " will be used." << endl;
+   else
+      c1out << SizeToStr(-1*Cache.UsrSize()) << " will be freed." << endl;
+
+   if (_error->PendingError() == true)
+      return false;
+
+   if (Ask == true)
+   {
+      
+      if (_config->FindI("quiet",0) < 2 || 
+         _config->FindB("APT::Get::Assume-Yes",false) == false)
+      c2out << "Do you want to continue? [Y/n] " << flush;
+      if (YnPrompt() == false)
+        exit(1);
+   }      
+
+   // Run it
+   if (Fetcher.Run() == false)
+      return false;
+   
    return true;
 }
                                                                        /*}}}*/
@@ -445,8 +534,41 @@ bool InstallPackages(pkgDepCache &Cache,bool ShwKept)
 // DoUpdate - Update the package lists                                 /*{{{*/
 // ---------------------------------------------------------------------
 /* */
-bool DoUpdate(CommandLine &CmdL)
+bool DoUpdate(CommandLine &)
 {
+   // Get the source list
+   pkgSourceList List;
+   if (List.ReadMainList() == false)
+      return false;
+
+   // Create the download object
+   AcqTextStatus Stat(ScreenWidth,_config->FindI("quiet",0));
+   pkgAcquire Fetcher(&Stat);
+   
+   // Populate it with the source selection
+   pkgSourceList::const_iterator I;
+   for (I = List.begin(); I != List.end(); I++)
+   {
+      new pkgAcqIndex(&Fetcher,I);
+      if (_error->PendingError() == true)
+        return false;
+   }
+   
+   // Run it
+   if (Fetcher.Run() == false)
+      return false;
+
+   // Clean out any old list files
+   if (Fetcher.Clean(_config->FindDir("Dir::State::lists")) == false ||
+       Fetcher.Clean(_config->FindDir("Dir::State::lists") + "partial/") == false)
+      return false;
+   
+   // Prepare the cache.   
+   CacheFile Cache;
+   if (Cache.Open() == false)
+      return false;
+   
+   return true;
 }
                                                                        /*}}}*/
 // DoUpgrade - Upgrade all packages                                    /*{{{*/
@@ -460,7 +582,6 @@ bool DoUpgrade(CommandLine &CmdL)
       return false;
 
    // Do the upgrade
-   pkgProblemResolver Resolve(Cache);
    if (pkgAllUpgrade(Cache) == false)
    {
       ShowBroken(c1out,Cache);
@@ -479,8 +600,8 @@ bool DoInstall(CommandLine &CmdL)
    if (Cache.Open() == false)
       return false;
    
-   int ExpectedInst = 0;
-   int Packages = 0;
+   unsigned int ExpectedInst = 0;
+   unsigned int Packages = 0;
    pkgProblemResolver Fix(Cache);
    
    bool DefRemove = false;
@@ -616,7 +737,10 @@ bool DoInstall(CommandLine &CmdL)
       ShowList(c1out,"The following extra packages will be installed:",List);
    }
 
-   return InstallPackages(Cache,false);
+   // See if we need to prompt
+   if (Cache->InstCount() != ExpectedInst || Cache->DelCount() != 0)
+      return InstallPackages(Cache,false,true);
+   return InstallPackages(Cache,false);   
 }
                                                                        /*}}}*/
 // DoDistUpgrade - Automatic smart upgrader                            /*{{{*/
@@ -766,6 +890,20 @@ void GetInitialize()
    _config->Set("APT::Get::Fix-Broken",false);
 }
                                                                        /*}}}*/
+// SigWinch - Window size change signal handler                                /*{{{*/
+// ---------------------------------------------------------------------
+/* */
+void SigWinch(int)
+{
+   // Riped from GNU ls
+#ifdef TIOCGWINSZ
+   struct winsize ws;
+  
+   if (ioctl(1, TIOCGWINSZ, &ws) != -1 && ws.ws_col >= 5)
+      ScreenWidth = ws.ws_col - 1;
+#endif
+}
+                                                                       /*}}}*/
 
 int main(int argc,const char *argv[])
 {
@@ -783,6 +921,7 @@ int main(int argc,const char *argv[])
       {'f',"fix-broken","APT::Get::Fix-Broken",0},
       {'u',"show-upgraded","APT::Get::Show-Upgraded",0},
       {'m',"ignore-missing","APT::Get::Fix-Broken",0},      
+      {0,"ignore-hold","APT::Ingore-Hold",0},      
       {'c',"config-file",0,CommandLine::ConfigFile},
       {'o',"option",0,CommandLine::ArbItem},
       {0,0,0,0}};
@@ -809,6 +948,11 @@ int main(int argc,const char *argv[])
       c0out.rdbuf(devnull.rdbuf());
    if (_config->FindI("quiet",0) > 1)
       c1out.rdbuf(devnull.rdbuf());
+
+   // Setup the signals
+   signal(SIGPIPE,SIG_IGN);
+   signal(SIGWINCH,SigWinch);
+   SigWinch(0);
    
    // Match the operation
    struct 
@@ -829,7 +973,8 @@ int main(int argc,const char *argv[])
    {
       if (strcmp(CmdL.FileList[0],Map[I].Match) == 0)
       {
-        Map[I].Handler(CmdL);
+        if (Map[I].Handler(CmdL) == false && _error->PendingError() == false)
+           _error->Error("Handler silently failed");
         break;
       }
    }