diff options
-rw-r--r-- | apt-pkg/orderlist.h | 6 | ||||
-rw-r--r-- | apt-pkg/packagemanager.cc | 13 | ||||
-rw-r--r-- | doc/apt.conf.5.yo | 8 | ||||
-rw-r--r-- | doc/examples/apt.conf | 3 |
4 files changed, 25 insertions, 5 deletions
diff --git a/apt-pkg/orderlist.h b/apt-pkg/orderlist.h index f15db4ce6..7e1b8efbc 100644 --- a/apt-pkg/orderlist.h +++ b/apt-pkg/orderlist.h @@ -1,6 +1,6 @@ // -*- mode: cpp; mode: fold -*- // Description /*{{{*/ -// $Id: orderlist.h,v 1.6 1999/08/03 05:19:41 jgg Exp $ +// $Id: orderlist.h,v 1.7 1999/08/12 05:59:54 jgg Exp $ /* ###################################################################### Order List - Represents and Manipulates an ordered list of packages. @@ -88,7 +88,7 @@ class pkgOrderList enum Flags {Added = (1 << 0), AddPending = (1 << 1), Immediate = (1 << 2), Loop = (1 << 3), UnPacked = (1 << 4), Configured = (1 << 5), - Removed = (1 << 6), + Removed = (1 << 6), // Early Remove InList = (1 << 7), States = (UnPacked | Configured | Removed)}; @@ -98,7 +98,7 @@ class pkgOrderList void Flag(PkgIterator Pkg,unsigned long State, unsigned long F) {Flags[Pkg->ID] = (Flags[Pkg->ID] & (~F)) | State;}; inline void Flag(PkgIterator Pkg,unsigned long F) {Flags[Pkg->ID] |= F;}; inline void Flag(Package *Pkg,unsigned long F) {Flags[Pkg->ID] |= F;}; - inline bool IsNow(PkgIterator Pkg) {return (Flags[Pkg->ID] & States) == 0;}; + inline bool IsNow(PkgIterator Pkg) {return (Flags[Pkg->ID] & (States & (~Removed))) == 0;}; bool IsMissing(PkgIterator Pkg); void WipeFlags(unsigned long F); void SetFileList(string *FileList) {this->FileList = FileList;}; diff --git a/apt-pkg/packagemanager.cc b/apt-pkg/packagemanager.cc index 68827f53c..28a8d7fb2 100644 --- a/apt-pkg/packagemanager.cc +++ b/apt-pkg/packagemanager.cc @@ -1,6 +1,6 @@ // -*- mode: cpp; mode: fold -*- // Description /*{{{*/ -// $Id: packagemanager.cc,v 1.19 1999/08/03 05:19:41 jgg Exp $ +// $Id: packagemanager.cc,v 1.20 1999/08/12 05:59:54 jgg Exp $ /* ###################################################################### Package Manager - Abstacts the package manager @@ -364,6 +364,17 @@ bool pkgPackageManager::EarlyRemove(PkgIterator Pkg) // Woops, it will not be re-installed! if (List->IsFlag(Pkg,pkgOrderList::InList) == false) return false; + + // Essential packages get special treatment + if ((Pkg->Flags & pkgCache::Flag::Essential) != 0) + { + if (_config->FindB("APT::Force-LoopBreak",false) == false) + return _error->Error("This installation run will require temporarily " + "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()); + } bool Res = SmartRemove(Pkg); if (Cache[Pkg].Delete() == false) diff --git a/doc/apt.conf.5.yo b/doc/apt.conf.5.yo index 9be4b114a..923e2724e 100644 --- a/doc/apt.conf.5.yo +++ b/doc/apt.conf.5.yo @@ -62,6 +62,14 @@ so may be necessary on some extremely slow single user systems but is very dangerous and may cause package install scripts to fail or worse. Use at your own risk. +dit(bf(Force-LoopBreak)) +Never Enable this option unless you -really- know what you are doing. It +permits APT to temporarily remove an essential package to break a +Conflicts/Conflicts or Conflicts/Pre-Depend loop between two essential +packages. SUCH A LOOP SHOULD NEVER EXIST AND IS A GRAVE BUG. This option will +work if the essential packages are not tar, gzip, libc, bash or anything that +those packages depend on. + dit(bf(Get)) The Get subsection controls the bf(apt-get(8)) tool, please see its documentation for more information about the options here. diff --git a/doc/examples/apt.conf b/doc/examples/apt.conf index a84fc1079..955088768 100644 --- a/doc/examples/apt.conf +++ b/doc/examples/apt.conf @@ -1,4 +1,4 @@ -// $Id: apt.conf,v 1.35 1999/08/05 05:56:25 jgg Exp $ +// $Id: apt.conf,v 1.36 1999/08/12 05:59:47 jgg Exp $ /* This file is an index of all APT configuration directives. It should NOT actually be used as a real config file, though it is a completely valid file. @@ -54,6 +54,7 @@ APT // Some general options Ignore-Hold "false"; Immediate-Configure "true"; // DO NOT turn this off, see the man page + Force-LoopBreak "false"; // DO NOT turn this on, see the man page }; // Options for the downloading routines |