@@ -491,6 +491,20 @@ def fs_cat(self, src, chunk_size=256):
491
491
)
492
492
self .exec_ (cmd , data_consumer = stdout_write_bytes )
493
493
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
+
494
508
def fs_get (self , src , dest , chunk_size = 256 , progress_callback = None ):
495
509
if progress_callback :
496
510
src_size = int (self .exec_ ("import os\n print(os.stat('%s')[6])" % src ))
@@ -584,18 +598,21 @@ def fname_cp_dest(src, dest):
584
598
srcs = args [:- 1 ]
585
599
dest = args [- 1 ]
586
600
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
590
603
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 )
593
606
for src in srcs :
594
- src = fname_remote (src )
595
- dest2 = fname_cp_dest (src , dest )
596
607
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 )
599
616
else :
600
617
op = {
601
618
"cat" : pyb .fs_cat ,
0 commit comments