| Index: build/android/pylib/device/device_utils.py
|
| diff --git a/build/android/pylib/device/device_utils.py b/build/android/pylib/device/device_utils.py
|
| index fe9d2c64324ecb378bf43b4c63aa8e1d13a94acc..00e66630c54561a2439ded64eaaf8b459e4d92c1 100644
|
| --- a/build/android/pylib/device/device_utils.py
|
| +++ b/build/android/pylib/device/device_utils.py
|
| @@ -91,6 +91,13 @@ def _GetTimeStamp():
|
| return time.strftime('%Y%m%dT%H%M%S', time.localtime())
|
|
|
|
|
| +def _JoinLines(lines):
|
| + # makes sure that the last line is also terminated, and is more memory
|
| + # efficient than first appending an end-line to each line and then joining
|
| + # all of them together.
|
| + return ''.join(s for line in lines for s in (line, '\n'))
|
| +
|
| +
|
| class DeviceUtils(object):
|
|
|
| _VALID_SHELL_VARIABLE = re.compile('^[a-zA-Z_][a-zA-Z0-9_]*$')
|
| @@ -880,7 +887,8 @@ class DeviceUtils(object):
|
| self.adb.Pull(device_path, host_path)
|
|
|
| @decorators.WithTimeoutAndRetriesFromInstance()
|
| - def ReadFile(self, device_path, as_root=False, timeout=None, retries=None):
|
| + def ReadFile(self, device_path, as_root=False,
|
| + timeout=None, retries=None):
|
| """Reads the contents of a file from the device.
|
|
|
| Args:
|
| @@ -892,22 +900,17 @@ class DeviceUtils(object):
|
| retries: number of retries
|
|
|
| Returns:
|
| - The contents of the file at |device_path| as a list of lines.
|
| + The contents of |device_path| as a string. Contents are intepreted using
|
| + universal newlines, so the caller will see them encoded as '\n'. Also,
|
| + all lines will be terminated.
|
|
|
| Raises:
|
| - CommandFailedError if the file can't be read.
|
| + AdbCommandFailedError if the file can't be read.
|
| CommandTimeoutError on timeout.
|
| DeviceUnreachableError on missing device.
|
| """
|
| - # TODO(jbudorick) Evaluate whether we want to return a list of lines after
|
| - # the implementation switch, and if file not found should raise exception.
|
| - if as_root:
|
| - if not self.old_interface.CanAccessProtectedFileContents():
|
| - raise device_errors.CommandFailedError(
|
| - 'Cannot read from %s with root privileges.' % device_path)
|
| - return self.old_interface.GetProtectedFileContents(device_path)
|
| - else:
|
| - return self.old_interface.GetFileContents(device_path)
|
| + return _JoinLines(self.RunShellCommand(
|
| + ['cat', device_path], as_root=as_root, check_return=True))
|
|
|
| @decorators.WithTimeoutAndRetriesFromInstance()
|
| def WriteFile(self, device_path, contents, as_root=False, force_push=False,
|
|
|