
    e                         d Z ddlmZ ddlmZ ddlmZ ddlmZ ddlZddlZddl	Z	ddl
Z
ddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZ 	 ddededededededdfdZd Z G d de      Zy)z.Download utils for Artifact Registry commands.    )absolute_import)division)unicode_literals)futuresN)transfer)requests)log)
console_io)
transports)files	dest_pathfile_res_name	file_nameallow_overwrite
chunk_sizeparallelismreturnc                    t        j                         }t        j                  j	                  |       } t        j                  j                  |       r0|s.t        j                  d|  d       t        j                  d       t        j                         }|j                  |      }|j                  j                  |      }	| dz   }
	 t        j                  |
      5 }|j!                  |	j"                         ddd       |j&                   d	| d
}|	j"                  |k  rd}|	j"                  |z  }g }t)        d|      D ]M  }||dz
  k  r |j+                  ||z  |dz   |z  dz
  f       +|j+                  ||z  |	j"                  dz
  f       O t-        d| ||	j"                        5 }t/        j0                  |      5 }t3        |      D cg c]%  \  }\  }}|j5                  t6        ||
||||||	      ' }}}}t/        j8                  |      D ]  }	 |j;                           	 ddd       ddd       |r4t        j                  j                  |       rt        j>                  |        t        j@                  |
|        y# 1 sw Y   xY w# t$        $ r2 t        j                  d|
 d       t        j                  d       Y w xY wc c}}}w # t<        $ r}|d}~ww xY w# 1 sw Y   xY w# 1 sw Y   xY w)z!Downloads a file to a local path.zFile z already exists.   )namez.tmpNzTemporary file za already exists (likely from a previous failed download attempt). Please remove it and try again.zv1/z:download?alt=mediar   zDownloading )labelr   total)max_workers)!r   	GetClientospath
expanduserexistsr	   errorsysexitGetMessages<ArtifactregistryProjectsLocationsRepositoriesFilesGetRequest%projects_locations_repositories_filesGetr   BinaryFileWritertruncate	sizeBytesFileExistsErrorurlrangeappendSharedProgressBarr   ThreadPoolExecutor	enumeratesubmit_DownloadRangeas_completedresult	Exceptionremoverename)r   r   r   r   r   r   clientmfile_reqfile_restemp_dest_pathfdownload_url
range_sizerangesiprogress_barexecutorstartendfsfutureexcs                          9lib/googlecloudsdk/command_lib/artifacts/download_util.pyDownloadrI   #   s    & gg  +) WW^^IIIi[ 012HHQK!KK L ( 99==hG( v%.				/1jj##$ 
0 JJ<s=/1DE, +%K!![0*&K a;?mmQ^a!ez%9A%=>?mmQ^X%7%7!%;<=	 ! 9+& 		#	#	< "+6!2 "3oa% //
 "3 	  ((,&	
--/ -! 
=6 	2IIi))NI&q 
0	/	 II
.) *N 	N HHQK<$  	)	' 
=	< s   
J J;J .K=K1*K?K1K,K1/K=JJ 7KKK1	K.	'K)	)K.	.K11K:	6K==Lc                     d|dz   |d}t        j                  |      }	t        j                  |      5 }
|
j	                         t
        j                  j                  |
|	||      }t        j                  d      |_
        	 |j                   fd       |j                  j                          	 ddd       y# |j                  j                          w xY w# 1 sw Y   yxY w)	z3Downloads a range of bytes to the placeholder file.Tr   )auto_transfer
total_sizeprogressr*   )	chunksizer7   N)response_encodingc                 B    j                  |j                  z
        S N)SetProgressrM   )_dlrA   rC   thread_indexs     rH   <lambda>z _DownloadRange.<locals>.<lambda>   s    !9!9kkE!"    )callback)jsondumpsr   r&   seekr   rI   FromDatar   GetApitoolsTransport
bytes_httpStreamMediastreamclose)rU   r;   r=   rC   rD   r   rA   r7   ser_dict	json_datar<   ds   `  `  `     rH   r1   r1   z   s     !G	( jj")n-FF5M""		 	# 	A 22TJALmm   hhnn# .-" hhnn# .-s$   AC#	C C#C  C##C,c                   (    e Zd ZdZd Zd Zd Zd Zy)r-   zDA thread safe progress bar that allows adding increamental progress.c                     dg|z  | _         || _        t        j                  |i || _        t        j                         | _        y )Nr   )completed_per_threadr   r
   ProgressBar_progress_bar	threadingLock_lock)selfr   r   argskwargss        rH   __init__zSharedProgressBar.__init__   s>    !"k 1DDJ#//@@D!DJrW   c                 :    | j                   j                          | S rQ   )ri   	__enter__)rm   s    rH   rr   zSharedProgressBar.__enter__   s      "KrW   c                 >    | j                   j                  |||       y rQ   )ri   __exit__)rm   exc_type	exc_value	tracebacks       rH   rt   zSharedProgressBar.__exit__   s    )Y?rW   c                     | j                   5  || j                  |<   | j                  j                  t	        | j                        | j
                  z         d d d        y # 1 sw Y   y xY wrQ   )rl   rg   ri   rR   sumr   )rm   rU   ps      rH   rR   zSharedProgressBar.SetProgress   sN    	01d-
$$
d''
(4::
5 
s   AA!!A*N)__name__
__module____qualname____doc__rp   rr   rt   rR    rW   rH   r-   r-      s    L"@rW   r-   )r   )r~   
__future__r   r   r   
concurrentr   rY   r   r    rj   apitools.base.pyr   $googlecloudsdk.command_lib.artifactsr   googlecloudsdk.corer	   googlecloudsdk.core.consoler
   googlecloudsdk.core.credentialsr   googlecloudsdk.core.utilr   strboolintrI   r1   objectr-   r   rW   rH   <module>r      s    5 &  '   	 
  % 9 # 2 6 * T'T'T' T' 	T'
 T' T' 
T'n%P rW   