// -*- mode: cpp; mode: fold -*-
// Description /*{{{*/
-// $Id: apt-get.cc,v 1.90 1999/11/26 00:05:55 jgg Exp $
+// $Id: apt-get.cc,v 1.99 2000/06/05 04:47:30 jgg Exp $
/* ######################################################################
apt-get - Cover for dpkg
#include <termios.h>
#include <sys/ioctl.h>
#include <sys/stat.h>
-#include <sys/vfs.h>
+#include <sys/statvfs.h>
#include <signal.h>
#include <unistd.h>
#include <stdio.h>
// ---------------------------------------------------------------------
/* This displays the informative messages describing what is going to
happen and then calls the download routines */
-bool InstallPackages(CacheFile &Cache,bool ShwKept,bool Ask = true,bool Saftey = true)
+bool InstallPackages(CacheFile &Cache,bool ShwKept,bool Ask = true,
+ bool Saftey = true)
{
if (_config->FindB("APT::Get::Purge",false) == true)
{
c1out << SizeToStr(DebBytes) << 'B';
c1out << " of archives. After unpacking ";
-
- // Check for enough free space
- struct statfs Buf;
- string OutputDir = _config->FindDir("Dir::Cache::Archives");
- if (statfs(OutputDir.c_str(),&Buf) != 0)
- return _error->Errno("statfs","Couldn't determine free space in %s",
- OutputDir.c_str());
- if (unsigned(Buf.f_bfree) < (FetchBytes - FetchPBytes)/Buf.f_bsize)
- return _error->Error("Sorry, you don't have enough free space in %s to hold all the .debs.",
- OutputDir.c_str());
// Size delta
if (Cache->UsrSize() >= 0)
if (_error->PendingError() == true)
return false;
+ /* Check for enough free space, but only if we are actually going to
+ download */
+ if (_config->FindB("APT::Get::Print-URIs") == false)
+ {
+ struct statvfs Buf;
+ string OutputDir = _config->FindDir("Dir::Cache::Archives");
+ if (statvfs(OutputDir.c_str(),&Buf) != 0)
+ return _error->Errno("statvfs","Couldn't determine free space in %s",
+ OutputDir.c_str());
+ if (unsigned(Buf.f_bfree) < (FetchBytes - FetchPBytes)/Buf.f_bsize)
+ return _error->Error("Sorry, you don't have enough free space in %s to hold all the .debs.",
+ OutputDir.c_str());
+ }
+
// Fail safe check
if (_config->FindI("quiet",0) >= 2 ||
_config->FindB("APT::Get::Assume-Yes",false) == true)
// Run it
while (1)
{
- if (_config->FindB("APT::Get::No-Download",false) == false)
- if (Fetcher.Run() == pkgAcquire::Failed)
- return false;
+ bool Transient = false;
+ if (_config->FindB("APT::Get::No-Download",false) == true)
+ {
+ for (pkgAcquire::Item **I = Fetcher.ItemsBegin(); I < Fetcher.ItemsEnd();)
+ {
+ if ((*I)->Local == true)
+ {
+ I++;
+ continue;
+ }
+
+ // Close the item and check if it was found in cache
+ (*I)->Finished();
+ if ((*I)->Complete == false)
+ Transient = true;
+
+ // Clear it out of the fetch list
+ delete *I;
+ I = Fetcher.ItemsBegin();
+ }
+ }
+
+ if (Fetcher.Run() == pkgAcquire::Failed)
+ return false;
// Print out errors
bool Failed = false;
- bool Transient = false;
for (pkgAcquire::Item **I = Fetcher.ItemsBegin(); I != Fetcher.ItemsEnd(); I++)
{
if ((*I)->Status == pkgAcquire::Item::StatDone &&
// Failed = true;
continue;
}
-
+
cerr << "Failed to fetch " << (*I)->DescURI() << endl;
cerr << " " << (*I)->ErrorText << endl;
Failed = true;
}
- /* If we are in no download mode and missing files then there were
+ /* If we are in no download mode and missing files and there were
'failures' then the user must specify -m. Furthermore, there
is no such thing as a transient error in no-download mode! */
- if (Transient == true &&
+ if (Transient == true &&
_config->FindB("APT::Get::No-Download",false) == true)
{
Transient = false;
cerr << "Unable to correct missing packages." << endl;
return _error->Error("Aborting Install.");
}
-
+
Cache.ReleaseLock();
pkgPackageManager::OrderResult Res = PM.DoInstall();
if (Res == pkgPackageManager::Failed || _error->PendingError() == true)
Pkg.ProvidesList()->NextProvides == 0)
{
pkgCache::PkgIterator Tmp = Pkg.ProvidesList().OwnerPkg();
- c1out << "Note, installing " << Tmp.Name() << " instead of " << Pkg.Name() << endl;
+ c1out << "Note, selecting " << Tmp.Name() << " instead of " << Pkg.Name() << endl;
Pkg = Tmp;
}
// Check if there is something at all to install
pkgDepCache::StateCache &State = Cache[Pkg];
if (Remove == true && Pkg->CurrentVer == 0)
+ {
+ if (AllowFail == false)
+ return false;
return _error->Error("Package %s is not installed",Pkg.Name());
+ }
if (State.CandidateVer == 0 && Remove == false)
{
}
// Clean out any old list files
- if (_config->FindB("APT::Get::List-Cleanup",false) == false)
+ if (_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)
protected:
virtual void Erase(const char *File,string Pkg,string Ver,struct stat &St)
{
- cout << "Del " << Pkg << " " << Ver << " [" << SizeToStr(St.st_size) << "B]" << endl;
+ c1out << "Del " << Pkg << " " << Ver << " [" << SizeToStr(St.st_size) << "B]" << endl;
if (_config->FindB("APT::Get::Simulate") == false)
unlink(File);
unsigned long DebBytes = Fetcher.TotalNeeded();
// Check for enough free space
- struct statfs Buf;
+ struct statvfs Buf;
string OutputDir = ".";
- if (statfs(OutputDir.c_str(),&Buf) != 0)
- return _error->Errno("statfs","Couldn't determine free space in %s",
+ if (statvfs(OutputDir.c_str(),&Buf) != 0)
+ return _error->Errno("statvfs","Couldn't determine free space in %s",
OutputDir.c_str());
if (unsigned(Buf.f_bfree) < (FetchBytes - FetchPBytes)/Buf.f_bsize)
return _error->Error("Sorry, you don't have enough free space in %s",
// Diff only mode only fetches .diff files
if (_config->FindB("APT::Get::Diff-Only",false) == true ||
- _config->FindB("APT::Get::Tar-Only",false) == true)
+ _config->FindB("APT::Get::Tar-Only",false) == true ||
+ Dsc[I].Dsc.empty() == true)
continue;
-
+
// See if the package is already unpacked
struct stat Stat;
if (stat(Dir.c_str(),&Stat) == 0 &&
return 100;
cout << "Usage: apt-get [options] command" << endl;
- cout << " apt-get [options] install pkg1 [pkg2 ...]" << endl;
+ cout << " apt-get [options] install|remove pkg1 [pkg2 ...]" << endl;
+ cout << " apt-get [options] source pkg1 [pkg2 ...]" << endl;
cout << endl;
cout << "apt-get is a simple command line interface for downloading and" << endl;
cout << "installing packages. The most frequently used commands are update" << endl;
{'s',"simulate","APT::Get::Simulate",0},
{'s',"just-print","APT::Get::Simulate",0},
{'s',"recon","APT::Get::Simulate",0},
+ {'s',"dry-run","APT::Get::Simulate",0},
{'s',"no-act","APT::Get::Simulate",0},
{'y',"yes","APT::Get::Assume-Yes",0},
{'y',"assume-yes","APT::Get::Assume-Yes",0},
_config->FindB("version") == true ||
CmdL.FileSize() == 0)
return ShowHelp(CmdL);
-
+
// Deal with stdout not being a tty
if (ttyname(STDOUT_FILENO) == 0 && _config->FindI("quiet",0) < 1)
_config->Set("quiet","1");
-
+
// Setup the output streams
c0out.rdbuf(cout.rdbuf());
c1out.rdbuf(cout.rdbuf());