Atoms : Dependency tree version 0.1
Pierre MARECHAL [Mon, 18 May 2009 13:40:46 +0000 (15:40 +0200)]
15 files changed:
scilab/modules/atoms/macros/atomsDependencyTree.sci [new file with mode: 0644]
scilab/modules/atoms/macros/atomsGetInstalled.sci
scilab/modules/atoms/macros/atomsInfo.sci
scilab/modules/atoms/macros/atomsInstall.sci
scilab/modules/atoms/macros/atomsIsInstalled.sci [new file with mode: 0644]
scilab/modules/atoms/macros/atoms_internals/atomsGetInstalledPath.sci [new file with mode: 0644]
scilab/modules/atoms/macros/atoms_internals/atomsGetInstalledVers.sci [new file with mode: 0644]
scilab/modules/atoms/macros/atoms_internals/atomsGetMRVersion.sci
scilab/modules/atoms/macros/atoms_internals/atomsInstallRegister.sci [new file with mode: 0644]
scilab/modules/atoms/macros/atoms_internals/atomsInstallUnregister.sci [new file with mode: 0644]
scilab/modules/atoms/macros/atoms_internals/atomsIsCompatible.sci [new file with mode: 0644]
scilab/modules/atoms/macros/atoms_internals/atomsIsPackage.sci
scilab/modules/atoms/macros/atoms_internals/atomsToolboxDetails.sci [new file with mode: 0644]
scilab/modules/atoms/macros/atoms_internals/atomsVersionCompare.sci [new file with mode: 0644]
scilab/modules/atoms/macros/atoms_internals/atomsVersionSort.sci [new file with mode: 0644]

diff --git a/scilab/modules/atoms/macros/atomsDependencyTree.sci b/scilab/modules/atoms/macros/atomsDependencyTree.sci
new file mode 100644 (file)
index 0000000..709e59d
--- /dev/null
@@ -0,0 +1,52 @@
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2009 - DIGITEO - Pierre MARECHAL <pierre.marechal@scilab.org>
+//
+// This file must be used under the terms of the CeCILL.
+// This source file is licensed as described in the file COPYING, which
+// you should have received as part of this distribution.  The terms
+// are also available at
+// http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
+
+// End user function
+
+// Installation of a toolbox
+
+function result = atomsDependencyTree(name,version)
+       
+       rhs = argn(2);
+       
+       // Check number of input arguments
+       // =========================================================================
+       
+       if rhs < 1 | rhs > 2 then
+               error(msprintf(gettext("%s: Wrong number of input argument: %d to %d expected.\n"),"atomsDependencyTree",1,2));
+       end
+       
+       // Check input parameters type
+       // =========================================================================
+       
+       if type(name) <> 10 then
+               error(msprintf(gettext("%s: Wrong type for input argument #%d: A single string expected.\n"),"atomsDependencyTree",1));
+       end
+       
+       if type(version) <> 10 then
+               error(msprintf(gettext("%s: Wrong type for input argument #%d: A single string expected.\n"),"atomsDependencyTree",2));
+       end
+       
+       // Check input parameters dimensions
+       // =========================================================================
+       
+       if size(name) <> 1 then
+               error(msprintf(gettext("%s: Wrong size for input argument #%d: A single string expected.\n"),"atomsDependencyTree",1));
+       end
+       
+       if size(version) <> 1 then
+               error(msprintf(gettext("%s: Wrong size for input argument #%d: A single string expected.\n"),"atomsDependencyTree",2));
+       end
+       
+       // Check if the wanted version is compatible with the current scilab version.
+       // =========================================================================
+       
+       this_package_details = atomsToolboxDetails(name,version);
+       
+endfunction
index 70601f6..f003086 100644 (file)
@@ -1,6 +1,4 @@
 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
-// Copyright (C) 2008 - INRIA - Delphine GASC <delphine.gasc@scilab.org>
-// Copyright (C) 2009 - DIGITEO - Sylvestre LEDRU <sylvestre.ledru@scilab.org>
 // Copyright (C) 2009 - DIGITEO - Pierre MARECHAL <pierre.marechal@scilab.org>
 //
 // This file must be used under the terms of the CeCILL.
 
 // End user function
 
-// List of installed toolboxes
-
-function tboxes = atomsGetInstalled()
+function packages = atomsGetInstalled(allusers)
+       
+       rhs      = argn(2);
+       packages = [];
+       
+       // Check number of input arguments
+       // =========================================================================
+       
+       if rhs > 1 then
+               error(msprintf(gettext("%s: Wrong number of input argument: at most %d expected.\n"),"atomsGetInstalled",1));
+       end
        
-       rhs = argn(2)
+       // Apply changes for all users or just for me ?
+       // =========================================================================
        
-       // Check input parameters
-       if rhs > 0 then
-               error(msprintf(gettext("%s: Wrong number of input arguments: %d expected.\n"),"atomsGetInstalled",0));
+       if rhs == 0 then
+               allusers = %T;
+       else
+               // Just check if it's a boolean
+               if type(allusers) <> 4 then
+                       error(msprintf(gettext("%s: Wrong type for input argument #%d: A boolean expected.\n"),"atomsGetInstalled",1));
+               end
        end
        
-       atoms_directories = atomsToolboxDirectory();
-       tboxes            = [];
+       // Define the differents path of the file where are installed
+       // =========================================================================
        
-       for i=1:size(atoms_directories,"*")
-               files = listfiles(atoms_directories(i));
-               for j=1:size(files, 1)
+       installed_files = [];
+       user_file       = pathconvert(SCIHOME+"/atoms/installed",%F);
+       alluser_file    = pathconvert(SCI+"/.atoms/installed",%F);
+       
+       if fileinfo(user_file)<>[] then
+               installed_files = [ installed_files ; user_file "user" ];
+       end
+       
+       if allusers & (fileinfo(alluser_file)<>[]) then
+               installed_files = [ installed_files ; alluser_file "alluser"];
+       end
+       
+       // Loop on each "installed" file specified as first input argument
+       // =========================================================================
+       
+       for i=1:size(installed_files(:,1),"*")
+               
+               // Get the installed package list in this file
+               installed = mgetl(installed_files(i,1));
+               
+               // Loop on each URL specified as first input argument
+               for j=1:size(installed,"*")
+                       current_name_length  = regexp(installed(j),"/\s-\s/","o");
+                       current_name         = part(installed(j),1:current_name_length-1);
+                       current_version      = part(installed(j),current_name_length+3:length(installed(j)));
                        
-
-                       tbox = atoms_directories(i) + "/" + files(j)
-                       if (  ( fileinfo(tbox + "/loader.sce") <> [] ) ..
-                               & ( fileinfo(tbox + "/DESCRIPTION") <> [] ) ..
-                               & ( fileinfo(tbox + "/DESCRIPTION-FUNCTIONS") <> [] ) ) then
-                               tboxes = [tboxes;tbox];
+                       if installed_files(i,2) == "user" then
+                               // user
+                               current_path  = pathconvert(SCIHOME+"/atoms/contrib/"+current_name+"/"+current_version,%F); 
+                       else
+                               // all users
+                               current_path = pathconvert(SCI+"/contrib/"+current_name+"/"+current_version,%F);
                        end
+                       
+                       packages = [ packages ; current_name current_version installed_files(i,2) current_path];
                end
        end
        
-       return tboxes;
-       
 endfunction
index baec9d2..4579d1e 100644 (file)
 
 // Display of the toolbox information
 
-function atomsInfo(name,version)
-
-       rhs = argn(2);
+function desc = atomsInfo(name)
+       
+       rhs  = argn(2);
+       
+       // Check number of input arguments
+       // =========================================================================
        
        if rhs < 1 | rhs > 2 then
                error(msprintf(gettext("%s: Wrong number of input argument: %d to %d expected.\n"),"atomsInfo",1,2));
        end
        
+       // Check input arguments dimensions
+       // =========================================================================
+       
+       if size(name,"*") <> 1 then
+               error(msprintf(gettext("%s: Wrong size for input argument #%d: A single string expected.\n"),"atomsInfo",1));
+       end
+       
+       if rhs>1 & size(version,"*") <> 1 then
+               error(msprintf(gettext("%s: Wrong size for input argument #%d: A single string expected.\n"),"atomsInfo",2));
+       end
+       
+       // Default value for version
+       // =========================================================================
+       if rhs<2 then
+               version = [];
+       end
+       
        // we remove the special characters
+       // =========================================================================
        normalized_name = atomsNormalizeName(name);
        
        // We try to find the information locally
        // =========================================================================
-       atoms_directories        = atomsToolboxDirectory();
-       this_toolbox_directory   = "";
-       this_toolbox_DESCRIPTION = "";
-       
-       for k=1:size(atoms_directories,"*")
-               check_directory = pathconvert(atoms_directories(k)+"/"+normalized_name);
-               check_file      = check_directory+"DESCRIPTION";
-               if fileinfo(check_file) <> [] then
-                       this_toolbox_directory   = check_directory;
-                       this_toolbox_DESCRIPTION = check_file;
-                       break;
-               end
-       end
        
-       if this_toolbox_DESCRIPTION <> "" then
-               desc = atomsReadDesc(nameToolbox);
-               disp(gettext("This toolbox is present locally."));
-               disp(desc);
-               disp(functionTool);
-               
-               // Ok, we have done the job : return
-               return;
+       if atomsIsInstalled(name,version) then
+               desc = atomsReadDesc( pathconvert(atomsGetInstalledPath(name,version)+"/DESCRIPTION",%F) );
        end
        
        // We try to find the information on the net
        // =========================================================================
        
-       disp(_("Search for toolbox versions available on the web"))
        
-       listDesc = atomsReadDesc("");
-       versions = "";
-       [n, m]   = size(listDesc("Toolbox"));
        
-       for i=1:n
-               if listDesc("Toolbox")(i) == nameToolbox
-                       // To avoid version redundancy
-                       [a, b] = size(versions)
-                       
-                       if find(versions == listDesc("Version")(i))
-                               continue;
-                       end
-                       
-                       versions(a+1)        = listDesc("Version")(i)
-                       desc                 = atomsListDescription()
-                       [listeObl, listeOpt] = constant()
-                       [o, p]               = size(listeOpt)
-                       [n, m]               = size(listeObl)
-                       for j=1:m
-                               desc(listeObl(j)) = listDesc(listeObl(j))(i)
-                       end
-                       for j=1:p
-                               desc(listeOpt(j)) = listDesc(listeOpt(j))(i)
-                       end
-                       
-                       disp(desc);
-               end
-       end
        
-       // if no version was found
-       // =========================================================================
-       [a, b] = size(versions)
-       if a == 1 then
-               disp("none")
-       end
+
+
+
+
+
+
 
 endfunction
index caf1553..f6b35d6 100644 (file)
@@ -15,6 +15,10 @@ function result = atomsInstall(packages,allusers)
        
        result = %F;
        
+       // Get scilab version (needed for later)
+       // =========================================================================
+       sciversion = strcat(string(getversion('scilab')) + ".");
+       
        // Check input parameters
        // =========================================================================
        
@@ -59,7 +63,13 @@ function result = atomsInstall(packages,allusers)
        
        atomsGetTOOLBOXES(%T);
        
-       // Loop on packages
+       // Loop on packages and get the following informations :
+       // - package name
+       // - package version
+       // - status
+       //  + Update
+       //  + New Installation
+       //  + The most recent version is already installed
        // =========================================================================
        
        for i=1:size(packages,"*")
@@ -76,8 +86,8 @@ function result = atomsInstall(packages,allusers)
                        version = "0";
                else
                        // A version is specified
-                       space = regexp(package,"/\s/");
-                       name  = part(package,[1:space-1]);
+                       space   = regexp(package,"/\s/");
+                       name    = part(package,[1:space-1]);
                        version = part(package,[space+1:length(package)]);
                end
                
@@ -100,9 +110,33 @@ function result = atomsInstall(packages,allusers)
                        package_versions(i) = atomsGetMRVersion(package_names(i));
                end
                
+               // Check if the package is already installed
+               if atomsIsInstalled(package_names(i),package_versions(i),%T) then
+                       error(msprintf(gettext("%s: The package %s is already installed.\n"),"atomsInstall",package_full_name));
+               end
+               
+               // Check if the wanted version is compatible with the current scilab version.
+               this_package_details = atomsToolboxDetails(package_names(i),package_versions(i));
+               if ~ atomsIsCompatible(this_package_details("ScilabVersion")) then
+                       error(msprintf(gettext("%s: The package %s is not compatible with the current scilab version.\n"),"atomsInstall",package_full_name));
+               end
+               
+               
+               
+               
+               
+               
+               
+               
+               
+               
+               
+               
+               // Register the successfully installed package
+               atomsInstallRegister(package_names(i),package_versions(i));
        end
        
-
+       
        
 
 //     global conflictingList
diff --git a/scilab/modules/atoms/macros/atomsIsInstalled.sci b/scilab/modules/atoms/macros/atomsIsInstalled.sci
new file mode 100644 (file)
index 0000000..35d3084
--- /dev/null
@@ -0,0 +1,85 @@
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2009 - DIGITEO - Pierre MARECHAL <pierre.marechal@scilab.org>
+//
+// This file must be used under the terms of the CeCILL.
+// This source file is licensed as described in the file COPYING, which
+// you should have received as part of this distribution.  The terms
+// are also available at
+// http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
+
+// Returns true if a package is installed, false otherwise
+
+function res = atomsIsInstalled(name,version,allusers)
+       
+       rhs           = argn(2);
+       res           = [];
+       installed     = []; // Column vector that contain user repositories
+       
+       // Check number of input arguments
+       // =========================================================================
+       
+       if rhs < 1 | rhs > 3 then
+               error(msprintf(gettext("%s: Wrong number of input argument: %d to %d expected.\n"),"atomsIsInstalled",1,3));
+       end
+       
+       // Check input parameters type
+       // =========================================================================
+       
+       if type(name) <> 10 then
+               error(msprintf(gettext("%s: Wrong type for input argument #%d: String array expected.\n"),"atomsIsInstalled",1));
+       end
+       
+       if rhs>1 & version<>[] & type(version)<>10  then
+               error(msprintf(gettext("%s: Wrong type for input argument #%d: String array expected.\n"),"atomsIsInstalled",2));
+       end
+       
+       // name and version must have the same size
+       // =========================================================================
+       
+       if rhs>1 & version<>[] & or(size(name)<>size(version)) then
+               error(msprintf(gettext("%s: Incompatible input arguments #%d and #%d: Same sizes expected.\n"),"atomsIsInstalled",1,2));
+       end
+       
+       // Value of version if not precised
+       // =========================================================================
+       
+       if rhs < 2 then
+               version = [];
+       end
+       
+       // allusers management
+       // =========================================================================
+       
+       if rhs < 3 then
+               allusers = %T;
+       end
+       
+       // Get the list of installed packages
+       // =========================================================================
+       packages = atomsGetInstalled(allusers);
+       
+       
+       // Loop on name
+       // =========================================================================
+       
+       for i=1:size(name,"*")
+               
+               if version == [] then
+                       // Just check the name
+                       res(i) = or(packages == name(i));
+               
+               else
+                       // Filter on names
+                       packages_version = packages( find(packages(:,1) == name(i)) , 2 );
+                       
+                       // Check if the wnated version is present$
+                       res(i) = or(packages_version == version(i) );
+               end
+               
+       end
+       
+       // Reshape the matrix
+       // =========================================================================
+       res = matrix(res,size(name) );
+       
+endfunction
diff --git a/scilab/modules/atoms/macros/atoms_internals/atomsGetInstalledPath.sci b/scilab/modules/atoms/macros/atoms_internals/atomsGetInstalledPath.sci
new file mode 100644 (file)
index 0000000..cbed71f
--- /dev/null
@@ -0,0 +1,82 @@
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2009 - DIGITEO - Pierre MARECHAL <pierre.marechal@scilab.org>
+//
+// This file must be used under the terms of the CeCILL.
+// This source file is licensed as described in the file COPYING, which
+// you should have received as part of this distribution.  The terms
+// are also available at
+// http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
+
+// Add an URL to the list of repositories, and returns
+
+function res = atomsGetInstalledPath(name,version,allusers)
+       
+       rhs           = argn(2);
+       res           = [];
+       installed     = []; // Column vector that contain user repositories
+       
+       // Check number of input arguments
+       // =========================================================================
+       
+       if rhs < 2 | rhs > 3 then
+               error(msprintf(gettext("%s: Wrong number of input argument: %d to %d expected.\n"),"atomsGetInstalledPath",1,3));
+       end
+       
+       // Check input parameters type
+       // =========================================================================
+       
+       if type(name) <> 10 then
+               error(msprintf(gettext("%s: Wrong type for input argument #%d: String array expected.\n"),"atomsGetInstalledPath",1));
+       end
+       
+       if type(version)<>10  then
+               error(msprintf(gettext("%s: Wrong type for input argument #%d: String array expected.\n"),"atomsGetInstalledPath",2));
+       end
+       
+       // name and version must have the same size
+       // =========================================================================
+       
+       if or(size(name)<>size(version)) then
+               error(msprintf(gettext("%s: Incompatible input arguments #%d and #%d: Same sizes expected.\n"),"atomsGetInstalledPath",1,2));
+       end
+       
+       // allusers management
+       // =========================================================================
+       
+       if rhs < 3 then
+               allusers = %T;
+       end
+       
+       // Get the list of installed packages
+       // =========================================================================
+       packages = atomsGetInstalled(allusers);
+       
+       // Loop on name
+       // =========================================================================
+       
+       for i=1:size(name,"*")
+               
+               // Filter on names
+               packages = packages( find(packages(:,1) == name(i))     ,:);
+               
+               if packages <> [] then
+                       res(i) = "";
+                       continue;
+               end
+               
+               // Filter on versions
+               packages = packages( find(packages(:,2) == version(i)) ,:);
+               
+               if packages <> [] then
+                       res(i) = "";
+                       continue;
+               end
+               
+               res(i) = packages(4);
+       end
+       
+       // Reshape the matrix
+       // =========================================================================
+       res = matrix(res,size(name) );
+       
+endfunction
diff --git a/scilab/modules/atoms/macros/atoms_internals/atomsGetInstalledVers.sci b/scilab/modules/atoms/macros/atoms_internals/atomsGetInstalledVers.sci
new file mode 100644 (file)
index 0000000..802a3c0
--- /dev/null
@@ -0,0 +1,49 @@
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2009 - DIGITEO - Pierre MARECHAL <pierre.marechal@scilab.org>
+//
+// This file must be used under the terms of the CeCILL.
+// This source file is licensed as described in the file COPYING, which
+// you should have received as part of this distribution.  The terms
+// are also available at
+// http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
+
+// Liste des versions installĂ©e de la toolbox "name"
+
+function res = atomsGetInstalledVers(name,allusers)
+       
+       rhs = argn(2);
+       
+       // Check number of input arguments
+       // =========================================================================
+       
+       if rhs < 1 | rhs > 2 then
+               error(msprintf(gettext("%s: Wrong number of input argument: %d to %d expected.\n"),"atomsGetInstalledVers",1,2));
+       end
+       
+       // Check input parameters type
+       // =========================================================================
+       
+       if type(name) <> 10 then
+               error(msprintf(gettext("%s: Wrong type for input argument #%d: A Single String expected.\n"),"atomsGetInstalledVers",1));
+       end
+       
+       if size(name,"*") <> 1 then
+               error(msprintf(gettext("%s: Wrong size for input argument #%d: A Single String expected.\n"),"atomsGetInstalledVers",1));
+       end
+       
+       // allusers management
+       // =========================================================================
+       
+       if rhs < 2 then
+               allusers = %T;
+       end
+       
+       // Get the list of installed packages
+       // =========================================================================
+       packages = atomsGetInstalled(allusers);
+       
+       // Filter on names
+       // =========================================================================
+       res = gsort(packages(find(packages(:,1) == name),2));
+       
+endfunction
index 3271e6b..c9c6e2a 100644 (file)
@@ -48,7 +48,7 @@ function versions = atomsGetMRVersion(packages)
                package_versions          = allpackages(packages(i));
                package_versions_tab      = getfield(1,package_versions);
                package_versions_tab(1:2) = [];
-               package_versions_tab      = gsort(package_versions_tab);
+               package_versions_tab      = atomsVersionSort(package_versions_tab);
                versions(i)               = package_versions_tab(1);
                
        end
diff --git a/scilab/modules/atoms/macros/atoms_internals/atomsInstallRegister.sci b/scilab/modules/atoms/macros/atoms_internals/atomsInstallRegister.sci
new file mode 100644 (file)
index 0000000..625e8bd
--- /dev/null
@@ -0,0 +1,108 @@
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2009 - DIGITEO - Pierre MARECHAL <pierre.marechal@scilab.org>
+//
+// This file must be used under the terms of the CeCILL.
+// This source file is licensed as described in the file COPYING, which
+// you should have received as part of this distribution.  The terms
+// are also available at
+// http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
+
+// Add an URL to the list of repositories, and returns
+
+function nbAdd = atomsInstallRegister(name,version,allusers)
+       
+       rhs           = argn(2);
+       nbAdd         = 0;
+       installed     = []; // Column vector that contain user repositories
+       
+       // Check number of input arguments
+       // =========================================================================
+       
+       if rhs < 2 | rhs > 3 then
+               error(msprintf(gettext("%s: Wrong number of input argument: %d to %d expected.\n"),"atomsInstallRegister",2,3));
+       end
+       
+       // Check input parameters type
+       // =========================================================================
+       
+       if type(name) <> 10 then
+               error(msprintf(gettext("%s: Wrong type for input argument #%d: String array expected.\n"),"atomsInstallRegister",1));
+       end
+       
+       if type(version) <> 10 then
+               error(msprintf(gettext("%s: Wrong type for input argument #%d: String array expected.\n"),"atomsInstallRegister",2));
+       end
+       
+       // name and version must have the same size
+       // =========================================================================
+       
+       if or( size(name) <> size(version) ) then
+               error(msprintf(gettext("%s: Incompatible input arguments #%d and #%d: Same sizes expected.\n"),"atomsInstallRegister",1,2));
+       end
+       
+       // Apply changes for all users or just for me ?
+       // =========================================================================
+       
+       if rhs == 2 then
+               // By default, The toolbox is installed for all users (if we have write access of course !)
+               if atomsAUWriteAccess() then
+                       allusers = %T; 
+               else
+                       allusers = %F;
+               end
+       
+       else
+               // Just check if it's a boolean
+               if type(allusers) <> 4 then
+                       error(msprintf(gettext("%s: Wrong type for input argument #%d: A boolean expected.\n"),"atomsInstallRegister",2));
+               end
+               
+               // Check if we have the write access
+               if allusers & ~ atomsAUWriteAccess() then
+                       error(msprintf(gettext("%s: You haven''t write access on this directory : %s.\n"),"atomsInstallRegister",2,pathconvert(SCI+"/.atoms")));
+               end
+       end
+       
+       // Define the path of the file that will record the change according to
+       // the "allusers" value
+       // =========================================================================
+       
+       if allusers then
+               atoms_directory = pathconvert(SCI+"/.atoms");
+       else
+               atoms_directory = pathconvert(SCIHOME+"/atoms");
+       end
+       
+       // Does the atoms_directory exist, if not create it
+       // =========================================================================
+       
+       if ~ isdir(atoms_directory) then
+               mkdir(atoms_directory);
+       end
+       
+       // Does the SCIHOME/atoms/installed exist, if yes load it
+       // =========================================================================
+       
+       if fileinfo(atoms_directory+"installed") <> [] then
+               installed = mgetl(atoms_directory+"installed");
+       end
+       
+       // Loop on each URL specified as input argument
+       // =========================================================================
+       
+       for i=1:size(name,"*")
+               // Add the URL only if it doesn't already exist
+               if find( installed == name(i)+" - "+version(i) ) == [] then
+                       installed = [ installed ; name(i)+" - "+version(i) ];
+                       nbAdd = nbAdd + 1;
+               end
+       end
+       
+       // Apply changes
+       // =========================================================================
+       
+       if nbAdd > 0 then
+               mputl(installed, atoms_directory+"installed");
+       end
+       
+endfunction
diff --git a/scilab/modules/atoms/macros/atoms_internals/atomsInstallUnregister.sci b/scilab/modules/atoms/macros/atoms_internals/atomsInstallUnregister.sci
new file mode 100644 (file)
index 0000000..c26f12c
--- /dev/null
@@ -0,0 +1,105 @@
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2009 - DIGITEO - Pierre MARECHAL <pierre.marechal@scilab.org>
+//
+// This file must be used under the terms of the CeCILL.
+// This source file is licensed as described in the file COPYING, which
+// you should have received as part of this distribution.  The terms
+// are also available at
+// http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
+
+// Delete an atoms package from the list of available package
+
+function nbDel = atomsInstallUnregister(name,version,allusers)
+       
+       rhs                  = argn(2);
+       nbDel                = 0;
+       
+       // Check number of input arguments
+       // =========================================================================
+       
+       if rhs < 2 | rhs > 3 then
+               error(msprintf(gettext("%s: Wrong number of input argument: %d to %d expected.\n"),"atomsInstallUnregister",2,3));
+       end
+       
+       // Check input parameters type
+       // =========================================================================
+       
+       if type(name) <> 10 then
+               error(msprintf(gettext("%s: Wrong type for input argument #%d: String array expected.\n"),"atomsInstallUnregister",1));
+       end
+       
+       if type(version) <> 10 then
+               error(msprintf(gettext("%s: Wrong type for input argument #%d: String array expected.\n"),"atomsInstallUnregister",2));
+       end
+       
+       // name and version must have the same size
+       // =========================================================================
+       
+       if or( size(name) <> size(version) ) then
+               error(msprintf(gettext("%s: Incompatible input arguments #%d and #%d: Same sizes expected.\n"),"atomsInstallUnregister",1,2));
+       end
+       
+       // Apply changes for all users or just for me ?
+       // =========================================================================
+       
+       if rhs == 2 then
+               // By default, add the repository for all users (if we have write access
+               // of course !)
+               if atomsAUWriteAccess() then
+                       allusers = %T; 
+               else
+                       allusers = %F;
+               end
+       
+       else
+               // Just check if it's a boolean
+               if type(allusers) <> 4 then
+                       error(msprintf(gettext("%s: Wrong type for input argument #%d: A boolean expected.\n"),"atomsInstallUnregister",2));
+               end
+               
+               // Check if we have the write access
+               if allusers & ~ atomsAUWriteAccess() then
+                       error(msprintf(gettext("%s: You haven''t write access on this directory : %s.\n"),"atomsInstallUnregister",2,pathconvert(SCI+"/.atoms")));
+               end
+       end
+       
+       // Define the path of the files that will record the change according to
+       // the "allusers" value and the existence of the latter
+       // =========================================================================
+       
+       atoms_files = [];
+       
+       if fileinfo( pathconvert(SCIHOME+"/atoms/installed",%F) )<> [] then
+               atoms_files = [ atoms_files ; pathconvert(SCIHOME+"/atoms/installed",%F) ];
+       end
+       
+       if allusers & (fileinfo( pathconvert(SCI+"/.atoms/installed",%F) )<>[]) then
+               atoms_files = [ atoms_files ; pathconvert(SCI+"/.atoms/installed",%F) ];
+       end
+       
+       // Loop on each installed file specified as first input argument
+       // =========================================================================
+       
+       for i=1:size(atoms_files,"*")
+               
+               // Get the installed package list in this file
+               installed = mgetl(atoms_files(i));
+               
+               // Loop on each URL specified as first input argument
+               for j=1:size(name,"*")
+                       indice = find( installed == name(j)+" - "+version(j) );
+                       if indice <> [] then
+                               installed(indice) = [];
+                               nbDel = nbDel + 1;
+                       end
+               end
+               
+               if installed == [] then
+                       mdelete(atoms_files(i));
+               else
+                       // Apply changes on this file
+                       mputl(installed,atoms_files(i));
+               end
+       end
+       
+endfunction
diff --git a/scilab/modules/atoms/macros/atoms_internals/atomsIsCompatible.sci b/scilab/modules/atoms/macros/atoms_internals/atomsIsCompatible.sci
new file mode 100644 (file)
index 0000000..83d65bc
--- /dev/null
@@ -0,0 +1,90 @@
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2009 - DIGITEO - Pierre MARECHAL <pierre.marechal@scilab.org>
+//
+// This file must be used under the terms of the CeCILL.
+// This source file is licensed as described in the file COPYING, which
+// you should have received as part of this distribution.  The terms
+// are also available at
+// http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
+
+// Internal function
+
+// Returns True if the version string is compatible with the current scilab version
+// else, returns false
+
+function result = atomsIsCompatible(version_str)
+       
+       rhs = argn(0);
+       
+       // Check number of input arguments
+       // =========================================================================
+       if rhs <> 1 then
+               error(msprintf(gettext("%s: Wrong number of input argument: %d expected.\n"),"atomsIsCompatible",1));
+       end
+       
+       // Check input parameter type
+       // =========================================================================
+       if type(version_str) <> 10 then
+               error(msprintf(gettext("%s: Wrong type for input argument #%d: A Single String expected.\n"),"atomsIsCompatible",1));
+       end
+       
+       // Check input parameter dimension
+       // =========================================================================
+       
+       if size(version_str,"*") <> 1 then
+               error(msprintf(gettext("%s: Wrong size for input argument #%d: A Single String expected.\n"),"atomsIsCompatible",1));
+       end
+       
+       // Check input parameters value
+       // =========================================================================
+       
+       if regexp(version_str,"/^(>=|<=|==|=)\s/","o") == [] then
+               error(msprintf(gettext("%s: Wrong value for input argument #%d: This is not a valid version/dependency.\n"),"atomsIsCompatible",1));
+       end
+       
+       // Get scilab version (Only the first digit)
+       // =========================================================================
+       sciversion = strcat(string(getversion("scilab")) + ".");
+       sciversion = strsubst(sciversion,"/\.$/","","r");
+       
+       // Get the dependency operator and version
+       // =========================================================================
+       operator_length  = regexp(version_str,"/\s/","o");
+       dep_operator     = part(version_str,1:operator_length-1);
+       dep_version      = part(version_str,operator_length+1:length(version_str));
+       
+       // Compare sciversion and the specified version
+       // =========================================================================
+       comparison       = atomsVersionCompare(dep_version,sciversion);
+       
+       // Verdict
+       // =========================================================================
+       
+       if (dep_operator == "==" | dep_operator == "=")  & comparison<>0 then
+               result = %F;
+               return;
+       end
+       
+       if (dep_operator == ">=") & comparison>0 then
+               result = %F;
+               return;
+       end
+       
+       if (dep_operator == "<=") & comparison<0 then
+               result = %F;
+               return;
+       end
+       
+       if (dep_operator == ">") & comparison>=0 then
+               result = %F;
+               return;
+       end
+       
+       if (dep_operator == "<") & comparison<=0 then
+               result = %F;
+               return;
+       end
+       
+       result = %T;
+       
+endfunction
index 8575586..122b2cf 100644 (file)
@@ -9,7 +9,7 @@
 
 // Internal function
 
-// Return the most recent version of each package specified as first input argument
+// Return true if the package is a valid package or not
 
 function result = atomsIsPackage(package_names,package_versions)
        
diff --git a/scilab/modules/atoms/macros/atoms_internals/atomsToolboxDetails.sci b/scilab/modules/atoms/macros/atoms_internals/atomsToolboxDetails.sci
new file mode 100644 (file)
index 0000000..6aa1c9b
--- /dev/null
@@ -0,0 +1,56 @@
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2009 - DIGITEO - Pierre MARECHAL <pierre.marechal@scilab.org>
+//
+// This file must be used under the terms of the CeCILL.
+// This source file is licensed as described in the file COPYING, which
+// you should have received as part of this distribution.  The terms
+// are also available at
+// http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
+
+// Return the mlist associated with the wanted toolbox
+
+function details = atomsToolboxDetails(name,version)
+       
+       rhs = argn(2);
+       
+       // Check number of input arguments
+       // =========================================================================
+       
+       if rhs < 1 | rhs > 3 then
+               error(msprintf(gettext("%s: Wrong number of input argument: %d to %d expected.\n"),"atomsToolboxDetails",2,3));
+       end
+       
+       // Check input parameters type
+       // =========================================================================
+       
+       if type(name) <> 10 then
+               error(msprintf(gettext("%s: Wrong type for input argument #%d: A single string expected.\n"),"atomsToolboxDetails",1));
+       end
+       
+       if type(version)<>10  then
+               error(msprintf(gettext("%s: Wrong type for input argument #%d: A single string expected.\n"),"atomsToolboxDetails",2));
+       end
+       
+       // Check input parameters dimensions
+       // =========================================================================
+       
+       if size(name,"*") <> 1 then
+               error(msprintf(gettext("%s: Wrong size for input argument #%d: A single string expected.\n"),"atomsToolboxDetails",1));
+       end
+       
+       if size(version,"*")<>1  then
+               error(msprintf(gettext("%s: Wrong size for input argument #%d: A single string expected.\n"),"atomsToolboxDetails",2));
+       end
+       
+       // Get the list of installed packages
+       // =========================================================================
+       packages = atomsGetTOOLBOXES();
+       
+       if ~ isfield(packages,name) then
+               error(msprintf(gettext("%s: the package %s doesn''t exist.\n"),"atomsToolboxDetails",name));
+       end
+       
+       package_versions = packages(name);
+       details          = package_versions(version);
+       
+endfunction
diff --git a/scilab/modules/atoms/macros/atoms_internals/atomsVersionCompare.sci b/scilab/modules/atoms/macros/atoms_internals/atomsVersionCompare.sci
new file mode 100644 (file)
index 0000000..6b92e8a
--- /dev/null
@@ -0,0 +1,112 @@
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2009 - DIGITEO - Pierre MARECHAL <pierre.marechal@scilab.org>
+//
+// This file must be used under the terms of the CeCILL.
+// This source file is licensed as described in the file COPYING, which
+// you should have received as part of this distribution.  The terms
+// are also available at
+// http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
+
+// Internal function
+
+// Return  1 if version_1 is superior than version_2
+// Return -1 if version_2 is superior than version_1
+// Return  0 if version_1 and version_2 are equal
+
+function result = atomsVersionCompare( version_1 , version_2 )
+       
+       rhs    = argn(2);
+       result = 0;
+       
+       // Check number of input arguments
+       // =========================================================================
+       
+       if rhs <> 2 then
+               error(msprintf(gettext("%s: Wrong number of input argument: %d expected.\n"),"atomsVersionCompare",2));
+       end
+       
+       // Check input parameters type
+       // =========================================================================
+       
+       if type(version_1) <> 10 then
+               error(msprintf(gettext("%s: Wrong type for input argument #%d: A Single String expected.\n"),"atomsVersionCompare",1));
+       end
+       
+       if type(version_2) <> 10 then
+               error(msprintf(gettext("%s: Wrong type for input argument #%d: A Single String expected.\n"),"atomsVersionCompare",2));
+       end
+       
+       // Check input parameters size
+       // =========================================================================
+       
+       if size(version_1,"*") <> 1 then
+               error(msprintf(gettext("%s: Wrong size for input argument #%d: A Single String expected.\n"),"atomsVersionCompare",1));
+       end
+       
+       if size(version_1,"*") <> 1 then
+               error(msprintf(gettext("%s: Wrong size for input argument #%d: A Single String expected.\n"),"atomsVersionCompare",2));
+       end
+       
+       // Check input parameters values
+       // =========================================================================
+       
+       if (length(version_1) > 1) & (regexp(version_1,"/^[0-9]([0-9\.])*[0-9]$/") == []) then
+               error(msprintf(gettext("%s: Wrong value for input argument #%d: This is not a valid version.\n"),"atomsVersionCompare",1));
+       end
+       
+       if (length(version_1) == 1) & (regexp(version_1,"/^[0-9]$/") == []) then
+               error(msprintf(gettext("%s: Wrong value for input argument #%d: This is not a valid version.\n"),"atomsVersionCompare",1));
+       end
+       
+       if (length(version_2) > 1) & (regexp(version_2,"/^[0-9]([0-9\.])*[0-9]$/") == []) then
+               error(msprintf(gettext("%s: Wrong value for input argument #%d: This is not a valid version.\n"),"atomsVersionCompare",2));
+       end     
+       
+       if (length(version_2) == 1) & (regexp(version_2,"/^[0-9]$/") == []) then
+               error(msprintf(gettext("%s: Wrong value for input argument #%d: This is not a valid version.\n"),"atomsVersionCompare",2));
+       end
+       
+       // Now : action
+       // =========================================================================
+       
+       if regexp(version_1,"/\./","o") == [] then
+               version_1_mat = strtod(version_1);
+       else
+               version_1_mat = strtod(strsubst( strsplit(version_1,strindex(version_1,".")) , "." , "" ));
+       end
+       
+       if regexp(version_2,"/\./","o") == [] then
+               version_2_mat = strtod(version_2);
+       else
+               version_2_mat = strtod(strsubst( strsplit(version_2,strindex(version_2,".")) , "." , "" ));
+       end
+       
+       version_1_mat_size = size(version_1_mat,"*");
+       version_2_mat_size = size(version_2_mat,"*");
+       
+       for i=1:version_1_mat_size
+               
+               if i > version_2_mat_size then
+                       if version_1_mat(i) > 0 then
+                               // Version_1 is superior than version_2
+                               result = 1;
+                               return;
+                       end
+                       continue;
+               end
+               
+               if version_1_mat(i) > version_2_mat(i) then
+                       // Version_1 is superior than version_2
+                       result = 1;
+                       return;
+               end
+               
+               if version_2_mat(i) > version_1_mat(i) then
+                       // Version_2 is superior than version_1
+                       result = -1;
+                       return;
+               end
+               
+       end
+       
+endfunction
diff --git a/scilab/modules/atoms/macros/atoms_internals/atomsVersionSort.sci b/scilab/modules/atoms/macros/atoms_internals/atomsVersionSort.sci
new file mode 100644 (file)
index 0000000..badc382
--- /dev/null
@@ -0,0 +1,73 @@
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2009 - DIGITEO - Pierre MARECHAL <pierre.marechal@scilab.org>
+//
+// This file must be used under the terms of the CeCILL.
+// This source file is licensed as described in the file COPYING, which
+// you should have received as part of this distribution.  The terms
+// are also available at
+// http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
+
+// Internal function
+
+// Tri un tableau de versions
+
+function versions_out = atomsVersionSort( versions_in , direction )
+       
+       rhs = argn(2);
+       
+       // Check number of input arguments
+       // =========================================================================
+       
+       if rhs <> 2 then
+               error(msprintf(gettext("%s: Wrong number of input argument: %d expected.\n"),"atomsVersionSort",2));
+       end
+       
+       // Check input parameters type
+       // =========================================================================
+       
+       if type(versions_in) <> 10 then
+               error(msprintf(gettext("%s: Wrong type for input argument #%d: String array expected.\n"),"atomsVersionSort",1));
+       end
+       
+       if type(direction) <> 10 then
+               error(msprintf(gettext("%s: Wrong type for input argument #%d: A single string expected.\n"),"atomsVersionSort",2));
+       end
+       
+       // Check input parameters dimension
+       // =========================================================================
+       
+       if size(direction,"*") <> 1 then
+               error(msprintf(gettext("%s: Wrong size for input argument #%d: A single string expected.\n"),"atomsVersionSort",2));
+       end
+       
+       // Check input parameters value
+       // =========================================================================
+       if regexp(direction,"/^(ASC|DESC)$/i","o") == [] then
+               error(msprintf(gettext("%s: Wrong value for input argument #%d: ""ASC"" or ""DESC"" expected.\n"),"atomsVersionSort",2));
+       end
+       
+       // Output argument
+       // =========================================================================
+       versions_out = versions_in;
+       
+       ASC  = (convstr(direction,"u") == "ASC");
+       DESC = ~ ASC;
+       
+       // Now : action
+       // =========================================================================
+       
+       for i=1:(size(versions_out,"*")-1)
+               for j=1:(size(versions_out,"*")-1)
+                       if ASC & (atomsVersionCompare(versions_out(j),versions_out(j+1)) > 0) then
+                               tmp               = versions_out(j+1);
+                               versions_out(j+1) = versions_out(j);
+                               versions_out(j)   = tmp;
+                       elseif DESC & (atomsVersionCompare(versions_out(j),versions_out(j+1)) < 0) then
+                               tmp               = versions_out(j+1);
+                               versions_out(j+1) = versions_out(j);
+                               versions_out(j)   = tmp;
+                       end
+               end
+       end
+       
+endfunction