@@ -491,6 +491,20 @@ def fs_cat(self, src, chunk_size=256):
491491 )
492492 self .exec_ (cmd , data_consumer = stdout_write_bytes )
493493
494+ def fs_cp (self , src , dest , chunk_size = 256 , progress_callback = None ):
495+ if progress_callback :
496+ src_size = int (self .exec_ ("import os\n print(os.stat('%s')[6])" % src ))
497+ written = 0
498+ self .exec_ ("fr=open('%s','rb')\n r=fr.read\n fw=open('%s','wb')\n w=fw.write" % (src , dest ))
499+ while True :
500+ data_len = int (self .exec_ ("d=r(%u)\n w(d)\n print(len(d))" % chunk_size ))
501+ if not data_len :
502+ break
503+ if progress_callback :
504+ written += data_len
505+ progress_callback (written , src_size )
506+ self .exec_ ("fr.close()\n fw.close()" )
507+
494508 def fs_get (self , src , dest , chunk_size = 256 , progress_callback = None ):
495509 if progress_callback :
496510 src_size = int (self .exec_ ("import os\n print(os.stat('%s')[6])" % src ))
@@ -584,18 +598,21 @@ def fname_cp_dest(src, dest):
584598 srcs = args [:- 1 ]
585599 dest = args [- 1 ]
586600 if dest .startswith (":" ):
587- op = pyb .fs_put
588- fmt = "cp %s :%s"
589- dest = fname_remote (dest )
601+ op_remote_src = pyb .fs_cp
602+ op_local_src = pyb .fs_put
590603 else :
591- op = pyb .fs_get
592- fmt = "cp :%s %s"
604+ op_remote_src = pyb .fs_get
605+ op_local_src = lambda src , dest , ** _ : __import__ ( "shutil" ). copy ( src , dest )
593606 for src in srcs :
594- src = fname_remote (src )
595- dest2 = fname_cp_dest (src , dest )
596607 if verbose :
597- print (fmt % (src , dest2 ))
598- op (src , dest2 , progress_callback = progress_callback )
608+ print ("cp %s %s" % (src , dest ))
609+ if src .startswith (":" ):
610+ op = op_remote_src
611+ else :
612+ op = op_local_src
613+ src2 = fname_remote (src )
614+ dest2 = fname_cp_dest (src2 , fname_remote (dest ))
615+ op (src2 , dest2 , progress_callback = progress_callback )
599616 else :
600617 op = {
601618 "cat" : pyb .fs_cat ,
0 commit comments