changeset 27597:352cead49726

Don't break uninstalling a package due to unrelated dependencies (bug #51722) * get_unsatisfied_deps.m: Add third input "uninstall_flag" to function prototype. When "uninstall_flag" is true, don't check for unsatisfied dependencies of unrelated packages. * uninstall.m: When checking for dependencies, call get_unsatisfied_deps with "uninstall_flag" set to true.
author Philip Nienhuis <prnienhuis@users.sf.net>
date Wed, 30 Oct 2019 23:18:11 +0100
parents 92e829d0a63b
children cf9fbfa04dd1
files scripts/pkg/private/get_unsatisfied_deps.m scripts/pkg/private/uninstall.m
diffstat 2 files changed, 7 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/scripts/pkg/private/get_unsatisfied_deps.m	Thu Oct 31 14:49:22 2019 +0900
+++ b/scripts/pkg/private/get_unsatisfied_deps.m	Wed Oct 30 23:18:11 2019 +0100
@@ -18,11 +18,12 @@
 ## <https://www.gnu.org/licenses/>.
 
 ## -*- texinfo -*-
-## @deftypefn {} {@var{bad_deps} =} get_unsatisfied_deps (@var{desc}, @var{installed_pkgs_lst})
+## @deftypefn {} {@var{bad_deps} =} get_unsatisfied_deps (@var{desc}, @var{installed_pkgs_lst}, @var{uninstall_flag})
 ## Undocumented internal function.
 ## @end deftypefn
 
-function bad_deps = get_unsatisfied_deps (desc, installed_pkgs_lst)
+function bad_deps = get_unsatisfied_deps (desc, installed_pkgs_lst,
+                                          uninstall_flag = false)
 
   bad_deps = {};
 
@@ -37,13 +38,13 @@
       endif
       ## Is the current dependency not Octave?
     else
-      ok = false;
+      ok = xor (false, uninstall_flag);
       for i = 1:length (installed_pkgs_lst)
         cur_name = installed_pkgs_lst{i}.name;
         cur_version = installed_pkgs_lst{i}.version;
         if (strcmp (dep.package, cur_name)
             && compare_versions (cur_version, dep.version, dep.operator))
-          ok = true;
+          ok = xor (true, uninstall_flag);
           break;
         endif
       endfor
--- a/scripts/pkg/private/uninstall.m	Thu Oct 31 14:49:22 2019 +0900
+++ b/scripts/pkg/private/uninstall.m	Wed Oct 30 23:18:11 2019 +0100
@@ -74,13 +74,14 @@
     ## Compute the packages that will remain installed.
     idx = setdiff (1:num_packages, delete_idx);
     remaining_packages = {installed_pkgs_lst{idx}};
+    to_delete_packages = {installed_pkgs_lst{delete_idx}};
 
     ## Check dependencies.
     if (handle_deps)
       error_text = "";
       for i = 1:length (remaining_packages)
         desc = remaining_packages{i};
-        bad_deps = get_unsatisfied_deps (desc, remaining_packages);
+        bad_deps = get_unsatisfied_deps (desc, to_delete_packages, true);
 
         ## Will the uninstallation break any dependencies?
         if (! isempty (bad_deps))