U
    „zk^Å-  ã                   @   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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rÒeƒ  dS )(é    Nc                 C   s    g | ]}|  ¡ rd |  ¡  ‘qS ©zpython%s©Ústrip)Ú.0Zver© r   ú!/usr/share/python3/py3versions.pyÚ
<listcomp>
   s    þr   ZDEBPYTHON3_SUPPORTEDÚ ú,c                 C   s~   ddl m}m} tsDtj d¡rD|ƒ }tdƒ}| |¡ | 	¡  |atrz| rzzt 
d| ¡}W n |k
rt   t‚Y nX |S d S )Nr   )ÚConfigParserÚNoOptionErrorz"/usr/share/python3/debian_defaultsZDEFAULT)Zconfigparserr   r   Ú	_defaultsÚosÚpathÚexistsÚopenZ	read_fileÚcloseÚgetÚ
ValueError)Únamer   r   ZconfigZdefaultsfileÚvaluer   r   r   Úread_default   s    

r   c              	      sh  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 ]Ú}| 
¡ }|d	krxqb|d
kr‚qb| dtƒ ¡ t d¡}| |¡}	zx|	s²tdƒ‚|	 d¡|	 d¡ }
‰ˆ d¡\}}t|ƒdk ræW qb|
dkrú| ˆ¡ n d}||
 ‰ ‡ ‡fdd„|D ƒ}W qb tk
�r:   tdƒ‚Y qbX qbd|k�rd||d< |�rd| |¡|d< |S )Nr
   é   zDtoo many arguments provided for X-Python3-Version: min and max only.r   )Nú=z>=z<=z<<T©Úversion_onlyFÚall)ZcurrentZcurrent_extÚversionsz(>=|<=|<<|=)? *(\d\.\d)$z'error parsing Python3-Version attributeé   Ú.é   )Nr   c                    s   g | ]}ˆ |ˆƒr|‘qS r   r   )r   Úav©ZfiltopÚvr   r   r   G   s     
 z"parse_versions.<locals>.<listcomp>)ÚlenÚsplitr   ÚoperatorÚeqÚgeÚleÚltÚsetÚsupported_versionsr   Ú
setdefaultÚreÚcompileÚmatchÚgroupÚintÚaddÚ	ExceptionÚunion)Úvstringr&   Z	operatorsÚvinfoZexact_versionsZversion_rangeZ
relop_seenZfieldZveÚmÚopZvmajZvminr   r"   r   Úparse_versions'   sP     þ


r:   Fc                 C   sX   t s>z tdƒ}dd„ | d¡D ƒa W n tk
r<   g a Y nX | rPdd„ t D ƒS t S d S )Nzold-versionsc                 S   s   g | ]}|  ¡ ‘qS r   r   ©r   Úsr   r   r   r   V   s     z old_versions.<locals>.<listcomp>r
   c                 S   s   g | ]}|d d… ‘qS ©é   Nr   ©r   r#   r   r   r   r   Z   s     )Ú_old_versionsr   r%   r   ©r   r   r   r   r   Úold_versionsQ   s    
rB   c                 C   sX   t s>z tdƒ}dd„ | d¡D ƒa W n tk
r<   g a Y nX | rPdd„ t D ƒS t S d S )Nzunsupported-versionsc                 S   s   g | ]}|  ¡ ‘qS r   r   r;   r   r   r   r   d   s     z(unsupported_versions.<locals>.<listcomp>r
   c                 S   s   g | ]}|d d… ‘qS r=   r   r?   r   r   r   r   h   s     )Ú_unsupported_versionsr   r%   r   rA   r   r   r   Úunsupported_versions_   s    
rD   c           	      C   s"  t ƒ  tsäz tdƒ}dd„ | d¡D ƒaW n¸ tk
râ   ddddg}z&d	d l}|j|d
d|jd�}|j}W n$ t	k
r�   t
 d |¡¡}Y nX d }|D ](}| d¡rš| dd
¡d
  ¡  d¡}qš| ¡  dd„ |D ƒ}|aY nX t t t¡¡}t ¡  t |¡ | �rdd„ tD ƒS tS d S )Nzsupported-versionsc                 S   s   g | ]}|  ¡ ‘qS r   r   r;   r   r   r   r   s   s     z&supported_versions.<locals>.<listcomp>r
   z/usr/bin/apt-cachez--no-all-versionsZshowzpython3-allr   r   F)ÚbufsizeÚshellÚstdoutú zDepends:ú:c                 S   s   g | ]}t  d d|¡‘qS )z\s*(\S+)[ (]?.*z\1)r.   Úsubr;   r   r   r   r   ƒ   s     c                 S   s   g | ]}|d d… ‘qS r=   r   r?   r   r   r   r   ‰   s     )Údefault_versionÚ_supported_versionsr   r%   r   Ú
subprocessÚPopenÚPIPErG   ÚImportErrorr   ÚpopenÚjoinÚ
startswithr   r   ÚpopÚindexÚ_default_versionÚsortÚappend)	r   r   ÚcmdrM   ÚpÚfdZdependsÚlineÚdefaultr   r   r   r,   m   s@     ÿ ÿ



r,   c                 C   sT   t st d¡a tdƒ}t |tj d|¡fkr8td| ƒ‚|a | rLt dd … S t S d 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 %sr>   )rV   r   Úreadlinkr   r   rR   r   )r   Zdebian_defaultr   r   r   rK   Ž   s    
þrK   c                 C   sÂ   t ƒ  d }t| ƒ}tdd�}t|ƒdkr”|d  |¡}g }|D ]}| |¡ q>z| | tdd … ¡¡}W n   d}Y nX | 	¡  |rœ| |¡ nt
dƒ‚|s¨t
dƒ‚|r°|S d	d
„ |D ƒS d S )NTr   r   r   r>   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   ·   s     z&requested_versions.<locals>.<listcomp>)rK   r:   r,   r$   ÚintersectionrX   rT   rU   rV   rW   r   )r6   r   r   r7   Ú	supportedZvlÚversionr]   r   r   r   Úrequested_versionsŸ   s,    
 
rb   c                    sH   dd l }tƒ ‰ ‡ fdd„|  d¡D ƒ}| ¡  | r@dd„ |D ƒS |S d S )Nr   c                    s(   g | ] }t j |¡ˆ krt j |¡‘qS r   )r   r   Úbasenamer;   ©r`   r   r   r   ½   s   þz&installed_versions.<locals>.<listcomp>z/usr/bin/python3.[0-9]c                 S   s   g | ]}|d d… ‘qS r=   r   r?   r   r   r   r   Â   s     )Úglobr,   rW   )r   re   r   r   rd   r   Úinstalled_versionsº   s    
ÿrf   c                   @   s   e Zd ZdS )ÚControlFileValueErrorN©Ú__name__Ú
__module__Ú__qualname__r   r   r   r   rg   Ç   s   rg   c                   @   s   e Zd ZdS )ÚMissingVersionValueErrorNrh   r   r   r   r   rl   Ë   s   rl   c              	   C   sä   d}d}d}t | dd��}dd„ |D ƒ}W 5 Q R X |D ]|}|dkr\|dkr\|dkrV q´d}q6| d¡rld}q6| d	| ¡r€|}q6| ¡  d
¡r6|dkržtdƒ‚| dd¡d  ¡ }q6|dkrÄtdƒ‚|dkrà|dkrÜtdƒ‚|S |S )zFread the debian/control file, extract the X-Python3-Version
    field.Nzutf-8)Úencodingc                 S   s   g | ]}|  ¡ ‘qS r   r   )r   r\   r   r   r   r   ×   s     z/extract_pyversion_attribute.<locals>.<listcomp>r	   ÚSourcezSource:z	Package: zx-python3-version:z1attribute X-Python3-Version not in Source sectionrI   r   znot a control filez$no X-Python3-Version in control file)r   rS   Úlowerr   r%   r   rg   rl   )ÚfnÚpkgra   ZsversionZsectionZcontrolfileÚlinesr\   r   r   r   Úextract_pyversion_attributeÏ   s2    
rs   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 n< tk
�r } ztd| |ƒ t d¡ W 5 d }~X Y nX �n¢|j�r6t
|ƒdk�r6td t|jƒ¡ƒ �nt|j�rdt
|ƒdk�rdtd t|jƒ¡ƒ �nF|j�rŒt
|ƒdk�rŒt
|ƒdk�rŽd }n|d }z°tj |¡�r*|}zt|d!ƒ}	t|	|jƒ}
W nb tk
�rø   tj d"||f ¡ t d¡ Y n0 tk
�r&   tj d#| ¡ t|jƒ}
Y nX nt||jƒ}
td |
¡ƒ W nB tk
�rˆ } z"tj d$||f ¡ t d¡ W 5 d }~X Y nX n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   )rw   r]   rx   ry   z%s:r   rH   zdebian/controlrn   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
)Zoptparsert   Z
add_optionÚ
parse_argsr   r   rc   ÚsysÚargvr]   r$   ÚprintrK   r   r   Úexitr`   rR   r,   r{   rf   rz   Úisfilers   rb   rg   ÚstderrÚwriterl   )rt   ru   ÚparserZoptsÚargsZprogramÚmsgr   rp   r6   Zvsr   r   r   Úmain  sˆ    
 þ þ ü þ  þ 
ÿþr‡   Ú__main__)N)F)F)F)F)F)F)r   r.   r}   r   r@   rC   Úenvironr   r%   rL   rV   r   r:   rB   rD   r,   rK   rb   rf   r   rg   rl   rs   r‡   ri   r   r   r   r   Ú<module>   s.   ÿ
*


!


=A