summaryrefslogtreecommitdiff
path: root/apt-pkg
diff options
context:
space:
mode:
Diffstat (limited to 'apt-pkg')
-rw-r--r--apt-pkg/acquire-item.cc20
-rw-r--r--apt-pkg/acquire.cc2
-rw-r--r--apt-pkg/algorithms.cc35
-rw-r--r--apt-pkg/algorithms.h2
-rw-r--r--apt-pkg/aptconfiguration.cc65
-rw-r--r--apt-pkg/cachefile.cc2
-rw-r--r--apt-pkg/cachefilter.cc2
-rw-r--r--apt-pkg/contrib/configuration.cc10
-rw-r--r--apt-pkg/contrib/fileutl.cc5
-rw-r--r--apt-pkg/deb/dpkgpm.cc148
-rw-r--r--apt-pkg/depcache.cc40
-rw-r--r--apt-pkg/indexcopy.cc4
-rw-r--r--apt-pkg/init.cc1
-rw-r--r--apt-pkg/orderlist.cc14
-rw-r--r--apt-pkg/packagemanager.cc603
-rw-r--r--apt-pkg/pkgrecords.cc2
-rw-r--r--apt-pkg/pkgsystem.cc4
-rw-r--r--apt-pkg/sourcelist.cc2
-rw-r--r--apt-pkg/srcrecords.cc2
-rw-r--r--apt-pkg/tagfile.cc5
-rw-r--r--apt-pkg/version.cc4
21 files changed, 630 insertions, 342 deletions
diff --git a/apt-pkg/acquire-item.cc b/apt-pkg/acquire-item.cc
index f231c42b4..9ea1519f1 100644
--- a/apt-pkg/acquire-item.cc
+++ b/apt-pkg/acquire-item.cc
@@ -1620,6 +1620,13 @@ void pkgAcqMetaClearSig::Failed(string Message,pkgAcquire::MethodConfig *Cnf) /*
{
if (AuthPass == false)
{
+ // Remove the 'old' InRelease file if we try Release.gpg now as otherwise
+ // the file will stay around and gives a false-auth impression (CVE-2012-0214)
+ string FinalFile = _config->FindDir("Dir::State::lists");
+ FinalFile.append(URItoFileName(RealURI));
+ if (FileExists(FinalFile))
+ unlink(FinalFile.c_str());
+
new pkgAcqMetaSig(Owner,
MetaSigURI, MetaSigURIDesc, MetaSigShortDesc,
MetaIndexURI, MetaIndexURIDesc, MetaIndexShortDesc,
@@ -1825,7 +1832,18 @@ bool pkgAcqArchive::QueueNext()
else
PartialSize = Buf.st_size;
}
-
+
+ // Disables download of archives - useful if no real installation follows,
+ // e.g. if we are just interested in proposed installation order
+ if (_config->FindB("Debug::pkgAcqArchive::NoQueue", false) == true)
+ {
+ Complete = true;
+ Local = true;
+ Status = StatDone;
+ StoreFilename = DestFile = FinalFile;
+ return true;
+ }
+
// Create the item
Local = false;
Desc.URI = Index->ArchiveURI(PkgFile);
diff --git a/apt-pkg/acquire.cc b/apt-pkg/acquire.cc
index cdc3fba4b..573a85c2f 100644
--- a/apt-pkg/acquire.cc
+++ b/apt-pkg/acquire.cc
@@ -766,7 +766,7 @@ void pkgAcquire::Queue::Bump()
// AcquireStatus::pkgAcquireStatus - Constructor /*{{{*/
// ---------------------------------------------------------------------
/* */
-pkgAcquireStatus::pkgAcquireStatus() : Update(true), MorePulses(false)
+pkgAcquireStatus::pkgAcquireStatus() : d(NULL), Update(true), MorePulses(false)
{
Start();
}
diff --git a/apt-pkg/algorithms.cc b/apt-pkg/algorithms.cc
index f7a333606..ed3534f0d 100644
--- a/apt-pkg/algorithms.cc
+++ b/apt-pkg/algorithms.cc
@@ -471,11 +471,11 @@ bool pkgMinimizeUpgrade(pkgDepCache &Cache)
// ProblemResolver::pkgProblemResolver - Constructor /*{{{*/
// ---------------------------------------------------------------------
/* */
-pkgProblemResolver::pkgProblemResolver(pkgDepCache *pCache) : Cache(*pCache)
+pkgProblemResolver::pkgProblemResolver(pkgDepCache *pCache) : d(NULL), Cache(*pCache)
{
// Allocate memory
unsigned long Size = Cache.Head().PackageCount;
- Scores = new signed short[Size];
+ Scores = new int[Size];
Flags = new unsigned char[Size];
memset(Flags,0,sizeof(*Flags)*Size);
@@ -515,20 +515,20 @@ void pkgProblemResolver::MakeScores()
memset(Scores,0,sizeof(*Scores)*Size);
// Important Required Standard Optional Extra
- signed short PrioMap[] = {
+ int PrioMap[] = {
0,
- (signed short) _config->FindI("pkgProblemResolver::Scores::Important",3),
- (signed short) _config->FindI("pkgProblemResolver::Scores::Required",2),
- (signed short) _config->FindI("pkgProblemResolver::Scores::Standard",1),
- (signed short) _config->FindI("pkgProblemResolver::Scores::Optional",-1),
- (signed short) _config->FindI("pkgProblemResolver::Scores::Extra",-2)
+ _config->FindI("pkgProblemResolver::Scores::Important",3),
+ _config->FindI("pkgProblemResolver::Scores::Required",2),
+ _config->FindI("pkgProblemResolver::Scores::Standard",1),
+ _config->FindI("pkgProblemResolver::Scores::Optional",-1),
+ _config->FindI("pkgProblemResolver::Scores::Extra",-2)
};
- signed short PrioEssentials = _config->FindI("pkgProblemResolver::Scores::Essentials",100);
- signed short PrioInstalledAndNotObsolete = _config->FindI("pkgProblemResolver::Scores::NotObsolete",1);
- signed short PrioDepends = _config->FindI("pkgProblemResolver::Scores::Depends",1);
- signed short PrioRecommends = _config->FindI("pkgProblemResolver::Scores::Recommends",1);
- signed short AddProtected = _config->FindI("pkgProblemResolver::Scores::AddProtected",10000);
- signed short AddEssential = _config->FindI("pkgProblemResolver::Scores::AddEssential",5000);
+ int PrioEssentials = _config->FindI("pkgProblemResolver::Scores::Essentials",100);
+ int PrioInstalledAndNotObsolete = _config->FindI("pkgProblemResolver::Scores::NotObsolete",1);
+ int PrioDepends = _config->FindI("pkgProblemResolver::Scores::Depends",1);
+ int PrioRecommends = _config->FindI("pkgProblemResolver::Scores::Recommends",1);
+ int AddProtected = _config->FindI("pkgProblemResolver::Scores::AddProtected",10000);
+ int AddEssential = _config->FindI("pkgProblemResolver::Scores::AddEssential",5000);
if (_config->FindB("Debug::pkgProblemResolver::ShowScores",false) == true)
clog << "Settings used to calculate pkgProblemResolver::Scores::" << endl
@@ -550,7 +550,7 @@ void pkgProblemResolver::MakeScores()
if (Cache[I].InstallVer == 0)
continue;
- signed short &Score = Scores[I->ID];
+ int &Score = Scores[I->ID];
/* This is arbitrary, it should be high enough to elevate an
essantial package above most other packages but low enough
@@ -588,7 +588,7 @@ void pkgProblemResolver::MakeScores()
}
// Copy the scores to advoid additive looping
- SPtrArray<signed short> OldScores = new signed short[Size];
+ SPtrArray<int> OldScores = new int[Size];
memcpy(OldScores,Scores,sizeof(*Scores)*Size);
/* Now we cause 1 level of dependency inheritance, that is we add the
@@ -1098,8 +1098,7 @@ bool pkgProblemResolver::ResolveInternal(bool const BrokenFix)
LEnd->Dep = End;
LEnd++;
- if (Start->Type != pkgCache::Dep::Conflicts &&
- Start->Type != pkgCache::Dep::Obsoletes)
+ if (Start.IsNegative() == false)
break;
}
}
diff --git a/apt-pkg/algorithms.h b/apt-pkg/algorithms.h
index 185d11e96..37eacf1f8 100644
--- a/apt-pkg/algorithms.h
+++ b/apt-pkg/algorithms.h
@@ -96,7 +96,7 @@ class pkgProblemResolver /*{{{*/
enum Flags {Protected = (1 << 0), PreInstalled = (1 << 1),
Upgradable = (1 << 2), ReInstateTried = (1 << 3),
ToRemove = (1 << 4)};
- signed short *Scores;
+ int *Scores;
unsigned char *Flags;
bool Debug;
diff --git a/apt-pkg/aptconfiguration.cc b/apt-pkg/aptconfiguration.cc
index c7da4cf35..b5ad74831 100644
--- a/apt-pkg/aptconfiguration.cc
+++ b/apt-pkg/aptconfiguration.cc
@@ -20,6 +20,7 @@
#include <sys/types.h>
#include <dirent.h>
#include <stdio.h>
+#include <fcntl.h>
#include <algorithm>
#include <string>
@@ -328,13 +329,60 @@ std::vector<std::string> const Configuration::getArchitectures(bool const &Cache
// FIXME: It is a bit unclean to have debian specific code hereā€¦
if (archs.empty() == true) {
archs.push_back(arch);
- string dpkgcall = _config->Find("Dir::Bin::dpkg", "dpkg");
- std::vector<string> const dpkgoptions = _config->FindVector("DPkg::options");
- for (std::vector<string>::const_iterator o = dpkgoptions.begin();
- o != dpkgoptions.end(); ++o)
- dpkgcall.append(" ").append(*o);
- dpkgcall.append(" --print-foreign-architectures 2> /dev/null");
- FILE *dpkg = popen(dpkgcall.c_str(), "r");
+
+ // Generate the base argument list for dpkg
+ std::vector<const char *> Args;
+ string Tmp = _config->Find("Dir::Bin::dpkg","dpkg");
+ {
+ string const dpkgChrootDir = _config->FindDir("DPkg::Chroot-Directory", "/");
+ size_t dpkgChrootLen = dpkgChrootDir.length();
+ if (dpkgChrootDir != "/" && Tmp.find(dpkgChrootDir) == 0) {
+ if (dpkgChrootDir[dpkgChrootLen - 1] == '/')
+ --dpkgChrootLen;
+ Tmp = Tmp.substr(dpkgChrootLen);
+ }
+ }
+ Args.push_back(Tmp.c_str());
+
+ // Stick in any custom dpkg options
+ ::Configuration::Item const *Opts = _config->Tree("DPkg::Options");
+ if (Opts != 0) {
+ Opts = Opts->Child;
+ for (; Opts != 0; Opts = Opts->Next)
+ {
+ if (Opts->Value.empty() == true)
+ continue;
+ Args.push_back(Opts->Value.c_str());
+ }
+ }
+
+ Args.push_back("--print-foreign-architectures");
+ Args.push_back(NULL);
+
+ int external[2] = {-1, -1};
+ if (pipe(external) != 0)
+ {
+ _error->WarningE("getArchitecture", "Can't create IPC pipe for dpkg --print-foreign-architectures");
+ return archs;
+ }
+
+ pid_t dpkgMultiArch = ExecFork();
+ if (dpkgMultiArch == 0) {
+ close(external[0]);
+ std::string const chrootDir = _config->FindDir("DPkg::Chroot-Directory");
+ if (chrootDir != "/" && chroot(chrootDir.c_str()) != 0)
+ _error->WarningE("getArchitecture", "Couldn't chroot into %s for dpkg --print-foreign-architectures", chrootDir.c_str());
+ int const nullfd = open("/dev/null", O_RDONLY);
+ dup2(nullfd, STDIN_FILENO);
+ dup2(external[1], STDOUT_FILENO);
+ dup2(nullfd, STDERR_FILENO);
+ execv(Args[0], (char**) &Args[0]);
+ _error->WarningE("getArchitecture", "Can't detect foreign architectures supported by dpkg!");
+ _exit(100);
+ }
+ close(external[1]);
+
+ FILE *dpkg = fdopen(external[0], "r");
char buf[1024];
if(dpkg != NULL) {
while (fgets(buf, sizeof(buf), dpkg) != NULL) {
@@ -349,8 +397,9 @@ std::vector<std::string> const Configuration::getArchitectures(bool const &Cache
arch = strtok(NULL, " ");
}
}
- pclose(dpkg);
+ fclose(dpkg);
}
+ ExecWait(dpkgMultiArch, "dpkg --print-foreign-architectures", true);
return archs;
}
diff --git a/apt-pkg/cachefile.cc b/apt-pkg/cachefile.cc
index 1b8d91a44..dfbd8b1d8 100644
--- a/apt-pkg/cachefile.cc
+++ b/apt-pkg/cachefile.cc
@@ -30,7 +30,7 @@
// CacheFile::CacheFile - Constructor /*{{{*/
// ---------------------------------------------------------------------
/* */
-pkgCacheFile::pkgCacheFile() : Map(NULL), Cache(NULL), DCache(NULL),
+pkgCacheFile::pkgCacheFile() : d(NULL), Map(NULL), Cache(NULL), DCache(NULL),
SrcList(NULL), Policy(NULL)
{
}
diff --git a/apt-pkg/cachefilter.cc b/apt-pkg/cachefilter.cc
index 210a9a9ab..9ec3fa699 100644
--- a/apt-pkg/cachefilter.cc
+++ b/apt-pkg/cachefilter.cc
@@ -18,7 +18,7 @@
/*}}}*/
namespace APT {
namespace CacheFilter {
-PackageNameMatchesRegEx::PackageNameMatchesRegEx(std::string const &Pattern) {/*{{{*/
+PackageNameMatchesRegEx::PackageNameMatchesRegEx(std::string const &Pattern) : d(NULL) {/*{{{*/
pattern = new regex_t;
int const Res = regcomp(pattern, Pattern.c_str(), REG_EXTENDED | REG_ICASE | REG_NOSUB);
if (Res == 0)
diff --git a/apt-pkg/contrib/configuration.cc b/apt-pkg/contrib/configuration.cc
index 0949ec223..36866a35a 100644
--- a/apt-pkg/contrib/configuration.cc
+++ b/apt-pkg/contrib/configuration.cc
@@ -185,8 +185,14 @@ string Configuration::FindFile(const char *Name,const char *Default) const
}
string val = Itm->Value;
- while (Itm->Parent != 0 && Itm->Parent->Value.empty() == false)
- {
+ while (Itm->Parent != 0)
+ {
+ if (Itm->Parent->Value.empty() == true)
+ {
+ Itm = Itm->Parent;
+ continue;
+ }
+
// Absolute
if (val.length() >= 1 && val[0] == '/')
break;
diff --git a/apt-pkg/contrib/fileutl.cc b/apt-pkg/contrib/fileutl.cc
index 28898fc34..529e7d655 100644
--- a/apt-pkg/contrib/fileutl.cc
+++ b/apt-pkg/contrib/fileutl.cc
@@ -890,6 +890,11 @@ bool FileFd::OpenDescriptor(int Fd, unsigned int const Mode, CompressMode Compre
std::vector<APT::Configuration::Compressor> const compressors = APT::Configuration::getCompressors();
std::vector<APT::Configuration::Compressor>::const_iterator compressor = compressors.begin();
std::string name;
+
+ // compat with the old API
+ if (Mode == ReadOnlyGzip && Compress == None)
+ Compress = Gzip;
+
switch (Compress)
{
case None: name = "."; break;
diff --git a/apt-pkg/deb/dpkgpm.cc b/apt-pkg/deb/dpkgpm.cc
index 2b04f0e71..eb43cbfb8 100644
--- a/apt-pkg/deb/dpkgpm.cc
+++ b/apt-pkg/deb/dpkgpm.cc
@@ -29,7 +29,6 @@
#include <sys/wait.h>
#include <signal.h>
#include <errno.h>
-#include <string.h>
#include <stdio.h>
#include <string.h>
#include <algorithm>
@@ -51,8 +50,10 @@ using namespace std;
class pkgDPkgPMPrivate
{
public:
- pkgDPkgPMPrivate() : dpkgbuf_pos(0), term_out(NULL), history_out(NULL)
+ pkgDPkgPMPrivate() : stdin_is_dev_null(false), dpkgbuf_pos(0),
+ term_out(NULL), history_out(NULL)
{
+ dpkgbuf[0] = '\0';
}
bool stdin_is_dev_null;
// the buffer we use for the dpkg status-fd reading
@@ -123,6 +124,45 @@ ionice(int PID)
return ExecWait(Process, "ionice");
}
+// dpkgChrootDirectory - chrooting for dpkg if needed /*{{{*/
+static void dpkgChrootDirectory()
+{
+ std::string const chrootDir = _config->FindDir("DPkg::Chroot-Directory");
+ if (chrootDir == "/")
+ return;
+ std::cerr << "Chrooting into " << chrootDir << std::endl;
+ if (chroot(chrootDir.c_str()) != 0)
+ _exit(100);
+}
+ /*}}}*/
+
+
+// FindNowVersion - Helper to find a Version in "now" state /*{{{*/
+// ---------------------------------------------------------------------
+/* This is helpful when a package is no longer installed but has residual
+ * config files
+ */
+static
+pkgCache::VerIterator FindNowVersion(const pkgCache::PkgIterator &Pkg)
+{
+ pkgCache::VerIterator Ver;
+ for (Ver = Pkg.VersionList(); Ver.end() == false; Ver++)
+ {
+ pkgCache::VerFileIterator Vf = Ver.FileList();
+ pkgCache::PkgFileIterator F = Vf.File();
+ for (F = Vf.File(); F.end() == false; F++)
+ {
+ if (F && F.Archive())
+ {
+ if (strcmp(F.Archive(), "now"))
+ return Ver;
+ }
+ }
+ }
+ return Ver;
+}
+ /*}}}*/
+
// DPkgPM::pkgDPkgPM - Constructor /*{{{*/
// ---------------------------------------------------------------------
/* */
@@ -328,15 +368,7 @@ bool pkgDPkgPM::RunScriptsWithPkgs(const char *Cnf)
SetCloseExec(STDIN_FILENO,false);
SetCloseExec(STDERR_FILENO,false);
- if (_config->FindDir("DPkg::Chroot-Directory","/") != "/")
- {
- std::cerr << "Chrooting into "
- << _config->FindDir("DPkg::Chroot-Directory")
- << std::endl;
- if (chroot(_config->FindDir("DPkg::Chroot-Directory","/").c_str()) != 0)
- _exit(100);
- }
-
+ dpkgChrootDirectory();
const char *Args[4];
Args[0] = "/bin/sh";
Args[1] = "-c";
@@ -832,7 +864,17 @@ bool pkgDPkgPM::Go(int OutStatusFd)
// Generate the base argument list for dpkg
std::vector<const char *> Args;
unsigned long StartSize = 0;
- string const Tmp = _config->Find("Dir::Bin::dpkg","dpkg");
+ string Tmp = _config->Find("Dir::Bin::dpkg","dpkg");
+ {
+ string const dpkgChrootDir = _config->FindDir("DPkg::Chroot-Directory", "/");
+ size_t dpkgChrootLen = dpkgChrootDir.length();
+ if (dpkgChrootDir != "/" && Tmp.find(dpkgChrootDir) == 0)
+ {
+ if (dpkgChrootDir[dpkgChrootLen - 1] == '/')
+ --dpkgChrootLen;
+ Tmp = Tmp.substr(dpkgChrootLen);
+ }
+ }
Args.push_back(Tmp.c_str());
StartSize += Tmp.length();
@@ -858,6 +900,7 @@ bool pkgDPkgPM::Go(int OutStatusFd)
pid_t dpkgAssertMultiArch = ExecFork();
if (dpkgAssertMultiArch == 0)
{
+ dpkgChrootDirectory();
// redirect everything to the ultimate sink as we only need the exit-status
int const nullfd = open("/dev/null", O_RDONLY);
dup2(nullfd, STDIN_FILENO);
@@ -1092,11 +1135,18 @@ bool pkgDPkgPM::Go(int OutStatusFd)
{
pkgCache::VerIterator PkgVer;
std::string name = I->Pkg.Name();
- if (Op == Item::Remove || Op == Item::Purge)
+ if (Op == Item::Remove || Op == Item::Purge)
+ {
PkgVer = I->Pkg.CurrentVer();
+ if(PkgVer.end() == true)
+ PkgVer = FindNowVersion(I->Pkg);
+ }
else
PkgVer = Cache[I->Pkg].InstVerIter(Cache);
- name.append(":").append(PkgVer.Arch());
+ if (PkgVer.end() == false)
+ name.append(":").append(PkgVer.Arch());
+ else
+ _error->Warning("Can not find PkgVer for '%s'", name.c_str());
char * const fullname = strdup(name.c_str());
Packages.push_back(fullname);
ADDARG(fullname);
@@ -1202,14 +1252,7 @@ bool pkgDPkgPM::Go(int OutStatusFd)
}
close(fd[0]); // close the read end of the pipe
- if (_config->FindDir("DPkg::Chroot-Directory","/") != "/")
- {
- std::cerr << "Chrooting into "
- << _config->FindDir("DPkg::Chroot-Directory")
- << std::endl;
- if (chroot(_config->FindDir("DPkg::Chroot-Directory","/").c_str()) != 0)
- _exit(100);
- }
+ dpkgChrootDirectory();
if (chdir(_config->FindDir("DPkg::Run-Directory","/").c_str()) != 0)
_exit(100);
@@ -1408,7 +1451,7 @@ void pkgDPkgPM::WriteApportReport(const char *pkgpath, const char *errormsg)
string::size_type pos;
FILE *report;
- if (_config->FindB("Dpkg::ApportFailureReport", false) == false)
+ if (_config->FindB("Dpkg::ApportFailureReport", true) == false)
{
std::clog << "configured to not write apport reports" << std::endl;
return;
@@ -1435,18 +1478,49 @@ void pkgDPkgPM::WriteApportReport(const char *pkgpath, const char *errormsg)
}
// do not report out-of-memory failures
- if(strstr(errormsg, strerror(ENOMEM)) != NULL) {
+ if(strstr(errormsg, strerror(ENOMEM)) != NULL ||
+ strstr(errormsg, "failed to allocate memory") != NULL) {
std::clog << _("No apport report written because the error message indicates a out of memory error") << std::endl;
return;
}
- // do not report dpkg I/O errors
- // XXX - this message is localized, but this only matches the English version. This is better than nothing.
- if(strstr(errormsg, "short read in buffer_copy (")) {
- std::clog << _("No apport report written because the error message indicates a dpkg I/O error") << std::endl;
+ // do not report bugs regarding inaccessible local files
+ if(strstr(errormsg, strerror(ENOENT)) != NULL ||
+ strstr(errormsg, "cannot access archive") != NULL) {
+ std::clog << _("No apport report written because the error message indicates an issue on the local system") << std::endl;
+ return;
+ }
+
+ // do not report errors encountered when decompressing packages
+ if(strstr(errormsg, "--fsys-tarfile returned error exit status 2") != NULL) {
+ std::clog << _("No apport report written because the error message indicates an issue on the local system") << std::endl;
return;
}
+ // do not report dpkg I/O errors, this is a format string, so we compare
+ // the prefix and the suffix of the error with the dpkg error message
+ vector<string> io_errors;
+ io_errors.push_back(string("failed to read on buffer copy for %s"));
+ io_errors.push_back(string("failed in write on buffer copy for %s"));
+ io_errors.push_back(string("short read on buffer copy for %s"));
+
+ for (vector<string>::iterator I = io_errors.begin(); I != io_errors.end(); I++)
+ {
+ vector<string> list = VectorizeString(dgettext("dpkg", (*I).c_str()), '%');
+ if (list.size() > 1) {
+ // we need to split %s, VectorizeString only allows char so we need
+ // to kill the "s" manually
+ if (list[1].size() > 1) {
+ list[1].erase(0, 1);
+ if(strstr(errormsg, list[0].c_str()) &&
+ strstr(errormsg, list[1].c_str())) {
+ std::clog << _("No apport report written because the error message indicates a dpkg I/O error") << std::endl;
+ return;
+ }
+ }
+ }
+ }
+
// get the pkgname and reportfile
pkgname = flNotDir(pkgpath);
pos = pkgname.find('_');
@@ -1536,6 +1610,24 @@ void pkgDPkgPM::WriteApportReport(const char *pkgpath, const char *errormsg)
{
while( fgets(buf, sizeof(buf), log) != NULL)
fprintf(report, " %s", buf);
+ fprintf(report, " \n");
+ fclose(log);
+ }
+ }
+
+ // attach history log it if we have it
+ string histfile_name = _config->FindFile("Dir::Log::History");
+ if (!histfile_name.empty())
+ {
+ FILE *log = NULL;
+ char buf[1024];
+
+ fprintf(report, "DpkgHistoryLog:\n");
+ log = fopen(histfile_name.c_str(),"r");
+ if(log != NULL)
+ {
+ while( fgets(buf, sizeof(buf), log) != NULL)
+ fprintf(report, " %s", buf);
fclose(log);
}
}
diff --git a/apt-pkg/depcache.cc b/apt-pkg/depcache.cc
index 085159711..fdfd1c713 100644
--- a/apt-pkg/depcache.cc
+++ b/apt-pkg/depcache.cc
@@ -871,6 +871,7 @@ bool pkgDepCache::IsDeleteOk(PkgIterator const &Pkg,bool rPurge,
if (FromUser == false && Pkg->CurrentVer == 0)
{
StateCache &P = PkgState[Pkg->ID];
+ // Status == 2 means this applies for new installs only
if (P.InstallVer != 0 && P.Status == 2 && (P.Flags & Flag::Auto) != Flag::Auto)
{
if (DebugMarker == true)
@@ -1240,19 +1241,36 @@ void pkgDepCache::SetReInstall(PkgIterator const &Pkg,bool To)
if (unlikely(Pkg.end() == true))
return;
+ APT::PackageList pkglist;
+ if (Pkg->CurrentVer != 0 &&
+ (Pkg.CurrentVer()-> MultiArch & pkgCache::Version::Same) == pkgCache::Version::Same)
+ {
+ pkgCache::GrpIterator Grp = Pkg.Group();
+ for (pkgCache::PkgIterator P = Grp.PackageList(); P.end() == false; P = Grp.NextPkg(P))
+ {
+ if (P->CurrentVer != 0)
+ pkglist.insert(P);
+ }
+ }
+ else
+ pkglist.insert(Pkg);
+
ActionGroup group(*this);
- RemoveSizes(Pkg);
- RemoveStates(Pkg);
-
- StateCache &P = PkgState[Pkg->ID];
- if (To == true)
- P.iFlags |= ReInstall;
- else
- P.iFlags &= ~ReInstall;
-
- AddStates(Pkg);
- AddSizes(Pkg);
+ for (APT::PackageList::const_iterator Pkg = pkglist.begin(); Pkg != pkglist.end(); ++Pkg)
+ {
+ RemoveSizes(Pkg);
+ RemoveStates(Pkg);
+
+ StateCache &P = PkgState[Pkg->ID];
+ if (To == true)
+ P.iFlags |= ReInstall;
+ else
+ P.iFlags &= ~ReInstall;
+
+ AddStates(Pkg);
+ AddSizes(Pkg);
+ }
}
/*}}}*/
// DepCache::SetCandidateVersion - Change the candidate version /*{{{*/
diff --git a/apt-pkg/indexcopy.cc b/apt-pkg/indexcopy.cc
index 3747e3570..e29e2819c 100644
--- a/apt-pkg/indexcopy.cc
+++ b/apt-pkg/indexcopy.cc
@@ -85,7 +85,7 @@ bool IndexCopy::CopyPackages(string CDROM,string Name,vector<string> &List,
string OrigPath = string(*I,CDROM.length());
// Open the package file
- FileFd Pkg(*I + GetFileName(), FileFd::ReadOnly, FileFd::Extension);
+ FileFd Pkg(*I + GetFileName(), FileFd::ReadOnly, FileFd::Auto);
off_t const FileSize = Pkg.Size();
pkgTagFile Parser(&Pkg);
@@ -797,7 +797,7 @@ bool TranslationsCopy::CopyTranslations(string CDROM,string Name, /*{{{*/
string OrigPath = string(*I,CDROM.length());
// Open the package file
- FileFd Pkg(*I, FileFd::ReadOnly, FileFd::Extension);
+ FileFd Pkg(*I, FileFd::ReadOnly, FileFd::Auto);
off_t const FileSize = Pkg.Size();
pkgTagFile Parser(&Pkg);
diff --git a/apt-pkg/init.cc b/apt-pkg/init.cc
index a1c47c030..4c15858a1 100644
--- a/apt-pkg/init.cc
+++ b/apt-pkg/init.cc
@@ -92,6 +92,7 @@ bool pkgInitConfig(Configuration &Cnf)
Cnf.Set("Dir::Ignore-Files-Silently::", "\\.dpkg-[a-z]+$");
Cnf.Set("Dir::Ignore-Files-Silently::", "\\.save$");
Cnf.Set("Dir::Ignore-Files-Silently::", "\\.orig$");
+ Cnf.Set("Dir::Ignore-Files-Silently::", "\\.distUpgrade$");
// Default cdrom mount point
Cnf.CndSet("Acquire::cdrom::mount", "/media/cdrom/");
diff --git a/apt-pkg/orderlist.cc b/apt-pkg/orderlist.cc
index 0ac9a83e3..3a179b2a2 100644
--- a/apt-pkg/orderlist.cc
+++ b/apt-pkg/orderlist.cc
@@ -82,16 +82,14 @@ pkgOrderList *pkgOrderList::Me = 0;
// OrderList::pkgOrderList - Constructor /*{{{*/
// ---------------------------------------------------------------------
/* */
-pkgOrderList::pkgOrderList(pkgDepCache *pCache) : Cache(*pCache)
+pkgOrderList::pkgOrderList(pkgDepCache *pCache) : Cache(*pCache),
+ Primary(NULL), Secondary(NULL),
+ RevDepends(NULL), Remove(NULL),
+ AfterEnd(NULL), FileList(NULL),
+ LoopCount(-1), Depth(0)
{
- FileList = 0;
- Primary = 0;
- Secondary = 0;
- RevDepends = 0;
- Remove = 0;
- LoopCount = -1;
Debug = _config->FindB("Debug::pkgOrderList",false);
-
+
/* Construct the arrays, egcs 1.0.1 bug requires the package count
hack */
unsigned long Size = Cache.Head().PackageCount;
diff --git a/apt-pkg/packagemanager.cc b/apt-pkg/packagemanager.cc
index a370f15a3..14a227e3e 100644
--- a/apt-pkg/packagemanager.cc
+++ b/apt-pkg/packagemanager.cc
@@ -36,11 +36,13 @@ bool pkgPackageManager::SigINTStop = false;
// PM::PackageManager - Constructor /*{{{*/
// ---------------------------------------------------------------------
/* */
-pkgPackageManager::pkgPackageManager(pkgDepCache *pCache) : Cache(*pCache)
+pkgPackageManager::pkgPackageManager(pkgDepCache *pCache) : Cache(*pCache),
+ List(NULL), Res(Incomplete)
{
FileNames = new string[Cache.Head().PackageCount];
- List = 0;
Debug = _config->FindB("Debug::pkgPackageManager",false);
+ NoImmConfigure = !_config->FindB("APT::Immediate-Configure",true);
+ ImmConfigureAll = _config->FindB("APT::Immediate-Configure-All",false);
}
/*}}}*/
// PM::PackageManager - Destructor /*{{{*/
@@ -150,7 +152,7 @@ void pkgPackageManager::ImmediateAdd(PkgIterator I, bool UseInstallVer, unsigned
if(!List->IsFlag(D.TargetPkg(), pkgOrderList::Immediate))
{
if(Debug)
- clog << OutputInDepth(Depth) << "ImmediateAdd(): Adding Immediate flag to " << D.TargetPkg() << " cause of " << D.DepType() << " " << I.Name() << endl;
+ clog << OutputInDepth(Depth) << "ImmediateAdd(): Adding Immediate flag to " << D.TargetPkg() << " cause of " << D.DepType() << " " << I.FullName() << endl;
List->Flag(D.TargetPkg(),pkgOrderList::Immediate);
ImmediateAdd(D.TargetPkg(), UseInstallVer, Depth + 1);
}
@@ -169,10 +171,7 @@ bool pkgPackageManager::CreateOrderList()
delete List;
List = new pkgOrderList(&Cache);
-
- NoImmConfigure = !_config->FindB("APT::Immediate-Configure",true);
- ImmConfigureAll = _config->FindB("APT::Immediate-Configure-All",false);
-
+
if (Debug && ImmConfigureAll)
clog << "CreateOrderList(): Adding Immediate flag for all packages because of APT::Immediate-Configure-All" << endl;
@@ -189,7 +188,7 @@ bool pkgPackageManager::CreateOrderList()
NoImmConfigure == false) || ImmConfigureAll)
{
if(Debug && !ImmConfigureAll)
- clog << "CreateOrderList(): Adding Immediate flag for " << I.Name() << endl;
+ clog << "CreateOrderList(): Adding Immediate flag for " << I.FullName() << endl;
List->Flag(I,pkgOrderList::Immediate);
if (!ImmConfigureAll) {
@@ -258,7 +257,7 @@ bool pkgPackageManager::CheckRConflicts(PkgIterator Pkg,DepIterator D,
if (EarlyRemove(D.ParentPkg()) == false)
return _error->Error("Reverse conflicts early remove for package '%s' failed",
- Pkg.Name());
+ Pkg.FullName().c_str());
}
return true;
}
@@ -296,9 +295,9 @@ bool pkgPackageManager::ConfigureAll()
if (ConfigurePkgs == true && SmartConfigure(Pkg, 0) == false) {
if (ImmConfigureAll)
_error->Error(_("Could not perform immediate configuration on '%s'. "
- "Please see man 5 apt.conf under APT::Immediate-Configure for details. (%d)"),Pkg.Name(),1);
+ "Please see man 5 apt.conf under APT::Immediate-Configure for details. (%d)"),Pkg.FullName().c_str(),1);
else
- _error->Error("Internal error, packages left unconfigured. %s",Pkg.Name());
+ _error->Error("Internal error, packages left unconfigured. %s",Pkg.FullName().c_str());
return false;
}
@@ -323,11 +322,11 @@ bool pkgPackageManager::ConfigureAll()
bool pkgPackageManager::SmartConfigure(PkgIterator Pkg, int const Depth)
{
// If this is true, only check and correct and dependencies without the Loop flag
- bool PkgLoop = List->IsFlag(Pkg,pkgOrderList::Loop);
+ bool const PkgLoop = List->IsFlag(Pkg,pkgOrderList::Loop);
if (Debug) {
VerIterator InstallVer = VerIterator(Cache,Cache[Pkg].InstallVer);
- clog << OutputInDepth(Depth) << "SmartConfigure " << Pkg.Name() << " (" << InstallVer.VerStr() << ")";
+ clog << OutputInDepth(Depth) << "SmartConfigure " << Pkg.FullName() << " (" << InstallVer.VerStr() << ")";
if (PkgLoop)
clog << " (Only Correct Dependencies)";
clog << endl;
@@ -338,103 +337,135 @@ bool pkgPackageManager::SmartConfigure(PkgIterator Pkg, int const Depth)
/* Because of the ordered list, most dependencies should be unpacked,
however if there is a loop (A depends on B, B depends on A) this will not
be the case, so check for dependencies before configuring. */
- bool Bad = false;
- for (DepIterator D = instVer.DependsList();
- D.end() == false; )
- {
- // Compute a single dependency element (glob or)
- pkgCache::DepIterator Start;
- pkgCache::DepIterator End;
- D.GlobOr(Start,End);
-
- if (End->Type == pkgCache::Dep::Depends)
- Bad = true;
-
- // Check for dependanices that have not been unpacked, probably due to loops.
- while (End->Type == pkgCache::Dep::Depends) {
- PkgIterator DepPkg;
- VerIterator InstallVer;
- SPtrArray<Version *> VList = Start.AllTargets();
-
- // Check through each version of each package that could satisfy this dependancy
- for (Version **I = VList; *I != 0; I++) {
- VerIterator Ver(Cache,*I);
- DepPkg = Ver.ParentPkg();
- InstallVer = VerIterator(Cache,Cache[DepPkg].InstallVer);
-
- // Check if the current version of the package is avalible and will satisfy this dependancy
- if (DepPkg.CurrentVer() == Ver && List->IsNow(DepPkg) == true &&
- !List->IsFlag(DepPkg,pkgOrderList::Removed) && DepPkg.State() == PkgIterator::NeedsNothing)
+ bool Bad = false, Changed = false;
+ do {
+ Changed = false;
+ for (DepIterator D = instVer.DependsList(); D.end() == false; )
+ {
+ // Compute a single dependency element (glob or)
+ pkgCache::DepIterator Start, End;
+ D.GlobOr(Start,End);
+
+ if (End->Type != pkgCache::Dep::Depends)
+ continue;
+ Bad = true;
+
+ // Search for dependencies which are unpacked but aren't configured yet (maybe loops)
+ for (DepIterator Cur = Start; true; ++Cur)
+ {
+ SPtrArray<Version *> VList = Cur.AllTargets();
+
+ for (Version **I = VList; *I != 0; ++I)
{
- Bad = false;
- break;
- }
-
- // Check if the version that is going to be installed will satisfy the dependancy
- if (Cache[DepPkg].InstallVer == *I) {
- if (List->IsFlag(DepPkg,pkgOrderList::UnPacked)) {
- if (List->IsFlag(DepPkg,pkgOrderList::Loop) && PkgLoop) {
- // This dependancy has already been dealt with by another SmartConfigure on Pkg
- Bad = false;
- break;
- } else if (List->IsFlag(Pkg,pkgOrderList::Loop)) {
- /* Check for a loop to prevent one forming
- If A depends on B and B depends on A, SmartConfigure will
- just hop between them if this is not checked. Dont remove the
- loop flag after finishing however as loop is already set.
- This means that there is another SmartConfigure call for this
- package and it will remove the loop flag */
- Bad = !SmartConfigure(DepPkg, Depth + 1);
- } else {
- /* Check for a loop to prevent one forming
- If A depends on B and B depends on A, SmartConfigure will
- just hop between them if this is not checked */
- List->Flag(Pkg,pkgOrderList::Loop);
- Bad = !SmartConfigure(DepPkg, Depth + 1);
- List->RmFlag(Pkg,pkgOrderList::Loop);
- }
- // If SmartConfigure was succesfull, Bad is false, so break
- if (!Bad) break;
- } else if (List->IsFlag(DepPkg,pkgOrderList::Configured)) {
- Bad = false;
- break;
+ VerIterator Ver(Cache,*I);
+ PkgIterator DepPkg = Ver.ParentPkg();
+
+ // Check if the current version of the package is available and will satisfy this dependency
+ if (DepPkg.CurrentVer() == Ver && List->IsNow(DepPkg) == true &&
+ List->IsFlag(DepPkg,pkgOrderList::Removed) == false &&
+ DepPkg.State() == PkgIterator::NeedsNothing)
+ {
+ Bad = false;
+ break;
+ }
+
+ // Check if the version that is going to be installed will satisfy the dependency
+ if (Cache[DepPkg].InstallVer != *I)
+ continue;
+
+ if (List->IsFlag(DepPkg,pkgOrderList::UnPacked))
+ {
+ if (List->IsFlag(DepPkg,pkgOrderList::Loop) && PkgLoop)
+ {
+ // This dependency has already been dealt with by another SmartConfigure on Pkg
+ Bad = false;
+ break;
+ }
+ /* Check for a loop to prevent one forming
+ If A depends on B and B depends on A, SmartConfigure will
+ just hop between them if this is not checked. Dont remove the
+ loop flag after finishing however as loop is already set.
+ This means that there is another SmartConfigure call for this
+ package and it will remove the loop flag */
+ if (PkgLoop == false)
+ List->Flag(Pkg,pkgOrderList::Loop);
+ if (SmartConfigure(DepPkg, Depth + 1) == true)
+ {
+ Bad = false;
+ if (List->IsFlag(DepPkg,pkgOrderList::Loop) == false)
+ Changed = true;
+ }
+ if (PkgLoop == false)
+ List->RmFlag(Pkg,pkgOrderList::Loop);
+ // If SmartConfigure was succesfull, Bad is false, so break
+ if (Bad == false)
+ break;
+ }
+ else if (List->IsFlag(DepPkg,pkgOrderList::Configured))
+ {
+ Bad = false;
+ break;
}
}
- }
-
- /* If the dependany is still not satisfied, try, if possible, unpacking a package to satisfy it */
- if (InstallVer != 0 && Bad) {
- if (List->IsNow(DepPkg)) {
- Bad = false;
- if (List->IsFlag(Pkg,pkgOrderList::Loop))
+ if (Cur == End)
+ break;
+ }
+
+ if (Bad == false)
+ continue;
+
+ // Check for dependencies that have not been unpacked, probably due to loops.
+ for (DepIterator Cur = Start; true; ++Cur)
+ {
+ SPtrArray<Version *> VList = Cur.AllTargets();
+
+ for (Version **I = VList; *I != 0; ++I)
+ {
+ VerIterator Ver(Cache,*I);
+ PkgIterator DepPkg = Ver.ParentPkg();
+
+ // Check if the version that is going to be installed will satisfy the dependency
+ if (Cache[DepPkg].InstallVer != *I || List->IsNow(DepPkg) == false)
+ continue;
+
+ if (PkgLoop == true)
{
if (Debug)
std::clog << OutputInDepth(Depth) << "Package " << Pkg << " loops in SmartConfigure" << std::endl;
+ Bad = false;
+ break;
}
else
{
- List->Flag(Pkg,pkgOrderList::Loop);
if (Debug)
- cout << OutputInDepth(Depth) << "Unpacking " << DepPkg.Name() << " to avoid loop" << endl;
- SmartUnPack(DepPkg, true, Depth + 1);
- List->RmFlag(Pkg,pkgOrderList::Loop);
+ clog << OutputInDepth(Depth) << "Unpacking " << DepPkg.FullName() << " to avoid loop " << Cur << endl;
+ if (PkgLoop == false)
+ List->Flag(Pkg,pkgOrderList::Loop);
+ if (SmartUnPack(DepPkg, true, Depth + 1) == true)
+ {
+ Bad = false;
+ if (List->IsFlag(DepPkg,pkgOrderList::Loop) == false)
+ Changed = true;
+ }
+ if (PkgLoop == false)
+ List->RmFlag(Pkg,pkgOrderList::Loop);
+ if (Bad == false)
+ break;
}
}
+
+ if (Cur == End)
+ break;
}
-
- if (Start==End) {
- if (Bad && Debug && List->IsFlag(DepPkg,pkgOrderList::Loop) == false)
- std::clog << OutputInDepth(Depth) << "Could not satisfy dependencies for " << Pkg.Name() << std::endl;
- break;
- } else {
- Start++;
- }
+
+ if (Bad == true && Changed == false && Debug == true)
+ std::clog << OutputInDepth(Depth) << "Could not satisfy " << Start << std::endl;
}
- }
+ } while (Changed == true);
if (Bad) {
if (Debug)
- _error->Warning(_("Could not configure '%s'. "),Pkg.Name());
+ _error->Warning(_("Could not configure '%s'. "),Pkg.FullName().c_str());
return false;
}
@@ -444,7 +475,7 @@ bool pkgPackageManager::SmartConfigure(PkgIterator Pkg, int const Depth)
static bool const ConfigurePkgs = (conf == "all" || conf == "smart");
if (List->IsFlag(Pkg,pkgOrderList::Configured))
- return _error->Error("Internal configure error on '%s'.", Pkg.Name());
+ return _error->Error("Internal configure error on '%s'.", Pkg.FullName().c_str());
if (ConfigurePkgs == true && Configure(Pkg) == false)
return false;
@@ -464,7 +495,7 @@ bool pkgPackageManager::SmartConfigure(PkgIterator Pkg, int const Depth)
// Sanity Check
if (List->IsFlag(Pkg,pkgOrderList::Configured) == false)
- return _error->Error(_("Could not configure '%s'. "),Pkg.Name());
+ return _error->Error(_("Could not configure '%s'. "),Pkg.FullName().c_str());
return true;
}
@@ -508,7 +539,7 @@ bool pkgPackageManager::EarlyRemove(PkgIterator Pkg)
"removing the essential package %s due to a "
"Conflicts/Pre-Depends loop. This is often bad, "
"but if you really want to do it, activate the "
- "APT::Force-LoopBreak option."),Pkg.Name());
+ "APT::Force-LoopBreak option."),Pkg.FullName().c_str());
}
bool Res = SmartRemove(Pkg);
@@ -544,184 +575,252 @@ bool pkgPackageManager::SmartUnPack(PkgIterator Pkg, bool const Immediate, int c
bool PkgLoop = List->IsFlag(Pkg,pkgOrderList::Loop);
if (Debug) {
- clog << OutputInDepth(Depth) << "SmartUnPack " << Pkg.Name();
+ clog << OutputInDepth(Depth) << "SmartUnPack " << Pkg.FullName();
VerIterator InstallVer = VerIterator(Cache,Cache[Pkg].InstallVer);
if (Pkg.CurrentVer() == 0)
- cout << " (install version " << InstallVer.VerStr() << ")";
+ clog << " (install version " << InstallVer.VerStr() << ")";
else
- cout << " (replace version " << Pkg.CurrentVer().VerStr() << " with " << InstallVer.VerStr() << ")";
+ clog << " (replace version " << Pkg.CurrentVer().VerStr() << " with " << InstallVer.VerStr() << ")";
if (PkgLoop)
- cout << " (Only Perform PreUnpack Checks)";
- cout << endl;
+ clog << " (Only Perform PreUnpack Checks)";
+ clog << endl;
}
VerIterator const instVer = Cache[Pkg].InstVerIter(Cache);
/* PreUnpack Checks: This loop checks and attempts to rectify and problems that would prevent the package being unpacked.
- It addresses: PreDepends, Conflicts, Obsoletes and Breaks (DpkgBreaks). Any resolutions that do not require it should
+ It addresses: PreDepends, Conflicts, Obsoletes and Breaks (DpkgBreaks). Any resolutions that do not require it should
avoid configuration (calling SmartUnpack with Immediate=true), this is because when unpacking some packages with
- complex dependancy structures, trying to configure some packages while breaking the loops can complicate things .
- This will be either dealt with if the package is configured as a dependency of Pkg (if and when Pkg is configured),
+ complex dependancy structures, trying to configure some packages while breaking the loops can complicate things .
+ This will be either dealt with if the package is configured as a dependency of Pkg (if and when Pkg is configured),
or by the ConfigureAll call at the end of the for loop in OrderInstall. */
- for (DepIterator D = instVer.DependsList();
- D.end() == false; )
- {
- // Compute a single dependency element (glob or)
- pkgCache::DepIterator Start;
- pkgCache::DepIterator End;
- D.GlobOr(Start,End);
-
- while (End->Type == pkgCache::Dep::PreDepends)
+ bool Changed = false;
+ do {
+ Changed = false;
+ for (DepIterator D = instVer.DependsList(); D.end() == false; )
{
- if (Debug)
- clog << OutputInDepth(Depth) << "PreDepends order for " << Pkg.Name() << std::endl;
+ // Compute a single dependency element (glob or)
+ pkgCache::DepIterator Start, End;
+ D.GlobOr(Start,End);
- // Look for possible ok targets.
- SPtrArray<Version *> VList = Start.AllTargets();
- bool Bad = true;
- for (Version **I = VList; *I != 0 && Bad == true; I++)
- {
- VerIterator Ver(Cache,*I);
- PkgIterator Pkg = Ver.ParentPkg();
-
- // See if the current version is ok
- if (Pkg.CurrentVer() == Ver && List->IsNow(Pkg) == true &&
- Pkg.State() == PkgIterator::NeedsNothing)
+ if (End->Type == pkgCache::Dep::PreDepends)
+ {
+ bool Bad = true;
+ if (Debug)
+ clog << OutputInDepth(Depth) << "PreDepends order for " << Pkg.FullName() << std::endl;
+
+ // Look for easy targets: packages that are already okay
+ for (DepIterator Cur = Start; Bad == true; ++Cur)
{
- Bad = false;
- if (Debug)
- clog << OutputInDepth(Depth) << "Found ok package " << Pkg.Name() << endl;
- continue;
- }
- }
-
- // Look for something that could be configured.
- for (Version **I = VList; *I != 0 && Bad == true; I++)
- {
- VerIterator Ver(Cache,*I);
- PkgIterator Pkg = Ver.ParentPkg();
-
- // Not the install version
- if (Cache[Pkg].InstallVer != *I ||
- (Cache[Pkg].Keep() == true && Pkg.State() == PkgIterator::NeedsNothing))
- continue;
-
- if (List->IsFlag(Pkg,pkgOrderList::Configured)) {
- Bad = false;
- continue;
+ SPtrArray<Version *> VList = Start.AllTargets();
+ for (Version **I = VList; *I != 0; ++I)
+ {
+ VerIterator Ver(Cache,*I);
+ PkgIterator Pkg = Ver.ParentPkg();
+
+ // See if the current version is ok
+ if (Pkg.CurrentVer() == Ver && List->IsNow(Pkg) == true &&
+ Pkg.State() == PkgIterator::NeedsNothing)
+ {
+ Bad = false;
+ if (Debug)
+ clog << OutputInDepth(Depth) << "Found ok package " << Pkg.FullName() << endl;
+ break;
+ }
+ }
+ if (Cur == End)
+ break;
}
- if (Debug)
- clog << OutputInDepth(Depth) << "Trying to SmartConfigure " << Pkg.Name() << endl;
- Bad = !SmartConfigure(Pkg, Depth + 1);
- }
+ // Look for something that could be configured.
+ for (DepIterator Cur = Start; Bad == true; ++Cur)
+ {
+ SPtrArray<Version *> VList = Start.AllTargets();
+ for (Version **I = VList; *I != 0; ++I)
+ {
+ VerIterator Ver(Cache,*I);
+ PkgIterator Pkg = Ver.ParentPkg();
+
+ // Not the install version
+ if (Cache[Pkg].InstallVer != *I ||
+ (Cache[Pkg].Keep() == true && Pkg.State() == PkgIterator::NeedsNothing))
+ continue;
+
+ if (List->IsFlag(Pkg,pkgOrderList::Configured))
+ {
+ Bad = false;
+ break;
+ }
+
+ // check if it needs unpack or if if configure is enough
+ if (List->IsFlag(Pkg,pkgOrderList::UnPacked) == false)
+ {
+ if (Debug)
+ clog << OutputInDepth(Depth) << "Trying to SmartUnpack " << Pkg.FullName() << endl;
+ // SmartUnpack with the ImmediateFlag to ensure its really ready
+ if (SmartUnPack(Pkg, true, Depth + 1) == true)
+ {
+ Bad = false;
+ if (List->IsFlag(Pkg,pkgOrderList::Loop) == false)
+ Changed = true;
+ break;
+ }
+ }
+ else
+ {
+ if (Debug)
+ clog << OutputInDepth(Depth) << "Trying to SmartConfigure " << Pkg.FullName() << endl;
+ if (SmartConfigure(Pkg, Depth + 1) == true)
+ {
+ Bad = false;
+ if (List->IsFlag(Pkg,pkgOrderList::Loop) == false)
+ Changed = true;
+ break;
+ }
+ }
+ }
+ }
- /* If this or element did not match then continue on to the
- next or element until a matching element is found */
- if (Bad == true)
- {
- // This triggers if someone make a pre-depends/depend loop.
- if (Start == End)
- return _error->Error("Couldn't configure pre-depend %s for %s, "
- "probably a dependency cycle.",
- End.TargetPkg().Name(),Pkg.Name());
- ++Start;
+ if (Bad == true)
+ {
+ if (Start == End)
+ return _error->Error("Couldn't configure pre-depend %s for %s, "
+ "probably a dependency cycle.",
+ End.TargetPkg().FullName().c_str(),Pkg.FullName().c_str());
+ }
+ else
+ continue;
}
- else
- break;
- }
-
- if (End->Type == pkgCache::Dep::Conflicts ||
- End->Type == pkgCache::Dep::Obsoletes)
- {
- /* Look for conflicts. Two packages that are both in the install
- state cannot conflict so we don't check.. */
- SPtrArray<Version *> VList = End.AllTargets();
- for (Version **I = VList; *I != 0; I++)
+ else if (End->Type == pkgCache::Dep::Conflicts ||
+ End->Type == pkgCache::Dep::Obsoletes)
{
- VerIterator Ver(Cache,*I);
- PkgIterator ConflictPkg = Ver.ParentPkg();
- VerIterator InstallVer(Cache,Cache[ConflictPkg].InstallVer);
-
- // See if the current version is conflicting
- if (ConflictPkg.CurrentVer() == Ver && List->IsNow(ConflictPkg))
- {
- cout << OutputInDepth(Depth) << Pkg.Name() << " conflicts with " << ConflictPkg.Name() << endl;
- /* If a loop is not present or has not yet been detected, attempt to unpack packages
- to resolve this conflict. If there is a loop present, remove packages to resolve this conflict */
- if (!List->IsFlag(ConflictPkg,pkgOrderList::Loop)) {
- if (Cache[ConflictPkg].Keep() == 0 && Cache[ConflictPkg].InstallVer != 0) {
- if (Debug)
- cout << OutputInDepth(Depth) << OutputInDepth(Depth) << "Unpacking " << ConflictPkg.Name() << " to prevent conflict" << endl;
- List->Flag(Pkg,pkgOrderList::Loop);
- SmartUnPack(ConflictPkg,false, Depth + 1);
- // Remove loop to allow it to be used later if needed
- List->RmFlag(Pkg,pkgOrderList::Loop);
- } else {
- if (EarlyRemove(ConflictPkg) == false)
- return _error->Error("Internal Error, Could not early remove %s",ConflictPkg.Name());
- }
- } else {
- if (!List->IsFlag(ConflictPkg,pkgOrderList::Removed)) {
- if (Debug)
- cout << OutputInDepth(Depth) << "Because of conficts knot, removing " << ConflictPkg.Name() << " to conflict violation" << endl;
- if (EarlyRemove(ConflictPkg) == false)
- return _error->Error("Internal Error, Could not early remove %s",ConflictPkg.Name());
- }
+ /* Look for conflicts. Two packages that are both in the install
+ state cannot conflict so we don't check.. */
+ SPtrArray<Version *> VList = End.AllTargets();
+ for (Version **I = VList; *I != 0; I++)
+ {
+ VerIterator Ver(Cache,*I);
+ PkgIterator ConflictPkg = Ver.ParentPkg();
+ VerIterator InstallVer(Cache,Cache[ConflictPkg].InstallVer);
+
+ // See if the current version is conflicting
+ if (ConflictPkg.CurrentVer() == Ver && List->IsNow(ConflictPkg))
+ {
+ clog << OutputInDepth(Depth) << Pkg.FullName() << " conflicts with " << ConflictPkg.FullName() << endl;
+ /* If a loop is not present or has not yet been detected, attempt to unpack packages
+ to resolve this conflict. If there is a loop present, remove packages to resolve this conflict */
+ if (List->IsFlag(ConflictPkg,pkgOrderList::Loop) == false)
+ {
+ if (Cache[ConflictPkg].Keep() == 0 && Cache[ConflictPkg].InstallVer != 0)
+ {
+ if (Debug)
+ clog << OutputInDepth(Depth) << OutputInDepth(Depth) << "Unpacking " << ConflictPkg.FullName() << " to prevent conflict" << endl;
+ List->Flag(Pkg,pkgOrderList::Loop);
+ if (SmartUnPack(ConflictPkg,false, Depth + 1) == true)
+ if (List->IsFlag(ConflictPkg,pkgOrderList::Loop) == false)
+ Changed = true;
+ // Remove loop to allow it to be used later if needed
+ List->RmFlag(Pkg,pkgOrderList::Loop);
+ }
+ else if (EarlyRemove(ConflictPkg) == false)
+ return _error->Error("Internal Error, Could not early remove %s (1)",ConflictPkg.FullName().c_str());
+ }
+ else if (List->IsFlag(ConflictPkg,pkgOrderList::Removed) == false)
+ {
+ if (Debug)
+ clog << OutputInDepth(Depth) << "Because of conficts knot, removing " << ConflictPkg.FullName() << " to conflict violation" << endl;
+ if (EarlyRemove(ConflictPkg) == false)
+ return _error->Error("Internal Error, Could not early remove %s (2)",ConflictPkg.FullName().c_str());
+ }
}
}
}
- }
-
- // Check for breaks
- if (End->Type == pkgCache::Dep::DpkgBreaks) {
- SPtrArray<Version *> VList = End.AllTargets();
- for (Version **I = VList; *I != 0; I++)
+ else if (End->Type == pkgCache::Dep::DpkgBreaks)
{
- VerIterator Ver(Cache,*I);
- PkgIterator BrokenPkg = Ver.ParentPkg();
- VerIterator InstallVer(Cache,Cache[BrokenPkg].InstallVer);
- if (BrokenPkg.CurrentVer() != Ver)
+ SPtrArray<Version *> VList = End.AllTargets();
+ for (Version **I = VList; *I != 0; ++I)
{
- if (Debug)
- std::clog << OutputInDepth(Depth) << " Ignore not-installed version " << Ver.VerStr() << " of " << Pkg.FullName() << " for " << End << std::endl;
- continue;
- }
+ VerIterator Ver(Cache,*I);
+ PkgIterator BrokenPkg = Ver.ParentPkg();
+ if (BrokenPkg.CurrentVer() != Ver)
+ {
+ if (Debug)
+ std::clog << OutputInDepth(Depth) << " Ignore not-installed version " << Ver.VerStr() << " of " << Pkg.FullName() << " for " << End << std::endl;
+ continue;
+ }
- // Check if it needs to be unpacked
- if (List->IsFlag(BrokenPkg,pkgOrderList::InList) && Cache[BrokenPkg].Delete() == false &&
- List->IsNow(BrokenPkg)) {
- if (List->IsFlag(BrokenPkg,pkgOrderList::Loop) && PkgLoop) {
- // This dependancy has already been dealt with by another SmartUnPack on Pkg
- break;
- } else if (List->IsFlag(Pkg,pkgOrderList::Loop)) {
- /* Found a break, so unpack the package, but dont remove loop as already set.
- This means that there is another SmartUnPack call for this
- package and it will remove the loop flag. */
- if (Debug)
- cout << OutputInDepth(Depth) << " Unpacking " << BrokenPkg.Name() << " to avoid break" << endl;
-
- SmartUnPack(BrokenPkg, false, Depth + 1);
- } else {
- List->Flag(Pkg,pkgOrderList::Loop);
- // Found a break, so unpack the package
- if (Debug)
- cout << OutputInDepth(Depth) << " Unpacking " << BrokenPkg.Name() << " to avoid break" << endl;
-
- SmartUnPack(BrokenPkg, false, Depth + 1);
- List->RmFlag(Pkg,pkgOrderList::Loop);
- }
- }
-
- // Check if a package needs to be removed
- if (Cache[BrokenPkg].Delete() == true && !List->IsFlag(BrokenPkg,pkgOrderList::Configured)) {
- if (Debug)
- cout << OutputInDepth(Depth) << " Removing " << BrokenPkg.Name() << " to avoid break" << endl;
- SmartRemove(BrokenPkg);
+ // Check if it needs to be unpacked
+ if (List->IsFlag(BrokenPkg,pkgOrderList::InList) && Cache[BrokenPkg].Delete() == false &&
+ List->IsNow(BrokenPkg))
+ {
+ if (List->IsFlag(BrokenPkg,pkgOrderList::Loop) && PkgLoop)
+ {
+ // This dependancy has already been dealt with by another SmartUnPack on Pkg
+ break;
+ }
+ else
+ {
+ // Found a break, so see if we can unpack the package to avoid it
+ // but do not set loop if another SmartUnPack already deals with it
+ // Also, avoid it if the package we would unpack pre-depends on this one
+ VerIterator InstallVer(Cache,Cache[BrokenPkg].InstallVer);
+ bool circle = false;
+ for (pkgCache::DepIterator D = InstallVer.DependsList(); D.end() == false; ++D)
+ {
+ if (D->Type != pkgCache::Dep::PreDepends)
+ continue;
+ SPtrArray<Version *> VL = D.AllTargets();
+ for (Version **I = VL; *I != 0; ++I)
+ {
+ VerIterator V(Cache,*I);
+ PkgIterator P = V.ParentPkg();
+ // we are checking for installation as an easy 'protection' against or-groups and (unchosen) providers
+ if (P->CurrentVer == 0 || P != Pkg || (P.CurrentVer() != V && Cache[P].InstallVer != V))
+ continue;
+ circle = true;
+ break;
+ }
+ if (circle == true)
+ break;
+ }
+ if (circle == true)
+ {
+ if (Debug)
+ clog << OutputInDepth(Depth) << " Avoiding " << End << " avoided as " << BrokenPkg.FullName() << " has a pre-depends on " << Pkg.FullName() << std::endl;
+ continue;
+ }
+ else
+ {
+ if (Debug)
+ {
+ clog << OutputInDepth(Depth) << " Unpacking " << BrokenPkg.FullName() << " to avoid " << End;
+ if (PkgLoop == true)
+ clog << " (Looping)";
+ clog << std::endl;
+ }
+ if (PkgLoop == false)
+ List->Flag(Pkg,pkgOrderList::Loop);
+ if (SmartUnPack(BrokenPkg, false, Depth + 1) == true)
+ {
+ if (List->IsFlag(BrokenPkg,pkgOrderList::Loop) == false)
+ Changed = true;
+ }
+ if (PkgLoop == false)
+ List->RmFlag(Pkg,pkgOrderList::Loop);
+ }
+ }
+ }
+ // Check if a package needs to be removed
+ else if (Cache[BrokenPkg].Delete() == true && List->IsFlag(BrokenPkg,pkgOrderList::Configured) == false)
+ {
+ if (Debug)
+ clog << OutputInDepth(Depth) << " Removing " << BrokenPkg.FullName() << " to avoid " << End << endl;
+ SmartRemove(BrokenPkg);
+ }
}
}
}
- }
+ } while (Changed == true);
// Check for reverse conflicts.
if (CheckRConflicts(Pkg,Pkg.RevDependsList(),
@@ -778,7 +877,7 @@ bool pkgPackageManager::SmartUnPack(PkgIterator Pkg, bool const Immediate, int c
// Perform immedate configuration of the package.
if (SmartConfigure(Pkg, Depth + 1) == false)
_error->Warning(_("Could not perform immediate configuration on '%s'. "
- "Please see man 5 apt.conf under APT::Immediate-Configure for details. (%d)"),Pkg.Name(),2);
+ "Please see man 5 apt.conf under APT::Immediate-Configure for details. (%d)"),Pkg.FullName().c_str(),2);
}
return true;
@@ -818,11 +917,11 @@ pkgPackageManager::OrderResult pkgPackageManager::OrderInstall()
{
if (!List->IsFlag(Pkg,pkgOrderList::Configured) && !NoImmConfigure) {
if (SmartConfigure(Pkg, 0) == false && Debug)
- _error->Warning("Internal Error, Could not configure %s",Pkg.Name());
+ _error->Warning("Internal Error, Could not configure %s",Pkg.FullName().c_str());
// FIXME: The above warning message might need changing
} else {
if (Debug == true)
- clog << "Skipping already done " << Pkg.Name() << endl;
+ clog << "Skipping already done " << Pkg.FullName() << endl;
}
continue;
@@ -831,7 +930,7 @@ pkgPackageManager::OrderResult pkgPackageManager::OrderInstall()
if (List->IsMissing(Pkg) == true)
{
if (Debug == true)
- clog << "Sequence completed at " << Pkg.Name() << endl;
+ clog << "Sequence completed at " << Pkg.FullName() << endl;
if (DoneSomething == false)
{
_error->Error("Internal Error, ordering was unable to handle the media swap");
@@ -845,7 +944,7 @@ pkgPackageManager::OrderResult pkgPackageManager::OrderInstall()
Pkg.State() == pkgCache::PkgIterator::NeedsNothing &&
(Cache[Pkg].iFlags & pkgDepCache::ReInstall) != pkgDepCache::ReInstall)
{
- _error->Error("Internal Error, trying to manipulate a kept package (%s)",Pkg.Name());
+ _error->Error("Internal Error, trying to manipulate a kept package (%s)",Pkg.FullName().c_str());
return Failed;
}
@@ -878,7 +977,7 @@ pkgPackageManager::OrderResult pkgPackageManager::OrderInstall()
if (List->IsFlag(*I,pkgOrderList::Configured) == false)
{
_error->Error("Internal error, packages left unconfigured. %s",
- PkgIterator(Cache,*I).Name());
+ PkgIterator(Cache,*I).FullName().c_str());
return Failed;
}
}
diff --git a/apt-pkg/pkgrecords.cc b/apt-pkg/pkgrecords.cc
index c5b3bebd7..36dab3480 100644
--- a/apt-pkg/pkgrecords.cc
+++ b/apt-pkg/pkgrecords.cc
@@ -22,7 +22,7 @@
// Records::pkgRecords - Constructor /*{{{*/
// ---------------------------------------------------------------------
/* This will create the necessary structures to access the status files */
-pkgRecords::pkgRecords(pkgCache &Cache) : Cache(Cache),
+pkgRecords::pkgRecords(pkgCache &Cache) : d(NULL), Cache(Cache),
Files(Cache.HeaderP->PackageFileCount)
{
for (pkgCache::PkgFileIterator I = Cache.FileBegin();
diff --git a/apt-pkg/pkgsystem.cc b/apt-pkg/pkgsystem.cc
index f61c140fa..05ba6e0e6 100644
--- a/apt-pkg/pkgsystem.cc
+++ b/apt-pkg/pkgsystem.cc
@@ -26,11 +26,11 @@ unsigned long pkgSystem::GlobalListLen = 0;
// System::pkgSystem - Constructor /*{{{*/
// ---------------------------------------------------------------------
/* Add it to the global list.. */
-pkgSystem::pkgSystem()
+pkgSystem::pkgSystem() : Label(NULL), VS(NULL)
{
assert(GlobalListLen < sizeof(SysList)/sizeof(*SysList));
SysList[GlobalListLen] = this;
- GlobalListLen++;
+ ++GlobalListLen;
}
/*}}}*/
// System::GetSystem - Get the named system /*{{{*/
diff --git a/apt-pkg/sourcelist.cc b/apt-pkg/sourcelist.cc
index f5f458099..0fddfb451 100644
--- a/apt-pkg/sourcelist.cc
+++ b/apt-pkg/sourcelist.cc
@@ -33,7 +33,7 @@ unsigned long pkgSourceList::Type::GlobalListLen = 0;
// Type::Type - Constructor /*{{{*/
// ---------------------------------------------------------------------
/* Link this to the global list of items*/
-pkgSourceList::Type::Type()
+pkgSourceList::Type::Type() : Name(NULL), Label(NULL)
{
ItmList[GlobalListLen] = this;
GlobalListLen++;
diff --git a/apt-pkg/srcrecords.cc b/apt-pkg/srcrecords.cc
index 48b643eac..d63d2c422 100644
--- a/apt-pkg/srcrecords.cc
+++ b/apt-pkg/srcrecords.cc
@@ -25,7 +25,7 @@
// SrcRecords::pkgSrcRecords - Constructor /*{{{*/
// ---------------------------------------------------------------------
/* Open all the source index files */
-pkgSrcRecords::pkgSrcRecords(pkgSourceList &List) : Files(0), Current(0)
+pkgSrcRecords::pkgSrcRecords(pkgSourceList &List) : d(NULL), Files(0), Current(0)
{
for (pkgSourceList::const_iterator I = List.begin(); I != List.end(); ++I)
{
diff --git a/apt-pkg/tagfile.cc b/apt-pkg/tagfile.cc
index ec86173df..79811899a 100644
--- a/apt-pkg/tagfile.cc
+++ b/apt-pkg/tagfile.cc
@@ -30,7 +30,10 @@ using std::string;
class pkgTagFilePrivate
{
public:
- pkgTagFilePrivate(FileFd *pFd, unsigned long long Size) : Fd(*pFd), Size(Size)
+ pkgTagFilePrivate(FileFd *pFd, unsigned long long Size) : Fd(*pFd), Buffer(NULL),
+ Start(NULL), End(NULL),
+ Done(false), iOffset(0),
+ Size(Size)
{
}
FileFd &Fd;
diff --git a/apt-pkg/version.cc b/apt-pkg/version.cc
index a9d4fb763..cb2c34c0f 100644
--- a/apt-pkg/version.cc
+++ b/apt-pkg/version.cc
@@ -23,10 +23,10 @@ unsigned long pkgVersioningSystem::GlobalListLen = 0;
// pkgVS::pkgVersioningSystem - Constructor /*{{{*/
// ---------------------------------------------------------------------
/* Link to the global list of versioning systems supported */
-pkgVersioningSystem::pkgVersioningSystem()
+pkgVersioningSystem::pkgVersioningSystem() : Label(NULL)
{
VSList[GlobalListLen] = this;
- GlobalListLen++;
+ ++GlobalListLen;
}
/*}}}*/
// pkgVS::GetVS - Find a VS by name /*{{{*/