]> SALOME platform Git repositories - modules/yacs.git/commitdiff
Salome HOME
manage extra environment files
authorCédric Aguerre <cedric.aguerre@edf.fr>
Mon, 11 May 2015 14:56:44 +0000 (16:56 +0200)
committerCédric Aguerre <cedric.aguerre@edf.fr>
Fri, 5 Jun 2015 12:35:41 +0000 (14:35 +0200)
bin/appliskel/.salome-completion.sh
bin/appliskel/salome
bin/salomeContextUtils.py.in

index 705129f837186475b69afae94e0c7f0765186cc3..48f38eaf5b8ba1bd7e4aeed023114d1d6eeaf991 100644 (file)
@@ -71,10 +71,10 @@ _salome()
         if [[ "$cur" == -* ]]; then
             case $command in
                 start)
-                    options='-t --terminal -g --gui -d --show-desktop= -o --hide-desktop -b --batch -l --logger -f --log-file= -r --resources= -x --xterm -m --modules= -e --embedded= -s --standalone= -p --portkill -k --killall -i --interp= -z --splash= -c --catch-exceptions= --print-port --nosave-config --pinter --ns-port-log= --test= --play= --gdb-session --ddd-session --valgrind-session -w --shutdown-servers= --foreground= --wake-up-session --server-launch-mode= --port= --siman --siman-study= --siman-scenario= --siman-user= --version -h --help --with-mpi-module='
+                    options='-t --terminal -g --gui -d --show-desktop= -o --hide-desktop -b --batch -l --logger -f --log-file= -r --resources= -x --xterm -m --modules= -e --embedded= -s --standalone= -p --portkill -k --killall -i --interp= -z --splash= -c --catch-exceptions= --print-port --nosave-config --pinter --ns-port-log= --test= --play= --gdb-session --ddd-session --valgrind-session -w --shutdown-servers= --foreground= --wake-up-session --server-launch-mode= --port= --siman --siman-study= --siman-scenario= --siman-user= --version -h --help --with-mpi-module= --config= --extra_env='
                     ;;
                 shell)
-                    options='-h --help -p --port= -m --machine= -d --directory= -u --user= --with-mpi-module='
+                    options='-h --help -p --port= -m --machine= -d --directory= -u --user= --with-mpi-module= --config= --extra_env='
                     ;;
             esac
             COMPREPLY=( $( compgen -W "$options" -- "$cur" ) )
index 1bcae77fa2d19aecd706a525e147ba81925521f1..df7e2fbe22cd069a2001c898e8ab114866013b64 100755 (executable)
@@ -35,9 +35,10 @@ def main(args):
     sys.exit(0)
 
   from salomeContextUtils import getConfigFileNames
-  configFileNames, args, unexisting = getConfigFileNames(args, checkExistence=True)
+  configFileNames, extraEnv, args, unexisting = getConfigFileNames(args, checkExistence=True)
+
   if len(unexisting) > 0:
-    print "ERROR: unexisting configuration file(s): " + ', '.join(unexisting)
+    print "ERROR: unexisting configuration/environment file(s): " + ', '.join(unexisting)
     sys.exit(1)
 
   # Create a SalomeContext which parses configFileNames to initialize environment
@@ -52,6 +53,10 @@ def main(args):
     # context.addToPythonPath('mypythonpath')
     # context.setVariable('myvarname', 'value')
 
+    if extraEnv:
+      for key,val in extraEnv.items():
+        context.addToVariable(key,val)
+
     # Start SALOME, parsing command line arguments
     (out, err), returncode = context.runSalome(args)
     if out:
index 724106a6e2792fb382496a42cfa2db6870d93b83..a716b79f6460e6dfc448551e68b9a013698f6f16 100644 (file)
@@ -61,18 +61,14 @@ def __getConfigFileNamesDefault():
   return __listDirectory(envdDir)
 #
 
-def getConfigFileNames(args, checkExistence=False):
-  # special case: configuration files are provided by user
-  # Search for command-line argument(s) --config=file1,file2,..., filen
-  # Search for command-line argument(s) --config=dir1,dir2,..., dirn
-  configOptionPrefix = "--config="
-  configArgs = [ str(x) for x in args if str(x).startswith(configOptionPrefix) ]
-
-  if len(configArgs) == 0:
-    return __getConfigFileNamesDefault(), args, []
+def __getEnvironmentFileNames(args, optionPrefix, checkExistence):
+  # special case: extra configuration/environment files are provided by user
+  # Search for command-line argument(s) <optionPrefix>=file1,file2,..., filen
+  # Search for command-line argument(s) <optionPrefix>=dir1,dir2,..., dirn
+  configArgs = [ str(x) for x in args if str(x).startswith(optionPrefix) ]
 
-  args = [ x for x in args if not x.startswith(configOptionPrefix) ]
-  allLists = [ x.replace(configOptionPrefix, '') for x in configArgs ]
+  args = [ x for x in args if not x.startswith(optionPrefix) ]
+  allLists = [ x.replace(optionPrefix, '') for x in configArgs ]
 
   configFileNames = []
   unexisting = []
@@ -91,6 +87,89 @@ def getConfigFileNames(args, checkExistence=False):
   return configFileNames, args, unexisting
 #
 
+def __validate_pair(ob):
+  try:
+    if not (len(ob) == 2):
+      #print "Unexpected result:", ob
+      raise ValueError
+  except:
+    return False
+  return True
+#
+def __get_environment_from_batch_command(env_cmd, initial=None):
+  """
+  Take a command (either a single command or list of arguments)
+  and return the environment created after running that command.
+  Note that if the command must be a batch file or .cmd file, or the
+  changes to the environment will not be captured.
+
+  If initial is supplied, it is used as the initial environment passed
+  to the child process.
+  """
+  #if not isinstance(env_cmd, (list, tuple)):
+  #    env_cmd = [env_cmd]
+  # construct the command that will alter the environment
+  #env_cmd = subprocess.list2cmdline(env_cmd)
+  # create a tag so we can tell in the output when the proc is done
+  tag = 'Done running command'
+  # construct a command to do accomplish this
+  cmd = '{env_cmd} && echo "{tag}"'.format(**vars())
+
+  # launch the process
+  proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, env=initial, shell=True)
+  # parse the output sent to stdout
+  lines = proc.stdout
+  # consume whatever output occurs until the tag is reached
+  #consume(itertools.takewhile(lambda l: tag not in l, lines))
+  # define a way to handle each KEY=VALUE line
+  handle_line = lambda l: l.rstrip().split('=',1)
+  # parse key/values into pairs
+  #pairs = map(handle_line, lines)
+  pairs = []
+  cpt = 0
+  while True:
+    line = lines.readline()
+    cpt = cpt+1
+    if tag in line or cpt > 1000:
+      break
+    if line:
+      pairs.append(line.rstrip().split('=',1))
+  # make sure the pairs are valid
+  valid_pairs = filter(__validate_pair, pairs)
+  # construct a dictionary of the pairs
+  result = dict(valid_pairs)
+  # let the process finish
+  proc.communicate()
+  return result
+#
+def __subtract(ref, dic):
+  result = {}
+  for item in set(ref).difference(set(dic)):
+    result[item] = ref[item]
+  return result
+#
+
+def getConfigFileNames(args, checkExistence=False):
+  configOptionPrefix = "--config="
+  configArgs = [ str(x) for x in args if str(x).startswith(configOptionPrefix) ]
+  if len(configArgs) == 0:
+    configFileNames, unexist1 = __getConfigFileNamesDefault(), []
+  else:
+    # get configuration filenames
+    configFileNames, args, unexist1 = __getEnvironmentFileNames(args, configOptionPrefix, checkExistence)
+
+  # get extra environment
+  extraEnvFileNames, args, unexist2 = __getEnvironmentFileNames(args, "--extra_env=", checkExistence)
+  before = __get_environment_from_batch_command("env")
+  after = {}
+  for filename in extraEnvFileNames:
+    after.update(__get_environment_from_batch_command(filename))
+    pass
+
+  extraEnv = __subtract(after,before)
+  return configFileNames, extraEnv, args, unexist1+unexist2
+#
+
 def __getScriptPath(scriptName, searchPathList):
   scriptName = os.path.expanduser(scriptName)
   if os.path.isabs(scriptName):