summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apt-pkg/orderlist.h6
-rw-r--r--apt-pkg/packagemanager.cc13
-rw-r--r--doc/apt.conf.5.yo8
-rw-r--r--doc/examples/apt.conf3
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