
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
3
©ft`�¡  ã               @   sÄ   d dl m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
 d dlmZ d dlmZmZmZ d dlZejjjZejjjZejjjZejjjZedƒZedƒZdd	„ ZG d
d„ deƒZ dd„ Z!dS )é    )ÚOrderedDictN)ÚEnableMultipleStreamsException)Úlogger)Ú_ÚP_Úucdz6

Hint: [d]efault, [e]nabled, [x]disabled, [i]nstalledz@

Hint: [d]efault, [e]nabled, [x]disabled, [i]nstalled, [a]ctivec             C   s   | j ƒ S )N)ÚgetName)Úprofile© r
   ú!/usr/lib/python3.6/module_base.pyÚ_profile_comparison_key'   s    r   c               @   s  e Zd Zdd„ Zdd„ Zdd„ ZdBdd	„ZdCd
d„Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ ZdDdd„Zdd„ Zdd„ Zdd„ Zd d!„ Zd"d#„ ZdEd%d&„Zd'd(„ Zd)d*„ Zd+d,„ ZdFd-d.„Zd/d0„ Zed1d2„ ƒZd3d4„ Zd5d6„ Zd7d8„ Zd9d:„ Zd;d<„ Z d=d>„ Z!d?d@„ Z"dAS )GÚ
ModuleBasec             C   s
   || _ d S )N)Úbase)Úselfr   r
   r
   r   Ú__init__.   s    zModuleBase.__init__c       	      C   sn   | j |ƒ\}}}}x8|jƒ D ],\}\}}|jrtjtdƒj|j|jƒƒ qW |sX|sX|rjtj	j
|||d�‚d S )Nz%Ignoring unnecessary profile: '{}/{}')Úno_match_group_specsÚerror_group_specsÚmodule_depsolv_errors)Ú!_resolve_specs_enable_update_sackÚitemsr	   r   Úinfor   ÚformatÚnameÚdnfÚ
exceptionsÚMarkingErrors)	r   Úmodule_specsÚno_match_specsÚerror_specsÚsolver_errorsÚmodule_dictsÚspecÚnsvcapÚmodule_dictr
   r
   r   Úenable2   s    zModuleBase.enablec             C   s,   | j |tƒ\}}|s|r(tjj||d�‚d S )N)r   r   )Ú_modules_reset_or_disableÚSTATE_DISABLEDr   r   r   )r   r   r   r   r
   r
   r   Údisable?   s    zModuleBase.disableTc          	      sþ  ˆ j |ƒ\}}}}tj}i }tƒ }	d}
�xt|jƒ D �]f\}\}}�xV|jƒ D �]H\}}�x<|jƒ D �].\}}‡ fdd„|D ƒ}|s¦tjtdƒj|||ƒƒ |j	|ƒ qbg }ˆ j
|ƒ}|jƒ |krâtdƒ}tj|j|jƒ |ƒƒ d}
|j�rd|j|j|jƒƒ |�s(|jƒ }|�r>djtdd„ |D ƒƒƒ}td	ƒj||||ƒ}ntd
ƒj|ƒ}tj|ƒ |j	|ƒ qbnÄˆ jjj||ƒ}|�sØ|jƒ }|�r´djtdd„ |D ƒƒƒ}tdƒj|||ƒ}ntdƒj||ƒ}tj|ƒ |j	|ƒ xNt|ƒD ]B}|j|ƒ}|�stjtdƒj|||ƒƒ |j	|ƒ |j|ƒ �qâW xJ|D ]B}ˆ jjj||jƒ ƒ x&|jƒ D ]}|j|tƒ ƒj|ƒ �qPW �q.W x|D ]}|	j|jƒ ƒ �qzW qbW qLW q2W |
�r´tjjtdƒƒ‚ˆ j |	||ƒ\}}|�rÖ|j|ƒ |�sè|�sè|�rútjj!|||d�‚d S )NFc                s"   g | ]}ˆ j jj|jƒ ƒr|‘qS r
   )r   Ú_moduleContainerÚisModuleActiveÚgetId)Ú.0Úx)r   r
   r   ú
<listcomp>S   s    z&ModuleBase.install.<locals>.<listcomp>zAAll matches for argument '{0}' in module '{1}:{2}' are not activezDInstalling module '{0}' from Fail-Safe repository {1} is not allowedTz, c             S   s   g | ]}|j ƒ ‘qS r
   )r   )r+   r	   r
   r
   r   r-   g   s    zKUnable to match profile for argument {}. Available profiles for '{}:{}': {}z'Unable to match profile for argument {}c             S   s   g | ]}|j ƒ ‘qS r
   )r   )r+   r	   r
   r
   r   r-   w   s    z<No default profiles for module {}:{}. Available profiles: {}zNo profiles for module {}:{}z0Default profile {} not available in module {}:{}z:Installing module from Fail-Safe repository is not allowed)r   r   r   )"r   ÚhawkeyÚMODULE_FAIL_SAFE_REPO_NAMEÚsetr   r   Úerrorr   r   ÚappendÚ_get_latestÚ	getRepoIDÚcriticalÚgetNameStreamr	   ÚextendÚgetProfilesÚjoinÚsortedr   r(   ÚgetDefaultProfilesÚinstallr   Ú
getContentÚ
setdefaultÚaddÚupdateÚgetArtifactsr   r   ÚErrorÚ_install_profiles_internalr   )r   r   Ústrictr   r   r   r    Úfail_safe_repoÚinstall_dictÚinstall_set_artifactsÚfail_safe_repo_usedr!   r"   Ú
moduledictr   Ú
streamdictÚstreamÚmodule_listÚinstall_module_listÚprofilesÚlatest_moduleÚmsgÚavailable_profilesÚprofile_namesZprofiles_stringsr	   Úmodule_profilesÚpkg_nameÚmoduleÚ__Úprofiles_errorsr
   )r   r   r<   F   sŽ    








 
 
zModuleBase.installc       .   	      sÄ  ˆ j |ƒ\}}}tƒ }tƒ }ddh}xž|jƒ D ]’\}	\}
}x„|jƒ D ]x}xrˆ jjj|ddddƒD ]X}ˆ jjj|ƒr`xD|jƒ D ]8}|j	ddƒd }||kršq||j	ddƒd }|j
|ƒ q|W q`W qDW q.W ˆ jƒ }ˆ j|ƒ}|rä|j|ƒ tj}i }tƒ }d	}ˆ jjjƒ }�x^|jƒ D �]P\}	\}
}�x>|jƒ D �]0\}}�x"|jƒ D �]\}}‡ fd
d„|D ƒ}|�sˆtjtdƒj|	||ƒƒ |j|	ƒ �q@g }ˆ j|ƒ}|jƒ |k�rÆtdƒ}tj|j|jƒ |ƒƒ d}|
j�rJ|j|j|
jƒƒ |�sž|jƒ }|�r"djtdd„ |D ƒƒƒ} tdƒj|	||| ƒ}ntdƒj|	ƒ}tj|ƒ |j|	ƒ �q@nT||k�ržxH|| D ]<}!|j|!ƒ}"|"�sŽtjtdƒj|!||ƒƒ �q^|j|"ƒ �q^W xJ|D ]B}!ˆ jjj||!j ƒ ƒ x&|!j!ƒ D ]}|j"|tƒ ƒj
|	ƒ �qÆW �q¤W xh|D ]`}|jƒ }#|j#|#ƒ xF|#D ]>}|j	ddƒd }||k�r.�q|j	ddƒd }|j
|ƒ �qW �qðW �q@W �q*W �qW |�r|t$j%j&tdƒƒ‚ˆ j'|||ƒ\}$}%|%�rž|j|%ƒ tƒ }&|&j#|ƒ |&j#|ƒ ˆ jj(jƒ j)dd�}'ˆ jj(jƒ j)ddgd�j*ƒ }(x¦|&D ]ž}|(j+|d�})|)j,ƒ }*|*�s�qî|)j-ƒ }+|+�sJtjtdƒj|ƒƒ ||k�rî|'j.|)ƒ}'�qî|)j/|$ƒ},|,�r^|,})t$j0j1ˆ jj(ƒ}-|-j|)d� ˆ jj2j3|-d� �qîW ˆ jj4|'ƒ |�s®|�s®|�rÀt$j%j5|||d�‚d S )NÚnosrcÚsrcÚ Ú.é   ú-é   r   Fc                s"   g | ]}ˆ j jj|jƒ ƒr|‘qS r
   )r   r(   r)   r*   )r+   r,   )r   r
   r   r-   À   s    z(ModuleBase.switch_to.<locals>.<listcomp>z8No active matches for argument '{0}' in module '{1}:{2}'zDInstalling module '{0}' from Fail-Safe repository {1} is not allowedTz, c             S   s   g | ]}|j ƒ ‘qS r
   )r   )r+   r	   r
   r
   r   r-   Õ   s    zKUnable to match profile for argument {}. Available profiles for '{}:{}': {}z'Unable to match profile for argument {}zEInstalled profile '{0}' is not available in module '{1}' stream '{2}'z:Installing module from Fail-Safe repository is not allowed)Úempty)Ú	arch__neq)r   z9No packages available to distrosync for package name '{}')Úpkg)Úselect)r   r   r   )6Ú_resolve_specs_enabler0   r   Úkeysr   r(   Úqueryr)   rA   Úrsplitr?   Ú_update_sackÚ_enable_dependenciesr7   r.   r/   ZgetRemovedProfilesr   r1   r   r   r2   r3   r4   r5   r6   r	   r8   r9   r:   Zwarningr<   r   r=   r>   r@   r   r   rB   rC   ÚsackÚfiltermÚapplyÚfilterÚ	installedÚ	availableÚunionÚintersectionÚselectorÚSelectorÚ_goalZdistupgradeÚ_remove_if_unneededr   ).r   r   rD   r   r   r    Znew_artifacts_namesZactive_artifacts_namesZ
src_archesr!   r"   rI   r   rU   ÚartifactÚarchrT   r   Údependency_error_specrE   rF   rG   rH   Zremoved_profilesrJ   rK   rL   rM   rN   rO   rP   rQ   rR   r	   rS   Ú	artifactsÚinstall_base_queryrW   Z	all_namesZremove_queryÚbase_no_source_queryre   rm   rn   Zonly_new_moduleÚsltrr
   )r   r   Ú	switch_to›   sÚ    








 



(






zModuleBase.switch_toc             C   s(   | j |tƒ\}}|r$tjj||d�‚d S )N)r   r   )r%   ÚSTATE_UNKNOWNr   r   r   )r   r   r   r   r
   r
   r   Úreset  s    zModuleBase.resetc                s,  g }t j}d}ˆ jjjƒ jddgd�jƒ }�xä|D �]Ú}ˆ j|ƒ\}}|sV|j|ƒ q2‡ fdd„|D ƒ}	|	s‚t	j
tdƒj|ƒƒ q2ˆ j|	|dƒ}
tƒ }�x|
jƒ D �]\}}�x|jƒ D ]ø\}}|jˆ j||ƒƒ ˆ j|ƒ}|jƒ |k�rtdƒ}t	j|j|jƒ |ƒƒ d	}|j�rH|j|jƒ}|�s(q¸x†|D ]}|j|jƒ ƒ �q.W q¸x |jƒ D ]}|j|jƒ ƒ �qRW xD|jƒ D ]8}t j|ƒ}x&|jt jgd
�D ]}|j|jƒ �q”W �qtW q¸W q¢W |�sÒt	j
tdƒj|ƒƒ |j|d�}|r2t j!j"ˆ jjƒ}|j|d� ˆ jj#j$|d� q2W |�r(t j%j&tdƒƒ‚|S )NFrY   rX   )r`   c                s"   g | ]}ˆ j jj|jƒ ƒr|‘qS r
   )r   r(   r)   r*   )r+   r,   )r   r
   r   r-   3  s    z&ModuleBase.upgrade.<locals>.<listcomp>zUnable to resolve argument {}zCUpgrading module '{0}' from Fail-Safe repository {1} is not allowedT)Zformsz&Unable to match profile in argument {})r   )ra   )rb   z9Upgrading module from Fail-Safe repository is not allowed)'r.   r/   r   ri   re   rj   rk   Ú_get_modulesr2   r   r1   r   r   Ú_create_module_dict_and_enabler0   r   r@   Ú)_get_package_name_set_and_remove_profilesr3   r4   r5   r6   r	   r8   r=   rA   ÚSubjectZget_nevra_possibilitiesZ
FORM_NEVRAr?   r   rl   r   rq   rr   rs   Úupgrader   rB   )r   r   r   rE   rH   rz   r!   rL   r"   Zupdate_module_listr#   Zupgrade_package_setr   rJ   rK   Úmodule_list_from_dictrO   rP   Úprofiles_setr	   ru   ÚsubjZ	nevra_objre   r{   r
   )r   r   rƒ   %  sb    




 zModuleBase.upgradec             C   sô   g }t ƒ }xž|D ]–}| j|ƒ\}}|s2|j|ƒ q| j||dƒ}g }x>|jƒ D ]2\}	}
x(|
jƒ D ]\}}|j| j||dƒƒ q`W qNW |sœtjt	dƒj
|ƒƒ |j|ƒ qW |rð| jjjƒ }|j|ƒ}|rð| jjjƒ jƒ j|d�}|rð| jj|ƒ |S )NFTz&Unable to match profile in argument {})r   )r0   r   r2   r€   r   r7   r�   r   r1   r   r   r@   r   r(   ZgetInstalledPkgNamesÚ
differenceri   re   rm   rj   rt   )r   r   r   Zremove_package_setr!   rL   r"   r#   Zremove_packages_namesr   rJ   rK   r„   Zkeep_pkg_namesre   r
   r
   r   Úremove_  s0    


zModuleBase.removec             C   s
   | j |ƒS )N)r   )r   Úmodule_specr
   r
   r   Úget_modules|  s    zModuleBase.get_modulesc       
      C   s¤   t j|ƒ}x�|jƒ D ]„}|jr$|jnd}|jr4|jnd}d}|jrH|jnd}|jrX|jnd}|jrv|jdkrvt|jƒ}| j	j
j|||||ƒ}	|	r|	|fS qW f d fS )NrZ   r\   éÿÿÿÿ)r.   r‚   Znsvcap_possibilitiesr   rK   Úcontextrv   ÚversionÚstrr   r(   re   )
r   r‰   r†   r"   r   rK   r�   rŒ   rv   Úmodulesr
   r
   r   r   €  s    

zModuleBase._get_modulesc             C   s>   d }|r:|d }x(|dd … D ]}|j ƒ |j ƒ kr|}qW |S )Nr   r\   )ZgetVersionNum)r   rL   ÚlatestrU   r
   r
   r   r3   �  s    zModuleBase._get_latestc             C   sˆ  i }x.|D ]&}|j |jƒ i ƒj |jƒ g ƒj|ƒ q
W �xL|jƒ D �]>\}}| jjj|ƒ}t|ƒdk�rF|t	krÄ|t
krÄ|tkrÄdjt|jƒ tj| jjjƒd�ƒ}	tdƒj|t|ƒ|	|d�}
t||
ƒ‚|t
krÜ| jjj|ƒ}n| jjj|ƒ}| sú||k�rt|ƒ‚xlt|jƒ ƒD ]0}||k�r8|�r| jjj||ƒ �q||= �qW n*|�rpx"|jƒ D ]}| jjj||ƒ �qVW t|ƒdks@t‚q@W |S )Nr\   z', ')Úkeyz‡Argument '{argument}' matches {stream_count} streams ('{streams}') of module '{module}', but none of the streams are enabled or default)ZargumentZstream_countZstreamsrU   )r>   r   Ú	getStreamr2   r   r   r(   ZgetModuleStateÚlenÚSTATE_DEFAULTÚSTATE_ENABLEDr&   r9   r:   rd   Ú	functoolsÚ
cmp_to_keyri   Zevr_cmpr   r   r   ZgetEnabledStreamÚgetDefaultStreamr$   ÚAssertionError)r   rL   r!   r$   Ú
moduleDictrU   Z
moduleNameÚ
streamDictZmoduleStateZstreams_strrP   rK   r‘   r
   r
   r   r€   ™  s>    
"


z)ModuleBase._create_module_dict_and_enablec       
      C   s´   g }g }i }xœ|D ]”}| j |ƒ\}}|s4|j|ƒ qy| j||dƒ}||f||< W q ttfk
r¤ }	 z2|j|ƒ tjt|	ƒƒ tjtdƒj	|ƒƒ W Y d d }	~	X qX qW |||fS )NTzUnable to resolve argument {})
r   r2   r€   ÚRuntimeErrorr   r   r1   r   r   r   )
r   r   r   Ú
error_specr    r!   rL   r"   r#   Úer
   r
   r   rc   ¾  s     


*z ModuleBase._resolve_specs_enablec             C   s„   dd„ | j jjƒ D ƒ}y4| j jj| j j|| j jj| j jjd| j jj	d�}W n4 t
jk
r~ } ztjjt|ƒƒ‚W Y d d }~X nX |S )Nc             S   s   g | ]}|j r|j‘qS r
   )Úmodule_hotfixesÚid)r+   Úir
   r
   r   r-   Ñ  s    z+ModuleBase._update_sack.<locals>.<listcomp>T)Zupdate_onlyZdebugsolver)r   ÚreposÚiter_enabledri   Zfilter_modulesr(   ÚconfZinstallrootZmodule_platform_idZdebug_solverr.   Ú	Exceptionr   r   rB   r   )r   Úhot_fix_reposr   rž   r
   r
   r   rg   Ð  s    
"zModuleBase._update_sackc       	      C   s°   g }x¦|j ƒ D ]š\}\}}xŒ|jƒ D ]€}xz|jƒ D ]n}y| jjjtjj|ƒƒ W q2 tk
rž } z2|j	|ƒ t
jt|ƒƒ t
jtdƒj|ƒƒ W Y d d }~X q2X q2W q$W qW |S )NzUnable to resolve argument {})r   Úvaluesr   r(   ZenableDependencyTreeÚlibdnfrU   ZVectorModulePackagePtrrœ   r2   r   r1   r   r   r   )	r   r    r�   r!   r"   rš   r›   r�   rž   r
   r
   r   rh   Û  s    
2zModuleBase._enable_dependenciesc             C   s<   | j |ƒ\}}}| jƒ }| j|ƒ}|r0|j|ƒ ||||fS )N)rc   rg   rh   r7   )r   r   r   r�   r    r   rw   r
   r
   r   r   é  s    

z,ModuleBase._resolve_specs_enable_update_sackc             C   sâ   g }xÌ|D ]Ä}| j |ƒ\}}|s@tjtdƒj|ƒƒ |j|ƒ q
|js^|js^|js^|j	s^|j
rrtjtdƒj|ƒƒ tƒ }x|D ]}|j|jƒ ƒ q~W x8|D ]0}	|tkr´| jjj|	ƒ |tkrš| jjj|	ƒ qšW q
W | jƒ }
||
fS )NzUnable to resolve argument {}zMOnly module name is required. Ignoring unneeded information in argument: '{}')r   r   r1   r   r   r2   rK   r�   rŒ   rv   r	   r   r0   r?   r   r}   r   r(   r~   r&   r'   rg   )r   r   Zto_stater   r!   rL   r"   Zmodule_namesrU   r   r   r
   r
   r   r%   ô  s(    



z$ModuleBase._modules_reset_or_disableFc       
      C   sÖ   t ƒ }| j|ƒ}t | jjj|jƒ ƒƒ}|s0t ƒ S |jrŽ|j|jƒ}|sLt ƒ S x„|D ]6}|jƒ |krR|rz| jjj||jƒ ƒ |j	|j
ƒ ƒ qRW nDxB|D ]:}	|r¬| jjj||	ƒ x |j|	ƒD ]}|j	|j
ƒ ƒ q¸W q”W |S )N)r0   r3   r   r(   ÚgetInstalledProfilesr   r	   r8   Z	uninstallr@   r=   )
r   rL   r"   rˆ   Zpackage_name_setrO   Zinstalled_profiles_stringsr…   r	   Zprofile_stringr
   r
   r   r�     s*    



z4ModuleBase._get_package_name_set_and_remove_profilesc       	      C   sØ   t ƒ }xÂ|D ]º}| j|ƒ\}}|s8tjtdƒj|ƒƒ q|jrXtjtdƒj|j|jƒƒ xl|D ]d}tƒ }|j	ƒ |d< x8t
|jƒ td�D ]$}djdd„ |jƒ D ƒƒ||jƒ < q†W |j| j|ƒjƒ ƒ q^W qW djt
|ƒƒS )	NzUnable to resolve argument {}z%Ignoring unnecessary profile: '{}/{}'ÚName)r‘   Ú
c             S   s   g | ]}|‘qS r
   r
   )r+   ZpkgNamer
   r
   r   r-   5  s    z1ModuleBase._get_info_profiles.<locals>.<listcomp>z

)r0   r   r   r   r   r   r	   r   r   ÚgetFullIdentifierr:   r8   r   r9   r=   r   r?   Ú_create_simple_tableÚtoString)	r   r   Úoutputr‰   rL   r"   rU   Úlinesr	   r
   r
   r   Ú_get_info_profiles#  s"    

 zModuleBase._get_info_profilesc             C   s€   | j jj|jƒ ƒ}|jƒ }d}xTt|td�D ]D}|dj|jƒ |jƒ |krLdndƒ7 }||jƒ |krj|rjdnd7 }q,W |d d… S )	NrZ   )r‘   z{}{}z [d]z [i], z, r^   éþÿÿÿ)r   r(   r©   r   r8   r:   r   r   )r   ÚmodulePackageÚdefault_profilesÚenabled_strZinstalled_profilesrQ   Úprofiles_strr	   r
   r
   r   Ú_profile_report_formatter:  s    

z$ModuleBase._profile_report_formatterc             C   s   |j ƒ jddƒS )Nr«   ú )ÚstripÚreplace)r   Zsummaryr
   r
   r   Ú_summary_report_formatterF  s    z$ModuleBase._summary_report_formatterc             C   s”   d}d}d}|j ƒ | jjj|jƒ ƒkr*d}| jjj|ƒrJ|s@d}|d7 }n| jjj|ƒrh|s`d}|d7 }|rŠ| jjj|ƒrŠ|s‚d}|d7 }|||fS )NrZ   z [d]r¸   z[e]z[x]z[a])r’   r   r(   r˜   r   Z	isEnabledZ
isDisabledr)   )r   r³   Ú
markActiveÚdefault_strrµ   Údisabled_strr
   r
   r   Ú_module_strs_formatterI  s&    
z!ModuleBase._module_strs_formatterc          
   C   sî  t ƒ }�xÄ|D �]º}| j|ƒ\}}|s<tjtdƒj|ƒƒ q|jr\tjtdƒj|j|jƒƒ �xj|D �]`}| j|dd�\}}}	| j	j
j|jƒ |jƒ ƒ}
| j||
|ƒ}tƒ }|jƒ |d< |jƒ | | |	 |d< |jƒ |d< |jƒ |d< |jƒ |d	< ||d
< dj|
ƒ|d< |jƒ |d< |jƒ |d< |jƒ |d< t ƒ }xV|jƒ D ]J}xB|jƒ D ]6}x.|jƒ D ]"\}}|jdj|dj|ƒƒƒ �qXW �qJW �q<W djt|ƒƒ|d< djt|jƒ ƒƒ|d< |j| j|ƒjƒ ƒ qdW qW djt|ƒƒ}|�rê|t7 }|S )NzUnable to resolve argument {}z%Ignoring unnecessary profile: '{}/{}'T)r¼   rª   ÚStreamZVersionZContextZArchitectureÚProfilesr¸   zDefault profilesÚRepoÚSummaryZDescriptionz{}:[{}]ú,r«   ZRequiresZ	Artifactsz

) r0   r   r   r   r   r   r	   r   r¿   r   r(   r;   r   r’   r·   r   Z
getVersionZ
getContextZgetArchr9   r4   Ú
getSummaryZgetDescriptionZgetModuleDependenciesZgetRequiresr   r?   r:   rA   r­   r®   ÚMODULE_INFO_TABLE_HINT)r   r   r¯   r‰   rL   r"   r³   r½   rµ   r¾   r´   r¶   r°   Zreq_setZreqZrequire_dictZmod_requirerK   Ú	str_tabler
   r
   r   Ú	_get_info^  sP    

*zModuleBase._get_infoc             C   s    t jjƒ }|jdƒ |jdƒ |jdƒ}|jdƒ}|jdƒ |jdƒ |jƒ  xL| j	ƒ D ]@\}}|d krld}|j
ƒ }|j|ƒj|ƒ |j|ƒjt|ƒƒ qXW |S )NTz : rª   ZValuer«   rZ   )r¨   Ú	smartcolsÚTableZenableNoheadingsZsetColumnSeparatorÚ	newColumnÚsetWrapZsetSafecharsZsetNewlineWrapFunctionr   ÚnewLineÚgetColumnCellÚsetDatarŽ   )r°   ÚtableÚcolumn_nameZcolumn_valueZ	line_nameÚvalueÚliner
   r
   r   r­   ‹  s    






zModuleBase._create_simple_tablec       	      C   s’   t ƒ }xx|D ]p}| j|ƒ\}}|s8tjtdƒj|ƒƒ q|jrXtjtdƒj|j|jƒƒ x"|D ]}|jƒ }|r^|j	|ƒ q^W qW dj
t|ƒƒ}|S )NzUnable to resolve argument {}z%Ignoring unnecessary profile: '{}/{}'z

)r0   r   r   r   r   r   r	   r   ZgetYamlr?   r9   r:   )	r   r   r¯   r‰   rL   r"   r³   r   Zoutput_stringr
   r
   r   Ú_get_full_info   s    

zModuleBase._get_full_infoc          	   C   s‚  t ƒ }| jjjƒ }| jjjƒ jdd�jƒ }| jjjtj	d�}x6|D ].}t
jj|ƒ}|j|j| jjddd|d�ƒ}qBW |jƒ  xö|D ]î}|jƒ }	|	s”q‚|j|	d�}
|
r‚xÊ|
D ]Â}d}g }x4t|jƒ td�D ] }|j|jƒ krÈ|j|jƒ ƒ qÈW tƒ }|jƒ |d	< d
jt|ƒƒ|d< |jƒ |d< |jƒ |d< | j|ƒ}|dj| jjj j!t"|ƒƒƒ7 }|dj|j#ƒ ƒ7 }|j$|ƒ qªW q‚W djt|ƒƒS )NT)r_   )ÚflagsF)Z
with_nevraZwith_providesZwith_filenamesre   )Únevra_strictrZ   )r‘   ZModuler¸   rÁ   rÂ   rÃ   z{}
z{}z

)%r0   r   r(   ÚgetModulePackagesri   re   rj   rk   r.   ZIGNORE_MODULAR_EXCLUDESr   Zsubjectr‚   ro   Zget_best_queryrA   rl   r:   r8   r   r   r=   r2   r   r   r¬   r9   r4   rÅ   r­   r   r¯   ÚtermÚboldrŽ   r®   r?   )r   Z	rpm_specsr¯   ZmodulePackagesZ	baseQueryZgetBestInitQueryr!   r†   r³   rx   re   ra   Zstring_outputrN   r	   r°   rÐ   r
   r
   r   Ú_what_provides²  s@    



zModuleBase._what_providesc                sr  t jjƒ }|jt jjjƒ |jdƒ |jdƒ}|jdƒ}|jdƒ}|jdƒ |jdƒ}|jdƒ ˆ jj	j
spd|_xü|D ]ô}xî|D ]æ}t|ƒdkrš|d }	n(‡ fdd	„|D ƒ}
|
rº|
d }	n|d }	|jƒ }ˆ j|	d
d�\}}}ˆ jjj|	jƒ |	jƒ ƒ}ˆ j|	||ƒ}|j|ƒj|	jƒ ƒ |j|ƒj|	jƒ | | | ƒ |j|ƒj|ƒ ˆ j|	jƒ ƒ}|j|ƒj|ƒ q€W qvW |S )NTrª   rÀ   rÁ   rÃ   r\   r   c                s   g | ]}ˆ j jj|ƒr|‘qS r
   )r   r(   r)   )r+   rU   )r   r
   r   r-   í  s    z5ModuleBase._create_and_fill_table.<locals>.<listcomp>F)r¼   )r¨   rÉ   rÊ   ZsetTermforceZTermForce_AUTOZenableMaxoutrË   rÌ   r   r¤   ÚverboseZhiddenr“   rÍ   r¿   r(   r;   r   r’   r·   rÎ   rÏ   r»   rÅ   )r   r�   rÐ   rÑ   Zcolumn_streamZcolumn_profilesZcolumn_infoZlatest_per_repoZnameStreamArchr³   ZactiverÓ   r½   rµ   r¾   r´   r¶   Zsummary_strr
   )r   r   Ú_create_and_fill_tableÚ  sD    












z!ModuleBase._create_and_fill_tablec             C   sª  g }|r0x2|D ]}| j |ƒ\}}|j|ƒ qW n| jjjƒ }| jjj||ƒ}|sTdS | j|ƒ}d}	d}
y"| jj|d d d jƒ  j	}W n( t
k
r°   |d d d jƒ }Y nX t|d ƒ}| j|ƒ}| j|ƒ}||7 }xÆtd|jƒ ƒD ]´}||
 |k�r„|
|7 }
|	d7 }	y"| jj||	 d d jƒ  j	}W n* t
k
�rX   ||	 d d jƒ }Y nX t||	 ƒ}|d7 }|| j|ƒ7 }||7 }|j|ƒ}||j||ƒ7 }qêW |t S )NrZ   r   r\   r«   )r   r7   r   r(   r×   ZgetLatestModulesPerReporÜ   r¢   r4   r   ÚKeyErrorr“   Ú_format_headerÚ_format_repoidÚrangeZgetNumberOfLinesÚgetLiner®   ÚMODULE_TABLE_HINT)r   r   Zmodule_stater�   r!   rL   r"   r�   rÐ   Zcurrent_repo_id_indexZalready_printed_linesÚ	repo_nameZversionsÚheaderrÇ   r¡   rÓ   r
   r
   r   Ú_get_brief_description  sH    

"


z!ModuleBase._get_brief_descriptionc             C   s&   |j dƒ}|j||ƒjddƒd d S )Nr   r«   r\   )rá   r®   Úsplit)r   rÐ   rÓ   r
   r
   r   rÞ   .  s    
zModuleBase._format_headerc             C   s   dj | jjjj|ƒƒS )Nz{}
)r   r   r¯   rØ   rÙ   )r   rã   r
   r
   r   rß   2  s    zModuleBase._format_repoidc             C   s  | j jjƒ jddgd�jƒ }|j|d�}g }dd„ | j jjƒ D ƒ}|j||jƒ d�}|j	|ƒ}x¶|j
ƒ D ]ª\}	}
|j|	d�}|sÒ|j|	d�}|sÒx |
D ]}tjtd	ƒj|ƒƒ q–W tjtd
ƒj|	ƒƒ |j|
ƒ qh| j jjj|	ƒ tjj| j jƒ}|j|d� | j jj|| d� qhW ||fS )NrY   rX   )r`   )rÖ   c             S   s   g | ]}|j r|j‘qS r
   )rŸ   r    )r+   r¡   r
   r
   r   r-   <  s    z9ModuleBase._install_profiles_internal.<locals>.<listcomp>)Zreponamer   )r   zUnable to resolve argument {}zNo match for package {})ra   )rb   Zoptional)r   ri   re   rj   rk   rl   r¢   r£   rd   ro   r   r   r1   r   r   r7   rs   Zgroup_membersr?   r   rq   rr   r0   r<   )r   rG   rF   rD   rz   ry   r   r¦   Zhotfix_packagesrT   Z	set_specsre   r!   r{   r
   r
   r   rC   5  s,    


z%ModuleBase._install_profiles_internalN)T)T)T)F)F)#Ú__name__Ú
__module__Ú__qualname__r   r$   r'   r<   r|   r~   rƒ   rˆ   rŠ   r   r3   r€   rc   rg   rh   r   r%   r�   r±   r·   r»   r¿   rÈ   Ústaticmethodr­   rÔ   rÚ   rÜ   rå   rÞ   rß   rC   r
   r
   r
   r   r   +   s@   
U
 :	
%

-(**r   c             C   s&   t jj| ƒ}djtddt| ƒƒ|gƒS )Nr«   zModular dependency problem:zModular dependency problems:)r   ÚutilZ_format_resolve_problemsr9   r   r“   )ÚerrorsrP   r
   r
   r   Úformat_modular_solver_errorsS  s    rí   )"Úcollectionsr   r.   Zlibdnf.smartcolsr¨   Zlibdnf.moduleZdnf.selectorr   Zdnf.exceptionsZdnf.module.exceptionsr   Zdnf.utilr   Zdnf.i18nr   r   r   r–   rU   ZModulePackageContainerZModuleState_DEFAULTr”   ZModuleState_ENABLEDr•   ZModuleState_DISABLEDr&   ZModuleState_UNKNOWNr}   râ   rÆ   r   Úobjectr   rí   r
   r
   r
   r   Ú<module>   s0   



      .