diff options
author | Arch Librarian <arch@canonical.com> | 2004-09-20 16:53:24 +0000 |
---|---|---|
committer | Arch Librarian <arch@canonical.com> | 2004-09-20 16:53:24 +0000 |
commit | 36375005d9e971d2fdfc62224671f009ce7adaf9 (patch) | |
tree | 4793d82c73be374f8f7a629237af2d73874fb468 | |
parent | 36f610f18a9a12c02ba89c6bb84726f7ed3ba7ad (diff) |
working apt-get source
Author: jgg
Date: 1999-04-07 05:30:17 GMT
working apt-get source
-rw-r--r-- | apt-pkg/acquire-item.cc | 91 | ||||
-rw-r--r-- | apt-pkg/acquire-item.h | 26 | ||||
-rw-r--r-- | apt-pkg/contrib/fileutl.h | 5 | ||||
-rw-r--r-- | apt-pkg/deb/debrecords.cc | 10 | ||||
-rw-r--r-- | apt-pkg/deb/debrecords.h | 3 | ||||
-rw-r--r-- | apt-pkg/deb/debsrcrecords.cc | 6 | ||||
-rw-r--r-- | apt-pkg/pkgrecords.h | 5 | ||||
-rw-r--r-- | apt-pkg/sourcelist.cc | 29 | ||||
-rw-r--r-- | apt-pkg/sourcelist.h | 5 | ||||
-rw-r--r-- | apt-pkg/srcrecords.cc | 4 | ||||
-rw-r--r-- | apt-pkg/srcrecords.h | 10 | ||||
-rw-r--r-- | cmdline/apt-get.cc | 164 |
12 files changed, 305 insertions, 53 deletions
diff --git a/apt-pkg/acquire-item.cc b/apt-pkg/acquire-item.cc index 0b1d2a5ba..7e178c3b4 100644 --- a/apt-pkg/acquire-item.cc +++ b/apt-pkg/acquire-item.cc @@ -1,6 +1,6 @@ // -*- mode: cpp; mode: fold -*- // Description /*{{{*/ -// $Id: acquire-item.cc,v 1.26 1999/03/27 03:02:38 jgg Exp $ +// $Id: acquire-item.cc,v 1.27 1999/04/07 05:30:17 jgg Exp $ /* ###################################################################### Acquire Item - Item to acquire @@ -20,6 +20,7 @@ #include <apt-pkg/configuration.h> #include <apt-pkg/error.h> #include <apt-pkg/strutl.h> +#include <apt-pkg/fileutl.h> #include <sys/stat.h> #include <unistd.h> @@ -236,14 +237,6 @@ void pkgAcqIndex::Done(string Message,unsigned long Size,string MD5) Mode = "gzip"; } /*}}}*/ -// AcqIndex::Describe - Describe the Item /*{{{*/ -// --------------------------------------------------------------------- -/* */ -string pkgAcqIndex::Describe() -{ - return Location->PackagesURI(); -} - /*}}}*/ // AcqIndexRel::pkgAcqIndexRel - Constructor /*{{{*/ // --------------------------------------------------------------------- @@ -322,14 +315,6 @@ void pkgAcqIndexRel::Done(string Message,unsigned long Size,string MD5) Rename(DestFile,FinalFile); } /*}}}*/ -// AcqIndexRel::Describe - Describe the Item /*{{{*/ -// --------------------------------------------------------------------- -/* */ -string pkgAcqIndexRel::Describe() -{ - return Location->ReleaseURI(); -} - /*}}}*/ // AcqIndexRel::Failed - Silence failure messages for missing rel files /*{{{*/ // --------------------------------------------------------------------- /* */ @@ -526,14 +511,6 @@ void pkgAcqArchive::Done(string Message,unsigned long Size,string Md5Hash) Complete = true; } /*}}}*/ -// AcqArchive::Describe - Describe the Item /*{{{*/ -// --------------------------------------------------------------------- -/* */ -string pkgAcqArchive::Describe() -{ - return Desc.URI; -} - /*}}}*/ // AcqArchive::Failed - Failure handler /*{{{*/ // --------------------------------------------------------------------- /* Here we try other sources */ @@ -558,3 +535,67 @@ void pkgAcqArchive::Failed(string Message,pkgAcquire::MethodConfig *Cnf) } } /*}}}*/ + +// AcqFile::pkgAcqFile - Constructor /*{{{*/ +// --------------------------------------------------------------------- +/* The file is added to the queue */ +pkgAcqFile::pkgAcqFile(pkgAcquire *Owner,string URI,string MD5, + unsigned long Size,string Dsc,string ShortDesc) : + Item(Owner), MD5(MD5) +{ + DestFile = flNotDir(URI); + + // Create the item + Desc.URI = URI; + Desc.Description = Dsc; + Desc.Owner = this; + + // Set the short description to the archive component + Desc.ShortDesc = ShortDesc; + + // Get the transfer sizes + FileSize = Size; + struct stat Buf; + if (stat(DestFile.c_str(),&Buf) == 0) + { + // Hmm, the partial file is too big, erase it + if ((unsigned)Buf.st_size > Size) + unlink(DestFile.c_str()); + else + PartialSize = Buf.st_size; + } + + QueueURI(Desc); +} + /*}}}*/ +// AcqFile::Done - Item downloaded OK /*{{{*/ +// --------------------------------------------------------------------- +/* */ +void pkgAcqFile::Done(string Message,unsigned long Size,string MD5) +{ + Item::Done(Message,Size,MD5); + + string FileName = LookupTag(Message,"Filename"); + if (FileName.empty() == true) + { + Status = StatError; + ErrorText = "Method gave a blank filename"; + return; + } + + Complete = true; + + // The files timestamp matches + if (StringToBool(LookupTag(Message,"IMS-Hit"),false) == true) + return; + + // We have to copy it into place + if (FileName != DestFile) + { + Local = true; + Desc.URI = "copy:" + FileName; + QueueURI(Desc); + return; + } +} + /*}}}*/ diff --git a/apt-pkg/acquire-item.h b/apt-pkg/acquire-item.h index e5e7c701d..205537eae 100644 --- a/apt-pkg/acquire-item.h +++ b/apt-pkg/acquire-item.h @@ -1,6 +1,6 @@ // -*- mode: cpp; mode: fold -*- // Description /*{{{*/ -// $Id: acquire-item.h,v 1.17 1999/03/27 03:02:38 jgg Exp $ +// $Id: acquire-item.h,v 1.18 1999/04/07 05:30:17 jgg Exp $ /* ###################################################################### Acquire Item - Item to acquire @@ -65,10 +65,10 @@ class pkgAcquire::Item virtual void Done(string Message,unsigned long Size,string Md5Hash); virtual void Start(string Message,unsigned long Size); virtual string Custom600Headers() {return string();}; + virtual string DescURI() = 0; // Inquire functions virtual string MD5Sum() {return string();}; - virtual string Describe() = 0; Item(pkgAcquire *Owner); virtual ~Item(); @@ -89,7 +89,7 @@ class pkgAcqIndex : public pkgAcquire::Item // Specialized action members virtual void Done(string Message,unsigned long Size,string Md5Hash); virtual string Custom600Headers(); - virtual string Describe(); + virtual string DescURI() {return Location->PackagesURI();}; pkgAcqIndex(pkgAcquire *Owner,const pkgSourceList::Item *Location); }; @@ -108,7 +108,7 @@ class pkgAcqIndexRel : public pkgAcquire::Item virtual void Failed(string Message,pkgAcquire::MethodConfig *Cnf); virtual void Done(string Message,unsigned long Size,string Md5Hash); virtual string Custom600Headers(); - virtual string Describe(); + virtual string DescURI() {return Location->ReleaseURI();}; pkgAcqIndexRel(pkgAcquire *Owner,const pkgSourceList::Item *Location); }; @@ -136,12 +136,28 @@ class pkgAcqArchive : public pkgAcquire::Item // Specialized action members virtual void Failed(string Message,pkgAcquire::MethodConfig *Cnf); virtual void Done(string Message,unsigned long Size,string Md5Hash); - virtual string Describe(); virtual string MD5Sum() {return MD5;}; + virtual string DescURI() {return Desc.URI;}; pkgAcqArchive(pkgAcquire *Owner,pkgSourceList *Sources, pkgRecords *Recs,pkgCache::VerIterator const &Version, string &StoreFilename); }; +// Fetch a generic file to the current directory +class pkgAcqFile : public pkgAcquire::Item +{ + pkgAcquire::ItemDesc Desc; + string MD5; + + public: + + // Specialized action members + virtual void Done(string Message,unsigned long Size,string Md5Hash); + virtual string DescURI() {return Desc.URI;}; + + pkgAcqFile(pkgAcquire *Owner,string URI,string MD5,unsigned long Size, + string Desc,string ShortDesc); +}; + #endif diff --git a/apt-pkg/contrib/fileutl.h b/apt-pkg/contrib/fileutl.h index 1bcb263c5..b0719bf3e 100644 --- a/apt-pkg/contrib/fileutl.h +++ b/apt-pkg/contrib/fileutl.h @@ -1,6 +1,6 @@ // -*- mode: cpp; mode: fold -*- // Description /*{{{*/ -// $Id: fileutl.h,v 1.15 1999/03/15 08:10:39 jgg Exp $ +// $Id: fileutl.h,v 1.16 1999/04/07 05:30:18 jgg Exp $ /* ###################################################################### File Utilities @@ -49,6 +49,7 @@ class FileFd // Simple manipulators inline int Fd() {return iFd;}; + inline void Fd(int fd) {iFd = fd1;}; inline bool IsOpen() {return iFd >= 0;}; inline bool Failed() {return (Flags & Fail) == Fail;}; inline void EraseOnFailure() {Flags |= DelOnFail;}; @@ -56,7 +57,7 @@ class FileFd inline string &Name() {return FileName;}; FileFd(string FileName,OpenMode Mode,unsigned long Perms = 0666); - FileFd(int Fd) : iFd(Fd), Flags(AutoClose) {}; + FileFd(int Fd = -1) : iFd(Fd), Flags(AutoClose) {}; FileFd(int Fd,bool) : iFd(Fd), Flags(0) {}; virtual ~FileFd(); }; diff --git a/apt-pkg/deb/debrecords.cc b/apt-pkg/deb/debrecords.cc index a2005914d..f86287b11 100644 --- a/apt-pkg/deb/debrecords.cc +++ b/apt-pkg/deb/debrecords.cc @@ -1,6 +1,6 @@ // -*- mode: cpp; mode: fold -*- // Description /*{{{*/ -// $Id: debrecords.cc,v 1.6 1999/03/29 19:28:52 jgg Exp $ +// $Id: debrecords.cc,v 1.7 1999/04/07 05:30:18 jgg Exp $ /* ###################################################################### Debian Package Records - Parser for debian package records @@ -75,3 +75,11 @@ string debRecordParser::LongDesc() return Section.FindS("Description"); } /*}}}*/ +// debRecordParser::SourcePkg - Return the source package name if any /*{{{*/ +// --------------------------------------------------------------------- +/* */ +string debRecordParser::SourcePkg() +{ + return Section.FindS("Source"); +} + /*}}}*/ diff --git a/apt-pkg/deb/debrecords.h b/apt-pkg/deb/debrecords.h index b91d07092..9191ebcda 100644 --- a/apt-pkg/deb/debrecords.h +++ b/apt-pkg/deb/debrecords.h @@ -1,6 +1,6 @@ // -*- mode: cpp; mode: fold -*- // Description /*{{{*/ -// $Id: debrecords.h,v 1.5 1999/03/29 19:28:52 jgg Exp $ +// $Id: debrecords.h,v 1.6 1999/04/07 05:30:18 jgg Exp $ /* ###################################################################### Debian Package Records - Parser for debian package records @@ -36,6 +36,7 @@ class debRecordParser : public pkgRecords::Parser // These refer to the archive file for the Version virtual string FileName(); virtual string MD5Hash(); + virtual string SourcePkg(); // These are some general stats about the package virtual string Maintainer(); diff --git a/apt-pkg/deb/debsrcrecords.cc b/apt-pkg/deb/debsrcrecords.cc index fa8407c51..7a06e30b9 100644 --- a/apt-pkg/deb/debsrcrecords.cc +++ b/apt-pkg/deb/debsrcrecords.cc @@ -1,6 +1,6 @@ // -*- mode: cpp; mode: fold -*- // Description /*{{{*/ -// $Id: debsrcrecords.cc,v 1.2 1999/04/04 08:07:39 jgg Exp $ +// $Id: debsrcrecords.cc,v 1.3 1999/04/07 05:30:18 jgg Exp $ /* ###################################################################### Debian Source Package Records - Parser implementation for Debian style @@ -75,10 +75,10 @@ bool debSrcRecordParser::Files(vector<pkgSrcRecords::File> &List) return false; // Stash the / terminated directory prefix - string Base = Sect.FindS("Directory:"); + string Base = Sect.FindS("Directory"); if (Base.empty() == false && Base[Base.length()-1] != '/') Base += '/'; - + // Iterate over the entire list grabbing each triplet const char *C = Files.c_str(); while (*C != 0) diff --git a/apt-pkg/pkgrecords.h b/apt-pkg/pkgrecords.h index 9fc30acd2..b5205f1ac 100644 --- a/apt-pkg/pkgrecords.h +++ b/apt-pkg/pkgrecords.h @@ -1,6 +1,6 @@ // -*- mode: cpp; mode: fold -*- // Description /*{{{*/ -// $Id: pkgrecords.h,v 1.3 1998/11/13 04:23:35 jgg Exp $ +// $Id: pkgrecords.h,v 1.4 1999/04/07 05:30:17 jgg Exp $ /* ###################################################################### Package Records - Allows access to complete package description records @@ -67,12 +67,13 @@ class pkgRecords::Parser // These refer to the archive file for the Version virtual string FileName() {return string();}; virtual string MD5Hash() {return string();}; + virtual string SourcePkg() {return string();}; // These are some general stats about the package virtual string Maintainer() {return string();}; virtual string ShortDesc() {return string();}; virtual string LongDesc() {return string();}; - + virtual ~Parser() {}; }; diff --git a/apt-pkg/sourcelist.cc b/apt-pkg/sourcelist.cc index bea2d91c8..c4f225fde 100644 --- a/apt-pkg/sourcelist.cc +++ b/apt-pkg/sourcelist.cc @@ -1,6 +1,6 @@ // -*- mode: cpp; mode: fold -*- // Description /*{{{*/ -// $Id: sourcelist.cc,v 1.12 1999/03/05 19:36:49 jgg Exp $ +// $Id: sourcelist.cc,v 1.13 1999/04/07 05:30:17 jgg Exp $ /* ###################################################################### List of Sources @@ -316,6 +316,33 @@ string pkgSourceList::Item::ArchiveURI(string File) const return Res; } /*}}}*/ +// SourceList::Item::SourceInfo - Returns an info line for a source /*{{{*/ +// --------------------------------------------------------------------- +/* */ +string pkgSourceList::Item::SourceInfo(string Pkg,string Ver,string Comp) const +{ + string Res; + switch (Type) + { + case DebSrc: + case Deb: + Res += SiteOnly(URI) + ' '; + if (Dist[Dist.size() - 1] == '/') + Res += Dist; + else + Res += Dist + '/' + Section; + + Res += " "; + Res += Pkg; + Res += " "; + Res += Ver; + if (Comp.empty() == false) + Res += " (" + Comp + ")"; + break; + }; + return Res; +} + /*}}}*/ // SourceList::Item::SiteOnly - Strip off the path part of a URI /*{{{*/ // --------------------------------------------------------------------- /* */ diff --git a/apt-pkg/sourcelist.h b/apt-pkg/sourcelist.h index bbf2dba4e..37accc5ab 100644 --- a/apt-pkg/sourcelist.h +++ b/apt-pkg/sourcelist.h @@ -1,6 +1,6 @@ // -*- mode: cpp; mode: fold -*- // Description /*{{{*/ -// $Id: sourcelist.h,v 1.7 1999/03/02 18:35:24 jgg Exp $ +// $Id: sourcelist.h,v 1.8 1999/04/07 05:30:18 jgg Exp $ /* ###################################################################### SourceList - Manage a list of sources @@ -48,7 +48,8 @@ class pkgSourceList string PackagesURI() const; string PackagesInfo() const; string ReleaseURI() const; - string ReleaseInfo() const; + string ReleaseInfo() const; + string SourceInfo(string Pkg,string Ver,string Comp) const; string SiteOnly(string URI) const; string ArchiveInfo(pkgCache::VerIterator Ver) const; string ArchiveURI(string File) const; diff --git a/apt-pkg/srcrecords.cc b/apt-pkg/srcrecords.cc index 05be79a5a..23d3a5fc0 100644 --- a/apt-pkg/srcrecords.cc +++ b/apt-pkg/srcrecords.cc @@ -1,6 +1,6 @@ // -*- mode: cpp; mode: fold -*- // Description /*{{{*/ -// $Id: srcrecords.cc,v 1.1 1999/04/04 01:17:29 jgg Exp $ +// $Id: srcrecords.cc,v 1.2 1999/04/07 05:30:18 jgg Exp $ /* ###################################################################### Source Package Records - Allows access to source package records @@ -63,7 +63,7 @@ pkgSrcRecords::pkgSrcRecords(pkgSourceList &List) : Files(0), Current(0) return; } - Files[Count] = new debSrcRecordParser(FD); + Files[Count] = new debSrcRecordParser(FD,I); Count++; } diff --git a/apt-pkg/srcrecords.h b/apt-pkg/srcrecords.h index 253a3283e..c7ff17fc2 100644 --- a/apt-pkg/srcrecords.h +++ b/apt-pkg/srcrecords.h @@ -1,6 +1,6 @@ // -*- mode: cpp; mode: fold -*- // Description /*{{{*/ -// $Id: srcrecords.h,v 1.2 1999/04/04 08:07:39 jgg Exp $ +// $Id: srcrecords.h,v 1.3 1999/04/07 05:30:18 jgg Exp $ /* ###################################################################### Source Package Records - Allows access to source package records @@ -36,9 +36,12 @@ class pkgSrcRecords class Parser { FileFd *File; - + pkgSourceList::const_iterator SrcItem; + public: + inline pkgSourceList::const_iterator Source() const {return SrcItem;}; + virtual bool Restart() = 0; virtual bool Step() = 0; virtual bool Jump(unsigned long Off) = 0; @@ -51,7 +54,8 @@ class pkgSrcRecords virtual const char **Binaries() = 0; virtual bool Files(vector<File> &F) = 0; - Parser(FileFd *File) : File(File) {}; + Parser(FileFd *File,pkgSourceList::const_iterator SrcItem) : File(File), + SrcItem(SrcItem) {}; virtual ~Parser() {delete File;}; }; diff --git a/cmdline/apt-get.cc b/cmdline/apt-get.cc index 859f113f1..e77437888 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.48 1999/03/29 19:28:52 jgg Exp $ +// $Id: apt-get.cc,v 1.49 1999/04/07 05:30:18 jgg Exp $ /* ###################################################################### apt-get - Cover for dpkg @@ -37,6 +37,8 @@ #include <apt-pkg/dpkginit.h> #include <apt-pkg/strutl.h> #include <apt-pkg/clean.h> +#include <apt-pkg/srcrecords.h> +#include <apt-pkg/version.h> #include <config.h> @@ -519,9 +521,10 @@ bool InstallPackages(CacheFile &Cache,bool ShwKept,bool Ask = true,bool Saftey = return false; // Lock the archive directory + FileFd Lock; if (_config->FindB("Debug::NoLocking",false) == false) { - FileFd Lock(GetLock(_config->FindDir("Dir::Cache::Archives") + "lock")); + Lock.Fd(GetLock(_config->FindDir("Dir::Cache::Archives") + "lock")); if (_error->PendingError() == true) return _error->Error("Unable to lock the download directory"); } @@ -590,9 +593,9 @@ bool InstallPackages(CacheFile &Cache,bool ShwKept,bool Ask = true,bool Saftey = if (Essential == true && Saftey == true) { c2out << "You are about to do something potentially harmful" << endl; - c2out << "To continue type in the phrase 'Yes, I understand this is bad'" << endl; + c2out << "To continue type in the phrase 'Yes, I understand this may be bad'" << endl; c2out << " ?] " << flush; - if (AnalPrompt("Yes, I understand this is bad") == false) + if (AnalPrompt("Yes, I understand this may be bad") == false) { c2out << "Abort." << endl; exit(1); @@ -617,6 +620,7 @@ bool InstallPackages(CacheFile &Cache,bool ShwKept,bool Ask = true,bool Saftey = } } + // Just print out the uris an exit if the --print-uris flag was used if (_config->FindB("APT::Get::Print-URIs") == true) { pkgAcquire::UriIterator I = Fetcher.UriBegin(); @@ -646,7 +650,7 @@ bool InstallPackages(CacheFile &Cache,bool ShwKept,bool Ask = true,bool Saftey = continue; } - cerr << "Failed to fetch " << (*I)->Describe() << endl; + cerr << "Failed to fetch " << (*I)->DescURI() << endl; cerr << " " << (*I)->ErrorText << endl; Failed = true; } @@ -688,9 +692,10 @@ bool DoUpdate(CommandLine &) return false; // Lock the list directory + FileFd Lock; if (_config->FindB("Debug::NoLocking",false) == false) { - FileFd Lock(GetLock(_config->FindDir("Dir::State::Lists") + "lock")); + Lock.Fd(GetLock(_config->FindDir("Dir::State::Lists") + "lock")); if (_error->PendingError() == true) return _error->Error("Unable to lock the list directory"); } @@ -1082,7 +1087,153 @@ bool DoCheck(CommandLine &CmdL) return true; } /*}}}*/ +// DoSource - Fetch a source archive /*{{{*/ +// --------------------------------------------------------------------- +/* */ +bool DoSource(CommandLine &CmdL) +{ + CacheFile Cache; + if (Cache.Open(true) == false) + return false; + + // Read the source list + pkgSourceList List; + if (List.ReadMainList() == false) + return _error->Error("The list of sources could not be read."); + + // Create the text record parsers + pkgRecords Recs(Cache); + pkgSrcRecords SrcRecs(List); + if (_error->PendingError() == true) + return false; + + // Create the download object + AcqTextStatus Stat(ScreenWidth,_config->FindI("quiet",0)); + pkgAcquire Fetcher(&Stat); + + // Load the requestd sources into the fetcher + for (const char **I = CmdL.FileList + 1; *I != 0; I++) + { + string Src; + /* Lookup the version of the package we would install if we were to + install a version and determine the source package name, then look + in the archive for a source package of the same name. In theory + we could stash the version string as well and match that too but + today there aren't multi source versions in the archive. */ + pkgCache::PkgIterator Pkg = Cache->FindPkg(*I); + if (Pkg.end() == false) + { + pkgCache::VerIterator Ver = Cache->GetCandidateVer(Pkg); + if (Ver.end() == false) + { + pkgRecords::Parser &Parse = Recs.Lookup(Ver.FileList()); + Src = Parse.SourcePkg(); + } + } + + // No source package name.. + if (Src.empty() == true) + Src = *I; + + // The best hit + pkgSrcRecords::Parser *Last = 0; + unsigned long Offset = 0; + string Version; + + // Iterate over all of the hits + pkgSrcRecords::Parser *Parse; + SrcRecs.Restart(); + while ((Parse = SrcRecs.Find(Src.c_str(),false)) != 0) + { + string Ver = Parse->Version(); + if (Last == 0 || pkgVersionCompare(Version,Ver) < 0) + { + Last = Parse; + Offset = Parse->Offset(); + Version = Ver; + } + } + + if (Last == 0) + return _error->Error("Unable to find a source package for %s",Src.c_str()); + + // Back track + vector<pkgSrcRecords::File> Lst; + if (Last->Jump(Offset) == false || Last->Files(Lst) == false) + return false; + + // Load them into the fetcher + for (vector<pkgSrcRecords::File>::const_iterator I = Lst.begin(); + I != Lst.end(); I++) + { + // Try to guess what sort of file it is we are getting. + string Comp; + if (I->Path.find(".dsc") != string::npos) + Comp = "dsc"; + if (I->Path.find(".tar.gz") != string::npos) + Comp = "tar"; + if (I->Path.find(".diff.gz") != string::npos) + Comp = "diff"; + + new pkgAcqFile(&Fetcher,Last->Source()->ArchiveURI(I->Path), + I->MD5Hash,I->Size,Last->Source()->SourceInfo(Src, + Last->Version(),Comp),Src); + } + } + + // Display statistics + unsigned long FetchBytes = Fetcher.FetchNeeded(); + unsigned long FetchPBytes = Fetcher.PartialPresent(); + unsigned long DebBytes = Fetcher.TotalNeeded(); + + // Check for enough free space + struct statfs Buf; + string OutputDir = "."; + 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", + OutputDir.c_str()); + + // Number of bytes + c1out << "Need to get "; + if (DebBytes != FetchBytes) + c1out << SizeToStr(FetchBytes) << "b/" << SizeToStr(DebBytes) << 'b'; + else + c1out << SizeToStr(DebBytes) << 'b'; + c1out << " of source archives." << endl; + + // Just print out the uris an exit if the --print-uris flag was used + 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) + return false; + + // Print error messages + for (pkgAcquire::Item **I = Fetcher.ItemsBegin(); I != Fetcher.ItemsEnd(); I++) + { + if ((*I)->Status == pkgAcquire::Item::StatDone && + (*I)->Complete == true) + continue; + + cerr << "Failed to fetch " << (*I)->DescURI() << endl; + cerr << " " << (*I)->ErrorText << endl; + } + + return true; +} + /*}}}*/ + // ShowHelp - Show a help screen /*{{{*/ // --------------------------------------------------------------------- /* */ @@ -1191,6 +1342,7 @@ int main(int argc,const char *argv[]) {"clean",&DoClean}, {"autoclean",&DoAutoClean}, {"check",&DoCheck}, + {"source",&DoSource}, {"help",&ShowHelp}, {0,0}}; |