Force-LoopBreak
authorArch Librarian <arch@canonical.com>
Mon, 20 Sep 2004 16:54:34 +0000 (16:54 +0000)
committerArch Librarian <arch@canonical.com>
Mon, 20 Sep 2004 16:54:34 +0000 (16:54 +0000)
Author: jgg
Date: 1999-08-12 05:59:47 GMT
Force-LoopBreak

apt-pkg/orderlist.h
apt-pkg/packagemanager.cc
doc/apt.conf.5.yo
doc/examples/apt.conf

index f15db4c..7e1b8ef 100644 (file)
@@ -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;};
index 68827f5..28a8d7f 100644 (file)
@@ -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)
index 9be4b11..923e272 100644 (file)
@@ -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.
index a84fc10..9550887 100644 (file)
@@ -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