a
    OcD                  	   @   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(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Z0ee%e%f e)dddZ1e j2dde)dddZ3e j2dde)dddZ4e j2dde)dddZ5e j2dde)ddd Z6e j2dde)dd!d"Z7ee% e	e%ddf d#d$d%Z8e j2ddej9ej9e%dd&d'd(Z:ej9ej9e%e)d&d)d*Z;e j2ddd+dddd,e)ee% ee% ee% dd-d.d/Z<dGe%e)ee% ee% e)ee% ed0d1d2Z=e%dd3d4Z>e%dd5d6Z?e%e)d7d8d9Z@e%dd:d;ZAe%dd<d=ZBe%e%e
e% d>d?d@ZCe%e)dAdBdCZDe%e
e% dDdEdFZEdS )H    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.
    Z_PIP_USE_SYSCONFIG)boolgetattr	sysconfig_USE_SYSCONFIG_DEFAULT r%   r%   X/var/www/html/megastudio/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_SCHEMESZ	unix_userplatlibFz	$usersite)distutils.command.installr+   KeyError)r+   Zunix_user_platlibr%   r%   r&   _looks_like_bpo_44860M   s    r/   )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   )r0   r,   Z	unpatchedr%   r%   r&   +_looks_like_red_hat_patched_platlib_purelib[   s    r5   )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)r5   .0kr*   r%   r&   	<genexpr>m   s   z*_looks_like_red_hat_lib.<locals>.<genexpr>)Zunix_prefixZ	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*   Z
deb_systemZ
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-   r?   Zdistutils.distr@   Zfinalize_optionsexec_prefixospathnormpathsysprefix)r?   r@   cmdr%   r%   r&   _looks_like_red_hat_scheme|   s    	
rH   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)r0   expandr2   r3   )r   r#   	get_pathsr.   pathsr%   r%   r&   _looks_like_slackware_scheme   s    rN   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)rJ   c                 s   s*   | ]"}d |vo d|v o | d V  qdS )ZLibr   zsite-packagesN)endswithr9   pr%   r%   r&   r;      s   z1_looks_like_msys2_mingw_scheme.<locals>.<genexpr>c                 3   s   | ]} | V  qd S r7   r%   )r9   keyrL   r%   r&   r;          r,   r3   )r#   rK   r<   r%   r%   rL   r&   _looks_like_msys2_mingw_scheme   s    rV   )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 )NZ	LDVERSIONabiflagsr   )r#   get_config_varr"   rE   rP   len)rW   Z	ldversionrX   partr%   r%   r&   _fix_abiflags   s    


r\   )oldnewrS   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^   rS   Z	issue_urlmessager%   r%   r&   _warn_mismatched   s    rc   c                C   s   | |krdS t | ||d dS )NFrS   T)rc   )r]   r^   rS   r%   r%   r&   _warn_if_mismatch   s    re   FuserhomerootrF   )rg   rh   ri   rF   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`   ra   join)rg   rh   ri   rF   rW   r%   r%   r&   _log_context   s    rl   )	dist_namerg   rh   ri   isolatedrF   r    c              	      s  t j| |||||d}tr|S tj| |||||dg }tD ]4}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jdko(tdko(t }|r2q<|oN|dv oNt oNt }|rXq<|pn|pn|pnt  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v ott|	j|
jk}|rq<to,|dv o,t }|r6q<tjddoRt oR|dv }|r\q<||	|
d| f q<|s~S tj| |||||dd t  fddtD rt!dd d d S |D ]\}	}
}t"|	|
|d qt#||||d S )N)rg   rh   ri   rn   rF   pypyrU   pythonheadersr,   )r   	   r   r   r   )usrlocalrs      rt   )r      )rq   r,   r3   T)
check_home)rq   includeplatincludezscheme.)Zignore_config_filesc                 3   s    | ]} | t |kV  qd S r7   )r"   r8   Zdefault_oldr]   r%   r&   r;     rT   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"   rE   implementationnameparent
startswithr   r=   r
   version_infor   r/   rN   r   rW   rZ   rH   r>   tupler\   rV   r#   is_python_buildappendZdistutils_schemeanyr   rc   rl   )rm   rg   rh   ri   rn   rF   r^   Zwarning_contextsr:   Zold_vZnew_vZskip_pypy_special_caseZ$skip_osx_framework_user_special_caseZskip_bpo_44860Zskip_slackware_user_schemeZskip_linux_system_special_caseZskip_sysconfig_abiflag_bugZskip_msys2_mingw_bugZskip_cpython_buildrS   r%   rz   r&   r      s    	



	
r   c                  C   s<   t  } tr| S t }tt|t| ddr8t  |S )NZ
bin_prefixrd   )r   r   r   r)   re   r   r   rl   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.r3   rd   )	r   r   r   r)   r   re   r   r   rl   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   rl   )r^   r)   r]   r%   r%   r&   r     s    r   )v1v2r    c                 C   s   | |kr| gS | |gS )zDeduplicate values from a list.r%   )r   r   r%   r%   r&   _deduplicated  s    r   )rC   r    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)rE   platformr   )rC   r%   r%   r&   _looks_like_apple_library  s    r   )rF   r    c                 C   s   t | \}}trt||S t| \}}t||}tdd |D rXtdddd |S tt	|t	|ddtt	|t	|ddg}t
|rt| d	 |S )
z*Return the lib locations under ``prefix``.c                 s   s   | ]}t |V  qd S r7   )r   rQ   r%   r%   r&   r;     rT   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-purelibrd   zprefixed-platlib)rF   )r   r   r   r   r)   r<   r   re   r   r   r   rl   )rF   Znew_pureZnew_platZold_pureZold_platZold_lib_pathsZwarnedr%   r%   r&   r     s4    


r   )FNNFN)F	functoolsloggingrB   r   rE   r#   typingr   r   r   r   r   r   Z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)   WARNINGra   DEBUGr/   r5   	lru_cacher=   r>   rH   rN   rV   r\   r   rc   re   rl   r   r   r   r   r   r   r   r   r   r%   r%   r%   r&   <module>   s   
  	










      3