U
    Ðvag<  ã                
   @   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.
    Z_PIP_USE_SYSCONFIG)ÚboolÚgetattrÚ	sysconfigÚ_USE_SYSCONFIG_DEFAULT© r"   r"   úT/var/www/html/myvenv/lib/python3.8/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k
r2   Y dS X |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_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/ú/ú/lib64/Fz/lib/z
$platbase/z$base/Úpurelib)Úreplacer   )r-   r)   Z	unpatchedr"   r"   r#   Ú+_looks_like_red_hat_patched_platlib_purelibZ   s    r2   )Úmaxsizec                      s"   ddl m‰  t‡ fdd„dD ƒƒS )z‘Red 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)r2   ©Ú.0Úkr'   r"   r#   Ú	<genexpr>l   s   þz*_looks_like_red_hat_lib.<locals>.<genexpr>)Zunix_prefixZ	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'   Z
deb_systemZ
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<   Zdistutils.distr=   Zfinalize_optionsÚexec_prefixÚosÚpathÚnormpathÚsysÚprefix)r<   r=   Úcmdr"   r"   r#   Ú_looks_like_red_hat_scheme{   s    	
þrE   c                  C   sJ   t dkrdS ztjddd�} W n tk
r4   Y dS X d| d koHdt kS )zÌSlackware 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-   Úexpandr/   r0   )r   r    Ú	get_pathsr+   ©Úpathsr"   r"   r#   Ú_looks_like_slackware_scheme�   s    rK   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)rG   c                 s   s*   | ]"}d |ko d|ko |  d¡ V  qdS )ZLibr   zsite-packagesN)Úendswith)r6   Úpr"   r"   r#   r8   «   s   ÿz1_looks_like_msys2_mingw_scheme.<locals>.<genexpr>c                 3   s   | ]}ˆ | V  qd S r4   r"   )r6   ÚkeyrI   r"   r#   r8   ­   s     ©r)   r0   )r    rH   r9   r"   r"   rI   r#   Ú_looks_like_msys2_mingw_schemeŸ   s    þrQ   )Ú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   rB   rM   Úlen)rR   Z	ldversionrS   Úpartr"   r"   r#   Ú_fix_abiflags±   s    


rW   )ÚoldÚnewrO   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)rX   rY   rO   Z	issue_urlÚmessager"   r"   r#   Ú_warn_mismatchedÁ   s    ÿr^   c                C   s   | |krdS t | ||d� dS )NF©rO   T)r^   )rX   rY   rO   r"   r"   r#   Ú_warn_if_mismatchÌ   s    r`   F©ÚuserÚhomeÚrootrC   )rb   rc   rd   rC   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Ú
)rZ   r[   r\   Újoin)rb   rc   rd   rC   rR   r"   r"   r#   Ú_log_contextÓ   s    	ûrg   )Ú	dist_namerb   rc   rd   ÚisolatedrC   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 k	oª|dkoª|	j|
jkoª|	j
 d¡oª|
j
 d¡}|r²q<|oÞtƒ oÞ|dkoÞ|	jj|
jkoÞ|	jj
 d¡}|ræq<|dkrötƒ röq<|�o(|dk�o(t �o(tjdk�o(tdk�o(tƒ }|�r2q<|�oN|dk�oNt �oNtƒ }|�rXq<|�pn|�pn|�pntƒ  �oÔ|	jd	d
… dk�oÔt|
jƒd	k�oÔ|
jd	 dk�oÔt|
jƒd
k �sÈ|
jd dk�oÔtƒ �pÔtƒ }|�rÞq<tjdk �ot �o|dk�ott|	jƒƒ|
jk}|�rq<t�o,|dk�o,tƒ }|�r6q<tjdd��oRt �oR|dk}|�r\q<| |	|
d|› �f¡ q<|�s~ˆS tj| |||||dd�‰ t ‡ ‡fdd„tD ƒƒ�rÂt!dd d d� ˆS |D ]\}	}
}t"|	|
|d� �qÆt#||||d� ˆS )N)rb   rc   rd   ri   rC   ÚpypyrP   ÚpythonÚheadersr)   )r   é	   r   r   r   )ÚusrÚlocalrn   é   ro   )r   é   )rl   r)   r0   T)Ú
check_home)rl   ÚincludeÚplatincludezscheme.)Zignore_config_filesc                 3   s    | ]}ˆ | t ˆ|ƒkV  qd S r4   )r   r5   ©Zdefault_oldrX   r"   r#   r8   ƒ  s     zget_scheme.<locals>.<genexpr>zöConfiguring 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_inr_   ra   )$r   r   Ú_USE_SYSCONFIGr&   r   ÚpathlibÚPathr   rB   ÚimplementationÚnameÚparentÚ
startswithr   r:   r	   Úversion_infor   r,   rK   r   rR   rU   rE   r;   ÚtuplerW   rQ   r    Úis_python_buildÚappendZdistutils_schemeÚanyr
   r^   rg   )rh   rb   rc   rd   ri   rC   rY   Zwarning_contextsr7   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_buildrO   r"   ru   r#   r   æ   s    úú	
ÿþ
ý
ü
úÿþýûÿþýüúÿþüÿþýüúÿþüÿÿýù	ø
c                  C   s<   t  ¡ } tr| S t ¡ }tt |¡t | ¡dd�r8tƒ  |S )NZ
bin_prefixr_   )r   r   ry   r&   r`   rz   r{   rg   ©rY   rX   r"   r"   r#   r   ˜  s    c                   C   s   t jddd�jS )NÚ T)rb   )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   r_   )	r   r   ry   r&   r‰   r`   rz   r{   rg   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)   r_   )
r   r   ry   r†   r&   r‰   r`   rz   r{   rg   )rY   r&   rX   r"   r"   r#   r   Æ  s    )FNNFN)BÚ	functoolsÚloggingr?   rz   rB   r    Útypingr   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__rZ   r   r   ÚstrÚ__annotations__r€   r!   r   r$   ry   r&   ÚWARNINGr\   ÚDEBUGr,   r2   Ú	lru_cacher:   r;   rE   rK   rQ   rW   r{   r^   r`   rg   r   r   r   r‰   r   r   r"   r"   r"   r#   Ú<module>   s¤     
ö



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