a
    &(a3                  	   @   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 g d
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d&dddd'e-ee+ ee+ ee+ dd(d)d*Z9d<e+e-ee+ ee+ e-ee+ ed+d,d-Z:e+dd.d/Z;e+dd0d1Z<e+e-d2d3d4Z=e+dd5d6Z>e+dd7d8Z?e+e
e+ d9d:d;Z@dS )=    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_site)r   get_bin_prefixget_bin_userr   get_platlibget_prefixed_libsget_purelib
get_schemer   r   r   Z"_PIP_LOCATIONS_NO_WARN_ON_MISMATCH
platlibdirlib_PLATLIBDIR)returnc                  C   s:   ddl m}  z| d d }W n ty0   Y dS 0 |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&   x/private/var/folders/m4/wm8f9dms7t78045sws6ggdl80000gn/T/pip-unpacked-wheel-vn48x2xj/pip/_internal/locations/__init__.py_looks_like_bpo_448601   s    r(   )schemer   c                 C   s4   | d }d|v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"   | ]}| v 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    r6   c                  C   s   ddl m}  d| v od| v S )z#Debian adds two additional schemes.r   r    Z
deb_systemZ
unix_local)r$   r!   r    r&   r&   r'   _looks_like_debian_schemeV   s    r7   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$   r8   distutils.distr9   finalize_optionsexec_prefixospathnormpathsysprefix)r8   r9   cmdr&   r&   r'   _looks_like_red_hat_scheme^   s    	
rC   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 |vo d|v o | d V  qdS )Libr   zsite-packagesN)endswith)r0   pr&   r&   r'   r2   ~   s   z1_looks_like_msys2_mingw_scheme.<locals>.<genexpr>c                 3   s   | ]} | V  qd S r.   r&   )r0   keypathsr&   r'   r2          r#   r*   )	sysconfig	get_pathsr5   r&   r&   rJ   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getattrr@   rG   len)rQ   Z	ldversionrS   partr&   r&   r'   _fix_abiflags   s    


rX   )oldnewrI   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   rI   Z	issue_urlmessager&   r&   r'   _warn_mismatched   s    r_   c                C   s   | |krdS t | ||d dS )NFrI   T)r_   )rY   rZ   rI   r&   r&   r'   _warn_if_mismatch   s    ra   FuserhomerootrA   )rc   rd   re   rA   r   c                 C   s&   g d}t td|| ||| d S )N)zAdditional context:z	user = %rz	home = %rz	root = %rzprefix = %r
)r[   r\   r]   join)rc   rd   re   rA   rQ   r&   r&   r'   _log_context   s    rh   )	dist_namerc   rd   re   isolatedrA   r   c              	      s  t j| |||||dtj| |||||d}g }tD ]}tt|}	tt||}
|	|
krdq4tjj	dko|d uo|dv 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v ott|	j|
jk}|rq4to|dv 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   rA   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'   r2   <  rL   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   r@   implementationnameparent
startswithr   r6   r
   version_infor   r(   r   rQ   rV   rC   r7   tuplerX   rP   appenddistutils_schemeanyr   r_   rh   )ri   rc   rd   re   rj   rA   rZ   Zwarning_contextsr1   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_bugrI   r&   rt   r'   r      s    	



	r   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
    r   c                   C   s   t jdddjS )N T)rc   )r   r   scriptsr&   r&   r&   r'   r   W  s    r   )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)r7   )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    r   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    r   )rA   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)rA   )r   r   r   ra   rw   rx   r   rh   )rA   Zold_pureZold_platZnew_pureZnew_platZwarnedr&   r&   r'   r     s$    
r   )FNNFN)A	functoolsloggingr=   rw   r@   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_cacher6   r7   rC   rP   rX   rx   r_   ra   rh   r   r   r   r   r   r   r   r&   r&   r&   r'   <module>   s   
  	







      