From eac023361fb5e524f2f31916dd186621cec46d6d Mon Sep 17 00:00:00 2001 From: Daniel Wagner-Hall Date: Fri, 19 Oct 2018 20:33:55 +0100 Subject: [PATCH] Pex exits with correct code when using entrypoint (#605) Currently the exit code from an entrypoint is swallowed, so running pex always exits 0. Tested with: ``` tox -e py27-package dist/pex27 -e pytest:main pytest -D /path/to/failing/test/dir ``` before this PR, this exits 0, after it exits 1. --- pex/pex.py | 12 ++++++------ tests/test_integration.py | 20 ++++++++++++++++++++ 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/pex/pex.py b/pex/pex.py index e39e04e29..83ff127f9 100644 --- a/pex/pex.py +++ b/pex/pex.py @@ -278,8 +278,7 @@ def patch_all(path, path_importer_cache, modules): def _wrap_coverage(self, runner, *args): if not self._vars.PEX_COVERAGE and self._vars.PEX_COVERAGE_FILENAME is None: - runner(*args) - return + return runner(*args) try: import coverage @@ -296,7 +295,7 @@ def _wrap_coverage(self, runner, *args): cov.start() try: - runner(*args) + return runner(*args) finally: TRACER.log('Stopping coverage') cov.stop() @@ -310,8 +309,7 @@ def _wrap_coverage(self, runner, *args): def _wrap_profiling(self, runner, *args): if not self._vars.PEX_PROFILE and self._vars.PEX_PROFILE_FILENAME is None: - runner(*args) - return + return runner(*args) pex_profile_filename = self._vars.PEX_PROFILE_FILENAME pex_profile_sort = self._vars.PEX_PROFILE_SORT @@ -348,7 +346,9 @@ def execute(self): self.patch_sys(pex_inherit_path) working_set = self._activate() self.patch_pkg_resources(working_set) - self._wrap_coverage(self._wrap_profiling, self._execute) + exit_code = self._wrap_coverage(self._wrap_profiling, self._execute) + if exit_code: + sys.exit(exit_code) except Exception: # Allow the current sys.excepthook to handle this app exception before we tear things down in # finally, then reraise so that the exit status is reflected correctly. diff --git a/tests/test_integration.py b/tests/test_integration.py index 6be82d121..9e53b5fb4 100644 --- a/tests/test_integration.py +++ b/tests/test_integration.py @@ -837,6 +837,26 @@ def test_pex_manylinux_runtime(): assert out.strip() == '[1, 2, 3]' +def test_pex_exit_code_propagation(): + """Tests exit code propagation.""" + test_stub = dedent( + """ + def test_fail(): + assert False + """ + ) + + with temporary_content({'tester.py': test_stub}) as output_dir: + pex_path = os.path.join(output_dir, 'test.pex') + tester_path = os.path.join(output_dir, 'tester.py') + results = run_pex_command(['pytest==3.9.1', + '-e', 'pytest:main', + '-o', pex_path]) + results.assert_success() + + assert subprocess.call([pex_path, os.path.realpath(tester_path)]) == 1 + + @pytest.mark.skipif(NOT_CPYTHON27) def test_platform_specific_inline_egg_resolution(): with temporary_dir() as td: