Procházet zdrojové kódy

Force-LoopBreak
Author: jgg
Date: 1999-08-12 05:59:47 GMT
Force-LoopBreak

Arch Librarian před 22 roky
rodič
revize
9d4c8f671a
4 změnil soubory, kde provedl 25 přidání a 5 odebrání
  1. 3 3
      apt-pkg/orderlist.h
  2. 12 1
      apt-pkg/packagemanager.cc
  3. 8 0
      doc/apt.conf.5.yo
  4. 2 1
      doc/examples/apt.conf

+ 3 - 3
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;};

+ 12 - 1
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)

+ 8 - 0
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.

+ 2 - 1
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