// -*- 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;
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
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++)
// ---------------------------------------------------------------------
/* 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)
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;
}
/*}}}*/
// 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 /*{{{*/
return false;
// Do the upgrade
- pkgProblemResolver Resolve(Cache);
if (pkgAllUpgrade(Cache) == false)
{
ShowBroken(c1out,Cache);
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;
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[])
{
{'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}};
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;
}
}