o
    1Yc5D                     @   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 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$e%e&d< ej'dkZ(de)fddZ*e* Z+e(re+sej,Z-nej.Z-de)fddZ/dee%e%f de)fddZ0e j1ddde)fddZ2e j1ddde)fddZ3e j1ddde)fddZ4e j1ddde)fddZ5e j1ddde)fd d!Z6d"ee% de	e%ddf fd#d$Z7e j1ddd%ej8d&ej8d'e%ddfd(d)Z9d%ej8d&ej8d'e%de)fd*d+Z:e j1ddd,dddd-d.e)d/ee% d0ee% d1ee% ddf
d2d3Z;	,			,	dLd4e%d.e)d/ee% d0ee% d5e)d1ee% defd6d7Z<de%fd8d9Z=de%fd:d;Z>d<e%de)fd=d>Z?de%fd?d@Z@de%fdAdBZAdCe%dDe%de
e% fdEdFZBdGe%de)fdHdIZCd1e%de
e% fdJdKZDdS )M    N)AnyDict	GeneratorList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_site)r   get_bin_prefixget_bin_userr   get_platlibget_prefixed_libsget_purelib
get_schemer   r   r   
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&   U/var/www/jaguar/venv/lib/python3.10/site-packages/pip/_internal/locations/__init__.py_should_use_sysconfig/   s   r(   c                  C   s8   ddl m}  z| d d }W |dkS  ty   Y dS w )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_44860G   s   r0   schemec                 C   sP   | d }d|v r| ddt d}d|vrdS | dd}| dd| d	 kS )
Nr,   z/$platlibdir///lib64/Fz/lib/z
$platbase/z$base/purelib)replacer   )r1   r,   	unpatchedr&   r&   r'   +_looks_like_red_hat_patched_platlib_purelibU   s   r7   )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)r7   .0kr)   r&   r'   	<genexpr>g   s    

z*_looks_like_red_hat_lib.<locals>.<genexpr>)unix_prefix	unix_home)r-   r*   allr&   r&   r)   r'   _looks_like_red_hat_lib_   s   rA   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_schemen   s   rD   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-   rE   distutils.distrF   finalize_optionsexec_prefixospathnormpathsysprefix)rE   rF   cmdr&   r&   r'   _looks_like_red_hat_schemev   s   	
rP   c                  C   sH   t du rdS z	tjddd} W n
 ty   Y dS w d| d v o#d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)r1   expandr3   r4   )r   r$   	get_pathsr.   pathsr&   r&   r'   _looks_like_slackware_scheme   s   rV   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)rR   c                 s   s,    | ]}d |vod|v o| d V  qdS )Libr   zsite-packagesN)endswithr;   pr&   r&   r'   r=      s
    
z1_looks_like_msys2_mingw_scheme.<locals>.<genexpr>c                 3   s    | ]} | V  qd S r9   r&   )r;   keyrT   r&   r'   r=          r,   r4   )r$   rS   r@   r&   r&   rT   r'   _looks_like_msys2_mingw_scheme   s   r_   partsc                 c   sj    t d}ttdd }|r|r||s| E d H  d S | D ]}||r/|d dt|  }|V  qd S )N	LDVERSIONabiflagsr   )r$   get_config_varr#   rM   rY   len)r`   	ldversionrb   partr&   r&   r'   _fix_abiflags   s   


rg   oldnewr\   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)rh   ri   r\   	issue_urlmessager&   r&   r'   _warn_mismatched   s   ro   c                C   s   | |krdS t | ||d dS )NFr\   T)ro   )rh   ri   r\   r&   r&   r'   _warn_if_mismatch   s   rq   FuserhomerootrN   rs   rt   ru   rN   c                 C   s&   g d}t td|| ||| d S )N)zAdditional context:z	user = %rz	home = %rz	root = %rzprefix = %r
)rj   rk   rl   join)rs   rt   ru   rN   r`   r&   r&   r'   _log_context   s   rx   	dist_nameisolatedc              	      s  t j| |||||d}tr|S ddlm} |j| |||||dg }tD ]}	tt|	}
tt||	}|
|kr<q$t	j
jdko[|d uo[|	dv o[|
j|jko[|
jdo[|jd}|r_q$|out ou|	dkou|
jj|jkou|
jjd}|ryq$|	dkrt rq$|o|	dkot ot	jd	kotd
kot }|rq$|o|	dv ot ot }|rq$|p|p|pt  o|
jdd dkot|jdko|jd dkot|jdk p|jd dkot pt }|rq$t	jdk ot o|	dv ott|
j|jk}|rq$to|	dv ot }|rq$tjddot o|	dv }|rq$||
|d|	 f q$|s,S |j | |||||dd t! fddtD rNt"dd d d S |D ]\}
}}t#|
||d qPt$||||d S )N)rs   rt   ru   rz   rN   r   
_distutilspypyr^   pythonheadersr,   )r   	   r   r   )usrlocalr      r   )r      )r   r,   r4   T)
check_home)r   includeplatincludezscheme.)ignore_config_filesc                 3   s"    | ]} | t |kV  qd S r9   )r#   r:   default_oldrh   r&   r'   r=     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_inrp   rr   )%r   r   _USE_SYSCONFIG r|   r   pathlibPathr#   rM   implementationnameparent
startswithr   rA   r
   version_infor   r0   rV   r   r`   rd   rP   rD   tuplerg   r_   r$   is_python_buildappenddistutils_schemeanyr   ro   rx   )ry   rs   rt   ru   rz   rN   ri   r|   warning_contextsr<   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_buildr\   r&   r   r'   r      s  	





	
r   c                  C   sH   t  } tr| S ddlm} | }tt|t| ddr"t  |S )Nr   r{   
bin_prefixrp   )	r   r   r   r   r|   rq   r   r   rx   ri   r|   rh   r&   r&   r'   r     s   r   c                   C   s   t jdddjS )Nr   T)rs   )r   r   scriptsr&   r&   r&   r'   r     s   r   valuec                 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)rD   )r   r&   r&   r'   $_looks_like_deb_system_dist_packages  s
   
r   c                  C   T   t  } tr| S ddlm} | }t|r|S tt|t| ddr(t	  |S )z,Return the default pure-Python lib location.r   r{   r4   rp   )
r   r   r   r   r|   r   rq   r   r   rx   r   r&   r&   r'   r        r   c                  C   r   )z0Return the default platform-shared lib location.r   r{   r,   rp   )
r   r   r   r   r|   r   rq   r   r   rx   r   r&   r&   r'   r     r   r   v1v2c                 C   s   | |kr| gS | |gS )zDeduplicate values from a list.r&   )r   r   r&   r&   r'   _deduplicated  s   r   rK   c                 C   s(   t jdd dkrdS | dt  dkS )zAApple patches sysconfig to *always* look under */Library/Python*.N   darwinFz/Library/Python/z/site-packages)rM   platformr   )rK   r&   r&   r'   _looks_like_apple_library  s   r   c                 C   s   t | \}}trt||S ddlm} || \}}t||}tdd |D r2tdddd |S tt	
|t	
|dd	tt	
|t	
|d
d	g}t|rUt| d |S )z*Return the lib locations under ``prefix``.r   r{   c                 s   s    | ]}t |V  qd S r9   )r   rZ   r&   r&   r'   r=     r]   z$get_prefixed_libs.<locals>.<genexpr>a&  Python distributed by Apple's Command Line Tools incorrectly patches sysconfig to always point to '/Library/Python'. This will cause build isolation to operate incorrectly on Python 3.10 or later. Please help report this to Apple so they can fix this. https://developer.apple.com/bug-reporting/Nr   zprefixed-purelibrp   zprefixed-platlib)rN   )r   r   r   r   r   r|   r@   r   rq   r   r   r   rx   )rN   new_purenew_platr|   old_pureold_platold_lib_pathswarnedr&   r&   r'   r     s6   


r   )FNNFN)E	functoolsloggingrJ   r   rM   r$   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   baser   r   r   r   r   r   __all__	getLogger__name__rj   r#   r   str__annotations__r   r%   r"   r(   r   WARNINGrl   DEBUGr0   r7   	lru_cacherA   rD   rP   rV   r_   rg   r   ro   rq   rx   r   r   r   r   r   r   r   r   r   r&   r&   r&   r'   <module>   s   
   	







 
 


 5