HEX
Server: LiteSpeed
System: Linux s1049.use1.mysecurecloudhost.com 4.18.0-477.27.2.lve.el8.x86_64 #1 SMP Wed Oct 11 12:32:56 UTC 2023 x86_64
User: xedaptot (3356)
PHP: 8.3.31
Disabled: NONE
Upload Files
File: //opt/saltstack/salt/lib/python3.10/site-packages/relenv/__pycache__/pyversions.cpython-310.pyc
o

;j���@s�dZddlmZddlZddlZddlZddlZddlZddl	Z	ddl
ZddlZ
ddlZddlmZmZddlmZmZmZmZmZerHddlZe�e�ZeZeZ
e
Zgd�Zgd�ZdZd	Zd�dd�Z d�dd�Z!d�d�dd�Z"d�dd�Z#d�dd�Z$d�d#d$�Z%d�d(d)�Z&d*Z'd*Z(dZ)dZ*d+d,iZ+d�d.d/�Z,d�d0d1�Z-d�d2d3�Z.d�d5d6�Z/d�d8d9�Z0d�d:d;�Z1d�d<d=�Z2d�d>d?�Z3d�d@dA�Z4d�dBdC�Z5d�dDdE�Z6d�dFdG�Z7d�dHdI�Z8dJZ9d�d�dMdN�Z:d�dPdQ�Z;d�dRdS�Z<d�dTdU�Z=d�dVdW�Z>d�dXdY�Z?d�d[d\�Z@d�d]d^�ZAd�d_d`�ZBd�dadb�ZCd�d�dfdg�ZDd�didj�ZEd�dkdl�ZF	d�dddm�d�drds�ZGd�dtdu�ZHd�d�dwdx�ZId�d{d|�ZJd�dd��ZKed�k�r?e-�dSdS)�z
Versions utility.
�)�annotationsN)�
TYPE_CHECKING�Any)�Version�	check_url�download_url�	fetch_url�fetch_url_content)r�os�
subprocess�sys)zkeyserver.ubuntu.comzkeys.openpgp.orgzpgp.mit.edu)zhttps://github.com/Yhg1s.gpgz)https://keybase.io/pablogsal/pgp_keys.ascz*https://keybase.io/stevedower/pgp_keys.ascz$https://keybase.io/ambv/pgp_keys.ascz#https://keybase.io/nad/pgp_keys.asczBhttps://www.python.org/ftp/python/{version}/Python-{version}.{ext}�x�str�returnrcCs$|�dd�d�dd�d}t|�S)NzPython ��<r)�splitr)r
�_�r�E/opt/saltstack/salt/lib/python3.10/site-packages/relenv/pyversions.py�_ref_versionGsrcCs|�d�d�d�dS)Nzhref="r�"r�r�r
rrr�	_ref_pathLsrF�version�gzip�bool�tuple[str, str | None]cCsL|rd|�d|�d�}n	d|�d|�d�}|td�kr|dfS||�d�fS)Nz"https://www.python.org/ftp/python/z/Python-z.tgz�.tar.xz�2.3�.asc�r)rrZtarballrrr�
_release_urlsPsr#�keyid�servercCs*tjdd|d|gdd�}|jdkrdSdS)N�gpgz--keyserverz--recv-keysT��capture_outputrF)r�run�
returncode)r$r%�procrrr�_receive_key[s
r,�NonecCs�ddl}tD]J}|��}zt||�Wnty/}ztd|�d|���WYd}~qd}~wwtjgd�|��dd�}|j	dkrPtd|�d|j
�������qdS)	aImport Python release manager public keys from their canonical homes.

    Keyservers regularly fail to serve newly-issued release manager keys, so
    we pull each key listed at python.org/downloads/metadata/pgp/ directly
    from the URL the release managers themselves publish.
    rNz)Could not fetch release manager key from �: )r&z--batchz--importT)�inputr(zgpg --import failed for )
�io�RELEASE_MANAGER_KEY_URLS�BytesIOr�	Exception�printrr)�getvaluer*�stderr�decode�strip)r0�url�buf�excr+rrr�import_release_manager_keysbs&���
��r<r+�"subprocess.CompletedProcess[bytes]�
str | Nonec	Cs>z|j��}|��d�dd�dWSttfyYdSw)Nr� ���)r6r7�
splitlines�rsplit�AttributeError�
IndexError)r+�errrrr�
_get_keyid{s
�rF�path�str | os.PathLike[str]�	signaturecCs
tjdd||gdd�}t|�}|jdkr"td|�d|pd���dS|j��}|rLd	|vrLtD]}t||�rBtd
|�d|���n	q/td|�d
��ntd|j�����dStjdd||gdd�}|jdkrttd|�d|���dS|j��}td|j�����dS)z
    Verify gpg signature.
    r&z--verifyTr'rzValid signature r?�z
No public keyzfound public key z on zUnable to find key z  on any serverzSignature verification failed F)	rr)rFr*r4r6r7�
KEYSERVERSr,)rGrIr+r$rEr%rrr�verify_signature�s.


��

rLT�opensslz3.5�filecC�Nt��}t|d��}|�|���Wd�|��S1swY|��S�z!
    SHA-256 digest of file.
    �rbN)�hashlib�sha1�open�update�read�	hexdigest�rNZhsh�fprrr�digest��
��rZcCsRdgi}t�d�}t�d�}t�d�}d}|��r|��sFtd�tt���}t|�}|�|�|�t|��dgi}|�t	j
|dd��n@tr{t|���}t
||d	�rotd�tt���}t|�}|�|�|�t|��nt	�|���}|��}nt	�|���}|��}t�d
|�}tdd�|D�d
d�}dd�|D�}	t��}
i}|	D]�}tr�tt�|kr�q�tr�|d�t|��t|�q�td|���|td�kr�|jdkr�t|j�d|j���}
n|}
|td�k�r.tj|
dd�}tr�t
|�t
|�d��n1t||
�}t|�d�|
�}t||�}|�r.t|�|v�r$t|�|t|�|<n
|t|�i|t|�<tj|
dd�}t�rKt
|�|td�k�rJt
|�d��q�t||
�}|td�k�r�t|�d�|
�}t||�}|�r�t|�|v�ryt|�|t|�|<q�|t|�i|t|�<q�t�r�|�t	j
|dd��dSt�s�|�r�|�t	j
|dd��dSdSdS)N�versionsz.pyversionsz.contentz.ts�!https://www.python.org/downloads/zGet downloads pager��indent)�	timestamp�$<a href="/downloads/.*">Python.*</a>cS�g|]}t|��qSr�r��.0rrrr�
<listcomp>��z_main.<locals>.<listcomp>T��reversecS�g|]	}|jdkr|�qS����majorrdrrrrf��zCheck version �3.2r�.�3.1.4�tar.xz�r�extr!�tgzr ) �pathlib�Path�existsr4�int�timer	�
write_textr�json�dumps�CHECK�	read_textr�loads�re�findall�sortedr
�getcwd�VERSIONr�PRINT�append�microrn�minor�ARCHIVE�formatrrLrZ)�
pyversionsZvfile�cfileZtsfiler9�ts�content�matched�parsed_versionsr\�cwd�outr�url_versionrG�sig_path�verifiedrrr�_main�s�







�

��r�cCrOrP)rR�sha256rTrUrVrWrXrrr�
sha256_digestr[r��	list[str]csVd}t|�}d}t�||�}t�d���r�fdd�|D�}tt|�dd�dd	�}|S)
zA
    Detect available OpenSSL versions from GitHub releases.
    z'https://github.com/openssl/openssl/tagszopenssl-(\d+\.\d+\.\d+)"rMcs(g|]}|�ks|���d��r|�qS)rq)�
startswith)re�v�Zpinrrrf,�(z+detect_openssl_versions.<locals>.<listcomp>cS�dd�|�d�D�S)NcSrbr�rz�rer
rrrrf/rgz=detect_openssl_versions.<locals>.<lambda>.<locals>.<listcomp>rqr�r�rrr�<lambda>/rgz)detect_openssl_versions.<locals>.<lambda>T��keyri)r	r�r��PINNED_VERSIONS�getr��set�r9r��pattern�matchesr\rr�r�detect_openssl_versions s
r��list[tuple[str, str]]cCs�d}t|�}d}t�||�}g}t|�D]<}t|�dkrP|ddkrPd}t|dd��}t|dd��}t|dd��}	|�d	|�d	|�d	|	��}
|�|
|f�qt|d
d�dd
�S)zq
    Detect available SQLite versions from sqlite.org.

    Returns list of (version, sqliteversion) tuples.
    z https://sqlite.org/download.htmlz sqlite-autoconf-(\d{7})\.tar\.gz�r�3rlr�rqcSsdd�|d�d�D�S)NcSrbrr�)re�nrrrrfIrgz<detect_sqlite_versions.<locals>.<lambda>.<locals>.<listcomp>rrqrrrrrr�Isz(detect_sqlite_versions.<locals>.<lambda>Tr�)r	r�r�r��lenrzr�r�)r9r�r�r�r\Z
sqlite_verrnr��patch�subpatchrrrr�detect_sqlite_versions3s�r�cCs6d}t|�}d}t�||�}tt|�dd�dd�}|S)z8
    Detect available XZ versions from tukaani.org.
    zhttps://tukaani.org/xz/zxz-(\d+\.\d+\.\d+)\.tar\.gzcSr�)NcSrbrr�r�rrrrfVrgz8detect_xz_versions.<locals>.<lambda>.<locals>.<listcomp>rqrr�rrrr�Vrgz$detect_xz_versions.<locals>.<lambda>Tr��r	r�r�r�r�r�rrr�detect_xz_versionsLsr�cC�2d}t|�}d}t�||�}tt|�dd�dd�S)z6Detect available libffi versions from GitHub releases.z%https://github.com/libffi/libffi/tags�v(\d+\.\d+\.\d+)"cSr�)NcSrbrr�r�rrrrf`rgz<detect_libffi_versions.<locals>.<lambda>.<locals>.<listcomp>rqrr�rrrr�`rgz(detect_libffi_versions.<locals>.<lambda>Tr�r��r9r�r�r�rrr�detect_libffi_versionsZ�
r�cCr�)z-Detect available zlib versions from zlib.net.zhttps://zlib.net/zzlib-(\d+\.\d+\.\d+)\.tar\.gzcSr�)NcSrbrr�r�rrrrfirgz:detect_zlib_versions.<locals>.<lambda>.<locals>.<listcomp>rqrr�rrrr�irgz&detect_zlib_versions.<locals>.<lambda>Tr�r�r�rrr�detect_zlib_versionscr�r�cCr�)z4Detect available bzip2 versions from sourceware.org.z!https://sourceware.org/pub/bzip2/zbzip2-(\d+\.\d+\.\d+)\.tar\.gzcSr�)NcSrbrr�r�rrrrfrrgz;detect_bzip2_versions.<locals>.<lambda>.<locals>.<listcomp>rqrr�rrrr�rrgz'detect_bzip2_versions.<locals>.<lambda>Tr�r�r�rrr�detect_bzip2_versionslr�r�cCr�)z3Detect available ncurses versions from GNU mirrors.z-https://mirrors.ocf.berkeley.edu/gnu/ncurses/zncurses-(\d+\.\d+)\.tar\.gzcSr�)NcSrbrr�r�rrrrf{rgz=detect_ncurses_versions.<locals>.<lambda>.<locals>.<listcomp>rqrr�rrrr�{rgz)detect_ncurses_versions.<locals>.<lambda>Tr�r�r�rrr�detect_ncurses_versionsur�r�cCr�)z4Detect available readline versions from GNU mirrors.z.https://mirrors.ocf.berkeley.edu/gnu/readline/zreadline-(\d+\.\d+)\.tar\.gzcSr�)NcSrbrr�r�rrrrf�rgz>detect_readline_versions.<locals>.<lambda>.<locals>.<listcomp>rqrr�rrrr��rgz*detect_readline_versions.<locals>.<lambda>Tr�r�r�rrr�detect_readline_versions~r�r�cCr�)z0Detect available gdbm versions from GNU mirrors.z*https://mirrors.ocf.berkeley.edu/gnu/gdbm/zgdbm-(\d+\.\d+)\.tar\.gzcSr�)NcSrbrr�r�rrrrf�rgz:detect_gdbm_versions.<locals>.<lambda>.<locals>.<listcomp>rqrr�rrrr��rgz&detect_gdbm_versions.<locals>.<lambda>Tr�r�r�rrr�detect_gdbm_versions�r�r�cCr�)z9Detect available libxcrypt versions from GitHub releases.z*https://github.com/besser82/libxcrypt/tagsr�cSr�)NcSrbrr�r�rrrrf�rgz?detect_libxcrypt_versions.<locals>.<lambda>.<locals>.<listcomp>rqrr�rrrr��rgz+detect_libxcrypt_versions.<locals>.<lambda>Tr�r�r�rrr�detect_libxcrypt_versions�r�r�)�https://kerberos.org/dist/krb5/z'https://web.mit.edu/kerberos/dist/krb5/rJ�suffixcCsvd}tD].}zt|�|���WSty2}z|}td|�|�d|�d��WYd}~qd}~ww|dus9J�|�)zGFetch a krb5 distribution directory, falling through to the MIT mirror.NzCould not fetch r.�; trying next mirror)�
KRB5_HOSTSr	r3r4)r��last_exc�baser;rrr�_fetch_krb5_index�s&��r��destcCsxd}tD]/}zt|�|��|�WSty3}z|}td|�|�d|�d��WYd}~qd}~ww|dus:J�|�)z;Download a krb5 tarball, falling through to the MIT mirror.NzCould not download r.r�)r�rr3r4)r�r�r�r�r;rrr�_download_krb5_tarball�s&��r�cCs~t�}d}t�||�}tt|�dd�dd�}|sgS|d}t|�d��}d}t�||�}d	d
�|D�}tt|�dd�dd�S)zJDetect available krb5 versions from kerberos.org (MIT mirror as fallback).z(\d+\.\d+)/cSr�)NcSrbrr�r�rrrrf�rg�:detect_krb5_versions.<locals>.<lambda>.<locals>.<listcomp>rqrr�rrrr��rgz&detect_krb5_versions.<locals>.<lambda>Tr�r�/z krb5-(\d+\.\d+(\.\d+)?)\.tar\.gzcS�g|]}|d�qS�rr�re�mrrrrf�rgz(detect_krb5_versions.<locals>.<listcomp>cSr�)NcSrbrr�r�rrrrf�rgr�rqrr�rrrr��rg)r�r�r�r�r�)r�r�r�ZmajorsZlatest_majorr\rrr�detect_krb5_versions�sr�cCr�)z3Detect available libuuid versions from SourceForge.z/https://sourceforge.net/projects/libuuid/files/z libuuid-(\d+\.\d+\.\d+)\.tar\.gzcSr�)NcSrbrr�r�rrrrf�rgz:detect_uuid_versions.<locals>.<lambda>.<locals>.<listcomp>rqrr�rrrr��rgz&detect_uuid_versions.<locals>.<lambda>Tr�r�r�rrr�detect_uuid_versions�r�r�cCr�)z4Detect available libtirpc versions from SourceForge.z9https://sourceforge.net/projects/libtirpc/files/libtirpc/z(\d+\.\d+\.\d+)/cSr�)NcSrbrr�r�rrrrf�rgz;detect_tirpc_versions.<locals>.<lambda>.<locals>.<listcomp>rqrr�rrrr��rgz'detect_tirpc_versions.<locals>.<lambda>Tr�r�r�rrr�detect_tirpc_versions�r�r�cC�@d}t|�}d}t�||�}dd�|D�}tt|�dd�dd�S)	z5Detect available expat versions from GitHub releases.z)https://github.com/libexpat/libexpat/tagszR_(\d+)_(\d+)_(\d+)"cSs,g|]}|d�d|d�d|d���qS)rrqr�rr�rrrrf�s,z)detect_expat_versions.<locals>.<listcomp>cSr�)NcSrbrr�r�rrrrf�rgz;detect_expat_versions.<locals>.<lambda>.<locals>.<listcomp>rqrr�rrrr��rgz'detect_expat_versions.<locals>.<lambda>Tr�r�r�rrr�detect_expat_versions�sr��namecCsFd}t|�}|�d�}t�||�}dd�|D�}tt|�dd�dd�S)	zIDetect available binary dependency versions from python/cpython-bin-deps.z/https://github.com/python/cpython-bin-deps/tagsz-(\d+\.\d+(\.\d+)*)\"cSr�r�rr�rrrrf�rgz4detect_cpython_bin_deps_versions.<locals>.<listcomp>cSr�)NcSrbrr�r�rrrrf�rgzFdetect_cpython_bin_deps_versions.<locals>.<lambda>.<locals>.<listcomp>rqrr�rrrr��rgz2detect_cpython_bin_deps_versions.<locals>.<lambda>Tr�r�)r�r9r�r�r�r\rrr� detect_cpython_bin_deps_versions�s
r�c

Cs�d}t|�}d}t�||�}g}|D]4}t|�dkrF|d}t|dd��}t|dd��}t|dd��}	|�|�d	|�d	|�d	|	���qtt|�d
d�dd
�S)z?Detect available Strawberry Perl versions from GitHub releases.z;https://github.com/StrawberryPerl/Perl-Dist-Strawberry/tagszSP_(\d+)_64bit"r�rrrl�NrqcSr�)NcSrbrr�r�rrrrfrgz:detect_perl_versions.<locals>.<lambda>.<locals>.<listcomp>rqrr�rrrr�rgz&detect_perl_versions.<locals>.<lambda>Tr�)r	r�r�r�rzr�r�r�)
r9r�r�r�r\r�rnr�r�r�rrr�detect_perl_versions�s �r�cCr�)z6Detect available mpdecimal versions from bytereef.org.z0https://www.bytereef.org/mpdecimal/download.htmlz"mpdecimal-(\d+\.\d+\.\d+)\.tar\.gzcSr�)NcSrbrr�r�rrrrfrgz?detect_mpdecimal_versions.<locals>.<lambda>.<locals>.<listcomp>rqrr�rrrr�rgz+detect_mpdecimal_versions.<locals>.<lambda>Tr�r�r�rrr�detect_mpdecimal_versionsr�r�cCr�)	z,Detect available nasm versions from nasm.us.�+https://www.nasm.us/pub/nasm/releasebuilds/zhref="(\d+\.\d+(\.\d+)?)/"cSr�r�rr�rrrrfrgz(detect_nasm_versions.<locals>.<listcomp>cSr�)NcSrbrr�r�rrrrfrgz:detect_nasm_versions.<locals>.<lambda>.<locals>.<listcomp>rqrr�rrrr�rgz&detect_nasm_versions.<locals>.<lambda>Tr�r�r�rrr�detect_nasm_versionssr��pathlib.Path�deps_to_update�list[str] | Nonec'
Cs6t��}|��r#t�|���}d|vr|d}|�di�}n	|}i}ni}i}|dur/gd�}d|vr�td�t�}|r�|d}td|���d|vrOi|d<||dvr�|�	d	d
�}d|�d|�d
�}	td|	�d��z&t
|	|�}
t|
�}td|���d|�d�|dgd�|d|<t�|
�Wnt
y�}z
td|���WYd}~nd}~wwd|v�rtd�t�}
|
�r|
d}td|���d|vr�i|d<gd�}||dv�rd|�d|�d�}	td|	�d��t
|	|�}
t|
�}td|���d}|||d�|d|<t�|
�n||d|d<d|v�r�td�t�}|�r�|d\}}td |�d!|�d"��d|v�r=i|d<||dv�r�ddl}|j��j}d#|�d$|�d�}	td|	�d��z(t
|	|�}
t|
�}td|���d#|�d%�||gd�d&�|d|<t�|
�Wnt
�y�}z
td'|���WYd}~nd}~wwd(|v�r�td)�t�}|�r�|d}td*|���d(|v�r�i|d(<||d(v�r�d+|�d�}	td|	�d��t
|	|�}
t|
�}td|���d,|gd�d�|d(|<t�|
�d-|v�r�td.�t�}|�rt|d}td/|���d-|v�ri|d-<||d-v�rtd0|�d1|�d�}	td|	�d��z#t
|	|�}
t|
�}td|���d2|d3dgd�|d-|<t�|
�Wnt
�ys}z
td4|���WYd}~nd}~wwtd-�}|�r�|d}td5|���||d-v�r�d6|�d�}	td|	�d��z"t
|	|�}
t|
�}td|���d7|dgd�|d-|<t�|
�Wnt
�y�}z
td8|���WYd}~nd}~wwd9|v�rQtd:�t�}|�rQ|d}td;|���d9|v�r�i|d9<||d9v�rQd<|�d=|�d�}	td|	�d��z#t
|	|�}
t|
�}td|���d>|d3dgd�|d9|<t�|
�Wnt
�yP}z
td?|���WYd}~nd}~wwd@|v�r�tdA�t�}|�r�|d}tdB|���d@|v�rti|d@<||d@v�r�dC|�d�}	td|	�d��z"t
|	|�}
t|
�}td|���dD|d3gd�|d@|<t�|
�Wnt
�y�}z
tdE|���WYd}~nd}~wwdF|v�r;tdG�t�}|�r;|d}tdH|���dF|v�r�i|dF<||dFv�r;dI|�d�}	td|	�d��z"t
|	|�}
t|
�}td|���dJ|d3gd�|dF|<t�|
�Wnt
�y:}z
tdK|���WYd}~nd}~wwdL|v�r�tdM�t�}|�r�|d}tdN|���dL|v�r^i|dL<||dLv�r�dO|�d�}	td|	�d��z"t
|	|�}
t|
�}td|���dP|d3gd�|dL|<t�|
�Wnt
�y�}z
tdQ|���WYd}~nd}~wwdR|v�r(tdS�t�}|�r(|d}tdT|���dR|v�r�i|dR<||dRv�r(dU|�dV|�dW�}	td|	�d��z"t
|	|�}
t|
�}td|���dX|d3gd�|dR|<t�|
�Wnt
�y'}z
tdY|���WYd}~nd}~wwdZ|v�r�td[�t�}|�r�|d}td\|���dZ|v�rKi|dZ<||dZv�r�d	�|�d	�dd]��}|�d^|�d�}tdtd�|�d��z&t||�}
t|
�}td|���d_|�d`�|d3gd�|dZ|<t�|
�Wnt
�y�}z
tda|���WYd}~nd}~wwdb|v�r)tdc�t �} | �r)| d}tdd|���db|v�r�i|db<||dbv�r)de|�d�}	td|	�d��z#t
|	|�}
t|
�}td|���df|gd�d�|db|<t�|
�Wnt
�y(}z
tdg|���WYd}~nd}~wwdh|v�r�tdi�t!�}!|!�r�|!d}tdj|���dh|v�rLi|dh<||dhv�r�dk|�d�}	td|	�d��z"t
|	|�}
t|
�}td|���dl|d3gd�|dh|<t�|
�Wnt
�y�}z
tdm|���WYd}~nd}~wwdn|v�rtdo�t"�}"|"�r|"d}tdp|���dn|v�r�i|dn<||dnv�rdq|�dr�}	td|	�d��z"t
|	|�}
t|
�}td|���ds|d3gd�|dn|<t�|
�Wnt
�y}z
tdt|���WYd}~nd}~wwdu|v�r�tdv�t#�}#|#�r�|#d}tdw|���du|v�r6i|du<||duv�r�|�	d	dx�}$dy|$�dz|�dW�}	td|	�d��z't
|	|�}
t|
�}td|���dy|$�d{�|gd�d�|du|<t�|
�Wnt
�y�}z
td||���WYd}~nd}~wwd}|v�rtd~�t$�}%|%�r|%d}td|���d}|v�r�i|d}<||d}v�rd�|�d�}	td|	�d��z"t
|	|�}
t|
�}td|���d�|dgd�|d}|<t�|
�Wnt
�y
}z
td�|���WYd}~nd}~wwd�|v�r�td��t%�}&|&�r�|&d}td�|���d�|v�r.i|d�<||d�v�r�d�|�d�|�d��}	td|	�d��z"t
|	|�}
t|
�}td|���d�|dgd�|d�|<t�|
�Wnt
�y�}z
td�|���WYd}~nd}~ww||d��}|�&tj'|d�d���td�|���dS)�a
    Update dependency versions in python-versions.json.

    Downloads tarballs, computes SHA-256, and updates the JSON file.

    :param path: Path to python-versions.json
    :param deps_to_update: List of dependencies to update (openssl, sqlite, xz), or None for all
    �python�dependenciesN)rM�sqlite�xz�libffi�zlib�ncurses�readline�gdbm�	libxcrypt�krb5�bzip2�uuid�tirpc�expat�	mpdecimal�nasm�perlr�zChecking perl versions...rz
Latest perl: rqrJzLhttps://github.com/StrawberryPerl/Perl-Dist-Strawberry/releases/download/SP_z_64bit/strawberry-perl-z-64bit-portable.zipzDownloading z...z	SHA-256: z3_64bit/strawberry-perl-{version}-64bit-portable.zip�win32)r9r��	platformszFailed to download perl: rMzChecking OpenSSL versions...zLatest OpenSSL: )�linux�darwinr�z=https://github.com/openssl/openssl/releases/download/openssl-z	/openssl-z.tar.gzz_https://github.com/openssl/openssl/releases/download/openssl-{version}/openssl-{version}.tar.gzr�r�zChecking SQLite versions...zLatest SQLite: z (sqlite version �)zhttps://sqlite.org/z/sqlite-autoconf-z!/sqlite-autoconf-{version}.tar.gz)r9r�Z
sqliteversionr�zFailed to download SQLite: r�zChecking XZ versions...zLatest XZ: zhttp://tukaani.org/xz/xz-z)http://tukaani.org/xz/xz-{version}.tar.gzr�zChecking libffi versions...zLatest libffi: z4https://github.com/libffi/libffi/releases/download/vz/libffi-zUhttps://github.com/libffi/libffi/releases/download/v{version}/libffi-{version}.tar.gzr�zFailed to download libffi: zLatest Windows libffi: zDhttps://github.com/python/cpython-bin-deps/archive/refs/tags/libffi-zThttps://github.com/python/cpython-bin-deps/archive/refs/tags/libffi-{version}.tar.gzz#Failed to download libffi (win32): r�zChecking zlib versions...z
Latest zlib: z2https://github.com/madler/zlib/releases/download/vz/zlib-zQhttps://github.com/madler/zlib/releases/download/v{version}/zlib-{version}.tar.gzzFailed to download zlib: r�zChecking ncurses versions...zLatest ncurses: z5https://mirrors.ocf.berkeley.edu/gnu/ncurses/ncurses-zEhttps://mirrors.ocf.berkeley.edu/gnu/ncurses/ncurses-{version}.tar.gzzFailed to download ncurses: r�zChecking readline versions...zLatest readline: z7https://mirrors.ocf.berkeley.edu/gnu/readline/readline-zGhttps://mirrors.ocf.berkeley.edu/gnu/readline/readline-{version}.tar.gzzFailed to download readline: r�zChecking gdbm versions...z
Latest gdbm: z/https://mirrors.ocf.berkeley.edu/gnu/gdbm/gdbm-z?https://mirrors.ocf.berkeley.edu/gnu/gdbm/gdbm-{version}.tar.gzzFailed to download gdbm: r�zChecking libxcrypt versions...zLatest libxcrypt: z9https://github.com/besser82/libxcrypt/releases/download/vz/libxcrypt-rz]https://github.com/besser82/libxcrypt/releases/download/v{version}/libxcrypt-{version}.tar.xzzFailed to download libxcrypt: r�zChecking krb5 versions...z
Latest krb5: r�z/krb5-r�z/krb5-{version}.tar.gzzFailed to download krb5: r�zChecking bzip2 versions...zLatest bzip2: z'https://sourceware.org/pub/bzip2/bzip2-z7https://sourceware.org/pub/bzip2/bzip2-{version}.tar.gzzFailed to download bzip2: r�zChecking uuid versions...z
Latest uuid: z7https://sourceforge.net/projects/libuuid/files/libuuid-zGhttps://sourceforge.net/projects/libuuid/files/libuuid-{version}.tar.gzzFailed to download uuid: r�zChecking tirpc versions...zLatest tirpc: z9https://sourceforge.net/projects/libtirpc/files/libtirpc-z.tar.bz2zJhttps://sourceforge.net/projects/libtirpc/files/libtirpc-{version}.tar.bz2zFailed to download tirpc: r�zChecking expat versions...zLatest expat: rz9https://github.com/libexpat/libexpat/releases/download/R_z/expat-z/expat-{version}.tar.xzzFailed to download expat: r�zChecking mpdecimal versions...zLatest mpdecimal: z?https://www.bytereef.org/software/mpdecimal/releases/mpdecimal-zOhttps://www.bytereef.org/software/mpdecimal/releases/mpdecimal-{version}.tar.gzzFailed to download mpdecimal: r�zChecking nasm versions...z
Latest nasm: r�z/win64/nasm-z
-win64.zipzShttps://www.nasm.us/pub/nasm/releasebuilds/{version}/win64/nasm-{version}-win64.zipzFailed to download nasm: �r�r�rr^zUpdated )(r
r�ryr}r�r�r�r4r��replacerr��remover3r�r��datetime�now�yearr�r�r�r�r�r�r�r�r��joinrr�r�r�r�r�r�r�r�r|r~)'rGr�r��all_data�pydatar�Z
perl_versions�latestZver_tagr9�
download_pathZchecksum�eZopenssl_versionsr�Zurl_templateZsqlite_versions�latest_versionZlatest_sqliteversionr�r�Zxz_versionsZlibffi_versionsZwin_libffi_versionsZ
zlib_versionsZncurses_versionsZreadline_versionsZ
gdbm_versionsZlibxcrypt_versionsZ
krb5_versionsZmajor_minorZtarball_suffixZbzip2_versionsZ
uuid_versionsZtirpc_versionsZexpat_versionsZversion_tagZmpdecimal_versionsZ
nasm_versionsrrr�update_dependency_versionss�	���
����

��



���


�



���
���


���


���


���


���


���



���


���


���


���


����


���


���
r�
list[Version]cCs<d}t|�}t�d|�}tdd�|D�dd�}dd�|D�S)z;
    Detect available Python versions from python.org.
    r]racSrbrrcrdrrrrf5rgz*detect_python_versions.<locals>.<listcomp>TrhcSrjrkrmrdrrrrf6ro)r	r�r�r�)r9r�r�r�rrr�detect_python_versions.s
r	cCs�t�}t��}t�|��r)t�|���}d|vr$|d}|�di�}n	|}i}ni}i}|D]�}|t	d�kr8q/t
|�|vr?q/|t	d�krV|jdkrVt	|j�d|j
���}n|}|t	d�krftj|dd	�}ntj|d
d	�}t||�}	|t	d�kr�t|�d�|�}
t|	|
�}n	td
|���d}|r�td|�dt|	����t|	�|t
|�<ntd|����||d�}|�tj|dd��q/||d�}|�tj|dd��dS)z+
    Create python-versions.json file.
    r�r�z3.15rprrqrrrsrtrv�3.14r!z$Skipping signature verification for TzVersion z has digest zSignature failed to verify: r�rr^N)r	r
r�r<ryr}r�r�r�rrr�rnr�r�r�rrLr4rZr3r|r~)rGr\r�rrr�rr�r9rr�r�rrr�create_pyversions9sJ


r)�createrUr�rrU�dict[Version, str]cs�t�t�jd}t�d�}|rd}|rt|�|��r|}n|��r%|}n	|r*|}ntd��t�|�	��}t
|t�rDd|vrD|�d|�n|�dd��D�}|r\t
|���fdd�|D�}�fd	d
�|D�S)z
    List python versions.
    �python-versions.jsonz$~/.local/relenv/python-versions.jsonTzNo versions file foundr�cSrbrr"rdrrrrf�rgz#python_versions.<locals>.<listcomp>cs(g|]}|j�jkr|j�jkr|�qSr)rnr�rd)�mvrrrf�r�csi|]	}|�t|��qSr)r)rer)r�rr�
<dictcomp>�roz#python_versions.<locals>.<dictcomp>)rwrx�__file__�parentrry�RuntimeErrorr}r�r��
isinstance�dictr�r)r�rrU�packaged�localZreadfrom�datar\r)rr�r�python_versionsus(	
"rcCs0td�}|s
td��tt|����d}t|�S)z�
    Get the default Python version to use when none is specified.

    :return: The default Python version string (e.g., "3.10.19")
    z3.10zNo 3.10 versions foundr@)rrr��list�keysr)r�rrrr�get_default_python_version�s
r�version_speccCsz|durt�St|�}|jdur"t�}||vrtd|����t|�St|�}|s/td|����tt|����d}t|�S)a�
    Resolve a Python version specification to a full version string.

    If version_spec is None, returns the latest Python 3.10 version.
    If version_spec is partial (e.g., "3.10"), returns the latest micro version.
    If version_spec is full (e.g., "3.10.19"), returns it as-is after validation.

    :param version_spec: Version specification (None, "3.10", or "3.10.19")
    :return: Full version string (e.g., "3.10.19")
    :raises RuntimeError: If the version is not found
    N�Unknown version �Unknown minor version r@)	rrr�rrrr�rr)r�	requestedr�rrrr�resolve_python_version�s
r!�
subparsers�3argparse._SubParsersAction[argparse.ArgumentParser]cCs�|jddd�}|jtd�|jddddd	d
�|jddddd
d
�|jdddddd
�|jddtdd�|jddddd
�|jddddd
�dS)z�
    Setup the subparser for the ``versions`` command.

    :param subparsers: The subparsers object returned from ``add_subparsers``
    :type subparsers: argparse._SubParsersAction
    r\zVersions utility)�description)�funcz-uz--updateF�
store_truezUpdate versions)�default�action�helpz-lz--listz
List versionsz-cz--checkzCheck for new python versionsz	--versionr
z)The python version [default: %(default)s])r'�typer)z--check-depsz!Check for new dependency versionsz
--update-depsz=Update dependency versions (downloads and computes checksums)N)�
add_parser�set_defaults�main�add_argumentr)r"Z	subparserrrr�setup_parser�sX	������
�r/�args�argparse.Namespacec Cs�t�t�jd}d}tjdkr%ddl}|j�d�}|j�d�}|s%|s%d}|r0d	}d
}d}d}	nd
}d}d}d}	|j	r�t
d�t|��
}
t�
|
�}Wd�n1sSwY|�d|�}g}
g}t�}|D]+}t|�}||vr�t
|�d|d�d��|�|�qgt
|�d|d�d��|
�|�qgt
dd���t
dt|��d�dd�t
dt|
��d��|
r�t
d�t
d �t�d�|j�r�t
d!�t|��
}
t�
|
�}Wd�n1s�wY|�d"i�}g}g}d#d$tfd%d&tfd'd(tfd)d)tfd*d*tfd+d+tfd,d,tfd-d-tfd.d.tfd/d/tfd0d0tfd1d1tfd2d2t fd3d3t!fd4d5t"fd6d7t#fd8d9t$fg}|D]�\}}}|�}|�s?�q2|d%k�rK|dd}n|d}d}||v�rgt%||�&�dd:�}|�rg|d}||k�r�t
|�d|d�d|d;�d��|�|��q2|�r�t
|�d|d�d|d;�d|	�d|�d<�
�|�|||f��q2t
|�d|d�dd=d;�d|	�d|��	�|�|d|f��q2t
dd���t
dt|��d�dd�t
t|��d>��|�r�t
d?�t
d@�t�d�|j'�r�t(|�t�d�|j)�rt*ddA�|j+�rt*�D]}t
|��qt��|j,�rct-|j,�}|j.�r;t*�}||v�r8t
dB|���t�dC�|}nt*|j,�}|�sOt
dD|���t�dC�t%t+|�&���dE}t
|�t��dSdS)Fz'
    Versions utility main method.
    rTr�rNZ
WT_SESSIONZTERM_PROGRAMFu✓u⚠u✗u→z[OK]    z[UPDATE]z[NEW]   z->z$Checking for new python versions...
r�z Python Z12z
 (up-to-date)z (new version available)�
z<============================================================z	Summary: z
 up-to-date, rJ)�endr?z new versions availablez 
To update python versions, run:z%  python3 -m relenv versions --updatez(Checking for new dependency versions...
r�rMZOpenSSLr�ZSQLiter�ZXZr�r�r�r�r�r�r�r�r�r�r�r�Z	MPDecimalr�ZNASMr�ZPerlrhZ15z (update available)z
(not tracked)z updates availablez
To update dependencies, run:z*  python3 -m relenv versions --update-deps)rrrrr@)/rwrxrrr�platformr
�environr��checkr4rTr}�loadr	rr�r��exitZ
check_depsr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rZupdate_depsrrUrrrrr�) r0rZuse_unicoder
Z
wt_sessionZterm_programZ	ok_symbolZ
update_symbolZ
new_symbolZarrow�frZ
current_pyZ
py_updatesZ
py_up_to_dateZpy_detectedrZvstrZcurrent_depsZdep_updatesZdep_up_to_dateZchecksZdep_keyZdep_nameZdetect_funcZdep_detectedrZcurrent_versionr\r r�Z
build_versionrrrr-s�

�

��


*(








�r-�__main__)r
rrr)r
rrr)F)rrrrrr)r$rr%rrr)rr-)r+r=rr>)rGrHrIrHrr)rNrHrr)rr�)rr�)rJ)r�rrr)r�rr�rrr)r�rrr�)N)rGr�r�r�rr-)rr)rGr�rr-)r�r>rrrUrrr
)rr)rr>rr)r"r#rr-)r0r1rr-)L�__doc__�
__future__rrRr}�loggingr
�_osrwr�r�_subprocessr�_sysr{�typingrrZ
relenv.commonrrrrr	�argparse�	getLogger�__name__�log�__all__rKr1r�rrr#r,r<rFrLr�rr�ZUPDATEr�rZr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rr	rrrr!r/r-rrrr�<module>s�







 �



_





	
	
	
	
	
		



	
	



	


=��
$
"
7
%
�