U
    
Ha3                     @   s  U 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	m
Z
mZmZ d dl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mZmZmZmZmZ d
ddddddddddgZ e!e"Z#ej$%drej&Z'nej(Z'e)eddZ*e+e,d< e-dddZ.ee+e+f e-dddZ/e j0dde-dd d!Z1e j0dde-dd"d#Z2e j0dde-dd$d%Z3e j0dde-dd&d'Z4ee+ e	e+ d(d)d*Z5e j0ddej6ej6e+dd+d,d-Z7ej6ej6e+e-d+d.d/Z8e j0ddd0dddd1e-ee+ ee+ ee+ dd2d3d4Z9d@e+e-ee+ ee+ e-ee+ ed5d6dZ:e+dd7dZ;e+dd8dZ<e+e-d9d:d;Z=e+dd<dZ>e+dd=dZ?e+e
e+ d>d?dZ@dS )A    N)AnyDictIteratorListOptionalTuple)SCHEME_KEYSScheme)WINDOWS)
deprecated)running_under_virtualenv   )
_distutils
_sysconfig)USER_CACHE_DIRget_major_minor_versionget_src_prefixis_osx_frameworksite_packages	user_siter   get_bin_prefixget_bin_userr   get_platlibget_prefixed_libsget_purelib
get_schemer   r   r   Z"_PIP_LOCATIONS_NO_WARN_ON_MISMATCHZ
platlibdirlib_PLATLIBDIR)returnc                  C   s<   ddl m}  z| d d }W n tk
r2   Y dS X |dkS )zsThe resolution to bpo-44860 will change this incorrect platlib.

    See <https://bugs.python.org/issue44860>.
    r   INSTALL_SCHEMES	unix_userplatlibFz	$usersite)distutils.command.installr    KeyError)r    Zunix_user_platlib r%   D/tmp/pip-unpacked-wheel-tx790h60/pip/_internal/locations/__init__.py_looks_like_bpo_448601   s    r'   )schemer   c                 C   s4   | d }d|krdS | dd}| dd| d kS )Nr"   z/lib64/Fz/lib/z
$platbase/z$base/purelib)replace)r(   r"   Z	unpatchedr%   r%   r&   +_looks_like_red_hat_patched_platlib_purelib?   s
    r+   )maxsizec                      s"   ddl m  t fdddD S )zRed Hat patches platlib in unix_prefix and unix_home, but not purelib.

    This is the only way I can see to tell a Red Hat-patched Python.
    r   r   c                 3   s"   | ]}| kot  | V  qd S N)r+   .0kr   r%   r&   	<genexpr>O   s   z*_looks_like_red_hat_lib.<locals>.<genexpr>)unix_prefix	unix_home)r#   r    allr%   r%   r   r&   _looks_like_red_hat_libG   s    r5   c                  C   s   ddl m}  d| kod| kS )z#Debian adds two additional schemes.r   r   
deb_system
unix_local)r#   r    r   r%   r%   r&   _looks_like_debian_schemeV   s    r8   c                  C   s^   ddl m}  ddlm} | | }|  |jtjt	j dko\|j
tjt	j
 dkS )a\  Red Hat patches ``sys.prefix`` and ``sys.exec_prefix``.

    Red Hat's ``00251-change-user-install-location.patch`` changes the install
    command's ``prefix`` and ``exec_prefix`` to append ``"/local"``. This is
    (fortunately?) done quite unconditionally, so we create a default command
    object without any configuration to detect this.
    r   )install)Distributionz/local)r#   r9   distutils.distr:   finalize_optionsexec_prefixospathnormpathsysprefix)r9   r:   cmdr%   r%   r&   _looks_like_red_hat_scheme^   s    	
rD   c                      s.   t jddd tdd  fdddD D S )a  MSYS2 patches distutils and sysconfig to use a UNIX-like scheme.

    However, MSYS2 incorrectly patches sysconfig ``nt`` scheme. The fix is
    likely going to be included in their 3.10 release, so we ignore the warning.
    See msys2/MINGW-packages#9319.

    MSYS2 MINGW's patch uses lowercase ``"lib"`` instead of the usual uppercase,
    and is missing the final ``"site-packages"``.
    ntF)expandc                 s   s*   | ]"}d |ko d|ko | d V  qdS )Libr   zsite-packagesN)endswith)r/   pr%   r%   r&   r1   ~   s   z1_looks_like_msys2_mingw_scheme.<locals>.<genexpr>c                 3   s   | ]} | V  qd S r-   r%   )r/   keypathsr%   r&   r1      s     r"   r)   )	sysconfig	get_pathsr4   r%   r%   rK   r&   _looks_like_msys2_mingw_schemer   s    rP   )partsr   c                 c   sh   t d}ttdd }|r(|r(||s6| E d H  d S | D ](}||r\|d dt|  }|V  q:d S )N	LDVERSIONabiflagsr   )rN   get_config_vargetattrrA   rH   len)rQ   Z	ldversionrS   partr%   r%   r&   _fix_abiflags   s    


rX   )oldnewrJ   r   c                C   s    d}d}t t|||| | d S )Nz(https://github.com/pypa/pip/issues/10151zSValue for %s does not match. Please report this to <%s>
distutils: %s
sysconfig: %s)loggerlog_MISMATCH_LEVEL)rY   rZ   rJ   Z	issue_urlmessager%   r%   r&   _warn_mismatched   s    r_   c                C   s   | |krdS t | ||d dS )NFrJ   T)r_   )rY   rZ   rJ   r%   r%   r&   _warn_if_mismatch   s    ra   FuserhomerootrB   )rc   rd   re   rB   r   c                 C   s,   dddddg}t td|| ||| d S )NzAdditional context:z	user = %rz	home = %rz	root = %rzprefix = %r
)r[   r\   r]   join)rc   rd   re   rB   rQ   r%   r%   r&   _log_context   s    	rh   )	dist_namerc   rd   re   isolatedrB   r   c              	      s  t j| |||||dtj| |||||d}g }tD ]}tt|}	tt||}
|	|
krdq4tjj	dko|d k	o|dko|	j
|
j
ko|	j	do|
j	d}|rq4|ot o|dko|	j
j
|
j
ko|	j
j	d}|rq4|dkrt rq4|o |dko t o tjdko tdko t }|r*q4|p@|p@|p@t  o|	jd	d
 dkot|
jd	ko|
jd	 dkot|
jd
k s|
jd dkot pt }|rq4tjdk ot o|dkott|	j|
jk}|rq4to|dkot }|rq4||	|
d| f q4|s*S t j| |||||dd t fddtD rntdd d d S |D ]\}	}
}t|	|
|d qrt||||d S )N)rc   rd   re   rj   rB   pypyrM   pythonheadersr"   )   	   r   r   rn   )usrlocalrp      rq   )rn      )rm   r"   r)   zscheme.T)Zignore_config_filesc                 3   s    | ]} | t |kV  qd S r-   )rU   r.   Zdefault_oldrY   r%   r&   r1   <  s     zget_scheme.<locals>.<genexpr>zConfiguring installation scheme with distutils config files is deprecated and will no longer work in the near future. If you are using a Homebrew or Linuxbrew Python, please see discussion at https://github.com/Homebrew/homebrew-core/issues/76621)replacementgone_inr`   rb   ) r   r   r   r   pathlibPathrU   rA   implementationnameparent
startswithr   r5   r
   version_infor   r'   r   rQ   rV   rD   r8   tuplerX   rP   appenddistutils_schemeanyr   r_   rh   )ri   rc   rd   re   rj   rB   rZ   Zwarning_contextsr0   Zold_vZnew_vZskip_pypy_special_caseZ$skip_osx_framework_user_special_caseZskip_bpo_44860Zskip_linux_system_special_caseZskip_sysconfig_abiflag_bugZskip_msys2_mingw_bugrJ   r%   rt   r&   r      s    	



	c                  C   s4   t  } t }tt| t|ddr0t  | S )NZ
bin_prefixr`   )r   r   r   ra   rw   rx   rh   rY   rZ   r%   r%   r&   r   O  s
    c                   C   s   t jdddjS )N T)rc   )r   r   scriptsr%   r%   r%   r&   r   W  s    )valuer   c                 C   s   t  s
dS | dkrdS dS )a  Check if the value is Debian's APT-controlled dist-packages.

    Debian's ``distutils.sysconfig.get_python_lib()`` implementation returns the
    default package path controlled by APT, but does not patch ``sysconfig`` to
    do the same. This is similar to the bug worked around in ``get_scheme()``,
    but here the default is ``deb_system`` instead of ``unix_local``. Ultimately
    we can't do anything about this Debian bug, and this detection allows us to
    skip the warning when needed.
    Fz/usr/lib/python3/dist-packagesT)r8   )r   r%   r%   r&   $_looks_like_deb_system_dist_packages[  s
    
r   c                  C   s@   t  } t }t| r| S tt| t|ddr<t  | S )z,Return the default pure-Python lib location.r)   r`   )r   r   r   r   ra   rw   rx   rh   r   r%   r%   r&   r   l  s    c                  C   s@   t  } t }t| r| S tt| t|ddr<t  | S )z0Return the default platform-shared lib location.r"   r`   )r   r   r   r   ra   rw   rx   rh   r   r%   r%   r&   r   w  s    )rB   r   c                 C   sx   t | \}}t| \}}tt|t|ddtt|t|ddg}t|rbt| d ||krp|gS ||gS )z*Return the lib locations under ``prefix``.zprefixed-purelibr`   zprefixed-platlib)rB   )r   r   r   ra   rw   rx   r   rh   )rB   Zold_pureZold_platZnew_pureZnew_platZwarnedr%   r%   r&   r     s$    
)FNNFN)A	functoolsloggingr>   rw   rA   rN   typingr   r   r   r   r   r   pip._internal.models.schemer   r	   pip._internal.utils.compatr
   pip._internal.utils.deprecationr   pip._internal.utils.virtualenvr   r   r   r   baser   r   r   r   r   r   __all__	getLogger__name__r[   environgetDEBUGr]   WARNINGrU   r   str__annotations__boolr'   r+   	lru_cacher5   r8   rD   rP   rX   rx   r_   ra   rh   r   r   r   r   r   r   r   r%   r%   r%   r&   <module>   s      








      