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 becd514106bf7b9fe5049fa939f4409fbb202a92..976399cfa35fa1222f4243b0076870b5ffc4585a 100644 |
--- a/build/android/pylib/device/device_utils.py |
+++ b/build/android/pylib/device/device_utils.py |
@@ -1005,19 +1005,23 @@ class DeviceUtils(object): |
all_changed_files = [] |
all_stale_files = [] |
+ missing_dirs = [] |
for h, d in host_device_tuples: |
- if os.path.isdir(h): |
- self.RunShellCommand(['mkdir', '-p', d], check_return=True) |
- changed_files, stale_files = ( |
+ changed_files, up_to_date_files, stale_files = ( |
self._GetChangedAndStaleFiles(h, d, delete_device_stale)) |
all_changed_files += changed_files |
all_stale_files += stale_files |
+ if (os.path.isdir(h) and changed_files and not up_to_date_files |
+ and not stale_files): |
+ missing_dirs.append(d) |
if delete_device_stale and all_stale_files: |
self.RunShellCommand(['rm', '-f'] + all_stale_files, |
check_return=True) |
if all_changed_files: |
+ if missing_dirs: |
+ self.RunShellCommand(['mkdir', '-p'] + missing_dirs, check_return=True) |
self._PushFilesImpl(host_device_tuples, all_changed_files) |
def _GetChangedAndStaleFiles(self, host_path, device_path, track_stale=False): |
@@ -1029,9 +1033,10 @@ class DeviceUtils(object): |
track_stale: whether to bother looking for stale files (slower) |
Returns: |
- a two-element tuple |
+ a three-element tuple |
1st element: a list of (host_files_path, device_files_path) tuples to push |
- 2nd element: a list of stale files under device_path, or [] when |
+ 2nd element: a list of host_files_path that are up-to-date |
+ 3rd element: a list of stale files under device_path, or [] when |
track_stale == False |
""" |
try: |
@@ -1045,25 +1050,29 @@ class DeviceUtils(object): |
interesting_device_paths, self) |
except EnvironmentError as e: |
logging.warning('Error calculating md5: %s', e) |
- return ([(host_path, device_path)], []) |
+ return ([(host_path, device_path)], [], []) |
+ to_push = [] |
+ up_to_date = [] |
+ to_delete = [] |
if os.path.isfile(host_path): |
host_checksum = host_checksums.get(host_path) |
device_checksum = device_checksums.get(device_path) |
- if host_checksum != device_checksum: |
- return ([(host_path, device_path)], []) |
+ if host_checksum == device_checksum: |
+ up_to_date.append(host_path) |
else: |
- return ([], []) |
+ to_push.append((host_path, device_path)) |
else: |
- to_push = [] |
for host_abs_path, host_checksum in host_checksums.iteritems(): |
device_abs_path = posixpath.join( |
device_path, os.path.relpath(host_abs_path, host_path)) |
device_checksum = device_checksums.pop(device_abs_path, None) |
- if device_checksum != host_checksum: |
+ if device_checksum == host_checksum: |
+ up_to_date.append(host_abs_path) |
+ else: |
to_push.append((host_abs_path, device_abs_path)) |
to_delete = device_checksums.keys() |
- return (to_push, to_delete) |
+ return (to_push, up_to_date, to_delete) |
def _ComputeDeviceChecksumsForApks(self, package_name): |
ret = self._cache['package_apk_checksums'].get(package_name) |