30
30
from pipes import quote as cmd_quote
31
31
32
32
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
+
33
44
class Device (Transport , Serial , Input , Utils , WM , Traffic , CPUStat , BatteryStats ):
34
45
INSTALL_RESULT_PATTERN = "(Success|Failure|Error)\s?(.*)"
35
46
UNINSTALL_RESULT_PATTERN = "(Success|Failure.*|.*Unknown package:.*)"
@@ -55,24 +66,22 @@ def _push(self, src, dest, mode, progress):
55
66
sync .push (src , dest , mode , progress )
56
67
57
68
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 :
59
71
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 ):
63
72
64
- basename = os .path .basename (src )
73
+ if isfile :
74
+ self ._push (src , dest , mode , progress )
65
75
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 ))
71
80
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 )) ))
73
82
74
83
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 )
76
85
77
86
def pull (self , src , dest ):
78
87
sync_conn = self .sync ()
0 commit comments