summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDamian Johnson <atagar@torproject.org>2017-05-24 13:26:14 -0700
committerDamian Johnson <atagar@torproject.org>2017-05-24 13:26:14 -0700
commitdfcdc18526ee416302ea7fed780478a3fd08e0ae (patch)
tree0b8689df2d6e511c8485a6dbefe041ae92ae6dc9
parent0d6212ed5f650f2364ac27dda88363b0de0265af (diff)
Add cwd argument to stem.util.system.call()
While investigating #22366 I ran into rare failures with relative paths. On reflection this is likely due to a background thread calling chdir. We shouldn't change global state in the background. The subprocess accepts a cwd argument so taking advantage of that.
-rw-r--r--docs/change_log.rst1
-rw-r--r--stem/util/system.py6
-rw-r--r--test/integ/installation.py35
3 files changed, 19 insertions, 23 deletions
diff --git a/docs/change_log.rst b/docs/change_log.rst
index c9b96af1..a097f5dc 100644
--- a/docs/change_log.rst
+++ b/docs/change_log.rst
@@ -66,6 +66,7 @@ The following are only available within Stem's `git repository
* **Utilities**
* Added timeout argument to :func:`~stem.util.system.call`
+ * Added cwd argument to :func:`~stem.util.system.call`
* Added :class:`~stem.util.test_tools.TimedTestRunner` and :func:`~stem.util.test_tools.test_runtimes`
* **Interpreter**
diff --git a/stem/util/system.py b/stem/util/system.py
index 7b315169..9f853042 100644
--- a/stem/util/system.py
+++ b/stem/util/system.py
@@ -1036,7 +1036,7 @@ def files_with_suffix(base_path, suffix):
yield os.path.join(root, filename)
-def call(command, default = UNDEFINED, ignore_exit_status = False, timeout = None, env = None):
+def call(command, default = UNDEFINED, ignore_exit_status = False, timeout = None, cwd = None, env = None):
"""
call(command, default = UNDEFINED, ignore_exit_status = False)
@@ -1052,7 +1052,7 @@ def call(command, default = UNDEFINED, ignore_exit_status = False, timeout = Non
Added env argument.
.. versionchanged:: 1.6.0
- Added timeout argument.
+ Added timeout and cwd arguments.
:param str,list command: command to be issued
:param object default: response if the query fails
@@ -1082,7 +1082,7 @@ def call(command, default = UNDEFINED, ignore_exit_status = False, timeout = Non
try:
is_shell_command = command_list[0] in SHELL_COMMANDS
- process = subprocess.Popen(command_list, stdout = subprocess.PIPE, stderr = subprocess.PIPE, shell = is_shell_command, env = env)
+ process = subprocess.Popen(command_list, stdout = subprocess.PIPE, stderr = subprocess.PIPE, shell = is_shell_command, cwd = cwd, env = env)
if timeout:
while process.poll() is None:
diff --git a/test/integ/installation.py b/test/integ/installation.py
index 80a405de..dd4eb88f 100644
--- a/test/integ/installation.py
+++ b/test/integ/installation.py
@@ -33,31 +33,26 @@ def setup():
def _setup():
global INSTALL_FAILURE, INSTALL_PATH, SDIST_FAILURE
- original_cwd = os.getcwd()
try:
- try:
- os.chdir(test.STEM_BASE)
- stem.util.system.call('%s setup.py install --prefix %s' % (PYTHON_EXE, BASE_INSTALL_PATH), timeout = 60)
- stem.util.system.call('%s setup.py clean --all' % PYTHON_EXE, timeout = 60) # tidy up the build directory
- site_packages_paths = glob.glob('%s/lib*/*/site-packages' % BASE_INSTALL_PATH)
+ stem.util.system.call('%s setup.py install --prefix %s' % (PYTHON_EXE, BASE_INSTALL_PATH), timeout = 60, cwd = test.STEM_BASE)
+ stem.util.system.call('%s setup.py clean --all' % PYTHON_EXE, timeout = 60, cwd = test.STEM_BASE) # tidy up the build directory
+ site_packages_paths = glob.glob('%s/lib*/*/site-packages' % BASE_INSTALL_PATH)
+
+ if len(site_packages_paths) != 1:
+ raise AssertionError('We should only have a single site-packages directory, but instead had: %s' % site_packages_paths)
- if len(site_packages_paths) != 1:
- raise AssertionError('We should only have a single site-packages directory, but instead had: %s' % site_packages_paths)
+ INSTALL_PATH = site_packages_paths[0]
+ except Exception as exc:
+ INSTALL_FAILURE = AssertionError("Unable to install with 'python setup.py install': %s" % exc)
- INSTALL_PATH = site_packages_paths[0]
+ if not os.path.exists(DIST_PATH):
+ try:
+ stem.util.system.call('%s setup.py sdist' % PYTHON_EXE, timeout = 60, cwd = test.STEM_BASE)
except Exception as exc:
- INSTALL_FAILURE = AssertionError("Unable to install with 'python setup.py install': %s" % exc)
-
- if not os.path.exists(DIST_PATH):
- try:
- stem.util.system.call('%s setup.py sdist' % PYTHON_EXE, timeout = 60)
- except Exception as exc:
- SDIST_FAILURE = exc
- else:
- SDIST_FAILURE = AssertionError("%s already exists, maybe you manually ran 'python setup.py sdist'?" % DIST_PATH)
- finally:
- os.chdir(original_cwd)
+ SDIST_FAILURE = exc
+ else:
+ SDIST_FAILURE = AssertionError("%s already exists, maybe you manually ran 'python setup.py sdist'?" % DIST_PATH)
if SETUP_THREAD is None:
SETUP_THREAD = threading.Thread(target = _setup)