summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apt-pkg/packagemanager.cc53
-rw-r--r--apt-pkg/packagemanager.h1
-rw-r--r--debian/changelog4
3 files changed, 46 insertions, 12 deletions
diff --git a/apt-pkg/packagemanager.cc b/apt-pkg/packagemanager.cc
index d6172c6c4..c391a6036 100644
--- a/apt-pkg/packagemanager.cc
+++ b/apt-pkg/packagemanager.cc
@@ -118,6 +118,41 @@ bool pkgPackageManager::FixMissing()
}
/*}}}*/
+// PM::ImmediateAdd - Add the immediate flag recursivly /*{{{*/
+// ---------------------------------------------------------------------
+/* This adds the immediate flag to the pkg and recursively to the
+ dependendies
+ */
+void pkgPackageManager::ImmediateAdd(PkgIterator I, bool UseInstallVer)
+{
+ DepIterator D;
+
+ if(UseInstallVer)
+ {
+ if(Cache[I].InstallVer == 0)
+ return;
+ D = Cache[I].InstVerIter(Cache).DependsList();
+ } else {
+ if (I->CurrentVer == 0)
+ return;
+ D = I.CurrentVer().DependsList();
+ }
+
+ for ( /* nothing */ ; D.end() == false; D++)
+ if (D->Type == pkgCache::Dep::Depends || D->Type == pkgCache::Dep::PreDepends)
+ {
+ if(!List->IsFlag(D.TargetPkg(), pkgOrderList::Immediate))
+ {
+ if(Debug)
+ clog << "ImmediateAdd(): Adding Immediate flag to " << I.Name() << endl;
+ List->Flag(D.TargetPkg(),pkgOrderList::Immediate);
+ ImmediateAdd(D.TargetPkg(), UseInstallVer);
+ }
+ }
+ return;
+}
+ /*}}}*/
+
// PM::CreateOrderList - Create the ordering class /*{{{*/
// ---------------------------------------------------------------------
/* This populates the ordering list with all the packages that are
@@ -144,21 +179,15 @@ bool pkgPackageManager::CreateOrderList()
(I->Flags & pkgCache::Flag::Important) == pkgCache::Flag::Important) &&
NoImmConfigure == false)
{
+ if(Debug)
+ clog << "CreateOrderList(): Adding Immediate flag for " << I.Name() << endl;
List->Flag(I,pkgOrderList::Immediate);
-
- // Look for other packages to make immediate configurea
- if (Cache[I].InstallVer != 0)
- for (DepIterator D = Cache[I].InstVerIter(Cache).DependsList();
- D.end() == false; D++)
- if (D->Type == pkgCache::Dep::Depends || D->Type == pkgCache::Dep::PreDepends)
- List->Flag(D.TargetPkg(),pkgOrderList::Immediate);
+
+ // Look for other install packages to make immediate configurea
+ ImmediateAdd(I, true);
// And again with the current version.
- if (I->CurrentVer != 0)
- for (DepIterator D = I.CurrentVer().DependsList();
- D.end() == false; D++)
- if (D->Type == pkgCache::Dep::Depends || D->Type == pkgCache::Dep::PreDepends)
- List->Flag(D.TargetPkg(),pkgOrderList::Immediate);
+ ImmediateAdd(I, false);
}
// Not interesting
diff --git a/apt-pkg/packagemanager.h b/apt-pkg/packagemanager.h
index 53cd4c96f..a1bfdc52d 100644
--- a/apt-pkg/packagemanager.h
+++ b/apt-pkg/packagemanager.h
@@ -49,6 +49,7 @@ class pkgPackageManager : protected pkgCache::Namespace
bool Debug;
bool DepAdd(pkgOrderList &Order,PkgIterator P,int Depth = 0);
+ void ImmediateAdd(PkgIterator P, bool UseInstallVer);
virtual OrderResult OrderInstall();
bool CheckRConflicts(PkgIterator Pkg,DepIterator Dep,const char *Ver);
bool CreateOrderList();
diff --git a/debian/changelog b/debian/changelog
index ef9784178..4f22e9d92 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -43,6 +43,10 @@ apt (0.7.10) UNRELEASED; urgency=low
* apt-pkg/acquire-item.{cc,h}:
- make the authentication download code more robust against
servers/proxies with broken If-Range implementations
+ * apt-pkg/packagemanager.{cc,h}:
+ - propergate the Immediate flag to make hitting the
+ "E: Internal Error, Could not perform immediate configuration (2)"
+ harder
[ Chris Cheney ]
* ftparchive/contents.cc: