HEX
Server: Apache/2.4.65 (Debian)
System: Linux kubikelcreative 5.10.0-35-amd64 #1 SMP Debian 5.10.237-1 (2025-05-19) x86_64
User: www-data (33)
PHP: 8.4.13
Disabled: NONE
Upload Files
File: //usr/share/dh-python/dhpython/__pycache__/pydist.cpython-39.pyc
a

��:`s:�@s<ddlZddlZddlZddlmZddlmZmZmZddl	m
Z
mZedkrzddl
Z
e
j�ej�eej�e�d���ddlmZmZmZmZmZddlmZmZdd	lmZe�d
�Ze� dej!�Z"e� dej!�Z#d
dddd�Z$dd�Z%edd��Z&d2dd�Z'd3dd�Z(dd�Z)dd�Z*dd �Z+e� d!�Z,e� d"�Z-d#d$�Z.d%d&�Z/d'd(�Z0d)d*�Z1edk�r8ej2�3d+d,�Z4e
j5d-d�D]�Z6ej�7e6��r�ze8d.�e(e4e6�d/��Wn4e9�y�Z:ze�;d0e6e:�WYdZ:[:n
dZ:[:00nNze8e'e4e6��p�d1�Wn4e9�y2Z:ze�;d0e6e:�WYdZ:[:n
dZ:[:00�q�dS)4�N)�partial)�exists�isdir�join)�PIPE�Popen�__main__z..)�PKG_PREFIX_MAP�
PUBLIC_DIR_RE�PYDIST_DIRS�PYDIST_OVERRIDES_FNAMES�PYDIST_DPKG_SEARCH_TPLS)�get_requested_versions�Version)�memoize�dhpythona�
    (?P<name>[A-Za-z][A-Za-z0-9_.\-]*)             # Python distribution name
    \s*
    (?P<vrange>(?:-?\d\.\d+(?:-(?:\d\.\d+)?)?)?) # version range
    \s*
    (?P<dependency>(?:[a-z][^;]*)?)              # Debian dependency
    (?:  # optional upstream version -> Debian version translator
        ;\s*
        (?P<standard>PEP386)?                    # PEP-386 mode
        \s*
        (?P<rules>(?:s|tr|y).*)?                 # translator rules
    )?
    a2
    (?P<name>[A-Za-z][A-Za-z0-9_.]*)     # Python distribution name
    \s*
    (?P<enabled_extras>(?:\[[^\]]*\])?)  # ignored for now
    \s*
    \(?  # optional parenthesis
    (?:  # optional minimum/maximum version
        (?P<operator><=?|>=?|==|!=|~=)
        \s*
        (?P<version>(\w|[-.])+)
        (?:  # optional interval minimum/maximum version
            \s*
            ,
            \s*
            (?P<operator2><=?|>=?|==|!=)
            \s*
            (?P<version2>(\w|[-.])+)
        )?
    )?
    \)?  # optional closing parenthesis
    �=�<<z>>z>=)z==�<�>�~=c	Cs�t|dd��h}|D]R}|��}|�d�s|s.qt�|�st�d|�dd�d|�Wd�d	SqWd�n1sz0Yd
S)z Check if pydist file looks good.�utf-8��encoding�#z"invalid pydist data in file %s: %s�/����NFT)�open�strip�
startswith�	PYDIST_RE�match�log�error�rsplit)�fpath�fp�line�r)�'/usr/share/dh-python/dhpython/pydist.py�validateRs
�2r+c
	sXt�|�}t|�r|g}ng}t�|��t��rN|��fdd�t���D��d�|�}t|�rj|�	|�i}|D]�}t
|dd���}|D]�}|��}|�d�s�|s�q�t
�|�}|s�td||f��|��}t|d�}	t||d	�|d
<|d��|d<|d�r|d�d
�|d<ng|d<|�|	g��	|�q�Wd�qr1�sH0Yqr|S)z�Load iformation about installed Python distributions.

    :param impl: interpreter implementation, f.e. cpython2, cpython3, pypy
    :type impl: str
    c3s|]}t�|�VqdS)N)r��.0�i�Zdnamer)r*�	<genexpr>o�zload.<locals>.<genexpr>z%/usr/share/dh-python/dist/{}_fallbackrrrzinvalid pydist line: %s (in %s)�nameZvrange�versions�
dependency�rules�;N)r�getrrr�extend�os�listdir�format�appendrrr r!�search�	Exception�	groupdict�	safe_namer�split�
setdefault)
�impl�fnameZto_checkZfbname�resultr&r'r(Zdistr2r)r/r*�load`s:





6rFFcCs�|pi}t�d||�t|t�r(t|�}t�d��|���\}}t	|�|}t
|�}t�|�}|sxt�d�t
d|��|��}|d}|�|���}	|	�r�|	D�]Z}
|r�||
�d|�vr�q�|
ds�dS|
d�d�r�|
dS|d	�r�|
d
�s|
d�r�|dd
v�r�t|d�}t|d	|
d|
d
�}d|
d||f}
|d�r�|dd
v�r�t|d�}t|d|
d|
d
�}|
d|
d||f7}
nD|ddk�r�d}tt|d	�|
d|
d
�}|
d|
d||f7}
|
S|�r�|d	�r�|dd
v�r�t|d�}d|
d||d	f}
|d�rf|dd
v�rft|d�}|
d|
d||df7}
n0|ddk�r�d}|
d|
d|t|d	�f7}
|
S|
d|v�r�d||
dv�r�||
dd�r�d�|
d||
dd�S|
dSq�t|�tt	|���}t�d|�td|dttd�}|��\}}|jdk�r�t�}t|d�}|�d�D](}|���sx�qf|�|�d�d��qft |�dk�r�t�!d|�n|�"�Snt�d||�t#||�}t�d |t	|�|t$|�dS)!Nz,trying to find dependency for %s (python=%s)z([^!><=~ \(\)\[]+)(.*)z[please ask dh_python3 author to fix REQUIRES_RE or your upstream author to fix requires.txtzrequirement is not valid: %sr2r3r4�)�version�standardr5�operator)Nz!=z
%s (%s %s)Zversion2Z	operator2z, %s (%s %s)rrz{} ({})zinvoking dpkg -S %sz/usr/bin/dpkg -S %sT)�shell�stdout�stderrrr�
�:rz,more than one package name found for %s distz'dpkg -S did not find package for %s: %sz�Cannot find package that provides %s. Please add package that provides it to Build-Depends or add "%s %s" line to %s or add proper dependency to Depends by hand and ignore this info.)%r#�debug�
isinstance�strr�re�compiler"�groupsr@rF�REQUIRES_RE�infor>r?r7�lower�endswith�
_translate_op�
_translate�_max_compatibler;r
�	ci_regexprrZcommunicate�
returncode�setrAr�add�lenr$�pop�sensible_pnamer)rC�reqrH�bdep�accept_upstream_versionsr2�rest�dataZreq_dZdetails�item�o�v�dZo2Zv2ZqueryZprocessrLrMrEr(Zpnamer)r)r*�guess_dependency�s��




�
�$ �



�rmc	Cs�|pg}|pg}|pg}t|�|�}d}|rR|��rRt|�d��dkrR|�d�}tt|||t|dd�d�}	gggd�}
d}}g}
t|ddd���}|D]�}|�	�}|r�|�
d	�r�|
�|�q�|�
d
�r�|dd��	�}|
�|�q�|�r&||vr�d}n,||v�rd
}n||v�rd}n|
�|�q�nd}|	|d�}|�rN|
|�|�d}q�|
�|�q�Wd�n1�sp0Y|�r�|�r�t|ddd��$}|�dd�|
D��Wd�n1�s�0Y|
S)NrrfF)rCrHrerf)�depends�
recommends�suggests�rrrr�[rrnrorp)rdT�wcss|]}|dVqdS)rNNr)r,r)r)r*r0r1zparse_pydep.<locals>.<genexpr>)
r
r"rUra�grouprrm�getattrrrr r<�
writelines)rCrDreZoptionsZdepends_secZrecommends_secZsuggests_secZ
public_dirZverZ
guess_depsrEZmodifiedZsectionZ	processedr'r(Z
result_keyr4r)r)r*�parse_pydep�sX

��






,4rwcCst�d��d|���S)zEmulate distribute's safe_name.z[^A-Za-z0-9.]+�_)rSrT�subrX�r2r)r)r*r@"sr@cCs:t|��dd�}|�d�r&|dd�}d�t||���S)z(Guess Debian package name from Egg name.rx�-zpython-�Nz{}-{})r@�replacer r;r	rX)rCZegg_namer)r)r*rc's
rccCsd�dd�|��D��S)z'Return case insensitive dpkg -S regexp.�css*|]"}|��rd|��|fn|VqdS)z[%s%s]N)�isalpha�upperr,r)r)r*r01r1zci_regexp.<locals>.<genexpr>)rrXrzr)r)r*r]/sr]z[-.]?(alpha|beta|rc|dev|a|b|c)z\$(\d+)cCst�d|�S)zdConvert Perl RE patterns used in uscan to Python's

    >>> print(_pl2py('foo$3'))
    foo\g<3>
    z\\g<\1>)�GROUP_REry)�patternr)r)r*�_pl2py8sr�cCsBt|�}d|_d|_|jdur0d|_t|d�Sd|_t|d�S)akReturn the maximum version compatible with `version` in PEP440 terms,
    used by ~= requires version specifiers.

    https://www.python.org/dev/peps/pep-0440/#compatible-release

    >>> _max_compatible('2.2')
    '3'
    >>> _max_compatible('1.4.5')
    '1.5'
    >>> _max_compatible('1.3.alpha4')
    '2'
    >>> _max_compatible('2.1.3.post5')
    '2.2'

    Nr)r�serial�releaselevel�microrR�minor)rHrkr)r)r*r\As
r\c	Cs|D]�}|�d�rZ|�d�r dnd}||dd��||�}|�t�|d|d��}q|�d�r�|dd��|d�}t�|d�}d}|dd�r�|d}d|vr�d}d	|vr�t�|dtj�}|�t	|d�||�}qt
�d
|�q|dk�rt�d|�}|S)
a>Translate Python version into Debian one.

    >>> _translate('1.C2betac', ['s/c//gi'], None)
    '1.2beta'
    >>> _translate('5-fooa1.2beta3-fooD',
    ...     ['s/^/1:/', 's/-foo//g', 's:([A-Z]):+$1:'], 'PEP386')
    '1:5~a1.2~beta3+D'
    >>> _translate('x.y.x.z', ['tr/xy/ab/', 'y,z,Z,'], None)
    'a.b.a.Z'
    )Ztr�yr�r�Nr�s�gr.zunknown rule ignored: %sZPEP386z~\g<1>)
r rA�	translaterR�	maketransrSrT�Iryr�r#�warn�
PRE_VER_RE)	rHr5rIZrule�pos�tmpr��count�flagsr)r)r*r[[s(


r[cCst�||�S)z�Translate Python version operator into Debian one.

    >>> _translate_op('==')
    '='
    >>> _translate_op('<')
    '<<'
    >>> _translate_op('<=')
    '<='
    )�DEB_VERS_OPSr7)rJr)r)r*rZ�s
rZZIMPLZcpython3rz, rnz%s: cannot guess (%s)r~)NNF)NNNNN)<Zloggingr9rS�	functoolsr�os.pathrrr�
subprocessrr�__name__�sys�pathr<�abspath�dirname�__file__rr	r
rrr
Zdhpython.versionrrZdhpython.toolsrZ	getLoggerr#rT�VERBOSEr!rVr�r+rFrmrwr@rcr]r�r�r�r\r[rZ�environr7rC�argvr.�isfile�printr>�errr$r)r)r)r*�<module>sj"
�
��
*�
b�
5

	%
&