Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
tesh: try harder to not loose the cwd between threads
[simgrid.git] / tools / tesh / tesh.py
index 37a7e5a..5ba29b8 100755 (executable)
@@ -5,7 +5,7 @@
 tesh -- testing shell
 ========================
 
-Copyright (c) 2012-2017. The SimGrid Team. All rights reserved.
+Copyright (c) 2012-2018. The SimGrid Team. All rights reserved.
 
 This program is free software; you can redistribute it and/or modify it
 under the terms of the license (GNU LGPL) which comes with this package.
@@ -45,6 +45,8 @@ else:
 #
 #
 
+def isWindows():
+    return sys.platform.startswith('win')
 
 # Singleton metaclass that works in Python 2 & 3
 # http://stackoverflow.com/questions/6760685/creating-a-singleton-in-python
@@ -106,6 +108,9 @@ except NameError:
 pgtokill = None
 
 def kill_process_group(pgid):
+    if pgid is None: # Nobody to kill. We don't know who to kill on windows, or we don't have anyone to kill on signal handler
+        return
+
     # print("Kill process group {}".format(pgid))
     try:
         os.killpg(pgid, signal.SIGTERM)
@@ -139,7 +144,7 @@ class FileReader(Singleton):
             self.filename_raw = filename
             self.filename = os.path.basename(filename)
             self.abspath = os.path.abspath(filename)
-            self.f = open(self.filename_raw, encoding="utf-8")
+            self.f = open(self.filename_raw)
 
         self.linenumber = 0
 
@@ -183,7 +188,7 @@ class TeshState(Singleton):
             t.acquire()
             t.release()
 
-#Command line object
+# Command line object
 class Cmd(object):
     def __init__(self):
         self.input_pipe = []
@@ -194,7 +199,8 @@ class Cmd(object):
         self.linenumber = -1
 
         self.background = False
-        self.cwd = None
+        # Python threads loose the cwd
+        self.cwd = os.getcwd()
 
         self.ignore_output = False
         self.expect_return = 0
@@ -254,8 +260,6 @@ class Cmd(object):
     def run_if_possible(self):
         if self.can_run():
             if self.background:
-                #Python threads loose the cwd
-                self.cwd = os.getcwd()
                 lock = _thread.allocate_lock()
                 lock.acquire()
                 TeshState().add_thread(lock)
@@ -268,10 +272,8 @@ class Cmd(object):
 
 
     def _run(self, lock=None):
-        #Python threads loose the cwd
-        if self.cwd is not None:
-            os.chdir(self.cwd)
-            self.cwd = None
+        # Python threads loose the cwd
+        os.chdir(self.cwd)
 
         #retrocompatibility: support ${aaa:=.} variable format
         def replace_perl_variables(m):
@@ -316,10 +318,19 @@ class Cmd(object):
         try:
             proc = subprocess.Popen(args, bufsize=1, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, universal_newlines=True, start_new_session=True)
             try:
-                pgtokill = os.getpgid(proc.pid)
+                if not isWindows():
+                    pgtokill = os.getpgid(proc.pid)
             except OSError:
                 # os.getpgid failed. OK. No cleanup.
                 pass
+        except PermissionError:
+            print("["+FileReader().filename+":"+str(self.linenumber)+"] Cannot start '"+args[0]+"': The binary is not executable.")
+            print("["+FileReader().filename+":"+str(self.linenumber)+"] Current dir: "+os.getcwd())
+            tesh_exit(3)            
+        except NotADirectoryError:
+            print("["+FileReader().filename+":"+str(self.linenumber)+"] Cannot start '"+args[0]+"': The path to binary does not exist.")
+            print("["+FileReader().filename+":"+str(self.linenumber)+"] Current dir: "+os.getcwd())
+            tesh_exit(3)
         except FileNotFoundError:
             print("["+FileReader().filename+":"+str(self.linenumber)+"] Cannot start '"+args[0]+"': File not found")
             tesh_exit(3)