B
    `dR                 @   s  d 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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 dd	lmZ dd
lmZmZ ddlmZ erddlmZmZmZmZm Z  ddl!m"Z" e#e$Z%G dd dZ&G dd de'Z(G dd de(Z)dS )z;Build Environment used for isolation during sdist building
    N)OrderedDict)get_python_lib)	get_paths)RequirementVersionConflict
WorkingSet)__file__)open_spinner)call_subprocess)TempDirectorytempdir_kinds)MYPY_CHECK_RUNNING)TupleSetIterableOptionalList)PackageFinderc               @   s   e Zd Zdd ZdS )_Prefixc             C   sj   || _ d| _ttjdkrdnd||ddd | _td|d}td|d}||kr\|g| _n
||g| _d S )	NFntposix_prefix)baseplatbase)varsscripts)plat_specificprefixT)pathsetupr   osnamebin_dirr   lib_dirs)selfr   purelibplatlib r&   ;/tmp/pip-unpacked-wheel-hu9qqap1/pip/_internal/build_env.py__init__!   s    
z_Prefix.__init__N)__name__
__module____qualname__r(   r&   r&   r&   r'   r      s   r   c               @   s8   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d ZdS )BuildEnvironmentzFCreates and manages an isolated environment to install build deps
    c          	      s   t tjdd t fdddD | _g | _g | _x6tt| j	 D ] }| j
|j | j|j qFW dd tdd	tdd	fD }tj jd
| _tj| jst| j ttj| jdd"}|tdj|| jd W d Q R X d S )NT)kindglobally_managedc             3   s&   | ]}|t tj j|fV  qd S )N)r   r   r   join).0r    )temp_dirr&   r'   	<genexpr>>   s   z,BuildEnvironment.__init__.<locals>.<genexpr>)normaloverlayc             S   s   h | ]}t j|qS r&   )r   r   normcase)r0   siter&   r&   r'   	<setcomp>K   s   z,BuildEnvironment.__init__.<locals>.<setcomp>F)r   r6   zsitecustomize.pywa  
                import os, site, sys

                # First, drop system-sites related paths.
                original_sys_path = sys.path[:]
                known_paths = set()
                for path in {system_sites!r}:
                    site.addsitedir(path, known_paths=known_paths)
                system_paths = set(
                    os.path.normcase(path)
                    for path in sys.path[len(original_sys_path):]
                )
                original_sys_path = [
                    path for path in original_sys_path
                    if os.path.normcase(path) not in system_paths
                ]
                sys.path = original_sys_path

                # Second, add lib directories.
                # ensuring .pth file are processed.
                for path in {lib_dirs!r}:
                    assert not path in sys.path
                    site.addsitedir(path)
                )system_sitesr"   )r   r   	BUILD_ENVr   	_prefixes	_bin_dirs	_lib_dirsreversedlistvaluesappendr!   extendr"   r   r   r   r/   	_site_direxistsmkdiropenwritetextwrapdedentformat)r#   r   r9   fpr&   )r1   r'   r(   7   s(    
zBuildEnvironment.__init__c             C   sn   dd dD | _ | jd d  }| j d }|r>||tj | jg}tjtj	|dtj	|d d S )Nc             S   s   i | ]}t j|d |qS )N)r   environget)r0   r    r&   r&   r'   
<dictcomp>q   s   z.BuildEnvironment.__enter__.<locals>.<dictcomp>)PATHPYTHONNOUSERSITE
PYTHONPATHrO   1)
	_save_envr<   rB   splitr   pathseprC   rL   updater/   )r#   r   old_path
pythonpathr&   r&   r'   	__enter__p   s    


zBuildEnvironment.__enter__c             C   s>   x8| j  D ]*\}}|d kr,tj|d  q|tj|< qW d S )N)rS   itemsr   rL   pop)r#   exc_typeexc_valexc_tbvarname	old_valuer&   r&   r'   __exit__   s    zBuildEnvironment.__exit__c             C   s   t  }t  }|rt| j}xx|D ]p}y"|t|dkrD|| W q  tk
r } z*|t|j	d 
 t|j	d f W dd}~X Y q X q W ||fS )zReturn 2 sets:
            - conflicting requirements: set of (installed, wanted) reqs tuples
            - missing requirements: set of reqs
        Nr      )setr   r=   findr   parseaddr   strargsas_requirement)r#   reqsmissingconflictingwsreqer&   r&   r'   check_requirements   s    

(z#BuildEnvironment.check_requirementsc          	   C   sr  | j | }|jrtd|_|s"d S tjtjtdddd|jdg}t	
 tjkrZ|d xBdD ]:}t|j|}|d	|d
d dt|pdhf q`W |j}	|	r|d|	d g x.|	dd  D ]}
|d|
g qW n
|d x|jD ]}|d|g qW x|jD ]}|d|g qW |jr:|d |d	 || t|}t||d W d Q R X d S )NTinstallz--ignore-installedz	--no-userz--prefixz--no-warn-script-locationz-v)	no_binaryonly_binaryz--_-,z:none:z-ir   rb   z--extra-index-urlz
--no-indexz--find-linksz--trusted-hostz--pre)spinner)r;   r   AssertionErrorsys
executabler   r   dirnamepip_locationloggergetEffectiveLevelloggingDEBUGrA   getattrformat_controlrB   replacer/   sorted
index_urls
find_linkstrusted_hostsallow_all_prereleasesr	   r
   )r#   finderrequirementsprefix_as_stringmessager   rh   r   formatsr   extra_indexlinkhostrw   r&   r&   r'   install_requirements   s<    









z%BuildEnvironment.install_requirementsN)	r)   r*   r+   __doc__r(   rY   ra   rp   r   r&   r&   r&   r'   r,   3   s   9r,   c               @   s8   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d ZdS )NoOpBuildEnvironmentz5A no-op drop-in replacement for BuildEnvironment
    c             C   s   d S )Nr&   )r#   r&   r&   r'   r(      s    zNoOpBuildEnvironment.__init__c             C   s   d S )Nr&   )r#   r&   r&   r'   rY      s    zNoOpBuildEnvironment.__enter__c             C   s   d S )Nr&   )r#   r\   r]   r^   r&   r&   r'   ra      s    zNoOpBuildEnvironment.__exit__c             C   s   d S )Nr&   )r#   r&   r&   r'   cleanup   s    zNoOpBuildEnvironment.cleanupc             C   s
   t  d S )N)NotImplementedError)r#   r   r   r   r   r&   r&   r'   r      s    z)NoOpBuildEnvironment.install_requirementsN)	r)   r*   r+   r   r(   rY   ra   r   r   r&   r&   r&   r'   r      s   r   )*r   r   r   ry   rH   collectionsr   distutils.sysconfigr   	sysconfigr   Zpip._vendor.pkg_resourcesr   r   r   pipr   r|   pip._internal.cli.spinnersr	   pip._internal.utils.subprocessr
   pip._internal.utils.temp_dirr   r   pip._internal.utils.typingr   typingr   r   r   r   r   "pip._internal.index.package_finderr   	getLoggerr)   r}   r   objectr,   r   r&   r&   r&   r'   <module>   s*   
 