Просмотр исходного кода

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

Arch Librarian лет назад: 22
Родитель
Сommit
9d4c8f671a
4 измененных файлов с 25 добавлено и 5 удалено
  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 -*-
 // -*- mode: cpp; mode: fold -*-
 // Description								/*{{{*/
 // 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.
    Order List - Represents and Manipulates an ordered list of packages.
@@ -88,7 +88,7 @@ class pkgOrderList
    enum Flags {Added = (1 << 0), AddPending = (1 << 1),
    enum Flags {Added = (1 << 0), AddPending = (1 << 1),
                Immediate = (1 << 2), Loop = (1 << 3),
                Immediate = (1 << 2), Loop = (1 << 3),
                UnPacked = (1 << 4), Configured = (1 << 5),
                UnPacked = (1 << 4), Configured = (1 << 5),
-               Removed = (1 << 6),
+               Removed = (1 << 6),        // Early Remove
                InList = (1 << 7),
                InList = (1 << 7),
                States = (UnPacked | Configured | Removed)};
                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;};
    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(PkgIterator Pkg,unsigned long F) {Flags[Pkg->ID] |= F;};
    inline void Flag(Package *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);
    bool IsMissing(PkgIterator Pkg);
    void WipeFlags(unsigned long F);
    void WipeFlags(unsigned long F);
    void SetFileList(string *FileList) {this->FileList = FileList;};
    void SetFileList(string *FileList) {this->FileList = FileList;};

+ 12 - 1
apt-pkg/packagemanager.cc

@@ -1,6 +1,6 @@
 // -*- mode: cpp; mode: fold -*-
 // -*- mode: cpp; mode: fold -*-
 // Description								/*{{{*/
 // 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
    Package Manager - Abstacts the package manager
@@ -364,6 +364,17 @@ bool pkgPackageManager::EarlyRemove(PkgIterator Pkg)
    // Woops, it will not be re-installed!
    // Woops, it will not be re-installed!
    if (List->IsFlag(Pkg,pkgOrderList::InList) == false)
    if (List->IsFlag(Pkg,pkgOrderList::InList) == false)
       return 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);
    bool Res = SmartRemove(Pkg);
    if (Cache[Pkg].Delete() == false)
    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.
 is very dangerous and may cause package install scripts to fail or worse.
 Use at your own risk.
 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))
 dit(bf(Get))
 The Get subsection controls the bf(apt-get(8)) tool, please see its
 The Get subsection controls the bf(apt-get(8)) tool, please see its
 documentation for more information about the options here.
 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
 /* 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
    NOT actually be used as a real config file, though it is a completely
    valid file.
    valid file.
@@ -54,6 +54,7 @@ APT
   // Some general options
   // Some general options
   Ignore-Hold "false";
   Ignore-Hold "false";
   Immediate-Configure "true";      // DO NOT turn this off, see the man page
   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
 // Options for the downloading routines