o
    AJeu"                  	   @   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yc   ed Y nw z
ddlZee7 ZW n ey|   ed	 Y nw d
efddZded
e	e fddZ dee d
e!fddZ"deded
e!fddZ#ded
dfddZ$ded
e!fddZ%d'dedede!d
dfd d!Z&deded
dfd"d#Z'	d(deded$e
e d
df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   k/home/seandotau/au.memorygallery.club/gallery/lib/python3.10/site-packages/pip/_internal/utils/unpacking.pycurrent_umask+   s   

r   pathc                 C   sd   |  d d} d| v r$d| v r| d| dk sd| vr$| ddS d| v r.| ddS | dgS )N/\    )lstripfindsplitr   r   r   r   split_leading_dir2   s   $r   pathsc                 C   sD   d}| D ]}t |\}}|s dS |du r|}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   Zcommon_prefixr   prefixrestr   r   r   has_leading_dir>   s   r    	directorytargetc                 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"   Zabs_directoryZ
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(   infoc                 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   
r0   Tfilenamelocationflattenc              	   C   sJ  t | t| d}ztj|dd}t| o|}| D ]{}|j}|}|r,t|d }t	j
||}t	j
|}	t||sId}
t|
| |||dsS|drXt | qt |	 ||}z)t|d}t|| W d	   n1 sxw   Y  W |  t|rt| q|  t|rt| w w W |  d	S |  w )
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zipfileZipFiler    namelistinfolistr1   r   r   r   joindirnamer%   r   formatendswithshutilcopyfileobjcloser0   r(   )r1   r2   r3   Zzipfpzipleadingr)   namefndirmessagefpdestfpr   r   r   
unzip_fileg   sF   	




rK   c                 C   s.  t | |  ds|  drd}n&|  trd}n|  tr)d}n|  dr3d}ntd|  d	}tj| |d
d}zt	dd |
 D }|
 D ]}|j}|r`t|d }tj||}t||swd}t|| ||| rt | qS| rz||| W qS ty }	 ztd| |j|	 W Y d}	~	qSd}	~	ww z||}
W n ttfy }	 ztd| |j|	 W Y d}	~	qSd}	~	ww t tj| |
dusJ t|d}t|
| W d   n1 sw   Y  |
  ||| |jd@ r
t | qSW |  dS |  w )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   )rE   ).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: %sNr6   r&   )!r   lowerr?   r   r	   loggerwarningtarfiler7   r    
getmembersrE   r   r   r   r<   r%   r   r>   isdirissym_extract_member	ExceptionextractfileKeyErrorAttributeErrorr=   r@   rA   rB   utimer/   r(   )r1   r2   r/   tarrD   rO   rF   r   rH   excrI   rJ   r   r   r   
untar_file   s   	


2r`   content_typec                 C   s   t j| } |dks|  tst| r#t| || d d d S |dks7t	
| s7|  tt t r>t| | d S td| || td| )Nzapplication/zipz.whl)r3   zapplication/x-gzipzZCannot unpack file %s (downloaded from %s, content-type: %s); cannot detect archive formatz#Cannot determine archive format of )r   r   realpathrQ   r?   r
   r8   
is_zipfilerK   rT   
is_tarfiler   r   r	   r`   rR   criticalr   )r1   r2   ra   r   r   r   unpack_file   s(   rf   )T)N))__doc__loggingr   r@   r-   rT   r8   typingr   r   r   r   pip._internal.exceptionsr   pip._internal.utils.filetypesr   r   r	   r
   pip._internal.utils.miscr   	getLogger__name__rR   SUPPORTED_EXTENSIONSbz2ImportErrordebuglzmaintr   strr   r,   r    r%   r(   r0   rK   r`   rf   r   r   r   r   <module>   sX    
.S