Index: build/android/pylib/android_commands.py |
diff --git a/build/android/pylib/android_commands.py b/build/android/pylib/android_commands.py |
index c5fa3d436df7ce30de661d2eb350fdd10ae6956c..472a11dbae4734ec41317f3a47acb163905bca65 100644 |
--- a/build/android/pylib/android_commands.py |
+++ b/build/android/pylib/android_commands.py |
@@ -1800,6 +1800,98 @@ class AndroidCommands(object): |
logging.error('Still showing a %s dialog for %s' % match.groups()) |
return package |
+ def EfficientDeviceDirectoryCopy(self, source, dest): |
+ """ Copy a directory efficiently on the device |
+ |
+ Copy new and changed files the source directory to the destination directory |
+ and remove added files. This is in some cases much faster than cp -r. |
+ |
+ Args: |
+ source: absolute path of source directory |
+ dest: absolute path of destination directory |
+ """ |
+ logging.info("In EfficientDeviceDirectoryCopy %s %s" % (source, dest)) |
bulach
2014/03/13 17:22:57
nit: s/"/'/
also, s/%/,/
that is, logging.info t
|
+ script = """ |
bulach
2014/03/13 17:22:57
would it make sense to have this in a separate fil
aberent
2014/03/13 18:32:45
Done.
|
+source=$1 |
+dest=$2 |
+echo copying $source to $dest |
+ |
+delete_extra() { |
+ # Don't delete symbolic links, since doing so deletes the vital lib link. |
+ if [ ! -L "$1" ] |
+ then |
+ if [ ! -e "$source/$1" ] |
+ then |
+ echo rm -rf "$dest/$1" |
+ rm -rf "$dest/$1" |
+ elif [ -d "$1" ] |
+ then |
+ for f in "$1"/* |
+ do |
+ delete_extra "$f" |
+ done |
+ fi |
+ fi |
+} |
+ |
+copy_if_older() { |
+ if [ -d "$1" ] && [ -e "$dest/$1" ] |
+ then |
+ if [ ! -e "$dest/$1" ] |
+ then |
+ echo cp -a "$1" "$dest/$1" |
+ cp -a "$1" "$dest/$1" |
+ else |
+ for f in "$1"/* |
+ do |
+ copy_if_older "$f" |
bulach
2014/03/13 17:22:57
indent
aberent
2014/03/13 18:32:45
Done.
|
+ done |
+ fi |
+ elif [ ! -e "$dest/$1" ] || [ "$1" -ot "$dest/$1" ] |
+ then |
+ echo cp -a "$1" "$dest/$1" |
+ cp -a "$1" "$dest/$1" |
+ fi |
+} |
+ |
+if [ -e "$dest" ] |
+then |
+ echo cd "$dest" |
+ cd "$dest" |
+ for f in ./* |
+ do |
+ if [ -e "$f" ] |
+ then |
+ delete_extra "$f" |
+ fi |
+ done |
+else |
+ echo mkdir "$dest" |
+ mkdir "$dest" |
+fi |
+echo cd "$source" |
+cd "$source" |
+for f in ./* |
+do |
+ if [ -e "$f" ] |
+ then |
+ copy_if_older "$f" |
+ fi |
+done |
+""" |
+ temp_script_file = self._GetDeviceTempFileName( |
+ AndroidCommands._TEMP_SCRIPT_FILE_BASE_FMT) |
+ self.SetFileContents(temp_script_file, script) |
+ self.EnableAdbRoot |
+ out = self.RunShellCommand("sh %s %s %s" % (temp_script_file, source, dest), |
bulach
2014/03/13 17:22:57
nit: s/"/'/
aberent
2014/03/13 18:32:45
Done.
|
+ timeout_time=120) |
+ if self._device: |
+ device_repr = self._device[-4:] |
+ else: |
+ device_repr = '????' |
+ for line in out: |
+ logging.info('[%s]> %s', device_repr, line) |
bulach
2014/03/13 17:22:57
I think logging is already hooked up to have a dev
aberent
2014/03/13 18:32:45
No, the device is added by RunShellCommand, but th
|
+ |
class NewLineNormalizer(object): |
"""A file-like object to normalize EOLs to '\n'. |