a
    hbòf  ã                	   @   st  d 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ZddlZddl	m
Z
mZmZmZmZ e
e eeedf dœdd„Ze
e ee dœd	d
„ZG dd„ deƒZeee dœdd„Ze ¡ eee dœdd„ƒZeee dœdd„Zedk�rpddlZe ¡ Ze d¡�sJ dƒ‚edeƒ edeejƒƒ eddd� ee  dde !d d!¡d" ¡ƒD ]Z"ee"d#d� �q\dS )$z�PEP 656 support.

This module implements logic to detect if the currently running Python is
linked against musl, and what musl version is used.
é    N)ÚIOÚIteratorÚ
NamedTupleÚOptionalÚTuple.)ÚfÚfmtÚreturnc                 C   s   t  ||  t  |¡¡¡S ©N)ÚstructÚunpackÚreadÚcalcsize)r   r   © r   ú]/home/httpd/docs/test/DocsMgr/lib/python3.9/site-packages/pip/_vendor/packaging/_musllinux.pyÚ_read_unpacked   s    r   )r   r	   c              	   C   sh  |   d¡ zt| dƒ}W n tjy.   Y dS 0 |dd… tdƒkrHdS |   t d¡d¡ zdd	d
œ|d  \}}}W n tyŠ   Y dS 0 tj|Ž }zt| |ƒ\}}}}}}}	W n tjyÈ   Y dS 0 t	|	d ƒD ]Œ}
|   |||
  ¡ z|t| |ƒƒ\}}}W n tj�y   Y  dS 0 |dk�r,qÖ|   |¡ t
 |  |¡¡ d¡}d|v�r\ dS |  S dS )záDetect musl libc location by parsing the Python executable.

    Based on: https://gist.github.com/lyssdod/f51579ae8d93c8657a5564aefc2ffbca
    ELF header: https://refspecs.linuxfoundation.org/elf/gabi4+/ch4.eheader.html
    r   Ú16BNé   s   ELFÚHHIé   )ÚIIIIHHHÚIIIIIIII)r   r   r   )ÚQQQIHHHÚIIQQQQQQ)r   é   é   )r   r   é   ú Úmusl)Úseekr   r   ÚerrorÚtupler   ÚKeyErrorÚoperatorÚ
itemgetterÚrangeÚosÚfsdecoder   Ústrip)r   ÚidentÚe_fmtÚp_fmtÚp_idxÚp_getÚ_Úe_phoffÚe_phentsizeÚe_phnumÚiÚp_typeÚp_offsetÚp_fileszÚinterpreterr   r   r   Ú_parse_ld_musl_from_elf   sF    
þý




r7   c                   @   s   e Zd ZU eed< eed< dS )Ú_MuslVersionÚmajorÚminorN)Ú__name__Ú
__module__Ú__qualname__ÚintÚ__annotations__r   r   r   r   r8   G   s   
r8   )Úoutputr	   c                 C   sx   dd„ dd„ |   ¡ D ƒD ƒ}t|ƒdk s<|d d d… dkr@d S t d	|d
 ¡}|sXd S tt| d
¡ƒt| d¡ƒd�S )Nc                 S   s   g | ]}|r|‘qS r   r   ©Ú.0Únr   r   r   Ú
<listcomp>M   ó    z'_parse_musl_version.<locals>.<listcomp>c                 s   s   | ]}|  ¡ V  qd S r
   )r(   rA   r   r   r   Ú	<genexpr>M   rE   z&_parse_musl_version.<locals>.<genexpr>r   r   r   r   zVersion (\d+)\.(\d+)r   )r9   r:   )Ú
splitlinesÚlenÚreÚmatchr8   r>   Úgroup)r@   ÚlinesÚmr   r   r   Ú_parse_musl_versionL   s     rN   )Ú
executabler	   c              	   C   sŒ   t  ¡ �N}z| t| dƒ¡}W n  ty>   Y W d  ƒ dS 0 t|ƒ}W d  ƒ n1 s\0    Y  |sndS tj|gtjdd�}t	|j
ƒS )a`  Detect currently-running musl runtime version.

    This is done by checking the specified executable's dynamic linking
    information, and invoking the loader to parse its output for a version
    string. If the loader is musl, the output would be something like::

        musl libc (x86_64)
        Version 1.2.2
        Dynamic Program Loader
    ÚrbNT)ÚstderrÚuniversal_newlines)Ú
contextlibÚ	ExitStackÚenter_contextÚopenÚOSErrorr7   Ú
subprocessÚrunÚPIPErN   rQ   )rO   Ústackr   ÚldÚprocr   r   r   Ú_get_musl_versionV   s    
&r^   )Úarchr	   c                 c   sH   t tjƒ}|du rdS t|jddƒD ]}d|j› d|› d| › �V  q$dS )aT  Generate musllinux tags compatible to the current platform.

    :param arch: Should be the part of platform tag after the ``linux_``
        prefix, e.g. ``x86_64``. The ``linux_`` prefix is assumed as a
        prerequisite for the current platform to be musllinux-compatible.

    :returns: An iterator of compatible musllinux tags.
    NéÿÿÿÿÚ
musllinux_r.   )r^   ÚsysrO   r%   r:   r9   )r_   Úsys_muslr:   r   r   r   Úplatform_tagsn   s
    	
rd   Ú__main__zlinux-z	not linuxzplat:zmusl:ztags:ú )Úendz[.-]r.   ú-r   r`   z
      )#Ú__doc__rS   Ú	functoolsr#   r&   rI   r   rX   rb   Útypingr   r   r   r   r   ÚbytesÚstrr>   r   r7   r8   rN   Ú	lru_cacher^   rd   r;   Ú	sysconfigÚget_platformÚplatÚ
startswithÚprintrO   ÚsubÚsplitÚtr   r   r   r   Ú<module>   s2   1


"