U
    8Yc                     @   s   d dl Zd dlmZ d dlZd dlZd dlZ	ddl
mZmZ ddlmZmZ ddlmZ ddlmZmZmZ eedZd	d
 ZdddZdddZdddZdd Z dddZ!e" dfddZ#dd Z$dS )    N)glob   )ConversionErrorInvalidArchiveError)CondaTarBZ2libarchive_enabled)CondaFormat_v2)TemporaryDirectoryrm_rfget_executor).tar.bz2.condac              
      s|   g g  }t D ]L\ }}|D ]"}t jt j | q"| fdd|D  qfdd|D  }|S )Nc                 3   s&   | ]}t jt j |V  qd S N)_ospathrelpathjoin.0_)dpprefix 9lib/python3.8/site-packages/conda_package_handling/api.py	<genexpr>   s     z!_collect_paths.<locals>.<genexpr>c                    s&   g | ] t  fd dD s qS )c                 3   s   | ]}|  tj V  qd S r   )
startswithr   sep)r   fr   r   r   r      s     z,_collect_paths.<locals>.<listcomp>.<genexpr>)any)r   )
file_pathsr   r   
<listcomp>   s    z"_collect_paths.<locals>.<listcomp>)r   walkappendr   r   r   extend)r   Z	dir_pathsZdn	filenamesr   	file_listr   )r   r    r   r   _collect_paths   s    
 r'   Tc                 C   sB   d }t D ] }| |r| d t|  }q|r>|s>tj|}|S r   )SUPPORTED_EXTENSIONSendswithlenr   r   basename)in_fileabspathdirnameextr   r   r   get_default_extracted_folder   s    
r0   c                 C   s   |rHt j|r|rtdt j|sjt jt j|p>t  |}n"t j|p\t j| t| dd}t j	|st 
| t D ]"}|| r|j| ||d  qqtd| tt d S )Nzdest_dir and prefix both provided as abs paths.  If providing both, prefix can be abspath, but dest dir must be relative (relative to prefix)Fr-   )
componentsGDidn't recognize extension for file '{}'.  Supported extensions are: {})r   r   isabs
ValueErrornormpathr   getcwdr.   r0   isdirmakedirsr(   values	supportedextractformatlistkeys)fndest_dirr2   r   r=   r   r   r   r<   (   s$     


 
r<   c           
      K   s   |st  }|d krt| }nHt|trfz.t|}| }W 5 Q R X dd |D }W n    Y nX d }t D ]l}|	|rrz|j
| |||f|}W  qW qr tk
r }	 z |rt j|rt| |	W 5 d }	~	X Y qrX qrtd|tt |S )Nc                 S   s   g | ]}|  qS r   )stripr   r   r   r   r!   J   s     zcreate.<locals>.<listcomp>r3   )r   r7   r'   
isinstancestropen	readlinesr(   r:   r;   create	Exceptionr   isfile_rm_rfr5   r=   r>   r?   )
r   r&   out_fn
out_folderkwr   dataoutr=   errr   r   r   rG   @   s4    




 
rG   c                 K   s  t | dd}ddlm} |s0td| tf  d S tj||| }d}tj|rfd|kr|d rt	|d}z^t
| |d	 t|}	t||	tj|fd
|i| |||\}
}}|s|rtt||}W n* tk
r } zt|}W 5 d }~X Y nX W 5 Q R X | ||fS )NFr1   r   validate_converted_files_matchzBInput file %s doesn't have a supported extension (%s), skipping it Zforce)dir)rA   rL   )r0   validaterR   printr(   r   r   r   lexists_TemporaryDirectoryr<   r'   rG   r+   rD   r   rH   )r@   out_extrL   rM   r+   rR   rK   errorsZtmpr&   r   Zmissing_filesZmismatching_sizeser   r   r   _convert`   s0       
$r\   c              
   K   s   |st j| pt  }tt| }| drH|tt| d| }n"| drj|tt| d| }i }tj	t
|ddt}t|`}tjtf||d|}	||	|D ]4\}
}}|d|
  |  |r|||
< t| qW 5 Q R X W 5 Q R X |S )Nr   r   FZtotalZleave)rY   rL   zConverted: %s)r   r   r.   r7   set_globr)   replace_tqdmtqdmr*   _get_executor
_functoolspartialr\   mapset_descriptionupdaterJ   )r,   rY   rL   	processesrM   ZflistZfailed_filestexecutorZ	convert_fr@   rK   rZ   r   r   r   	transmutey   s,    



rl   c              
      s*  ddl m  s    fddtD }dd | D }| D ]$\}}|kr^qL|dd |D M }qLtth }	i }
tjt|tt d dd	~}t	|d
h}|	D ]\fdd}|
||D ]:\}}}|d|  |  |s|rtt|||
|< qqW 5 Q R X W 5 Q R X |
S )Nr   rQ   c              	      s$   i | ]}|t tj | qS r   )r_   r   r   r   )r   r/   )glob_pattern
target_dirr   r   
<dictcomp>   s    z%verify_conversion.<locals>.<dictcomp>c                 S   s   h | ]\}}| |d qS rS   r`   r   r/   r   r   r   r   	<setcomp>   s     z$verify_conversion.<locals>.<setcomp>c                 S   s   h | ]\}}| |d qS rp   rq   rr   r   r   r   rs      s     Fr]   )Zmax_workersc                    s   |   dS )N)Zref_extZsubjectr   )r@   )	other_extreference_extrR   r   r   <lambda>   s   z#verify_conversion.<locals>.<lambda>zValidating %s)rU   rR   r)   r(   itemsr^   ra   rb   r*   Z	_Executorrf   rg   rh   rD   r   )rm   rn   ru   Ztmpdir_rootri   Zfile_sets_by_extZmatchesr/   pathsZ
other_extsrZ   rj   rk   Z	verify_fnr@   ZmissingZmismatchingr   )rm   rt   ru   rn   rR   r   verify_conversion   s.    
 *ry   c                 C   s8   t  D ]}|| r|| } q4qtd| |S )zWFor the new pkg format, we return the size and hashes of the inner pkg part of the filez"Don't know what to do with file {})r(   r:   r;   get_pkg_detailsr5   r=   )r,   r=   Zdetailsr   r   r   rz      s    

rz   )T)NNN)N)Nr   )%osr   r   r_   	functoolsrd   ZtempfileZ	_tempfilerb   ra   
exceptionsr   r   Ztarballr   Z_CondaTarBZ2r   Z	conda_fmtr   Z_CondaFormat_v2Zutilsr	   rX   r
   rJ   r   rc   r(   r'   r0   r<   rG   r\   rl   Z
gettempdirry   rz   r   r   r   r   <module>   s*   



 
 
