]> git.saurik.com Git - apt.git/commitdiff
eipp: add Allow-Temporary-Remove-of-Essentials
authorDavid Kalnischkies <david@kalnischkies.de>
Mon, 6 Jun 2016 15:58:00 +0000 (17:58 +0200)
committerDavid Kalnischkies <david@kalnischkies.de>
Mon, 27 Jun 2016 09:57:12 +0000 (11:57 +0200)
A rather special need option, but the internal planer supports this and
we have a testcase for it & sometimes it is hit (as a bug through). The
option itself mostly serves as a reminder for implementors that they
should be careful with removes and especially temporary removes if they
perform any.

apt-pkg/edsp.cc
apt-pkg/edsp.h
apt-pkg/packagemanager.cc
cmdline/apt-internal-planer.cc
doc/external-installation-planer-protocol.txt

index e79bb804c60bd41b1317a227033d5593086cb9f2..1c6be8afed27a8c9ef341f1da23a7f0e610b1bf2 100644 (file)
@@ -1155,6 +1155,8 @@ bool EIPP::WriteRequest(pkgDepCache &Cache, FileFd &output,               /*{{{*/
       WriteOkay(Okay, output, "Immediate-Configuration: yes\n");
    else if ((flags & Request::NO_IMMEDIATE_CONFIGURATION) != 0)
       WriteOkay(Okay, output, "Immediate-Configuration: no\n");
+   else if ((flags & Request::ALLOW_TEMPORARY_REMOVE_OF_ESSENTIALS) != 0)
+      WriteOkay(Okay, output, "Allow-Temporary-Remove-of-Essentials: yes\n");
    return WriteOkay(Okay, output, "\n");
 }
                                                                        /*}}}*/
@@ -1389,6 +1391,8 @@ bool EIPP::ReadRequest(int const input, std::list<std::pair<std::string,PKG_ACTI
            else
               flags |= Request::NO_IMMEDIATE_CONFIGURATION;
         }
+        else if (ReadFlag(flags, line, "Allow-Temporary-Remove-of-Essentials:", Request::ALLOW_TEMPORARY_REMOVE_OF_ESSENTIALS))
+           ;
         else
            _error->Warning("Unknown line in EIPP Request stanza: %s", line.c_str());
 
index e1ffdf59807bdfa4818bb3933c74751149b5051f..4adfc95e97e2f64d9fbc7b9c541ccbc2f9feebe5 100644 (file)
@@ -245,6 +245,7 @@ namespace EIPP                                                              /*{{{*/
       {
         IMMEDIATE_CONFIGURATION_ALL = (1 << 0), /*!< try to keep the least amount of packages unconfigured as possible at all times */
         NO_IMMEDIATE_CONFIGURATION = (1 << 1), /*!< do not perform immediate configuration at all */
+        ALLOW_TEMPORARY_REMOVE_OF_ESSENTIALS = (1 << 2), /*!< just as the name suggests, very special case and dangerous! */
       };
    }
 
index d5afceb6dc6a7824252e9f096d822755040ea8a8..a61c5f7a9c1f3f7ab90615302fb5213bf5953116 100644 (file)
@@ -1045,6 +1045,8 @@ pkgPackageManager::OrderResult pkgPackageManager::OrderInstall()
         flags |= EIPP::Request::NO_IMMEDIATE_CONFIGURATION;
       else if (_config->FindB("APT::Immediate-Configure-All", false))
         flags |= EIPP::Request::IMMEDIATE_CONFIGURATION_ALL;
+      else if (_config->FindB("APT::Force-LoopBreak", false))
+        flags |= EIPP::Request::ALLOW_TEMPORARY_REMOVE_OF_ESSENTIALS;
 
       if (EIPP::OrderInstall(planer.c_str(), this, flags, nullptr))
         return Completed;
index c83dba8b18a428c45845d38cc952a303aafb35f4..56d4f8afd49fbc70c09e8b1567d4690da87a776a 100644 (file)
@@ -152,6 +152,7 @@ int main(int argc,const char *argv[])                                       /*{{{*/
                DIE("Parsing the request failed!");
        _config->Set("APT::Immediate-Configure", (flags & EIPP::Request::NO_IMMEDIATE_CONFIGURATION) == 0);
        _config->Set("APT::Immediate-Configure-All", (flags & EIPP::Request::IMMEDIATE_CONFIGURATION_ALL) != 0);
+       _config->Set("APT::Force-LoopBreak", (flags & EIPP::Request::ALLOW_TEMPORARY_REMOVE_OF_ESSENTIALS) != 0);
 
        EDSP::WriteProgress(5, "Read scenario…", output);
 
index 7760ecf60d3fcc5d7087770ed3cb8accf7c4ea05..2a0bdbee3cb29dba7412f567daae79772ca1d693 100644 (file)
@@ -162,14 +162,22 @@ The following **preference fields** are supported in request stanzas:
   informational string specifying to which planer this request was send
   initially.
 
-- *Immediate-Configuration:** (option, unset by default) A boolean value
-  defining if the planer should try to configure all packages as quickly
-  as possible (true) or shouldn't perform any kind of immediate
+- **Immediate-Configuration:** (option, unset by default) A boolean
+  value defining if the planer should try to configure all packages as
+  quickly as possible (true) or shouldn't perform any kind of immediate
   configuration at all (false). If not explicitly set with this field
   the planer is free to pick either mode or implementing e.g. a mode
   which configures only packages immediately if they are flagged as
   `Essential` (or are dependencies of packages marked as `Essential`).
 
+- **Allow-Temporary-Remove-of-Essentials** (optional, defaults to `no`).
+  A boolean value allowing the planer (if set to yes) to temporarily
+  remove an essential package. Associated with the APT::Force-LoopBreak
+  configuration option its main use is highlighting that planers who do
+  temporary removes must take special care in terms of essentials. Legit
+  uses of this option by users is very uncommon, traditionally
+  a situation in which it is needed indicates a packaging error.
+
 
 #### Package universe