@@ -27,6 +27,39 @@ def init_build(host, token, files, channel):
2727 r .raise_for_status ()
2828 return r .json ()
2929
30+ class ProgressFileReader :
31+ def __init__ (self , path , size ):
32+ self ._file = open (path , 'rb' )
33+ self ._size = size
34+ self ._sent = 0
35+ self ._start_time = time .time ()
36+ self ._last_print = self ._start_time
37+
38+ def __len__ (self ):
39+ return self ._size
40+
41+ def read (self , chunk_size = - 1 ):
42+ if chunk_size == - 1 :
43+ chunk_size = self ._size
44+ data = self ._file .read (chunk_size )
45+ if not data :
46+ elapsed = time .time () - self ._start_time
47+ speed = self ._size / elapsed / 1024 / 1024 if elapsed > 0 else 0
48+ print (' 100% - all bytes sent in {:.1f}s ({:.2f} MB/s), waiting for server response...' .format (elapsed , speed ))
49+ return data
50+ self ._sent += len (data )
51+ now = time .time ()
52+ if now - self ._last_print >= 5 :
53+ elapsed = now - self ._start_time
54+ speed = self ._sent / elapsed / 1024 / 1024 if elapsed > 0 else 0
55+ print (' {:.1f}% ({:.1f} / {:.1f} MB) {:.2f} MB/s' .format (
56+ self ._sent * 100 / self ._size , self ._sent / 1024 / 1024 , self ._size / 1024 / 1024 , speed ))
57+ self ._last_print = now
58+ return data
59+
60+ def close (self ):
61+ self ._file .close ()
62+
3063def upload_file (path , upload_info ):
3164 url = upload_info .get ('url' )
3265 headers = dict (upload_info .get ('headers' , {}))
@@ -37,28 +70,11 @@ def upload_file(path, upload_info):
3770 print ('Uploading {} ({:.1f} MB)' .format (path , size / 1024 / 1024 ))
3871 start_time = time .time ()
3972
40- def reader ():
41- sent = 0
42- last_print = time .time ()
43- with open (path , 'rb' ) as f :
44- while True :
45- chunk = f .read (256 * 1024 )
46- if not chunk :
47- break
48- sent += len (chunk )
49- now = time .time ()
50- if now - last_print >= 5 :
51- elapsed = now - start_time
52- speed = sent / elapsed / 1024 / 1024 if elapsed > 0 else 0
53- print (' {:.1f}% ({:.1f} / {:.1f} MB) {:.2f} MB/s' .format (
54- sent * 100 / size , sent / 1024 / 1024 , size / 1024 / 1024 , speed ))
55- last_print = now
56- yield chunk
57- elapsed = time .time () - start_time
58- speed = size / elapsed / 1024 / 1024 if elapsed > 0 else 0
59- print (' 100% - all bytes sent in {:.1f}s ({:.2f} MB/s), waiting for server response...' .format (elapsed , speed ))
60-
61- r = requests .put (url , data = reader (), headers = headers , timeout = 900 )
73+ body = ProgressFileReader (path , size )
74+ try :
75+ r = requests .put (url , data = body , headers = headers , timeout = 900 )
76+ finally :
77+ body .close ()
6278 print (' Server responded: {} ({:.1f}s total)' .format (r .status_code , time .time () - start_time ))
6379 if r .status_code != 200 :
6480 print ('Upload failed' , r .status_code )
0 commit comments