
    5i-                         d Z ddlmZmZmZmZ ddlZddlZddlZddl	Z	ddl
Z
ddlZddlmZmZmZmZmZ ddlmZ ddlmZ dd	lmZ dd
lmZ d Zd Zd Zd Zd Zd Zd Z d Z!ddZ"d Z#d Z$y)zG
This module handles download commands for the dx command-line client.
    )print_functionunicode_literalsdivisionabsolute_importN   )resolve_existing_pathget_first_pos_of_charis_project_explicitobject_exists_in_projectis_jbor_str)err_exit   )try_call)fill)	pathmatchc                     d }t         j                  d   j                  t         j                        D ].  }t         j                  j                  ||       } ||      s,|c S  y )Nc                     t         j                  j                  |       xr$ t        j                  | t         j                        S N)ospathisfileaccessX_OK)fpaths    s/home/marpiech/ifpan-abm-pgxpred/analysis/marpiech-gwas-test/venv/lib/python3.12/site-packages/dxpy/cli/download.pyis_exez_which.<locals>.is_exe'   s)    ww~~e$B5"'')BB    PATH)r   environsplitpathsepr   join)programr   r   exe_files       r   _whichr%   &   sW    C 

6"((4 77<<g.(O r   c                    t        d      }|t        d       |d| g}	 t        d       t        j                  |      }j                         j                         }t        |      dk7  rt        dt        |      z          |d   }||k7  rt        d	|z   d
z   |z          t        d       y # t        j
                  $ r t        dt        |      z          Y w xY w)Nmd5sumz&md5sum is not installed on this systemz-bzCalculating checksumzFailed to run md5sum: r   zmd5sum returned weird results: r   zChecksum doesn't match z  expected:zChecksum correct)
r%   r   print
subprocesscheck_outputCalledProcessErrorstrstripr    len)filename	md5digest
md5sum_execmdcmd_outline
actual_md5s          r   _verifyr6   2   s    !J9:tX
&C6$%))#. ==?  "D
4yA~2SY>?aJY*Z7-G)ST	
 (( 6)CH456s    B, ,*CCc                 J   |j                   s9t        j                  j                  |      rt	        t        d|z   dz                |d   dk7  r,t         dj                  di |t        j                         y |d   dk7  r,t         d	j                  di |t        j                         y 	 |j                  }	 t        |      j                  d      |j                  nd}t        j                   |d   ||| ||       y # t        $ r d
}Y Uw xY w#  t	                Y y xY w)NError: path "/" already exists but -f/--overwrite was not setclassfilez+Skipping non-file data object {name} ({id})r;   stateclosedz4Skipping file {name} ({id}) because it is not closedFsymlink_max_tries   id)show_progressprojectdescribe_outputr?    )	overwriter   r   existsr   r   r(   formatsysstderrrB   AttributeErrorvarsgetr?   dxpydownload_dxfile)rC   	file_descdest_filenameargsrB   r?   s         r   download_one_filerS   F   s   >>77>>-(T/M9<mmnoV#B;BBOYOVYV`V`aX%KDKKXiX_b_i_ij**
6:4jnnEX6Y6eD22km%dO)*7$+,5.?	A 	  
s   /D <AD DDD"c                 .    t        j                  |        y r   )loggingdebug)msgs    r   do_debugrX   f   s    MM#r   c           	          t        dj                  |             |t        dj                  |             |j                  s9t        j                  j                  |      rt        t        d|z   dz                |d   dk7  r,t         dj                  di |t        j                         y 	 |j                  }	 t        j                  |d
   ||||| |       y # t        $ r d	}Y .w xY w#  t                Y y xY w)Nz:download.py#download_one_database_file - src_filename = {}z9download.py#download_one_database_file - file_status = {}r8   r9   r:   databasez/Skipping non-database data object {name} ({id})r<   FrA   )rB   rC   rD   rE   )rX   rH   rF   r   r   rG   r   r   r(   rI   rJ   rB   rK   rN   download_dxdatabasefile)rC   database_descrQ   src_filenamefile_statusrR   rB   s          r   download_one_database_filer_   k   s    IPPQ]^_LSST_`a>>77>>-(T/M9<mmnoW+F?FFWW^a^h^hi**
$$$')	+	  
s   1C >C/ C,+C,/C=c                     t         j                  j                  |       sOt         j                  j                  |       rt	        t        d| z   dz                t        j                  |        y y )Nr8   z'" already exists and is not a directory)r   r   isdirrG   r   r   makedirs)ds    r   _ensure_local_dirrd      sJ    77==77>>!T/A-0YYZ[
A r   c                 B    t        d|       dkD  xs t        d|       dkD  S )N*?)r	   r   s    r   _is_globrj      s'     d+b0Y4I#t4TWY4YYr   c                 
   | j                  d      st        j                  |k7  r1| t        j                  j                  | j                  d            }}nt        j                  j                  dd      }t        j                  j                  ||       t        j                  j                  t        j                  j                  ||       j                  d            }}t        |      dkD  r|j                  d      }||fS )N/	DX_CLI_WDr   )
startswithrN   WORKSPACE_IDr   r   dirnamerstripconfigrM   r"   r.   )r   rC   abs_pathstrip_prefixwds        r   _rel2absrv      s    st00G;!%rwwt{{37G'H,[[__[$/!#b$!7VXZ^I_IfIfgjIk9l,
8}q??3'\!!r   c           	          | D ]V  }| |   D ]L  }|d   }|xs3 t         j                  j                  ||d   j                  dd            }t	        ||||       N X y )Ndescribenamerl   z%2F)r   r   r"   replacerS   )filesdestdirrR   rQ   rC   frP   dests           r   _download_filesr      sh     >w 	>A*I `BGGLL)F:K:S:STWY^:_$`Dgy$=	>>r   c           	         	 |j                   }| D ]  }| |   D ]  \  }}|j                  st        d|z   dz          |j	                  |      sJ t
        j                  j                  ||t        |      d  j                  d            }	 t        j                  ||||j                  |         y # t        $ r d}Y w xY w#  t                Y xY w)NFzError: "z9" is a folder but the -r/--recursive option was not givenrl   )folderrF   rB   )rB   rK   	recursiver   rn   r   r   r"   r.   lstriprN   download_folderrF   )foldersr|   rR   rB   rC   r   rt   folder_destdirs           r   _download_foldersr      s    **  
$+G$4 		 FL>>f,/jjk$$\232WW\\'6#l:K:L3M3T3TUX3YZN$$WnVW[WeWe3@B		
  
s   B3 
$C3C CCc           
         t        j                  t              t        j                  t              d}}}g g }}| j                  D ]o  }ddi}| j                  st        |      r|j                  ddd       |j                  dddddddi       t        t        |fi |\  }}	|	g }	nt        |	t              s|	g}	t        |      xs t        |      }
t        |      rt        |	      dk(  sJ |	d   d   d	   g }t        d
|      }|dk\  r||dz   d  }t        |      \  }t        j                   j#                  |      }t%        j&                  |d      }t)        j*                  ||      }d|v rt        |      dkD  r|j-                  d       t        |	      dk(  r2t        |      dk(  r$t/        t1        dj3                  |                   |
st$        j4                  j6                  | j8                  s8t        |	      dkD  r*|
r(t;        fd|	D              st/        t1        d             |   j=                  |	       |   j=                  fd|D               |t        |	      t        |      z   z  }|j=                  d |	D               |j=                  fd|D               r t        |      dkD  rft        |      dkD  rXt?        |      t?        |      z  }t        |      dkD  r3d}|djA                  tC        |            z  }t/        t1        |             | jD                  t        jF                         d }}n|dkD  rLt        j                   jI                  | jD                        st/        t1        d             | jD                  d }}nt        j                   jK                  | jD                        r| jD                  d }}nj| jD                  jM                  d      r/t/        t1        dj3                  | jD                                     n t        jF                         | jD                  }}tO        ||        tQ        |||        y )Nr   allow_empty_stringFT)
allow_multall_multrx   )partssizedrivemd5checksumTyper   rC   :)recurserl   z1Error: {path} is neither a file nor a folder nameri   c              3   B   K   | ]  }t        |d    d           yw)rx   rA   N)r   ).0r}   rC   s     r   	<genexpr>zdownload.<locals>.<genexpr>   s#     gST0:t1DgNgs   z?Error: specified project does not contain specified file objectc              3   &   K   | ]  }|f 
 y wr   rE   r   r}   rt   s     r   r   zdownload.<locals>.<genexpr>  s     'TaL(9'Ts   c              3   ,   K   | ]  }|d    d     yw)rx   ry   NrE   )r   r}   s     r   r   zdownload.<locals>.<genexpr>  s     G1:v.Gs   c              3   X   K   | ]!  }|t              d  j                  d       # y w)Nrl   )r.   r   r   s     r   r   zdownload.<locals>.<genexpr>  s)     W1S./077<Ws   '*zmError: The following paths are both file and folder names, and cannot be downloaded to the same destination: z, zPError: When downloading multiple objects, --output must be an existing directoryz Error: {path} could not be found)rQ   ))collectionsdefaultdictlistpathsallrj   updater   r   
isinstancer
   r   r.   r	   rv   r   r   rp   rN   list_subfoldersr   filterremover   r   rH   DXFileNO_PROJECT_HINTlightweightanyextendsetr"   sortedoutputgetcwdrG   ra   endswithr   r   )rR   folders_to_getfiles_to_getcountfoldernames	filenamesr   resolver_kwargs
folderpathmatching_filespath_has_explicit_projmatching_folders	colon_posrs   parent_folderfolder_listingname_conflictsrW   r|   rQ   rC   rt   s                       @@r   downloadr      s   *5*A*A$*GI`I`aeIfhi%LNK

 GX 0788x~""$D#IJ 	
d596:48=A	-/  0 	1 /77Ld.fVe.f+^!NND1,-N "5T!:!Ok$>Ot~&!+++$Q'
3I>G-c48IA~IMN+%-dG%<"HlGGOOH5M!11'=RWXN(//I&&3/?+@1+D !'',~!#,<(=(BTMTTZ^T_`a &kk11G N#a'&gXfgg_`aW$$^4w&&'TCS'TU^$s+;'<<<GGGWFVWWOGXR 9~c+.2Y#k*::~"CC499VN344CT#Y{{!#d	ww~~dkk*Tlmn!%d	t{{	#!%d			c	"8??T[[?QRS!#dkkngt4L'4}Mr   r   )%__doc__
__future__r   r   r   r   r   r   r)   rI   rU   rN   utils.resolverr   r	   r
   r   r   
exceptionsr    r   dxpy.utils.printingr   
dxpy.utilsr   r%   r6   rS   rX   r_   rd   rj   rv   r   r   r   rE   r   r   <module>r      sx   " S R  	  
  E E !  &  (@
>Z">&bNr   