Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1279)

Unified Diff: build/android/gyp/util/build_utils.py

Issue 106923002: Don't use sys.exit() in build_utils.CheckCallDie(). (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: build/android/gyp/util/build_utils.py
diff --git a/build/android/gyp/util/build_utils.py b/build/android/gyp/util/build_utils.py
index a58fe4a715e552a4a70b0c57a4aee013489f1b5d..0bf94821f3fa86617446b6a779e3b4ebc37c58ea 100644
--- a/build/android/gyp/util/build_utils.py
+++ b/build/android/gyp/util/build_utils.py
@@ -78,49 +78,44 @@ def ReadJson(path):
return json.load(jsonfile)
-# This can be used in most cases like subprocess.check_call. The output,
+class CalledProcessError(Exception):
+ """This exception is raised when the process run by CheckOutput
+ exits with a non-zero exit code."""
+
+ def __init__(self, cwd, args, output):
+ self.cwd = cwd
+ self.args = args
+ self.output = output
+
+ def __str__(self):
+ # A user should be able to simply copy and paste the command that failed
+ # into their shell.
+ copyable_command = '( cd {}; {} )'.format(os.path.abspath(self.cwd),
+ ' '.join(map(pipes.quote, self.args)))
+ return 'Command failed: {}\n{}'.format(copyable_command, self.output)
+
+
+# This can be used in most cases like subprocess.check_output(). The output,
# particularly when the command fails, better highlights the command's failure.
-# This call will directly exit on a failure in the subprocess so that no python
-# stacktrace is printed after the output of the failed command (and will
-# instead print a python stack trace before the output of the failed command)
-def CheckCallDie(args, suppress_output=False, cwd=None, fail_if_stderr=False):
+# If the command fails, raises a build_utils.CalledProcessError.
+def CheckOutput(args, cwd=None, print_stdout=False, print_stderr=True,
+ fail_if_stderr=False):
if not cwd:
cwd = os.getcwd()
child = subprocess.Popen(args,
stdout=subprocess.PIPE, stderr=subprocess.PIPE, cwd=cwd)
-
stdout, stderr = child.communicate()
- returncode = child.returncode
- if fail_if_stderr and stderr and returncode == 0:
- returncode = 1
-
- if returncode:
- stacktrace = traceback.extract_stack()
- print >> sys.stderr, ''.join(traceback.format_list(stacktrace))
- # A user should be able to simply copy and paste the command that failed
- # into their shell.
- copyable_command = ' '.join(map(pipes.quote, args))
- copyable_command = ('( cd ' + os.path.abspath(cwd) + '; '
- + copyable_command + ' )')
- print >> sys.stderr, 'Command failed:', copyable_command, '\n'
-
- if stdout:
- print stdout,
- if stderr:
- print >> sys.stderr, stderr,
+ if child.returncode or (stderr and fail_if_stderr):
+ raise CalledProcessError(cwd, args, stdout + stderr)
- # Directly exit to avoid printing stacktrace.
- sys.exit(returncode)
+ if print_stdout:
+ sys.stdout.write(stdout)
+ if print_stderr:
+ sys.stderr.write(stderr)
- else:
- if not suppress_output:
- if stdout:
- print stdout,
- if stderr:
- print >> sys.stderr, stderr,
- return stdout + stderr
+ return stdout
def GetModifiedTime(path):
@@ -141,7 +136,7 @@ def IsTimeStale(output, inputs):
def IsDeviceReady():
- device_state = CheckCallDie(['adb', 'get-state'], suppress_output=True)
+ device_state = CheckOutput(['adb', 'get-state'])
return device_state.strip() == 'device'

Powered by Google App Engine
This is Rietveld 408576698