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, |