B
    He<              
   @   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 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 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g
Zee Z!e"eddZ#e$e%d< ej&dkZ'e(dddZ)e) Z*e*sddlm+Z+ e'r(e*s(ej,Z-nej.Z-e(dddZ/ee$e$f e(ddd Z0e j1dd!e(dd"d#Z2e j1dd!e(dd$d%Z3e j1dd!e(dd&d'Z4e j1dd!e(dd(d)Z5e j1dd!e(dd*d+Z6ee$ e	e$ddf d,d-d.Z7e j1dd!ej8ej8e$dd/d0d1Z9ej8ej8e$e(d/d2d3Z:e j1dd!d4dddd5e(e
e$ e
e$ e
e$ dd6d7d8Z;dBe$e(e
e$ e
e$ e(e
e$ ed9d:dZ<e$dd;dZ=e$dd<dZ>e$e(d=d>d?Z?e$dd@dZ@e$ddAdZAdS )C    N)AnyDict	GeneratorOptionalTuple)SCHEME_KEYSScheme)WINDOWS)
deprecated)running_under_virtualenv   )
_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_purelib
get_schemer   r   r   Z
platlibdirlib_PLATLIBDIR)   
   )returnc               C   s   t ttdtS )ax  This function determines the value of _USE_SYSCONFIG.

    By default, pip uses sysconfig on Python 3.10+.
    But Python distributors can override this decision by setting:
        sysconfig._PIP_USE_SYSCONFIG = True / False
    Rationale in https://github.com/pypa/pip/issues/10647

    This is a function for testability, but should be constant during any one
    run.
    _PIP_USE_SYSCONFIG)boolgetattr	sysconfig_USE_SYSCONFIG_DEFAULT r#   r#   t/var/www/downstreamdata.science/rtclock/rtclock-venv/lib/python3.7/site-packages/pip/_internal/locations/__init__.py_should_use_sysconfig.   s    r%   )
_distutilsc              C   s:   ddl m}  y| d d }W n tk
r0   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'   unix_user_platlibr#   r#   r$   _looks_like_bpo_44860L   s    r-   )schemer   c             C   sP   | d }d|kr$| ddt d}d|kr0dS | dd}| dd| d	 kS )
Nr)   z/$platlibdir//z/lib64/Fz/lib/z
$platbase/z$base/purelib)replacer   )r.   r)   	unpatchedr#   r#   r$   +_looks_like_red_hat_patched_platlib_purelibZ   s    r3   )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)r3   ).0k)r'   r#   r$   	<genexpr>m   s   z*_looks_like_red_hat_lib.<locals>.<genexpr>)unix_prefix	unix_home)r*   r'   allr#   r#   )r'   r$   _looks_like_red_hat_libd   s    
r;   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_schemes   s    r>   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*   r?   distutils.distr@   finalize_optionsexec_prefixospathnormpathsysprefix)r?   r@   cmdr#   r#   r$   _looks_like_red_hat_scheme{   s    	
rJ   c              C   sH   t dkrdS ytjddd} W n tk
r2   dS X d| d koFdt kS )zSlackware patches sysconfig but fails to patch distutils and site.

    Slackware changes sysconfig's user scheme to use ``"lib64"`` for the lib
    path, but does not do the same to the site module.
    NF
posix_user)r.   expandz/lib64/r0   )r   r!   	get_pathsr+   )pathsr#   r#   r$   _looks_like_slackware_scheme   s    rO   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)rL   c             s   s*   | ]"}d |ko d|ko | d V  qdS )Libr   zsite-packagesN)endswith)r5   pr#   r#   r$   r7      s   z1_looks_like_msys2_mingw_scheme.<locals>.<genexpr>c             3   s   | ]} | V  qd S )Nr#   )r5   key)rN   r#   r$   r7      s    )r)   r0   )r!   rM   r:   r#   r#   )rN   r$   _looks_like_msys2_mingw_scheme   s    rU   )partsr   c             c   sl   t d}ttdd }|r(|r(||s6| E d H  d S x0| D ](}||r^|d dt|  }|V  q<W d S )N	LDVERSIONabiflagsr   )r!   get_config_varr    rG   rR   len)rV   	ldversionrX   partr#   r#   r$   _fix_abiflags   s    



r]   )oldnewrT   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)r^   r_   rT   	issue_urlmessager#   r#   r$   _warn_mismatched   s    re   c            C   s   | |krdS t | ||d dS )NF)rT   T)re   )r^   r_   rT   r#   r#   r$   _warn_if_mismatch   s    rf   F)userhomerootrH   )rg   rh   ri   rH   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`   ra   rb   join)rg   rh   ri   rH   rV   r#   r#   r$   _log_context   s    	rl   )	dist_namerg   rh   ri   isolatedrH   r   c          	      s   t j| |||||d}tr|S tj| |||||dg }x>tD ]4}tt|}	tt||}
|	|
krpq@tj	j
dko|d k	o|dko|	j|
jko|	j
do|
j
d}|rq@|ot o|dko|	jj|
jko|	jj
d}|rq@|dkrt rq@|o,|dko,t o,tjdko,tdko,t }|r6q@|oR|dkoRt oRt }|r\q@|pr|pr|prt  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 }|rq@tjdk ot o|dkott|	j|
jk}|rq@to0|dko0t }|r:q@tjddoVt oV|dk}|r`q@||	|
d| f q@W |sS tj| |||||dd t  fddtD rt!dd d d S x"|D ]\}	}
}t"|	|
|d qW t#||||d S )N)rg   rh   ri   rn   rH   pypy)r)   r0   pythonheadersr)   )r   	   r   r   r   )usrlocalrs      rt   )r      )rq   r)   r0   T)
check_home)rq   includeplatincludezscheme.)ignore_config_filesc             3   s    | ]} | t |kV  qd S )N)r    )r5   r6   )default_oldr^   r#   r$   r7     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)reasonreplacementgone_in)rT   )rg   rh   ri   rH   )$r   r   _USE_SYSCONFIGr&   r   pathlibPathr    rG   implementationnameparent
startswithr   r;   r	   version_infor   r-   rO   r   rV   rZ   rJ   r>   tupler]   rU   r!   is_python_buildappenddistutils_schemeanyr
   re   rl   )rm   rg   rh   ri   rn   rH   r_   warning_contextsr6   old_vnew_vskip_pypy_special_case$skip_osx_framework_user_special_caseskip_bpo_44860skip_slackware_user_schemeskip_linux_system_special_caseskip_sysconfig_abiflag_bugskip_msys2_mingw_bugskip_cpython_buildrT   r#   )r{   r^   r$   r      s    


 
c              C   s<   t  } tr| S t }tt|t| ddr8t  |S )N
bin_prefix)rT   )r   r   r   r&   rf   r   r   rl   )r_   r^   r#   r#   r$   r     s    c               C   s   t jdddjS )N T)rg   )r   r   scriptsr#   r#   r#   r$   r     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)r>   )r   r#   r#   r$   $_looks_like_deb_system_dist_packages  s
    
r   c              C   sH   t  } tr| S t }t|r$|S tt|t| ddrDt  |S )z,Return the default pure-Python lib location.r0   )rT   )	r   r   r   r&   r   rf   r   r   rl   )r_   r^   r#   r#   r$   r     s    c              C   sT   t  } tr| S ddlm} | }t|r0|S tt|t| ddrPt	  |S )z0Return the default platform-shared lib location.r   )r&   r)   )rT   )
r   r   r   r   r&   r   rf   r   r   rl   )r_   r&   r^   r#   r#   r$   r     s    )FNNFN)B	functoolsloggingrD   r   rG   r!   typingr   r   r   r   r   pip._internal.models.schemer   r   pip._internal.utils.compatr	   pip._internal.utils.deprecationr
   pip._internal.utils.virtualenvr   r   r   baser   r   r   r   r   r   __all__	getLogger__name__r`   r    r   str__annotations__r   r"   r   r%   r   r&   WARNINGrb   DEBUGr-   r3   	lru_cacher;   r>   rJ   rO   rU   r]   r   re   rf   rl   r   r   r   r   r   r   r#   r#   r#   r$   <module>   s     











     ,