3030 from pipes import quote as cmd_quote
3131
3232
33+ def _get_src_info (src ):
34+ """Get information about the contents of a folder; used in :meth:`Device.push`."""
35+ exists = os .path .exists (src )
36+ isfile = os .path .isfile (src )
37+ isdir = os .path .isdir (src )
38+ basename = os .path .basename (src )
39+ walk = None if not isdir else list (os .walk (src ))
40+
41+ return exists , isfile , isdir , basename , walk
42+
43+
3344class Device (Transport , Serial , Input , Utils , WM , Traffic , CPUStat , BatteryStats ):
3445 INSTALL_RESULT_PATTERN = "(Success|Failure|Error)\s?(.*)"
3546 UNINSTALL_RESULT_PATTERN = "(Success|Failure.*|.*Unknown package:.*)"
@@ -55,24 +66,22 @@ def _push(self, src, dest, mode, progress):
5566 sync .push (src , dest , mode , progress )
5667
5768 def push (self , src , dest , mode = 0o644 , progress = None ):
58- if not os .path .exists (src ):
69+ exists , isfile , isdir , basename , walk = _get_src_info (src )
70+ if not exists :
5971 raise FileNotFoundError ("Cannot find {}" .format (src ))
60- elif os .path .isfile (src ):
61- self ._push (src , dest , mode , progress )
62- elif os .path .isdir (src ):
6372
64- basename = os .path .basename (src )
73+ if isfile :
74+ self ._push (src , dest , mode , progress )
6575
66- for root , dirs , files in os .walk (src ):
67- subdir = root .replace (src , "" )
68- if subdir .startswith ("/" ):
69- subdir = subdir [1 :]
70- root_dir_path = os .path .join (basename , subdir )
76+ elif isdir :
77+ for root , dirs , files in walk :
78+ subdir = os .path .relpath (root , src )
79+ root_dir_path = os .path .normpath (os .path .join (basename , subdir ))
7180
72- self .shell (" mkdir -p {}/{}" .format (dest , root_dir_path ))
81+ self .shell (' mkdir -p "{}"' .format (os . path . normpath ( os . path . join ( dest , root_dir_path )) ))
7382
7483 for item in files :
75- self ._push (os .path .join (root , item ), os .path .join (dest , root_dir_path , item ), mode , progress )
84+ self ._push (os .path .normpath ( os . path . join (root , item )) , os .path .normpath ( os . path . join (dest , root_dir_path , item ) ), mode , progress )
7685
7786 def pull (self , src , dest ):
7887 sync_conn = self .sync ()
0 commit comments