#include <apt-pkg/version.h>
#include <apt-pkg/cachefile.h>
#include <apt-pkg/sptr.h>
+#include <apt-pkg/md5.h>
#include <apt-pkg/versionmatch.h>
#include <config.h>
#include "acqprogress.h"
+#include <set>
#include <locale.h>
#include <langinfo.h>
#include <fstream>
ostream c1out(0);
ostream c2out(0);
ofstream devnull("/dev/null");
-unsigned int ScreenWidth = 80;
+unsigned int ScreenWidth = 80 - 1; /* - 1 for the cursor */
// class CacheFile - Cover class for some dependency cache functions /*{{{*/
// ---------------------------------------------------------------------
}
delete [] Added;
- return ShowList(out,_("WARNING: The following essential packages will be removed\n"
+ return ShowList(out,_("WARNING: The following essential packages will be removed.\n"
"This should NOT be done unless you know exactly what you are doing!"),List,VersionsList);
}
// Check that the system is OK
if (DCache->DelCount() != 0 || DCache->InstCount() != 0)
- return _error->Error("Internal Error, non-zero counts");
+ return _error->Error("Internal error, non-zero counts");
// Apply corrections for half-installed packages
if (pkgApplyStatus(*DCache) == false)
if (_config->FindB("APT::Get::AllowUnauthenticated",false) == true)
{
- c2out << "Authentication warning overridden.\n";
+ c2out << _("Authentication warning overridden.\n");
return true;
}
if (_config->FindI("quiet",0) < 2
&& _config->FindB("APT::Get::Assume-Yes",false) == false)
{
- c2out << _("Install these packages without verification? [y/N] ") << flush;
+ c2out << _("Install these packages without verification [y/N]? ") << flush;
if (!YnPrompt(false))
return _error->Error(_("Some packages could not be authenticated"));
if (Cache->BrokenCount() != 0)
{
ShowBroken(c1out,Cache,false);
- return _error->Error("Internal Error, InstallPackages was called with broken packages!");
+ return _error->Error(_("Internal error, InstallPackages was called with broken packages!"));
}
if (Cache->DelCount() == 0 && Cache->InstCount() == 0 &&
// No remove flag
if (Cache->DelCount() != 0 && _config->FindB("APT::Get::Remove",true) == false)
- return _error->Error(_("Packages need to be removed but Remove is disabled."));
+ return _error->Error(_("Packages need to be removed but remove is disabled."));
// Run the simulator ..
if (_config->FindB("APT::Get::Simulate") == true)
{
pkgSimulate PM(Cache);
- pkgPackageManager::OrderResult Res = PM.DoInstall();
+ int status_fd = _config->FindI("APT::Status-Fd",-1);
+ pkgPackageManager::OrderResult Res = PM.DoInstall(status_fd);
if (Res == pkgPackageManager::Failed)
return false;
if (Res != pkgPackageManager::Completed)
- return _error->Error("Internal Error, Ordering didn't finish");
+ return _error->Error(_("Internal error, Ordering didn't finish"));
return true;
}
if (DebBytes != Cache->DebSize())
{
c0out << DebBytes << ',' << Cache->DebSize() << endl;
- c0out << "How odd.. The sizes didn't match, email apt@packages.debian.org" << endl;
+ c0out << _("How odd.. The sizes didn't match, email apt@packages.debian.org") << endl;
}
// Number of bytes
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",
+ 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(_("You don't have enough free space in %s."),
const char *Prompt = _("Yes, do as I say!");
ioprintf(c2out,
- _("You are about to do something potentially harmful\n"
+ _("You are about to do something potentially harmful.\n"
"To continue type in the phrase '%s'\n"
" ?] "),Prompt);
c2out << flush;
if (_config->FindI("quiet",0) < 2 &&
_config->FindB("APT::Get::Assume-Yes",false) == false)
{
- c2out << _("Do you want to continue? [Y/n] ") << flush;
+ c2out << _("Do you want to continue [Y/n]? ") << flush;
if (YnPrompt() == false)
{
if (Failed == true && PM->FixMissing() == false)
{
cerr << _("Unable to correct missing packages.") << endl;
- return _error->Error(_("Aborting Install."));
+ return _error->Error(_("Aborting install."));
}
_system->UnLock();
- pkgPackageManager::OrderResult Res = PM->DoInstall();
+ int status_fd = _config->FindI("APT::Status-Fd",-1);
+ pkgPackageManager::OrderResult Res = PM->DoInstall(status_fd);
if (Res == pkgPackageManager::Failed || _error->PendingError() == true)
return false;
if (Res == pkgPackageManager::Completed)
string VerTag;
string TmpSrc = Name;
string::size_type Slash = TmpSrc.rfind('=');
+
+ // honor default release
+ string DefRel = _config->Find("APT::Default-Release");
+ pkgCache::PkgIterator Pkg = Cache.FindPkg(TmpSrc);
+
if (Slash != string::npos)
{
VerTag = string(TmpSrc.begin() + Slash + 1,TmpSrc.end());
TmpSrc = string(TmpSrc.begin(),TmpSrc.begin() + Slash);
+ }
+ else if(!Pkg.end() && DefRel.empty() == false)
+ {
+ // we have a default release, try to locate the pkg. we do it like
+ // this because GetCandidateVer() will not "downgrade", that means
+ // "apt-get source -t stable apt" won't work on a unstable system
+ for (pkgCache::VerIterator Ver = Pkg.VersionList(); Ver.end() == false;
+ Ver++)
+ {
+ for (pkgCache::VerFileIterator VF = Ver.FileList(); VF.end() == false;
+ VF++)
+ {
+ /* If this is the status file, and the current version is not the
+ version in the status file (ie it is not installed, or somesuch)
+ then it is not a candidate for installation, ever. This weeds
+ out bogus entries that may be due to config-file states, or
+ other. */
+ if ((VF.File()->Flags & pkgCache::Flag::NotSource) ==
+ pkgCache::Flag::NotSource && Pkg.CurrentVer() != Ver)
+ continue;
+
+ //std::cout << VF.File().Archive() << std::endl;
+ if(VF.File().Archive() && (VF.File().Archive() == DefRel))
+ {
+ VerTag = Ver.VerStr();
+ break;
+ }
+ }
+ }
}
-
+
/* 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. */
- if (_config->FindB("APT::Get::Only-Source") == false &&
- VerTag.empty() == true)
+ in the archive for a source package of the same name. */
+ if (_config->FindB("APT::Get::Only-Source") == false)
{
- pkgCache::PkgIterator Pkg = Cache.FindPkg(TmpSrc);
if (Pkg.end() == false)
{
- pkgCache::VerIterator Ver = Cache.GetCandidateVer(Pkg);
+ pkgCache::VerIterator Ver = Cache.GetCandidateVer(Pkg);
if (Ver.end() == false)
{
pkgRecords::Parser &Parse = Recs.Lookup(Ver.FileList());
}
}
- if (Last == 0)
- return 0;
-
- if (Last->Jump(Offset) == false)
+ if (Last == 0 || Last->Jump(Offset) == false)
return 0;
return Last;
if (pkgAllUpgrade(Cache) == false)
{
ShowBroken(c1out,Cache,false);
- return _error->Error(_("Internal Error, AllUpgrade broke stuff"));
+ return _error->Error(_("Internal error, AllUpgrade broke stuff"));
}
return InstallPackages(Cache,true);
/* Install named packages */
bool DoInstall(CommandLine &CmdL)
{
+ // Lock the list directory
+ FileFd Lock;
+ if (_config->FindB("Debug::NoLocking",false) == false)
+ {
+ Lock.Fd(GetLock(_config->FindDir("Dir::State::Lists") + "lock"));
+ if (_error->PendingError() == true)
+ return _error->Error(_("Unable to lock the list directory"));
+ }
+
CacheFile Cache;
if (Cache.OpenForInstall() == false ||
Cache.CheckDeps(CmdL.FileSize() != 1) == false)
// See if we need to prompt
if (Cache->InstCount() == ExpectedInst && Cache->DelCount() == 0)
return InstallPackages(Cache,false,false);
-
+
return InstallPackages(Cache,false);
}
/*}}}*/
if (Cache.OpenForInstall() == false || Cache.CheckDeps() == false)
return false;
- c0out << _("Calculating Upgrade... ") << flush;
+ c0out << _("Calculating upgrade... ") << flush;
if (pkgDistUpgrade(*Cache) == false)
{
c0out << _("Failed") << endl;
if (Fix.Resolve() == false)
{
ShowBroken(c1out,Cache,false);
- return _error->Error("Internal Error, problem resolver broke stuff");
+ return _error->Error(_("Internal error, problem resolver broke stuff"));
}
}
if (pkgAllUpgrade(Cache) == false)
{
ShowBroken(c1out,Cache,false);
- return _error->Error("Internal Error, problem resolver broke stuff");
+ return _error->Error(_("Internal error, problem resolver broke stuff"));
}
return InstallPackages(Cache,false);
DscFile *Dsc = new DscFile[CmdL.FileSize()];
+ // insert all downloaded uris into this set to avoid downloading them
+ // twice
+ set<string> queued;
// Load the requestd sources into the fetcher
unsigned J = 0;
for (const char **I = CmdL.FileList + 1; *I != 0; I++, J++)
if (_config->FindB("APT::Get::Tar-Only",false) == true &&
I->Type != "tar")
continue;
-
+
+ // don't download the same uri twice (should this be moved to
+ // the fetcher interface itself?)
+ if(queued.find(Last->Index().ArchiveURI(I->Path)) != queued.end())
+ continue;
+ queued.insert(Last->Index().ArchiveURI(I->Path));
+
+ // check if we have a file with that md5 sum already localy
+ if(!I->MD5Hash.empty() && FileExists(flNotDir(I->Path)))
+ {
+ FileFd Fd(flNotDir(I->Path), FileFd::ReadOnly);
+ MD5Summation sum;
+ sum.AddFD(Fd.Fd(), Fd.Size());
+ Fd.Close();
+ if((string)sum.Result() == I->MD5Hash)
+ {
+ ioprintf(c1out,_("Skiping already downloaded file '%s'\n"),
+ flNotDir(I->Path).c_str());
+ continue;
+ }
+ }
+
new pkgAcqFile(&Fetcher,Last->Index().ArchiveURI(I->Path),
I->MD5Hash,I->Size,
Last->Index().SourceInfo(*Last,*I),Src);
struct statvfs Buf;
string OutputDir = ".";
if (statvfs(OutputDir.c_str(),&Buf) != 0)
- return _error->Errno("statvfs","Couldn't determine free space in %s",
+ 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(_("You don't have enough free space in %s"),
if (_config->FindB("APT::Get::Simulate",false) == true)
{
for (unsigned I = 0; I != J; I++)
- ioprintf(cout,_("Fetch Source %s\n"),Dsc[I].Package.c_str());
+ ioprintf(cout,_("Fetch source %s\n"),Dsc[I].Package.c_str());
return true;
}
if (system(S) != 0)
{
fprintf(stderr,_("Unpack command '%s' failed.\n"),S);
+ fprintf(stderr,_("Check if the 'dpkg-dev' package is installed.\n"));
_exit(1);
}
}
if (_config->FindB("version") == true)
{
- cout << _("Supported Modules:") << endl;
+ cout << _("Supported modules:") << endl;
for (unsigned I = 0; I != pkgVersioningSystem::GlobalListLen; I++)
{