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

Side by Side Diff: build/android/pylib/android_commands.py

Issue 97133002: Add instance-level in-memory cache for PushIfNeeded(). (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebase 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 # Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 # Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 # Use of this source code is governed by a BSD-style license that can be 2 # Use of this source code is governed by a BSD-style license that can be
3 # found in the LICENSE file. 3 # found in the LICENSE file.
4 4
5 """Provides an interface to communicate with the device via the adb command. 5 """Provides an interface to communicate with the device via the adb command.
6 6
7 Assumes adb binary is currently on system path. 7 Assumes adb binary is currently on system path.
8 """ 8 """
9 9
10 import collections 10 import collections
(...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after
253 self.logcat_process = None 253 self.logcat_process = None
254 self._logcat_tmpoutfile = None 254 self._logcat_tmpoutfile = None
255 self._pushed_files = [] 255 self._pushed_files = []
256 self._device_utc_offset = None 256 self._device_utc_offset = None
257 self._potential_push_size = 0 257 self._potential_push_size = 0
258 self._actual_push_size = 0 258 self._actual_push_size = 0
259 self._external_storage = '' 259 self._external_storage = ''
260 self._util_wrapper = '' 260 self._util_wrapper = ''
261 self._api_strict_mode = api_strict_mode 261 self._api_strict_mode = api_strict_mode
262 self._system_properties = system_properties.SystemProperties(self.Adb()) 262 self._system_properties = system_properties.SystemProperties(self.Adb())
263 self._push_if_needed_cache = {}
263 264
264 if not self._api_strict_mode: 265 if not self._api_strict_mode:
265 logging.warning( 266 logging.warning(
266 'API STRICT MODE IS DISABLED.\n' 267 'API STRICT MODE IS DISABLED.\n'
267 'It should be enabled as soon as possible as it will eventually ' 268 'It should be enabled as soon as possible as it will eventually '
268 'become the default.') 269 'become the default.')
269 270
270 @property 271 @property
271 def system_properties(self): 272 def system_properties(self):
272 return self._system_properties 273 return self._system_properties
(...skipping 685 matching lines...) Expand 10 before | Expand all | Expand 10 after
958 """Pushes |host_path| to |device_path|. 959 """Pushes |host_path| to |device_path|.
959 960
960 Works for files and directories. This method skips copying any paths in 961 Works for files and directories. This method skips copying any paths in
961 |test_data_paths| that already exist on the device with the same hash. 962 |test_data_paths| that already exist on the device with the same hash.
962 963
963 All pushed files can be removed by calling RemovePushedFiles(). 964 All pushed files can be removed by calling RemovePushedFiles().
964 """ 965 """
965 MAX_INDIVIDUAL_PUSHES = 50 966 MAX_INDIVIDUAL_PUSHES = 50
966 assert os.path.exists(host_path), 'Local path not found %s' % host_path 967 assert os.path.exists(host_path), 'Local path not found %s' % host_path
967 968
969 # See if the file on the host changed since the last push (if any) and
970 # return early if it didn't. Note that this shortcut assumes that the tests
971 # on the device don't modify the files.
972 if not os.path.isdir(host_path):
973 if host_path in self._push_if_needed_cache:
974 host_path_mtime = self._push_if_needed_cache[host_path]
975 if host_path_mtime == os.stat(host_path).st_mtime:
976 return
977
968 def GetHostSize(path): 978 def GetHostSize(path):
969 return int(cmd_helper.GetCmdOutput(['du', '-sb', path]).split()[0]) 979 return int(cmd_helper.GetCmdOutput(['du', '-sb', path]).split()[0])
970 980
971 size = GetHostSize(host_path) 981 size = GetHostSize(host_path)
972 self._pushed_files.append(device_path) 982 self._pushed_files.append(device_path)
973 self._potential_push_size += size 983 self._potential_push_size += size
974 984
975 changed_files = self.GetFilesChanged(host_path, device_path) 985 changed_files = self.GetFilesChanged(host_path, device_path)
976 logging.info('Found %d files that need to be pushed to %s', 986 logging.info('Found %d files that need to be pushed to %s',
977 len(changed_files), device_path) 987 len(changed_files), device_path)
978 if not changed_files: 988 if not changed_files:
979 return 989 return
980 990
981 def Push(host, device): 991 def Push(host, device):
982 # NOTE: We can't use adb_interface.Push() because it hardcodes a timeout 992 # NOTE: We can't use adb_interface.Push() because it hardcodes a timeout
983 # of 60 seconds which isn't sufficient for a lot of users of this method. 993 # of 60 seconds which isn't sufficient for a lot of users of this method.
984 push_command = 'push %s %s' % (host, device) 994 push_command = 'push %s %s' % (host, device)
985 self._LogShell(push_command) 995 self._LogShell(push_command)
986 996
987 # Retry push with increasing backoff if the device is busy. 997 # Retry push with increasing backoff if the device is busy.
988 retry = 0 998 retry = 0
989 while True: 999 while True:
990 output = self._adb.SendCommand(push_command, timeout_time=30 * 60) 1000 output = self._adb.SendCommand(push_command, timeout_time=30 * 60)
991 if _HasAdbPushSucceeded(output): 1001 if _HasAdbPushSucceeded(output):
1002 if not os.path.isdir(host_path):
1003 self._push_if_needed_cache[host] = os.stat(host).st_mtime
992 return 1004 return
993 if retry < 3: 1005 if retry < 3:
994 retry += 1 1006 retry += 1
995 wait_time = 5 * retry 1007 wait_time = 5 * retry
996 logging.error('Push failed, retrying in %d seconds: %s' % 1008 logging.error('Push failed, retrying in %d seconds: %s' %
997 (wait_time, output)) 1009 (wait_time, output))
998 time.sleep(wait_time) 1010 time.sleep(wait_time)
999 else: 1011 else:
1000 raise Exception('Push failed: %s' % output) 1012 raise Exception('Push failed: %s' % output)
1001 1013
(...skipping 755 matching lines...) Expand 10 before | Expand all | Expand 10 after
1757 """ 1769 """
1758 def __init__(self, output): 1770 def __init__(self, output):
1759 self._output = output 1771 self._output = output
1760 1772
1761 def write(self, data): 1773 def write(self, data):
1762 data = data.replace('\r\r\n', '\n') 1774 data = data.replace('\r\r\n', '\n')
1763 self._output.write(data) 1775 self._output.write(data)
1764 1776
1765 def flush(self): 1777 def flush(self):
1766 self._output.flush() 1778 self._output.flush()
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698