U
    &%eu"                     @   s  d 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
 ddlmZ ddlmZ ddlmZmZmZmZ ddlmZ eeZee ZzddlZee7 ZW n ek
r   ed Y nX zddlZee7 ZW n ek
r   ed	 Y nX ed
ddZee	e dddZ ee e!dddZ"eee!dddZ#eddddZ$ee!dddZ%d%eee!ddddZ&eeddd d!Z'd&eee
e dd"d#d$Z(dS )'zUtilities related archives.
    N)IterableListOptional)ZipInfo)InstallationError)BZ2_EXTENSIONSTAR_EXTENSIONSXZ_EXTENSIONSZIP_EXTENSIONS)
ensure_dirzbz2 module is not availablezlzma module is not available)returnc                  C   s   t d} t |  | S )zBGet the current umask which involves having to set it temporarily.r   )osumask)mask r   \/var/www/html/Darija-Ai-API/env/lib/python3.8/site-packages/pip/_internal/utils/unpacking.pycurrent_umask+   s    

r   )pathr   c                 C   sh   |  d d} d| krHd| kr4| d| dk s<d| krH| ddS d| kr\| ddS | dgS d S )N/\    )lstripfindsplitr   r   r   r   split_leading_dir2   s    r   )pathsr   c                 C   sD   d}| D ]6}t |\}}|s" dS |dkr0|}q||kr dS qdS )zyReturns true if all the paths have the same leading path name
    (i.e., everything is in one subdirectory in an archive)NFT)r   )r   common_prefixr   prefixrestr   r   r   has_leading_dir>   s    r!   )	directorytargetr   c                 C   s0   t j| }t j|}t j||g}||kS )zL
    Return true if the absolute path of target is within the directory
    )r   r   abspathcommonprefix)r"   r#   abs_directory
abs_targetr   r   r   r   is_within_directoryM   s    r(   c                 C   s   t | dt  @ dB  dS )zx
    Make file present at path have execute for user/group/world
    (chmod +x) is no-op on windows per python docs
    i  I   N)r   chmodr   r   r   r   r   2set_extracted_file_to_default_mode_plus_executableX   s    r+   )infor   c                 C   s$   | j d? }t|o t|o |d@ S )N   r)   )external_attrboolstatS_ISREG)r,   moder   r   r   zip_item_is_executable`   s    
r3   T)filenamelocationflattenr   c              
   C   s  t | t| d}ztj|dd}t| o0|}| D ]}|j}|}|rXt	|d }t
j||}t
j|}	t||sd}
t|
| |||ds|drt | q:t |	 ||}z&t|d}t|| W 5 Q R X W 5 |  t|rt| X q:W 5 |  X d	S )
a  
    Unzip the file (with path `filename`) to the destination `location`.  All
    files are written based on system defaults and umask (i.e. permissions are
    not preserved), except that regular file members with any execute
    permissions (user, group, or world) have "chmod +x" applied after being
    written. Note that for windows, any execute changes using os.chmod are
    no-ops per the python docs.
    rbT)
allowZip64r   zQThe zip file ({}) has a file ({}) trying to install outside target directory ({})r   r   wbN)r   openclosezipfileZipFiler!   namelistinfolistr4   r   r   r   joindirnamer(   r   formatendswithr3   r+   shutilcopyfileobj)r4   r5   r6   zipfpzipleadingr,   namefndirmessagefpdestfpr   r   r   
unzip_fileg   s6    	




rO   )r4   r5   r   c                 C   s.  t | |  ds$|  dr*d}nL|  tr>d}n8|  trRd}n$|  drfd}ntd|  d	}tj| |d
d}zt
dd | D }| D ]p}|j}|rt|d }tj||}t||sd}t|| ||| rt | q| rbz||| W n> tk
r^ }	 ztd| |j|	 W Y qW 5 d}	~	X Y nX qz||}
W nB ttfk
r }	 ztd| |j|	 W Y qW 5 d}	~	X Y nX t tj| |
dk	stt|d}t|
| W 5 Q R X |
	  ||| |j d@ rt!| qW 5 |	  X dS )a  
    Untar the file (with path `filename`) to the destination `location`.
    All files are written based on system defaults and umask (i.e. permissions
    are not preserved), except that regular file members with any execute
    permissions (user, group, or world) have "chmod +x" applied after being
    written.  Note that for windows, any execute changes using os.chmod are
    no-ops per the python docs.
    z.gzz.tgzzr:gzzr:bz2zr:xzz.tarrz-Cannot determine compression type for file %szr:*zutf-8)encodingc                 S   s   g | ]
}|j qS r   )rI   ).0memberr   r   r   
<listcomp>   s     zuntar_file.<locals>.<listcomp>r   zQThe tar file ({}) has a file ({}) trying to install outside target directory ({})z/In the tar file %s the member %s is invalid: %sNr9   r)   )"r   lowerrC   r   r	   loggerwarningtarfiler:   r;   r!   
getmembersrI   r   r   r   r@   r(   r   rB   isdirissym_extract_member	ExceptionextractfileKeyErrorAttributeErrorrA   AssertionErrorrD   rE   utimer2   r+   )r4   r5   r2   tarrH   rS   rJ   r   rL   excrM   rN   r   r   r   
untar_file   st    	




re   )r4   r5   content_typer   c                 C   s   t j| } |dks,|  ts,t| rDt| || d d nR|dkslt	
| sl|  tt t rxt| | ntd| || td| d S )Nzapplication/zipz.whl)r6   zapplication/x-gzipzZCannot unpack file %s (downloaded from %s, content-type: %s); cannot detect archive formatz#Cannot determine archive format of )r   r   realpathrU   rC   r
   r<   
is_zipfilerO   rX   
is_tarfiler   r   r	   re   rV   criticalr   )r4   r5   rf   r   r   r   unpack_file   s,    rk   )T)N))__doc__loggingr   rD   r0   rX   r<   typingr   r   r   r   pip._internal.exceptionsr   pip._internal.utils.filetypesr   r   r	   r
   pip._internal.utils.miscr   	getLogger__name__rV   SUPPORTED_EXTENSIONSbz2ImportErrordebuglzmaintr   strr   r/   r!   r(   r+   r3   rO   re   rk   r   r   r   r   <module>   sL   
.S 