Salome HOME
Remove special process for PARAVIS
[modules/yacs.git] / bin / salomeContextUtils.py.in
index a716b79f6460e6dfc448551e68b9a013698f6f16..661f2ad904cefad9915ca63e33d20efa7c22a509 100644 (file)
@@ -1,6 +1,6 @@
 #! /usr/bin/env python
 
-# Copyright (C) 2013-2015  CEA/DEN, EDF R&D, OPEN CASCADE
+# Copyright (C) 2013-2016  CEA/DEN, EDF R&D, OPEN CASCADE
 #
 # This library is free software; you can redistribute it and/or
 # modify it under the terms of the GNU Lesser General Public
@@ -144,8 +144,24 @@ def __get_environment_from_batch_command(env_cmd, initial=None):
 #
 def __subtract(ref, dic):
   result = {}
-  for item in set(ref).difference(set(dic)):
-    result[item] = ref[item]
+  for key,val in ref.items():
+    if not dic.has_key(key):
+      result[key] = val
+    else:
+      # compare values types
+      if (type(dic[key]) != type(val)):
+        result[key] = val
+      else:
+        # compare values
+        if isinstance(val, basestring):
+          tolist1 = dic[key].split(os.pathsep)
+          tolist2 = val.split(os.pathsep)
+          diff = list(set(tolist2)-set(tolist1))
+          if diff:
+            result[key] = os.pathsep.join(diff)
+        else:
+          result[key] = val
+
   return result
 #
 
@@ -212,7 +228,9 @@ class ScriptAndArgsObjectEncoder(json.JSONEncoder):
       return json.JSONEncoder.default(self, obj)
 #
 
-def getShortAndExtraArgs(args=[]):
+def getShortAndExtraArgs(args=None):
+  if args is None:
+    args = []
   try:
     pos = args.index("--") # raise a ValueError if not found
     short_args = args[:pos]
@@ -226,7 +244,9 @@ def getShortAndExtraArgs(args=[]):
 #
 
 # Return an array of ScriptAndArgs objects
-def getScriptsAndArgs(args=[], searchPathList=None):
+def getScriptsAndArgs(args=None, searchPathList=None):
+  if args is None:
+    args = []
   short_args, extra_args = getShortAndExtraArgs(args)
   args = short_args
 
@@ -250,7 +270,35 @@ def getScriptsAndArgs(args=[], searchPathList=None):
       if not currentKey or callPython:
         raise SalomeContextException("args list must follow corresponding script file in command line.")
       elt = elt.replace(argsPrefix, '')
-      scriptArgs[len(scriptArgs)-1].args = [os.path.expanduser(x) for x in elt.split(",")]
+      # Special process if some items of 'args:' list are themselves lists
+      # Note that an item can be a list, but not a list of lists...
+      # So we can have something like this:
+      # myscript.py args:['file1','file2'],val1,"done",[1,2,3],[True,False],"ok"
+      # With such a call, an elt variable contains the string representing ['file1','file2'],val1,"done",[1,2,3],[True,False],"ok" that is '[file1,file2],val1,done,[1,2,3],[True,False],ok'
+      # We have to split elt to obtain: ['[file1,file2]','val1','done','[1,2,3]','[True,False]','ok']
+      contains_list = re.findall('(\[[^\]]*\])', elt)
+      if contains_list:
+        extracted_args = []
+        x = elt.split(",")
+        # x is ['[file1', 'file2]', 'val1', 'done', '[1', '2', '3]', '[True', 'False]', 'ok']
+        list_begin_indices = [i for i in xrange(len(x)) if x[i].startswith('[')] # [0, 4, 7]
+        list_end_indices = [i for i in xrange(len(x)) if x[i].endswith(']')] # [1, 6, 8]
+        start = 0
+        for lbeg, lend in zip(list_begin_indices,list_end_indices): # [(0, 1), (4, 6), (7, 8)]
+          if lbeg > start:
+            extracted_args += x[start:lbeg]
+            pass
+          extracted_args += [','.join(x[lbeg:lend+1])]
+          start = lend+1
+          pass
+        if start < len(x):
+          extracted_args += x[start:len(x)]
+          pass
+        scriptArgs[len(scriptArgs)-1].args = extracted_args
+        pass
+      else: # a single split is enough
+        scriptArgs[len(scriptArgs)-1].args = [os.path.expanduser(x) for x in elt.split(",")]
+        pass
       currentKey = None
       callPython = False
       afterArgs = True