* Bug 12477 fixed: errors in atomsRemove() were blocking 38/20638/4
Samuel GOUGEON [Sun, 25 Nov 2018 19:58:12 +0000 (20:58 +0100)]
  http://bugzilla.scilab.org/12477

Change-Id: Icdb55234b5320f1bddc1ac1f8bb338aae2065a66

scilab/CHANGES.md
scilab/modules/atoms/macros/atomsLoad.sci
scilab/modules/atoms/macros/atomsRemove.sci
scilab/modules/atoms/macros/atoms_internals/atomsError.sci

index e40b239..bb7310b 100644 (file)
@@ -470,6 +470,7 @@ Known issues
 * [#12275](http://bugzilla.scilab.org/show_bug.cgi?id=12275): `msprintf("%s",ascii(97*ones(1,4097)))` produced "An error occurred: Buffer too small."
 * [#12345](http://bugzilla.scilab.org/show_bug.cgi?id=12345): `tree_show` is a list-specific function. Its page was expected in the data_structures chapter rather than in the general GUI chapter. It is moved.
 * [#12402](http://bugzilla.scilab.org/show_bug.cgi?id=12402): The menu `Applications => Scinotes` could launch the external editor instead of Scinotes.
+* [#12477](http://bugzilla.scilab.org/show_bug.cgi?id=12477): Any `atomsRemove` error in `scilab.start` made any forthcoming session unusable.
 * [#12520](http://bugzilla.scilab.org/show_bug.cgi?id=12520): Variable browser did not display the size of the variables.
 * [#12529](http://bugzilla.scilab.org/show_bug.cgi?id=12529): The `listvarinfile` help page needed to be updated.
 * [#12534](http://bugzilla.scilab.org/show_bug.cgi?id=12534): Variable browser did not display the size of the variables.
index 6558675..8edf91e 100644 (file)
@@ -54,11 +54,11 @@ function result = atomsLoad(packages)
     // Complete packages matrix with empty columns
     // =========================================================================
 
-    if size(packages(1,:),"*") == 1 then
-        packages = [ packages emptystr(size(packages(:,1),"*"),1) emptystr(size(packages(:,1),"*"),1) ];
+    if size(packages, 2) == 1 then
+        packages = [ packages emptystr(size(packages,1), 2) ];
 
-    elseif size(packages(1,:),"*") == 2 then
-        packages = [ packages emptystr(size(packages(:,1),"*"),1) ];
+    elseif size(packages, 2) == 2 then
+        packages = [ packages emptystr(packages(:,1)) ];
 
     end
 
@@ -87,8 +87,8 @@ function result = atomsLoad(packages)
 
     // Loop on input parameter
     // =========================================================================
-
-    for i=1:size(packages(:,1),"*")
+    i_ignore = [];
+    for i = 1:size(packages, 1)
 
         // The module's installed version hasn't been specified or is empty
         // → Set the MRV available
@@ -108,9 +108,15 @@ function result = atomsLoad(packages)
 
             if isempty(this_module_versions) then
                 if section == "all" then
-                    error(msprintf(gettext("%s: Module ''%s'' is not installed.\n"),"atomsLoad",packages(i,1)));
+                    msg = gettext("%s: Module ''%s'' is not installed.\n")
+                    warning(msprintf(msg, "atomsLoad", packages(i,1)));
+                    i_ignore = [i_ignore i];
+                    continue
                 else
-                    error(msprintf(gettext("%s: Module ''%s'' is not installed (''%s'' section).\n"),"atomsLoad",packages(i,1),section));
+                    msg = gettext("%s: Module ''%s'' is not installed (''%s'' section).\n")
+                    warning(msprintf(msg, "atomsLoad", packages(i,1), section));
+                    i_ignore = [i_ignore i];
+                    continue
                 end
             else
                 packages(i,2) = this_module_versions(1);
@@ -119,7 +125,10 @@ function result = atomsLoad(packages)
         else
 
             if ~atomsIsInstalled([packages(i,1) packages(i,2)]) then
-                error(msprintf(gettext("%s: Module ''%s - %s'' is not installed.\n"),"atomsLoad",packages(i,1),packages(i,2)));
+                msg = gettext("%s: Module ''%s - %s'' is not installed.\n")
+                warning(msprintf(msg, "atomsLoad", packages(i,1), packages(i,2)));
+                i_ignore = [i_ignore i];
+                continue
             end
 
             // If the packaging version is not mentioned, define it
@@ -152,7 +161,8 @@ function result = atomsLoad(packages)
             if ~ atomsIsInstalled([packages(i,1) packages(i,2)],packages(i,3)) then
                 mprintf(gettext("%s: The following modules are not installed:\n"),"atomsAutoloadAdd");
                 mprintf("\t - ''%s - %s'' (''%s'' section)\n",packages(i,1),packages(i,2),packages(i,3));
-                error("");
+                i_ignore = [i_ignore i];
+                continue
             end
 
         end
@@ -162,6 +172,7 @@ function result = atomsLoad(packages)
         packages(i,4) = atomsGetInstalledPath([packages(i,1) packages(i,2) packages(i,3)]);
 
     end
+    packages(i_ignore,:) = []
 
     // Loop on packages gived by the user
     // =========================================================================
@@ -170,7 +181,7 @@ function result = atomsLoad(packages)
     mandatory_packages_name = struct();
     mandatory_packages_mat  = [];
 
-    for i=1:size(packages(:,1),"*")
+    for i = 1:size(packages,1)
 
         this_package_name    = packages(i,1);
         this_package_version = packages(i,2);
index 447f7cd..59faf9d 100644 (file)
@@ -163,7 +163,7 @@ function result = atomsRemove(packages,section,del)
 
     // Some checking on packages variable
     // =========================================================================
-
+    i_keep = [];
     for i=1:size(packages(:,1),"*")
 
         package_names(i)    = packages(i,1);
@@ -188,7 +188,10 @@ function result = atomsRemove(packages,section,del)
             installed_details = atomsGetInstalledDetails(packages(i,:),section);
 
             if installed_details(3) == "allusers" then
-                error(msprintf(gettext("%s: You have not enough rights to remove the package %s (%s).\n"),"atomsRemove",package_names(i),package_versions(i)));
+                msg = gettext("%s: You have not enough rights to remove the package %s (%s).\n")
+                warning(msprintf(msg, "atomsRemove", package_names(i), package_versions(i)));
+                i_keep = [i_keep i];
+                continue
             end
 
         elseif (section=="user") & isempty(package_versions(i)) then
@@ -196,12 +199,17 @@ function result = atomsRemove(packages,section,del)
             // Check if we have the right to remove at least one of the version
             // of the package
             if isempty(atomsGetInstalledVers(package_names(i),section)) then
-                error(msprintf(gettext("%s: You have not enough rights to remove any version of the package %s.\n"),"atomsRemove",package_names(i)));
+                msg = gettext("%s: You have not enough rights to remove any version of the package %s.\n")
+                warning(msprintf(msg, "atomsRemove", package_names(i)));
+                i_keep = [i_keep i];
+                continue
             end
 
         end
 
     end
+    packages(i_keep, :) = [];
+
 
     // Build the list of package to Uninstall
     // =========================================================================
@@ -267,12 +275,13 @@ function result = atomsRemove(packages,section,del)
             (grep(this_package_directory,pathconvert(SCIHOME)) == []) &..
             (grep(this_package_directory,"/^(SCI|SCIHOME)\"+filesep()+"/","r") == []) then
 
-            atomsError("error", ..
+            atomsError("warning", ..
             msprintf( ..
-            gettext("%s: The directory of this package (%s-%s) is located neither in SCI nor in SCIHOME. For security reason, ATOMS refuses to delete this directory.\n"), ..
+            gettext("%s: The directory of this package (%s-%s) is located neither in SCI nor in SCIHOME.\n\tFor security reason, ATOMS refuses to delete this directory.\n"), ..
             "atomsRemove", ..
             this_package_name, ..
             this_package_version));
+            continue
         end
 
         if isdir(this_package_directory) then
@@ -280,13 +289,14 @@ function result = atomsRemove(packages,section,del)
             uninstall_status = rmdir(this_package_directory,"s");
 
             if uninstall_status<>1 then
-                atomsError("error", ..
+                atomsError("warning", ..
                 msprintf( ..
-                gettext("%s: The directory of this package (%s-%s) cannot been deleted, please check if you have write access on this directory : %s.\n"), ..
+                gettext("%s: The package (%s - %s) directory ""%s"" cannot be deleted.\n\tIt may be used and locked. Please also check that you have write permission on it.\n"), ..
                 "atomsRemove", ..
                 this_package_name, ..
                 this_package_version, ..
                 strsubst(this_package_directory,"\","\\") ));
+                continue
             end
 
         end
@@ -299,9 +309,9 @@ function result = atomsRemove(packages,section,del)
         if isdir(this_package_root_dir) & listfiles(this_package_root_dir)==[] then
             stat = rmdir(this_package_root_dir);
             if stat<>1 then
-                atomsError("error", ..
+                atomsError("warning", ..
                 msprintf( ..
-                gettext("%s: The root directory of this package (%s-%s) cannot been deleted, please check if you have write access on this directory : %s.\n"), ..
+                gettext("%s: The package (%s - %s) has been removed from its root directory ""%s"".\n\tHowever, this empty directory cannot be deleted. It may be used and locked, or you may have no write permission on it.\n"), ..
                 "atomsRemove", ..
                 this_package_name, ..
                 this_package_version, ..
index ef1a3c6..b971879 100644 (file)
@@ -13,6 +13,7 @@
 // Internal function
 
 function atomsError(issue,msg)
+    // issue = "error" | "warning"
 
     // Check input argments
     // =========================================================================