U
    8Yc                     @   s   d dl 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mZ d dl	Z	zddl
mZ dZW n ek
rt   dZY nX ddl
mZ dd	lmZ dd
lmZmZ e	eZdd Zdd Zdd ZdddZdd ZdddZG dd deZdS )    )ELOOPN)NamedTemporaryFile   )archive_utilsTF)utils)AbstractBaseFormat)CaseInsensitiveFileSystemErrorInvalidArchiveErrorc              
      sd  dt jj   fdd}t jtjdd}t j|rPtdddd	}t	~ |
td
d | |  |d|j }tj|dtjd \}}|d d}fdd|D }t |j W 5 Q R X W 5 Q R X t|}	t|}
|
|	 }|D ]}|| qt|}
t|	t|
kr6||	|
  tt| fddd}ntt||d}|S )z7Sort by filesize or by binsort, to optimize compressioninfoc                    s   t t j| jpd}t|   }|r~t j| \}}t	dd|}|sjdt
t j| d  }ndtt
|d  }||fS )Ni z(\.dylib|\.so).*$z.sor   i )oslstatpathjoinst_sizeint
startswithsplitextresubhashdirnameabs)fZfsizeZ
info_order_ext
info_slashprefix =lib/python3.8/site-packages/conda_package_handling/tarball.pyorder   s    z_sort_file_order.<locals>.orderbinbinsortwz	.filelistF)modesuffixdeletec                 S   s   dt j |  d S )N.
)r   sep)xr   r   r   <lambda>,       z"_sort_file_order.<locals>.<lambda>z -t 1 -q -d -o 1000 {}T)shellstdoutzutf-8r(   c                    s"   g | ]}|  tj d d qS )r   )splitr   r)   ).0r   )r   r   r   
<listcomp>3   s   z$_sort_file_order.<locals>.<listcomp>c                    s   |    S N)r   )r   )r   r   r   r+   B   r,   )key)r   r   r)   r   sysr   existsr   r   	tmp_chdir
writelinesmapcloseformatname
subprocessPopenPIPEZcommunicatedecodestripr0   unlinksetremovelenextendlistsorted)r   filesr    r"   Zflcmdoutr   Z
files_lists1s2Zfollowedr   r   r   r   _sort_file_order   s8    
 rN   c              	   C   s0   t | d}|D ]}|| qW 5 Q R X d S )Nzw:bz2)tarfileopenadd)fullpathrI   tr   r   r   r   _create_no_libarchiveH   s    rT   c                 C   s   t | ||| d S r3   )r   Zcreate_archive)rR   rI   compression_filterfilter_optsr   r   r   _create_libarchiveN   s    rW    c           	   	   C   sX   t j||}t| |}|| }t| $ tr@t|||| n
t|| W 5 Q R X |S r3   )	r   r   r   rN   r   r7   libarchive_enabledrW   rT   )	r   rI   Ztmpdirbasenamer   rU   rV   Ztmp_pathrR   r   r   r   create_compressed_tarballR   s    
r[   c              	   C   sB   t j| st jt  | } t| t|  W 5 Q R X d S r3   )	r   r   isabsr   getcwdr   r7   r   Zextract_file)ZtarballZdir_pathr   r   r   _tar_xfc   s    r^   c                 C   sJ  |d kr| d d }t | d}tj |d}| D ]<}tj|js`tj|jt	 s6t
| d|jq6z|j|d W nP tk
r } z2|jtkrt| ||dnt
| dt|W 5 d }~X Y nX W 5 Q R X W 5 Q R X tjdrFt d	krFt|D ]4\}}}|D ]"}	tj||	}
t|
d	d	 qqd S )
Nirb)fileobjzcontains unsafe path: {})r   )Zpackage_locationZextract_locationZ	caused_byzfailed with error: {}Zlinuxr   )rP   rO   Z
getmembersr   r   r\   r<   realpathr   r]   r	   r;   Z
extractallIOErrorerrnor   r   strr5   platformgetuidwalkr   lchown)Ztarball_full_pathZdestination_directoryr`   Ztar_filemembererootdirsrI   fnpr   r   r   _tar_xf_no_libarchivej   s<    

*ro   c                   @   sD   e Zd Zedd Zedd Zee fddZedd Z	d	S )
CondaTarBZ2c                 C   s
   |  dS )N.tar.bz2)endswith)rm   r   r   r   	supported   s    zCondaTarBZ2.supportedc                 K   s   t j|st | t j| s<t jt jt  | } trzzt	| | W q t
k
rv   td t| | Y qX n
t| | d S )NzJFailed extraction with libarchive... falling back to python implementation)r   r   isdirmakedirsr\   normpathr   r]   rY   r^   r	   LOGZwarningro   )rm   Zdest_dirkwr   r   r   extract   s    
zCondaTarBZ2.extractc                 K   s>   t j|rt j|}t| ||t j|dddd}|S )Nrq   rX   Zbzip2)r   r   r\   r   r[   rZ   replace)r   Z	file_listZout_fnZ
out_folderrx   Zout_filer   r   r   create   s     zCondaTarBZ2.createc                 C   s,   t | }|j}t| d\}}|||dS )N)md5sha256)sizer|   r}   )r   statr   r   Z	checksums)Zin_filestat_resultr~   r|   r}   r   r   r   get_pkg_details   s    
zCondaTarBZ2.get_pkg_detailsN)
__name__
__module____qualname__staticmethodrs   ry   r   r]   r{   r   r   r   r   r   rp      s   

rp   )rX   )N)rc   r   r   r   r=   r5   rO   Ztempfiler   ZloggingrX   r   rY   ImportErrorr   Z	interfacer   
exceptionsr   r	   Z	getLogger__file__rw   rN   rT   rW   r[   r^   ro   rp   r   r   r   r   <module>   s0   

2 

"