o
    e+                     @  sX  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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Zd dlmZmZ ddlmZ ddlmZ ejdkrZd dlmZ nejrdd dlmZ nejZeeZG d	d
 d
eZej ddd#ddZ!d$ddZ"G dd deZ#d%ddZ$ej ddd#ddZ%d%ddZ&d&d!d"Z'd
dgZ(dS )'    )annotationsN)
CollectionMapping   )FailedProcessError)check_dependency      )Protocolc                   @  s4   e Zd ZdZeejd
ddZejdddZd	S )IsolatedEnvzIsolated build environment ABC.returnstrc                 C     dS )z2The Python executable of the isolated environment.N selfr   r   ;/var/www/html/env/lib/python3.10/site-packages/build/env.pypython_executable%       zIsolatedEnv.python_executableMapping[str, str] | Nonec                 C  r   )zBGenerate additional env vars specific to the isolated environment.Nr   r   r   r   r   make_extra_environ*   r   zIsolatedEnv.make_extra_environNr   r   )r   r   )	__name__
__module____qualname____doc__propertyabcabstractmethodr   r   r   r   r   r   r   "   s    r   )maxsizer   boolc                     s4   dd l  tjdd uot fddtdD  S )Nr   
virtualenvc                 3  s2    | ]}t |d kr j|d  jdkV  qdS )r   r"   N)lenrequirementsRequirementname).0d	packagingr   r   	<genexpr>6   s    z)_should_use_virtualenv.<locals>.<genexpr>zbuild[virtualenv])packaging.requirements	importlibutil	find_specanyr   r   r   r)   r   _should_use_virtualenv/   s   
r1   cmd	list[str]Nonec              
   C  sP   zt j| dt jt jd W dS  t jy' } zt|j dtj	d  d}~ww )z;Invoke subprocess and output stdout and stderr if it fails.T)checkstdoutstderr )endfileN)

subprocessrunPIPESTDOUTCalledProcessErrorprintoutputdecodesysr7   )r2   er   r   r   _subprocess=   s   rE   c                   @  sb   e Zd ZdZdddZddd	ZedddZedddZdddZ	dddZ
edddZdS ) DefaultIsolatedEnvzDAn isolated environment which combines venv and virtualenv with pip.r   c                 C  s   z7t jdd| _t r| d t| j\| _| _W | S | d tj	
t jdd| _t| j\| _| _W | S  tyF   | jt    w )Nz
build-env-prefixz+Creating virtualenv isolated environment...z%Creating venv isolated environment...)tempfilemkdtemp_pathr1   log_create_isolated_env_virtualenv_python_executable_scripts_dirospathrealpath_create_isolated_env_venv	Exception__exit__rC   exc_infor   r   r   r   	__enter__I   s   

zDefaultIsolatedEnv.__enter__argsobjectr4   c                 G  s"   t j| jrt| j d S d S )N)rP   rQ   existsrK   shutilrmtree)r   rX   r   r   r   rU   `   s   zDefaultIsolatedEnv.__exit__r   c                 C     | j S )z/The location of the isolated build environment.)rK   r   r   r   r   rQ   d      zDefaultIsolatedEnv.pathc                 C  r]   )z8The python executable of the isolated build environment.)rN   r   r   r   r   r   i   r^   z$DefaultIsolatedEnv.python_executabledict[str, str]c                 C  s2   t jd}d|d urt j| j|giS | jiS )NPATH)rP   environgetpathsepjoinrO   )r   rQ   r   r   r   r   n   s   &z%DefaultIsolatedEnv.make_extra_environr$   Collection[str]c              
   C  s   |sdS |  ddt| d tjddddd	d
}|tj| W d   n1 s0w   Y  z| jddddddtj	
|jg}t| W t|j dS t|j w )at  
        Install packages from PEP 508 requirements in the isolated build environment.

        :param requirements: PEP 508 requirement specification to install

        :note: Passing non-PEP 508 strings will result in undefined behavior, you *should not* rely on it. It is
               merely an implementation detail, it may change any time without warning.
        Nz0Installing packages in isolated environment... (z, )wzbuild-reqs-z.txtFzutf-8)rH   suffixdeleteencodingz-Impipinstallz--use-pep517z--no-warn-script-locationz-r)rL   rd   sortedrI   NamedTemporaryFilewriterP   linesepr   rQ   abspathr&   rE   unlink)r   r$   req_filer2   r   r   r   rl   r   s$   	

zDefaultIsolatedEnv.installmessagec                 C  s2   t jdkrtjtj| dd dS ttj|  dS )z
        Prints message

        The default implementation uses the logging module but this function can be
        overwritten by users to have a different implementation.

        :param msg: Message to output
        r      )
stacklevelN)rC   version_info_loggerrL   loggingINFO)rt   r   r   r   rL      s   

zDefaultIsolatedEnv.logN)r   rF   )rX   rY   r   r4   r   )r   r_   )r$   re   r   r4   )rt   r   r   r4   )r   r   r   r   rW   rU   r   rQ   r   r   rl   staticmethodrL   r   r   r   r   rF   F   s    



!rF   rQ   r   tuple[str, str]c                 C  sH   ddl }t| ddddg}|j|dd}t|jj}t|jj}||fS )	z
    We optionally can use the virtualenv package to provision a virtual environment.

    :param path: The path where to create the isolated build environment
    :return: The Python executable and script folder
    r   Nz--no-setuptoolsz
--no-wheelz--activatorsr8   F)setup_logging)r"   r   cli_runcreatorexe
script_dir)rQ   r"   r2   result
executabler   r   r   r   rM      s   rM   c                  C  s   t jdsdS tjdd1} |  d}zt| j| t| W n t	t
tfy5   Y W d   dS w 	 W d   dS 1 sBw   Y  dS )z%Return True if symlinks are supportedwinTzbuild-symlink-rG   z-bNF)rC   platform
startswithrI   rn   rP   symlinkr&   rr   OSErrorNotImplementedErrorAttributeError)tmp_filedestr   r   r   _fs_supports_symlink   s   
$r   c              
   C  s~  ddl }ddl}tjdk rddl}nddlm} t }z0t	 " tjdd dkr1t
ddt |jd	|d
|  W d   n1 sEw   Y  W n tjy^ } zt|ddd}~ww t| \}}}tt|jd|gd}	|j|	j}
t dkrtt d dd dkrt dk}|rdnd}nd}|
|j|k rt|dddd| g t|dddddg ||fS )z
    On Python 3 we use the venv package from the standard library.

    :param path: The path where to create the isolated build environment
    :return: The Python executable and script folder
    r   Nr   )metadatar	   )r	      r   ignorez.check_home argument is deprecated and ignored.T)with_pipsymlinksz7Failed to create venv. Maybe try installing virtualenv.rk   )r&   rQ   Darwin.r   x86_64z21.0.1z20.3.0z19.1.0z-mrl   zpip>=	uninstall
setuptoolsz-y)venvpackaging.versionrC   rw   importlib_metadatar-   r   r   warningscatch_warningsfilterwarningsDeprecationWarning
EnvBuildercreater;   r?   r   _find_executable_and_scriptsnextiterdistributionsversionVersionr   systemintmac_versplitmachinerE   )rQ   r   r*   r   r   excr   r   purelibpip_distributioncurrent_pip_versionis_apple_silicon_pythonminimum_pip_versionr   r   r   rS      s8   


*rS   tuple[str, str, str]c                 C  s   t   }| |d< t  }d|v rt jd|d}nd|v r&t jd|d}nd|v r2t jd|d}nt j|d}tj|d tj	
d	rFd
nd}tj|sYd| d}t|||d |d fS )z
    Detect the Python executable and script folder of a virtual environment.

    :param path: The location of the virtual environment
    :return: The Python executable, script folder, and purelib folder
    baser   )schemevarsposix_localposix_prefixosx_framework_library)r   scriptsr   z
python.exepythonz0Virtual environment creation failed, executable z missingr   )	sysconfigget_config_varscopyget_scheme_names	get_pathsrP   rQ   rd   rC   r   r   rZ   RuntimeError)rQ   config_varsscheme_namespathsr   msgr   r   r   r      s   "r   )r   r!   )r2   r3   r   r4   )rQ   r   r   r|   )rQ   r   r   r   ))
__future__r   r   	functoolsimportlib.utilr-   ry   rP   r   r[   r;   rC   r   rI   typingr   collections.abcr   r   _exceptionsr   _utilr   rw   r   TYPE_CHECKINGtyping_extensionsABC	getLoggerr   rx   r   	lru_cacher1   rE   rF   rM   r   rS   r   __all__r   r   r   r   <module>   sH    



	
]


0+