o
    å¹´f†.  ã                   @   sä   d dl Z d dlZd dlZdadadadd„ e j dd¡ d¡D ƒa	da
d#dd„Zd	d
„ Zdd„ Zd$dd„Zd$dd„Zd$dd„Zd$dd„Zd$dd„Zd$dd„ZG dd„ deƒZG dd„ deƒZdd„ Z	 d d!„ Zed"krpeƒ  dS dS )%é    Nc                 C   s    g | ]}|  ¡ rd |  ¡  ‘qS ©zpython%s©Ústrip)Ú.0Úver© r   ú!/usr/share/python3/py3versions.pyÚ
<listcomp>
   s    þr	   ÚDEBPYTHON3_SUPPORTEDÚ ú,c                 C   sv   ddl m}m} ts"tj d¡r"|ƒ }tdƒ}| |¡ | 	¡  |atr9| r9z	t 
d| ¡}W |S  |y8   t‚w d S )Nr   )ÚConfigParserÚNoOptionErrorz"/usr/share/python3/debian_defaultsÚDEFAULT)Úconfigparserr   r   Ú	_defaultsÚosÚpathÚexistsÚopenÚ	read_fileÚcloseÚgetÚ
ValueError)Únamer   r   ÚconfigÚdefaultsfileÚvaluer   r   r   Úread_default   s    
þÿr   c                 C   s   t dd„ |  d¡D ƒƒS )Nc                 s   s   � | ]}t |ƒV  qd S ©N)Úint)r   Úpartr   r   r   Ú	<genexpr>(   s   € z#version_to_tuple.<locals>.<genexpr>Ú.)ÚtupleÚsplit)Úversionr   r   r   Úversion_to_tuple'   s   r'   c              	      sZ  t |  d¡ƒdkrtdƒ‚dd l}|j|j|j|j|jdœ}i }tƒ }tt	dd�ƒ}d}|  d¡D ]h}| 
¡ }|d	kr<q1|d
v rAq1| dtƒ ¡ t d¡}| |¡}	z<|	sYtdƒ‚|	 d¡|	 d¡}
‰ˆ d¡\}}t|ƒdk rsW q1|
dv r}| ˆ¡ nd}||
 ‰ ‡ ‡fdd„|D ƒ}W q1 ty™   tdƒ‚w d|v r«||d< |r«| |¡|d< |S )Nr   é   zDtoo many arguments provided for X-Python3-Version: min and max only.r   )Nú=z>=z<=z<<T©Úversion_onlyFÚall)ÚcurrentÚcurrent_extÚversionsz(>=|<=|<<|=)? *(\d\.\d+)$z'error parsing Python3-Version attributeé   r#   é   )Nr)   c                    s"   g | ]}ˆ t |ƒt ˆƒƒr|‘qS r   )r'   )r   Úav©ÚfiltopÚvr   r   r	   K   s   
 ÿz"parse_versions.<locals>.<listcomp>)Úlenr%   r   ÚoperatorÚeqÚgeÚleÚltÚsetÚsupported_versionsr   Ú
setdefaultÚreÚcompileÚmatchÚgroupr    ÚaddÚ	ExceptionÚunion)Úvstringr7   Ú	operatorsÚvinfoÚexact_versionsÚversion_rangeÚ
relop_seenÚfieldÚveÚmÚopÚvmajÚvminr   r3   r   Úparse_versions+   sR   þ

€ÿrR   Fc                 C   óR   t sztdƒ}dd„ | d¡D ƒa W n ty   g a Y nw | r'dd„ t D ƒS t S )Nzold-versionsc                 S   ó   g | ]}|  ¡ ‘qS r   r   ©r   Úsr   r   r   r	   [   ó    z old_versions.<locals>.<listcomp>r   c                 S   ó   g | ]}|d d… ‘qS ©é   Nr   ©r   r5   r   r   r   r	   _   ó    )Ú_old_versionsr   r%   r   ©r+   r   r   r   r   Úold_versionsV   ó   ÿr_   c                 C   rS   )Nzunsupported-versionsc                 S   rT   r   r   rU   r   r   r   r	   i   rW   z(unsupported_versions.<locals>.<listcomp>r   c                 S   rX   rY   r   r[   r   r   r   r	   m   r\   )Ú_unsupported_versionsr   r%   r   r^   r   r   r   Úunsupported_versionsd   r`   rb   c           	      C   s  t ƒ  tsnztdƒ}dd„ | d¡D ƒaW nX tym   g d¢}zdd l}|j|dd|jd	�}|j}W n t	yD   t
 d
 |¡¡}Y nw d }|D ]}| d¡r]| dd¡d  ¡  d¡}qI| ¡  dd„ |D ƒ}|aY nw t t t¡¡}t ¡  t |¡ | rˆdd„ tD ƒS tS )Nzsupported-versionsc                 S   rT   r   r   rU   r   r   r   r	   x   rW   z&supported_versions.<locals>.<listcomp>r   )z/usr/bin/apt-cachez--no-all-versionsÚshowzpython3-allr   r0   F)ÚbufsizeÚshellÚstdoutú zDepends:ú:c                 S   s   g | ]	}t  d d|¡‘qS )z\s*(\S+)[ (]?.*z\1)r?   ÚsubrU   r   r   r   r	   ˆ   s    c                 S   rX   rY   r   r[   r   r   r   r	   Ž   r\   )Údefault_versionÚ_supported_versionsr   r%   r   Ú
subprocessÚPopenÚPIPErf   ÚImportErrorr   ÚpopenÚjoinÚ
startswithr   r   ÚpopÚindexÚ_default_versionÚsortÚappend)	r+   r   Úcmdrl   ÚpÚfdÚdependsÚlineÚdefaultr   r   r   r=   r   s>   ÿ
ÿ
€ð
r=   c                 C   sP   t st d¡a tdƒ}t |tj d|¡fvrtd| ƒ‚|a | r&t dd … S t S )Nz/usr/bin/python3zdefault-versionz/usr/binzkthe symlink /usr/bin/python3 does not point to the python3 default version. It must be reset to point to %srZ   )ru   r   Úreadlinkr   r   rq   r   )r+   Údebian_defaultr   r   r   rj   “   s   
þrj   c                 C   sº   t ƒ  d }t| ƒ}tdd�}t|ƒdkrH|d  |¡}g }|D ]}| |¡ qz| | tdd … ¡¡}W n   d}Y | 	¡  |rG| |¡ nt
dƒ‚|sRt
dƒ‚|rV|S d	d
„ |D ƒS )NTr*   r0   r/   rZ   r   z/No supported python3 versions in version stringzempty set of versionsc                 S   s   g | ]}d | ‘qS r   r   r[   r   r   r   r	   ¼   rW   z&requested_versions.<locals>.<listcomp>)rj   rR   r=   r6   Úintersectionrw   rs   rt   ru   rv   r   )rF   r+   r/   rH   Ú	supportedÚvlr&   r}   r   r   r   Úrequested_versions¤   s,   

€rƒ   c                    sN   dd l }tƒ ‰ ‡ fdd„|  d¡|  d¡ D ƒ}| ¡  | r%dd„ |D ƒS |S )Nr   c                    s(   g | ]}t j |¡ˆ v rt j |¡‘qS r   )r   r   ÚbasenamerU   ©r�   r   r   r	   Â   s
    
þz&installed_versions.<locals>.<listcomp>z/usr/bin/python3.[0-9]z/usr/bin/python3.[0-9][0-9]c                 S   rX   rY   r   r[   r   r   r   r	   Ç   r\   )Úglobr=   rv   )r+   r†   r/   r   r…   r   Úinstalled_versions¿   s   
ÿr‡   c                   @   ó   e Zd ZdS )ÚControlFileValueErrorN©Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r‰   Ì   ó    r‰   c                   @   rˆ   )ÚMissingVersionValueErrorNrŠ   r   r   r   r   r�   Ð   rŽ   r�   c                 C   sø   d}d}d}t | dd��}dd„ |D ƒ}W d  ƒ n1 sw   Y  |D ]>}|dkr8|dkr8|dkr5 n/d}q%| d¡r@d}q%| d	| ¡rJ|}q%| ¡  d
¡rc|dkrYtdƒ‚| dd¡d  ¡ }q%|du rltdƒ‚|dkrz|du rxtdƒ‚|S |S )zFread the debian/control file, extract the X-Python3-Version
    field.Nzutf-8)Úencodingc                 S   rT   r   r   )r   r|   r   r   r   r	   Ü   rW   z/extract_pyversion_attribute.<locals>.<listcomp>r   ÚSourcezSource:z	Package: zx-python3-version:z1attribute X-Python3-Version not in Source sectionrh   r0   znot a control filez$no X-Python3-Version in control file)r   rr   Úlowerr   r%   r   r‰   r�   )ÚfnÚpkgr&   ÚsversionÚsectionÚcontrolfileÚlinesr|   r   r   r   Úextract_pyversion_attributeÔ   s6   ÿ
€r™   c               
   C   sž  ddl m}  d}	 | |d�}|jddddd	d
� |jdddddd
� |jdddddd
� |jdddddd
� |jddddddd� | ¡ \}}tj tjd ¡}|j	rƒt
|ƒdkrƒz
tt|jƒƒ W d S  ty‚ } ztd| |ƒ t d¡ W Y d }~d S d }~ww |jr˜t
|ƒdkr˜td t|jƒ¡ƒ d S |jr­t
|ƒdkr­td t|jƒ¡ƒ d S |j�r>t
|ƒdk�r>t
|ƒdkrÁd }n|d }zUtj |¡�r|}zt|d!ƒ}	t|	|jƒ}
W n4 tyô   tj d"||f ¡ t d¡ Y n t�y
   tj d#| ¡ t|jƒ}
Y nw t||jƒ}
td |
¡ƒ W d S  t�y= } ztj d$||f ¡ t d¡ W Y d }~d S d }~ww tj d%||f ¡ t d¡ d S )&Nr   )ÚOptionParserz;[-v] [-h] [-d|--default] [-s|--supported] [-i|--installed] )Úusagez-dz	--defaultz!print the default python3 versionÚ
store_truer}   )ÚhelpÚactionÚdestz-sz--supportedz$print the supported python3 versionsr�   z-rz--requestedz’print the python3 versions requested by a build; the argument is either the name of a control file or the value of the X-Python3-Version attributeÚ	requestedz-iz--installedz.print the installed supported python3 versionsÚ	installedz-vz	--versionz print just the version number(s)Fr+   )r�   r}   rž   rŸ   z%s:r0   rg   zdebian/controlr‘   z%s: not a control file: %s, zC%s: no X-Python3-Version in control file, using supported versions
z%s: %s
zusage: %s %s
)Úoptparserš   Ú
add_optionÚ
parse_argsr   r   r„   ÚsysÚargvr}   r6   Úprintrj   r+   r   Úexitr�   rq   r=   r¡   r‡   r    Úisfiler™   rƒ   r‰   ÚstderrÚwriter�   )rš   r›   ÚparserÚoptsÚargsÚprogramÚmsgr/   r“   rF   Úvsr   r   r   Úmain  sˆ   
þþüþþ€þ
ÿþü€þr²   Ú__main__r   )F)r   r?   r¥   r   r]   ra   Úenvironr   r%   rk   ru   r   r'   rR   r_   rb   r=   rj   rƒ   r‡   r   r‰   r�   r™   r²   r‹   r   r   r   r   Ú<module>   s6   ÿ

+


!

A
ÿ