Index: build/android/pylib/device/adb_wrapper.py |
diff --git a/build/android/pylib/device/adb_wrapper.py b/build/android/pylib/device/adb_wrapper.py |
index f4a5931121acc5db030fea1b8e2bbf9bbf8b3271..f6ac660c276176c5bd75ded89fac57f63cf70243 100644 |
--- a/build/android/pylib/device/adb_wrapper.py |
+++ b/build/android/pylib/device/adb_wrapper.py |
@@ -171,18 +171,27 @@ class AdbWrapper(object): |
if expect_rc is None: |
actual_command = command |
else: |
- actual_command = '%s; echo $?;' % command |
+ actual_command = '%s; echo %%$?;' % command.rstrip() |
output = self._DeviceAdbCmd( |
['shell', actual_command], timeout, retries, check_error=False) |
if expect_rc is not None: |
- output_end = output.rstrip().rfind('\n') + 1 |
- rc = output[output_end:].strip() |
- output = output[:output_end] |
- if int(rc) != expect_rc: |
+ output_end = output.rfind('%') |
+ if output_end < 0: |
+ # causes the string for rc to become empty and also raise a ValueError |
+ output_end = len(output) |
+ |
+ try: |
+ rc = int(output[output_end+1:]) |
+ except ValueError: |
raise device_errors.AdbCommandFailedError( |
- ['shell', command], |
- 'shell command exited with code: %s' % rc, |
+ ['shell'], 'command %r on device produced output %r where no' |
+ ' valid return code was found' % (actual_command, output), |
self._device_serial) |
+ |
+ output = output[:output_end] |
+ if rc != expect_rc: |
+ raise device_errors.AdbShellCommandFailedError( |
+ command, rc, output, self._device_serial) |
return output |
def Logcat(self, filter_spec=None, timeout=_DEFAULT_TIMEOUT, |