From 5e312de78360736fa3ef505909ef84da211362ca Mon Sep 17 00:00:00 2001 From: David Kalnischkies Date: Tue, 15 Sep 2009 23:52:04 +0200 Subject: Add even more config options and try to handle configuration problems arising if we upgrade essential or predependencies which need to be configured before even unpacking packages depending on them. --- apt-pkg/deb/dpkgpm.cc | 28 +++++++++++++++++++++------- apt-pkg/deb/dpkgpm.h | 2 +- 2 files changed, 22 insertions(+), 8 deletions(-) (limited to 'apt-pkg/deb') diff --git a/apt-pkg/deb/dpkgpm.cc b/apt-pkg/deb/dpkgpm.cc index 04e257b1b..5edab5ac7 100644 --- a/apt-pkg/deb/dpkgpm.cc +++ b/apt-pkg/deb/dpkgpm.cc @@ -135,9 +135,12 @@ bool pkgDPkgPM::Configure(PkgIterator Pkg) if (Pkg.end() == true) return false; - bool static const NoConfigure = _config->FindB("DPkg::NoConfigure",false); - if (NoConfigure == false) - List.push_back(Item(Item::Configure,Pkg)); + List.push_back(Item(Item::Configure, Pkg)); + + // Use triggers for config calls if we configure "smart" + // as otherwise Pre-Depends will not be satisfied, see #526774 + if (_config->FindB("DPkg::TriggersPending", false) == true) + List.push_back(Item(Item::TriggersPending, PkgIterator())); return true; } @@ -627,7 +630,8 @@ bool pkgDPkgPM::Go(int OutStatusFd) unsigned int const MaxArgs = _config->FindI("Dpkg::MaxArgs",8*1024); unsigned int const MaxArgBytes = _config->FindI("Dpkg::MaxArgBytes",32*1024); - bool const NoTriggers = _config->FindB("DPkg::NoTriggers",false); + bool const NoTriggers = _config->FindB("DPkg::NoTriggers", false); + bool const NoConfTriggers = _config->FindB("DPkg::NoConfTriggers", NoTriggers); if (RunScripts("DPkg::Pre-Invoke") == false) return false; @@ -637,8 +641,9 @@ bool pkgDPkgPM::Go(int OutStatusFd) // support subpressing of triggers processing for special // cases like d-i that runs the triggers handling manually - if(_config->FindB("DPkg::ConfigurePending",_config->FindB("DPkg::NoConfigure",false)) == true) - List.push_back(Item(Item::ConfigurePending,PkgIterator())); + bool const SmartConf = (_config->Find("PackageManager::Configure", "all") != "all"); + if (_config->FindB("DPkg::ConfigurePending", SmartConf) == true) + List.push_back(Item(Item::ConfigurePending, PkgIterator())); // map the dpkg states to the operations that are performed // (this is sorted in the same way as Item::Ops) @@ -776,6 +781,13 @@ bool pkgDPkgPM::Go(int OutStatusFd) Size += strlen(Args[n-1]); break; + case Item::TriggersPending: + Args[n++] = "--triggers-only"; + Size += strlen(Args[n-1]); + Args[n++] = "--pending"; + Size += strlen(Args[n-1]); + break; + case Item::Install: Args[n++] = "--unpack"; Size += strlen(Args[n-1]); @@ -784,7 +796,9 @@ bool pkgDPkgPM::Go(int OutStatusFd) break; } - if (NoTriggers == true && I->Op != Item::ConfigurePending) + if (NoTriggers == true && I->Op != Item::TriggersPending && + I->Op != Item::ConfigurePending && + (I->Op != Item::Configure || NoConfTriggers == true)) { Args[n++] = "--no-triggers"; Size += strlen(Args[n-1]); diff --git a/apt-pkg/deb/dpkgpm.h b/apt-pkg/deb/dpkgpm.h index 0c266605a..43e5c7d45 100644 --- a/apt-pkg/deb/dpkgpm.h +++ b/apt-pkg/deb/dpkgpm.h @@ -53,7 +53,7 @@ class pkgDPkgPM : public pkgPackageManager struct Item { - enum Ops {Install, Configure, Remove, Purge, ConfigurePending} Op; + enum Ops {Install, Configure, Remove, Purge, ConfigurePending, TriggersPending} Op; string File; PkgIterator Pkg; Item(Ops Op,PkgIterator Pkg,string File = "") : Op(Op), -- cgit v1.2.3-70-g09d2