// -*- mode: cpp; mode: fold -*-
// Description /*{{{*/
-// $Id: apt-get.cc,v 1.5 1998/10/24 04:58:08 jgg Exp $
+// $Id: apt-get.cc,v 1.9 1998/11/13 04:24:03 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 <config.h>
+#include "acqprogress.h"
+
#include <fstream.h>
+#include <termios.h>
+#include <sys/ioctl.h>
+#include <signal.h>
/*}}}*/
ostream c0out;
// ---------------------------------------------------------------------
/* 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)
{
ShowDel(c1out,Cache);
ShowNew(c1out,Cache);
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;
+
+ // Run it
+ if (Fetcher.Run() == false)
+ return false;
+
return true;
}
/*}}}*/
// 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 /*{{{*/
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 /*{{{*/
_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[])
{
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
{
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;
}
}