a
    ijM7                  	   @  sL  U 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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 g d
ZeeZeeddZde d< ej!dkZ"ddddZ#e# Z$e$sddlm%Z% e"re$sej&Z'nej(Z'ddddZ)dddddZ*ej+ddddZ,ej+ddddZ-ej+dddd Z.ej+ddd!d"Z/ej+ddd#d$Z0ej+d%d%dd&d'd(d)Z1d%d%ddd'd*d+Z2ej+d,dddd-dd.d.d.d&d/d0d1Z3dAddd.d.dd.d2d3d4d5Z4ddd6d7Z5ddd8d9Z6ddd:d;d<Z7ddd=d>Z8ddd?d@Z9dS )B    )annotationsN)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_site)
r
   get_bin_prefixget_bin_userr   get_platlibget_purelib
get_schemer   r   r   
platlibdirlibstr_PLATLIBDIR)   
   bool)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)r   getattr	sysconfig_USE_SYSCONFIG_DEFAULT r!   r!   ^/home/ghrups/robot-bench/.venv/lib/python3.9/site-packages/pip/_internal/locations/__init__.py_should_use_sysconfig/   s    r#   
_distutilsc                  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'   unix_user_platlibr!   r!   r"   _looks_like_bpo_44860M   s    r-   zdict[str, str])schemer   c                 C  sP   | d }d|v r$| ddt d}d|vr0dS | dd}| dd| d	 kS )
Nr)   z/$platlibdir///lib64/Fz/lib/z
$platbase/z$base/purelib)replacer   )r.   r)   	unpatchedr!   r!   r"   +_looks_like_red_hat_patched_platlib_purelib[   s    r4   c                     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)r4   .0kr&   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_libe   s    r=   c                  C  s   ddl m}  d| v od| v S )z#Debian adds two additional schemes.r   r&   
deb_system
unix_local)r*   r'   r&   r!   r!   r"   _looks_like_debian_schemet   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*   rA   distutils.distrB   finalize_optionsexec_prefixospathnormpathsysprefix)rA   rB   cmdr!   r!   r"   _looks_like_red_hat_scheme|   s    	
rL   c                  C  sH   t du rdS ztjddd} W n ty2   Y dS 0 d| d v oFdt v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.   expandr0   r1   )r   r   	get_pathsr+   pathsr!   r!   r"   _looks_like_slackware_scheme   s    rR   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)rN   c                 s  s*   | ]"}d |vo d|v o | d V  qdS )Libr   zsite-packagesN)endswith)r7   pr!   r!   r"   r9      s   z1_looks_like_msys2_mingw_scheme.<locals>.<genexpr>c                 3  s   | ]} | V  qd S r5   r!   )r7   keyrP   r!   r"   r9          r)   r1   )r   rO   r<   r!   r!   rP   r"   _looks_like_msys2_mingw_scheme   s    rZ   zpathlib.PathNone)oldnewrW   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]   rW   	issue_urlmessager!   r!   r"   _warn_mismatched   s    rc   c                C  s   | |krdS t | ||d dS )NFrW   T)rc   )r\   r]   rW   r!   r!   r"   _warn_if_mismatch   s    re   FuserhomerootrJ   z
str | None)rg   rh   ri   rJ   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)rg   rh   ri   rJ   partsr!   r!   r"   _log_context   s    rm   r   )	dist_namerg   rh   ri   isolatedrJ   r   c              	     s  t j| |||||d}tr|S tj| |||||dg }tD ]}tt|}	tt||}
|	|
krlq<tj	j
dko|d uo|dv 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dkot }|r&q<|oB|dv oBt oBt }|rLq<|pb|pb|pbt  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o|dv ot }|rq<tjddot o|dv }|rq<||	|
d| f q<|s8S tj| |||||dd t fddtD r|tdd d d S |D ]\}	}
}t|	|
|d qt ||||d S )N)rg   rh   ri   ro   rJ   pypyrY   pythonheadersr)   r   r   r   )usrlocalrs      rt   T)
check_home)rr   includeplatincludezscheme.)ignore_config_filesc                 3  s    | ]} | t |kV  qd S r5   )r   r6   default_oldr\   r!   r"   r9   h  rX   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_inrd   rf   )!r	   r   _USE_SYSCONFIGr%   r   pathlibPathr   rI   implementationnameparent
startswithr   r=   r   r   r-   rR   r   rl   lenrL   r@   rZ   r   is_python_buildappenddistutils_schemeanyr   rc   rm   )rn   rg   rh   ri   ro   rJ   r]   warning_contextsr8   old_vnew_vskip_pypy_special_case$skip_osx_framework_user_special_caseskip_bpo_44860Zskip_slackware_user_schemeskip_linux_system_special_caseskip_msys2_mingw_bugskip_cpython_buildrW   r!   rz   r"   r      s    	



	
r   c                  C  s<   t  } tr| S t }tt|t| ddr8t  |S )N
bin_prefixrd   )r	   r   r   r%   re   r   r   rm   r]   r\   r!   r!   r"   r   }  s    r   c                   C  s   t jdddjS )N T)rg   )r	   r   scriptsr!   r!   r!   r"   r     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)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.r1   rd   )	r	   r   r   r%   r   re   r   r   rm   r   r!   r!   r"   r     s    r   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)   rd   )
r	   r   r   r   r%   r   re   r   r   rm   )r]   r%   r\   r!   r!   r"   r     s    r   )FNNFN):
__future__r   	functoolsloggingrF   r   rI   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   __annotations__version_infor    r#   r   r%   WARNINGr`   DEBUGr-   r4   cacher=   r@   rL   rR   rZ   rc   re   rm   r   r   r   r   r   r   r!   r!   r!   r"   <module>   sp    	



      '