o
    $¼"be  ã                   @   sþ   d Z ddlmZmZ ddlZddlmZmZ ddlm	Z	 ddl
mZmZmZ ddlmZ ddlmZmZ dd	lmZmZmZ dd
lmZ G dd„ deƒZG dd„ deƒZeeƒG dd„ deƒƒZeeƒG dd„ deƒƒZG dd„ deƒZG dd„ deeƒZdS )aG  
Virtual environments in the traditional sense are built as reference to the host python. This file allows declarative
references to elements on the file system, allowing our system to automatically detect what modes it can support given
the constraints: e.g. can the file system symlink, can the files be read, executed, etc.
é    )Úabsolute_importÚunicode_literalsN)ÚABCMetaÚabstractmethod)ÚOrderedDict)ÚS_IXGRPÚS_IXOTHÚS_IXUSR)Úadd_metaclass)Úfs_is_case_sensitiveÚfs_supports_symlink)ÚcopyÚmake_exeÚsymlink)Úensure_textc                   @   ó   e Zd ZdZdZdZdS )ÚRefMustÚNAr   r   N)Ú__name__Ú
__module__Ú__qualname__r   ÚCOPYÚSYMLINK© r   r   úN/usr/lib/python3/dist-packages/virtualenv/create/via_global_ref/builtin/ref.pyr      ó    r   c                   @   r   )ÚRefWhenÚANYr   r   N)r   r   r   r   r   r   r   r   r   r   r      r   r   c                   @   sn   e Zd ZdZeƒ Zeƒ Zej	e
jfdd„Zdd„ Zedd„ ƒZedd	„ ƒZed
d„ ƒZedd„ ƒZdd„ ZdS )ÚPathRefz@Base class that checks if a file reference can be symlink/copiedc                 C   st   || _ || _|| _z| ¡ | _W n ty   d| _Y nw | jr"d nd| _| jr*d nd| _| jr5d | _d S d| _d S ©NF)ÚmustÚwhenÚsrcÚexistsÚOSErrorÚ	_can_readÚ	_can_copyÚ_can_symlink©Úselfr"   r    r!   r   r   r   Ú__init__'   s   
ÿzPathRef.__init__c                 C   s   d  | jj| j¡S )Nz
{}(src={}))ÚformatÚ	__class__r   r"   ©r)   r   r   r   Ú__repr__3   s   zPathRef.__repr__c                 C   s”   | j d u rG| j ¡ r:z!| j d¡� d| _ W d   ƒ n1 sw   Y  W | j S W | j S  ty9   d| _ Y | j S w t tt| jƒƒtj	¡| _ | j S )NÚrbTF)
r%   r"   Úis_fileÚopenr$   ÚosÚaccessr   ÚstrÚR_OKr-   r   r   r   Úcan_read6   s   

ÿúüüzPathRef.can_readc                 C   s2   | j d u r| jtjkr| j| _ | j S | j| _ | j S ©N)r&   r    r   r   Úcan_symlinkr6   r-   r   r   r   Úcan_copyC   s   
ÿzPathRef.can_copyc                 C   s8   | j d u r| jtjkr| j| _ | j S | jo| j| _ | j S r7   )r'   r    r   r   r9   ÚFS_SUPPORTS_SYMLINKr6   r-   r   r   r   r8   L   s   
ÿzPathRef.can_symlinkc                 C   s   t ‚r7   )ÚNotImplementedError)r)   ÚcreatorÚsymlinksr   r   r   ÚrunU   s   zPathRef.runc                 C   s,   | j tjkrtS | j tjkrtS |rtS tS r7   )r    r   r   r   r   r   )r)   r=   r   r   r   ÚmethodY   s
   zPathRef.methodN)r   r   r   Ú__doc__r   r:   r   ÚFS_CASE_SENSITIVEr   r   r   r   r*   r.   Úpropertyr6   r9   r8   r   r>   r?   r   r   r   r   r       s    



r   c                       sB   e Zd ZdZejejf‡ fdd„	Ze	dd„ ƒZ
e	dd„ ƒZ‡  ZS )Ú
ExePathRefzIBase class that checks if a executable can be references via symlink/copyc                    s   t t| ƒ |||¡ d | _d S r7   )ÚsuperrC   r*   Ú_can_runr(   ©r,   r   r   r*   e   ó   
zExePathRef.__init__c                 C   s   | j r| jS dS r   )r:   Úcan_runr-   r   r   r   r8   i   s   zExePathRef.can_symlinkc                 C   sF   | j d u r | j ¡ j}tttfD ]}||@ rd| _  | j S d| _ | j S )NTF)rE   r"   ÚstatÚst_moder	   r   r   )r)   ÚmodeÚkeyr   r   r   rH   o   s   
ÿzExePathRef.can_run)r   r   r   r@   r   r   r   r   r*   rB   r8   rH   Ú__classcell__r   r   rF   r   rC   a   s    
rC   c                       s2   e Zd ZdZejejf‡ fdd„	Zdd„ Z	‡  Z
S )ÚPathRefToDestzLink a path on the file systemc                    s   t t| ƒ |||¡ || _d S r7   )rD   rN   r*   Údest)r)   r"   rO   r    r!   rF   r   r   r*      rG   zPathRefToDest.__init__c                 C   s`   |   || j¡}|  |¡}t|tƒr|n|f}|j ¡ s#|jjddd� |D ]}|| j|ƒ q%d S )NT)ÚparentsÚexist_ok)rO   r"   r?   Ú
isinstanceÚlistÚparentr#   Úmkdir)r)   r<   r=   rO   r?   Údest_iterableÚdstr   r   r   r>   ƒ   s   

ÿzPathRefToDest.run)r   r   r   r@   r   r   r   r   r*   r>   rM   r   r   rF   r   rN   |   s    rN   c                   @   s2   e Zd ZdZejejfdd„Zdd„ Z	dd„ Z
dS )	ÚExePathRefToDestz"Link a exe path on the file systemc                 C   sd   t  | |||¡ t | ||||¡ | js!ttdd„ |D ƒƒ ¡ ƒ}|d | _|dd … | _|| _	d S )Nc                 s   s   � | ]	}|  ¡ d fV  qd S r7   )Úlower)Ú.0Úir   r   r   Ú	<genexpr>”   s   € z,ExePathRefToDest.__init__.<locals>.<genexpr>r   é   )
rC   r*   rN   rA   rS   r   ÚkeysÚbaseÚaliasesrO   )r)   r"   ÚtargetsrO   r    r!   r   r   r   r*   �   s   

zExePathRefToDest.__init__c                 C   sŽ   |   || j¡j}|| j }|  |¡}|| j|ƒ |st|ƒ | jD ]#}|| }| ¡ r/| ¡  |r8| 	| j¡ nt
| j|ƒ |sDt|ƒ q!d S r7   )rO   r"   rT   r_   r?   r   r`   r#   ÚunlinkÚ
symlink_tor   )r)   r<   r=   Úbin_dirrO   r?   ÚextraÚ	link_filer   r   r   r>   ™   s"   


€÷zExePathRefToDest.runc                 C   s   d  | jj| j| j¡S )Nz{}(src={}, alias={}))r+   r,   r   r"   r`   r-   r   r   r   r.   «   s   zExePathRefToDest.__repr__N)r   r   r   r@   r   r   r   r   r*   r>   r.   r   r   r   r   rX   �   s
    	rX   ) r@   Ú
__future__r   r   r2   Úabcr   r   Úcollectionsr   rI   r   r   r	   Úsixr
   Úvirtualenv.infor   r   Úvirtualenv.util.pathr   r   r   Úvirtualenv.util.sixr   Úobjectr   r   r   rC   rN   rX   r   r   r   r   Ú<module>   s$    @