X-Git-Url: https://git.saurik.com/apt.git/blobdiff_plain/21ae3cae55e3537db56ae7a77748cacb37b99db6..2b154e536a0df3afb318ddcf9b7daf9337de3c23:/cmdline/apt-get.cc diff --git a/cmdline/apt-get.cc b/cmdline/apt-get.cc index 9749913a7..da364e03c 100644 --- a/cmdline/apt-get.cc +++ b/cmdline/apt-get.cc @@ -1,6 +1,6 @@ // -*- mode: cpp; mode: fold -*- // Description /*{{{*/ -// $Id: apt-get.cc,v 1.32 1998/12/31 01:32:20 jgg Exp $ +// $Id: apt-get.cc,v 1.43 1999/02/21 08:38:53 jgg Exp $ /* ###################################################################### apt-get - Cover for dpkg @@ -35,7 +35,8 @@ #include #include #include -#include +#include +#include #include @@ -44,7 +45,10 @@ #include #include #include +#include +#include #include +#include #include /*}}}*/ @@ -367,7 +371,7 @@ class CacheFile inline pkgDepCache *operator ->() {return Cache;}; inline pkgDepCache &operator *() {return *Cache;}; - bool Open(); + bool Open(bool AllowBroken = false); CacheFile() : File(0), Map(0), Cache(0) {}; ~CacheFile() { @@ -381,7 +385,7 @@ class CacheFile // --------------------------------------------------------------------- /* This routine generates the caches and then opens the dependency cache and verifies that the system is OK. */ -bool CacheFile::Open() +bool CacheFile::Open(bool AllowBroken) { if (_error->PendingError() == true) return false; @@ -427,7 +431,7 @@ bool CacheFile::Open() return false; // Nothing is broken - if (Cache->BrokenCount() == 0) + if (Cache->BrokenCount() == 0 || AllowBroken == true) return true; // Attempt to fix broken things @@ -519,7 +523,8 @@ bool InstallPackages(CacheFile &Cache,bool ShwKept,bool Ask = true) // Create the package manager and prepare to download pkgDPkgPM PM(Cache); - if (PM.GetArchives(&Fetcher,&List,&Recs) == false) + if (PM.GetArchives(&Fetcher,&List,&Recs) == false || + _error->PendingError() == true) return false; // Display statistics @@ -530,21 +535,31 @@ bool InstallPackages(CacheFile &Cache,bool ShwKept,bool Ask = true) c0out << DebBytes << ',' << Cache->DebSize() << endl; c0out << "How odd.. The sizes didn't match, email apt@packages.debian.org" << endl; } - + + // 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/Buf.f_bsize) + return _error->Error("Sorry, you don't have enough free space in %s", + OutputDir.c_str()); + // Number of bytes - c2out << "Need to get "; + c1out << "Need to get "; if (DebBytes != FetchBytes) - c2out << SizeToStr(FetchBytes) << '/' << SizeToStr(DebBytes); + c1out << SizeToStr(FetchBytes) << "b/" << SizeToStr(DebBytes) << 'b'; else - c2out << SizeToStr(DebBytes); + c1out << SizeToStr(DebBytes) << 'b'; c1out << " of archives. After unpacking "; // Size delta if (Cache->UsrSize() >= 0) - c2out << SizeToStr(Cache->UsrSize()) << " will be used." << endl; + c1out << SizeToStr(Cache->UsrSize()) << "b will be used." << endl; else - c2out << SizeToStr(-1*Cache->UsrSize()) << " will be freed." << endl; + c1out << SizeToStr(-1*Cache->UsrSize()) << "b will be freed." << endl; if (_error->PendingError() == true) return false; @@ -566,6 +581,15 @@ bool InstallPackages(CacheFile &Cache,bool ShwKept,bool Ask = true) if (YnPrompt() == false) exit(1); } + + if (_config->FindB("APT::Get::Print-URIs") == true) + { + pkgAcquire::UriIterator I = Fetcher.UriBegin(); + for (; I != Fetcher.UriEnd(); I++) + cout << '\'' << I->URI << "' " << flNotDir(I->Owner->DestFile) << ' ' << + I->Owner->FileSize << ' ' << I->Owner->MD5Sum() << endl; + return true; + } // Run it if (Fetcher.Run() == false) @@ -692,9 +716,14 @@ bool DoUpgrade(CommandLine &CmdL) bool DoInstall(CommandLine &CmdL) { CacheFile Cache; - if (Cache.Open() == false) + if (Cache.Open(CmdL.FileSize() != 1) == false) return false; + // Enter the special broken fixing mode if the user specified arguments + bool BrokenFix = false; + if (Cache->BrokenCount() != 0) + BrokenFix = true; + unsigned int ExpectedInst = 0; unsigned int Packages = 0; pkgProblemResolver Fix(Cache); @@ -757,11 +786,13 @@ bool DoInstall(CommandLine &CmdL) pkgCache::PkgIterator Pkg = I.OwnerPkg(); if ((*Cache)[Pkg].CandidateVerIter(*Cache) == I.OwnerVer()) - c1out << " " << Pkg.Name() << " " << I.OwnerVer().VerStr() << endl; - - if ((*Cache)[Pkg].InstVerIter(*Cache) == I.OwnerVer()) - c1out << " " << Pkg.Name() << " " << I.OwnerVer().VerStr() << - " [Installed]"<< endl; + { + if ((*Cache)[Pkg].Install() == true && (*Cache)[Pkg].NewInstall() == false) + c1out << " " << Pkg.Name() << " " << I.OwnerVer().VerStr() << + " [Installed]"<< endl; + else + c1out << " " << Pkg.Name() << " " << I.OwnerVer().VerStr() << endl; + } } c1out << "You should explicly select one to install." << endl; } @@ -801,10 +832,21 @@ bool DoInstall(CommandLine &CmdL) ExpectedInst++; // Install it with autoinstalling enabled. - if (State.InstBroken() == true) + if (State.InstBroken() == true && BrokenFix == false) Cache->MarkInstall(Pkg,true); } + /* If we are in the Broken fixing mode we do not attempt to fix the + problems. This is if the user invoked install without -f and gave + packages */ + if (BrokenFix == true && Cache->BrokenCount() != 0) + { + c1out << "You might want to run `apt-get -f install' to correct these." << endl; + ShowBroken(c1out,Cache); + + return _error->Error("Unmet dependencies. Try using -f."); + } + // Call the scored problem resolver Fix.InstallProtect(); if (Fix.Resolve(true) == false) @@ -909,7 +951,7 @@ bool DoDSelectUpgrade(CommandLine &CmdL) /* Install the package only if it is a new install, the autoupgrader will deal with the rest */ if (I->SelectedState == pkgCache::State::Install) - Cache->MarkInstall(I); + Cache->MarkInstall(I,true); } // Apply erasures now, they override everything else. @@ -921,12 +963,37 @@ bool DoDSelectUpgrade(CommandLine &CmdL) Cache->MarkDelete(I); } - /* Use updates smart upgrade to do the rest, it will automatically - ignore held items */ + /* Resolve any problems that dselect created, allupgrade cannot handle + such things. We do so quite agressively too.. */ + if (Cache->BrokenCount() != 0) + { + pkgProblemResolver Fix(Cache); + + // Hold back held packages. + if (_config->FindB("APT::Ingore-Hold",false) == false) + { + for (pkgCache::PkgIterator I = Cache->PkgBegin(); I.end() == false; I++) + { + if (I->SelectedState == pkgCache::State::Hold) + { + Fix.Protect(I); + Cache->MarkKeep(I); + } + } + } + + if (Fix.Resolve() == false) + { + ShowBroken(c1out,Cache); + return _error->Error("Internal Error, problem resolver broke stuff"); + } + } + + // Now upgrade everything if (pkgAllUpgrade(Cache) == false) { ShowBroken(c1out,Cache); - return _error->Error("Internal Error, AllUpgrade broke stuff"); + return _error->Error("Internal Error, problem resolver broke stuff"); } return InstallPackages(Cache,false); @@ -943,6 +1010,31 @@ bool DoClean(CommandLine &CmdL) return true; } /*}}}*/ +// DoAutoClean - Smartly remove downloaded archives /*{{{*/ +// --------------------------------------------------------------------- +/* This is similar to clean but it only purges things that cannot be + downloaded, that is old versions of cached packages. */ +class LogCleaner : public pkgArchiveCleaner +{ + protected: + virtual void Erase(const char *File,string Pkg,string Ver,struct stat &St) + { + cout << "Del " << Pkg << " " << Ver << " [" << SizeToStr(St.st_size) << "b]" << endl; + }; +}; + +bool DoAutoClean(CommandLine &CmdL) +{ + CacheFile Cache; + if (Cache.Open(true) == false) + return false; + + LogCleaner Cleaner; + + return Cleaner.Go(_config->FindDir("Dir::Cache::archives"),*Cache) && + Cleaner.Go(_config->FindDir("Dir::Cache::archives") + "partial/",*Cache); +} + /*}}}*/ // DoCheck - Perform the check operation /*{{{*/ // --------------------------------------------------------------------- /* Opening automatically checks the system, this command is mostly used @@ -963,7 +1055,9 @@ bool ShowHelp(CommandLine &CmdL) { cout << PACKAGE << ' ' << VERSION << " for " << ARCHITECTURE << " compiled on " << __DATE__ << " " << __TIME__ << endl; - + if (_config->FindB("version") == true) + return 100; + cout << "Usage: apt-get [options] command" << endl; cout << " apt-get [options] install pkg1 [pkg2 ...]" << endl; cout << endl; @@ -979,6 +1073,7 @@ bool ShowHelp(CommandLine &CmdL) cout << " dist-upgrade - Distribution upgrade, see apt-get(8)" << endl; cout << " dselect-upgrade - Follow dselect selections" << endl; cout << " clean - Erase downloaded archive files" << endl; + cout << " autoclean - Erase old downloaded archive files" << endl; cout << " check - Verify that there are no broken dependencies" << endl; cout << endl; cout << "Options:" << endl; @@ -1031,6 +1126,7 @@ int main(int argc,const char *argv[]) { CommandLine::Args Args[] = { {'h',"help","help",0}, + {'v',"version","version",0}, {'q',"quiet","quiet",CommandLine::IntLevel}, {'q',"silent","quiet",CommandLine::IntLevel}, {'d',"download-only","APT::Get::Download-Only",0}, @@ -1047,6 +1143,7 @@ int main(int argc,const char *argv[]) {0,"ignore-hold","APT::Ingore-Hold",0}, {0,"no-upgrade","APT::Get::no-upgrade",0}, {0,"force-yes","APT::Get::force-yes",0}, + {0,"print-uris","APT::Get::Print-URIs",0}, {'c',"config-file",0,CommandLine::ConfigFile}, {'o',"option",0,CommandLine::ArbItem}, {0,0,0,0}}; @@ -1057,6 +1154,7 @@ int main(int argc,const char *argv[]) {"dist-upgrade",&DoDistUpgrade}, {"dselect-upgrade",&DoDSelectUpgrade}, {"clean",&DoClean}, + {"autoclean",&DoAutoClean}, {"check",&DoCheck}, {"help",&ShowHelp}, {0,0}}; @@ -1072,6 +1170,7 @@ int main(int argc,const char *argv[]) // See if the help should be shown if (_config->FindB("help") == true || + _config->FindB("version") == true || CmdL.FileSize() == 0) return ShowHelp(CmdL);