a
    ©!c†<  ã                   @   s„   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
Z
G dd„ deƒZG dd„ deƒZG dd	„ d	eƒZG d
d„ deƒZdS )é    N)Ú_)Úloggerc                   @   sl   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ ZdS )ÚPersistorBasec                 C   sB   t |tjjjƒs J tt|ƒƒƒ‚|| _i | _i | _i | _	i | _
d S ©N)Ú
isinstanceÚdnfÚdbÚhistoryZSwdbInterfaceÚstrÚtypeÚ
_installedÚ_removedÚ	_upgradedÚ_downgraded)Úselfr	   © r   ú0/usr/lib/python3.9/site-packages/dnf/db/group.pyÚ__init__    s     zPersistorBase.__init__c                 C   s(   t | jƒt | jƒ t | jƒ t | jƒ S r   )Úlenr   r   r   r   ©r   r   r   r   Ú__len__(   s    zPersistorBase.__len__c                 C   s   i | _ i | _i | _i | _d S r   )r   r   r   r   r   r   r   r   Úclean+   s    zPersistorBase.cleanc                 C   s   t ‚d S r   ©ÚNotImplementedError©r   Úobjr   r   r   Ú_get_obj_id1   s    zPersistorBase._get_obj_idc                 C   s*   | j j |d|tjj¡}| tjj¡ d S )NÚ )r	   ÚswdbÚaddItemÚlibdnfÚtransactionÚTransactionItemReason_USERZsetStateZTransactionItemState_DONE)r   ÚitemÚactionÚtir   r   r   Ú_add_to_history4   s    zPersistorBase._add_to_historyc                 C   s$   || j |  |¡< |  |tjj¡ d S r   )r   r   r&   r    r!   ÚTransactionItemAction_INSTALLr   r   r   r   Úinstall8   s    zPersistorBase.installc                 C   s$   || j |  |¡< |  |tjj¡ d S r   )r   r   r&   r    r!   ÚTransactionItemAction_REMOVEr   r   r   r   Úremove<   s    zPersistorBase.removec                 C   s$   || j |  |¡< |  |tjj¡ d S r   )r   r   r&   r    r!   ÚTransactionItemAction_UPGRADEr   r   r   r   Úupgrade@   s    zPersistorBase.upgradec                 C   s$   || j |  |¡< |  |tjj¡ d S r   )r   r   r&   r    r!   ÚTransactionItemAction_DOWNGRADEr   r   r   r   Ú	downgradeD   s    zPersistorBase.downgradec                 C   s   t ‚d S r   r   )r   Úobj_idÚnameÚtranslated_nameÚ	pkg_typesr   r   r   ÚnewH   s    zPersistorBase.newc                 C   s   t ‚d S r   r   )r   r/   r   r   r   ÚgetK   s    zPersistorBase.getc                 C   s   t ‚d S r   r   ©r   Úpatternr   r   r   Úsearch_by_patternN   s    zPersistorBase.search_by_patternN)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r&   r(   r*   r,   r.   r3   r4   r7   r   r   r   r   r      s   r   c                   @   sD   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dS )ÚGroupPersistorc                 C   s"   | j j ¡ }dd„ |D ƒ}t|ƒS )Nc                 S   s   g | ]}|  ¡ r|‘qS r   )ÚgetCompsGroupItem©Ú.0Úir   r   r   Ú
<listcomp>V   ó    z+GroupPersistor.__iter__.<locals>.<listcomp>©r	   r   ÚgetItemsÚiter©r   Úitemsr   r   r   Ú__iter__T   s    zGroupPersistor.__iter__c                 C   s   |  ¡ S r   )Ú
getGroupIdr   r   r   r   r   Y   s    zGroupPersistor._get_obj_idc                 C   sH   | j j ¡ }| |¡ |d ur(| |¡ |d ur:| |¡ | |¡ |S r   )r	   r   ZcreateCompsGroupItemZ
setGroupIdÚsetNameÚsetTranslatedNameÚsetPackageTypes)r   r/   r0   r1   r2   Ú
swdb_groupr   r   r   r3   \   s    



zGroupPersistor.newc                 C   s"   | j j |¡}|sd S | ¡ }|S r   )r	   r   r<   )r   r/   rL   r   r   r   r4   f   s
    zGroupPersistor.getc                 C   s   | j j |¡S r   )r	   r   ZgetCompsGroupItemsByPatternr5   r   r   r   r7   m   s    z GroupPersistor.search_by_patternc                 C   s   | j j |¡S r   )r	   r   ZgetPackageCompsGroups)r   Úpkg_namer   r   r   Úget_package_groupsp   s    z!GroupPersistor.get_package_groupsc                 C   sÄ   | j j |dd¡}|tjjkr"dS t|  |¡ƒ}| j 	¡ D ]8\}}| 
¡ D ]&}| ¡ |kr\qJ| ¡ sfqJ| |¡ qJq:| j 	¡ D ]8\}}| 
¡ D ]&}| ¡ |kr qŽ| ¡ sªqŽ| |¡ qŽq~|rÀdS dS )Nr   éþÿÿÿFT)r	   r   ÚresolveRPMTransactionItemReasonr    r!   ZTransactionItemReason_GROUPÚsetrN   r   rF   ZgetPackagesZgetNameÚgetInstalledr*   r   Úadd)r   rM   ÚreasonZpackage_groupsÚgroup_idÚgroupÚpkgr   r   r   Úis_removable_pkgs   s*    zGroupPersistor.is_removable_pkgN)
r8   r9   r:   rG   r   r3   r4   r7   rN   rX   r   r   r   r   r;   R   s   
r;   c                   @   sD   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dS )ÚEnvironmentPersistorc                 C   s"   | j j ¡ }dd„ |D ƒ}t|ƒS )Nc                 S   s   g | ]}|  ¡ r|‘qS r   )ÚgetCompsEnvironmentItemr=   r   r   r   r@   ’   rA   z1EnvironmentPersistor.__iter__.<locals>.<listcomp>rB   rE   r   r   r   rG      s    zEnvironmentPersistor.__iter__c                 C   s   |  ¡ S r   )ZgetEnvironmentIdr   r   r   r   r   •   s    z EnvironmentPersistor._get_obj_idc                 C   sH   | j j ¡ }| |¡ |d ur(| |¡ |d ur:| |¡ | |¡ |S r   )r	   r   ZcreateCompsEnvironmentItemZsetEnvironmentIdrI   rJ   rK   )r   r/   r0   r1   r2   Úswdb_envr   r   r   r3   ˜   s    



zEnvironmentPersistor.newc                 C   s"   | j j |¡}|sd S | ¡ }|S r   )r	   r   rZ   )r   r/   r[   r   r   r   r4   ¢   s
    zEnvironmentPersistor.getc                 C   s   | j j |¡S r   )r	   r   Z!getCompsEnvironmentItemsByPatternr5   r   r   r   r7   ©   s    z&EnvironmentPersistor.search_by_patternc                 C   s   | j j |¡S r   )r	   r   ZgetCompsGroupEnvironments)r   rU   r   r   r   Úget_group_environments¬   s    z+EnvironmentPersistor.get_group_environmentsc                 C   s¸   | j j |¡}|sdS t|  |¡ƒ}| j ¡ D ]8\}}| ¡ D ]&}| ¡ |krPq>| 	¡ sZq>| 
|¡ q>q.| j ¡ D ]8\}}| ¡ D ]&}| ¡ |kr”q‚| 	¡ sžq‚| |¡ q‚qr|r´dS dS )NFT)r	   rV   r4   rQ   r\   r   rF   Z	getGroupsrH   rR   r*   r   rS   )r   rU   rL   Zgroup_environmentsZenv_idÚenvrV   r   r   r   Úis_removable_group¯   s*    z'EnvironmentPersistor.is_removable_groupN)
r8   r9   r:   rG   r   r3   r4   r7   r\   r^   r   r   r   r   rY   Ž   s   
rY   c                   @   sÎ   e Zd Zd,dd„Zdd„ Zdd„ Zdd	„ Zd-d
d„Zdd„ Zdd„ Z	dd„ Z
d.dd„Zd/dd„Zd0dd„Zd1dd„Zd2dd„Zd3dd„Zd4dd„Zd d!„ Zd"d#„ Zed$d%„ ƒZed&d'„ ƒZd(d)„ Zd*d+„ ZdS )5ÚRPMTransactionNc                 C   s:   || _ || _| js0z| j j ¡  W n   Y n0 i | _d S r   )r	   r!   r   ZinitTransactionÚ_swdb_ti_pkg)r   r	   r!   r   r   r   r   Ë   s    zRPMTransaction.__init__c                    s8   ˆ j rˆ j  ¡ }nˆ jj ¡ }‡ fdd„|D ƒ}t|ƒS )Nc                    s&   g | ]}|  ¡ rtjj ˆ j|¡‘qS r   ©Z
getRPMItemr   r   r	   ZRPMTransactionItemWrapperr=   r   r   r   r@   Ý   rA   z+RPMTransaction.__iter__.<locals>.<listcomp>)r!   rC   r	   r   rD   rE   r   r   r   rG   ×   s
    zRPMTransaction.__iter__c                    s8   ˆ j rˆ j  ¡ }nˆ jj ¡ }‡ fdd„|D ƒ}t|ƒS )Nc                    s&   g | ]}|  ¡ rtjj ˆ j|¡‘qS r   ra   r=   r   r   r   r@   å   rA   z*RPMTransaction.__len__.<locals>.<listcomp>)r!   rC   r	   r   r   rE   r   r   r   r   à   s
    zRPMTransaction.__len__c                 C   sP   | j j ¡ }| |j¡ | |jp$d¡ | |j¡ | 	|j
¡ | |j¡ |S )Nr   )r	   r   ZcreateRPMItemrI   r0   ZsetEpochZepochZ
setVersionÚversionZ
setReleaseÚreleaseZsetArchÚarch)r   rW   Úrpm_itemr   r   r   Ú_pkg_to_swdb_rpm_itemè   s    z$RPMTransaction._pkg_to_swdb_rpm_itemc                 C   sV   |   |¡}|  |¡}|d u r&|  |¡}| jj ||||¡}|rH| |¡ || j|< |S r   )rf   Ú
get_repoidÚ
get_reasonr	   r   r   ÚaddReplacedByr`   )r   rW   r$   rT   Úreplaced_byre   ZrepoidÚresultr   r   r   r3   ñ   s    




zRPMTransaction.newc                 C   s   t |dd ƒ}|r|S |jS )NZ_force_swdb_repoid)ÚgetattrZreponame)r   rW   rk   r   r   r   rg   ü   s    zRPMTransaction.get_repoidc                 C   s   | j j |j|jd¡S )úGet reason for packageéÿÿÿÿ)r	   r   rP   r0   rd   ©r   rW   r   r   r   rh     s    zRPMTransaction.get_reasonc                 C   s   t j |  |¡¡S )rm   )r    r!   ZTransactionItemReasonToStringrh   ro   r   r   r   Úget_reason_name  s    zRPMTransaction.get_reason_namec                 C   s4   |pg }|D ]"}|   |tjj¡}|r| |¡ qd S r   )r3   r    r!   ÚTransactionItemAction_OBSOLETEDri   )r   Ú	obsoletedrj   Zobsr%   r   r   r   Ú_add_obsoleted
  s
    zRPMTransaction._add_obsoletedc                 C   s6   |   |tjj¡}| j |tjj|d}| j||d d S ©N)rj   )r3   r    r!   r-   Ú TransactionItemAction_DOWNGRADEDrs   ©r   r3   Úoldrr   Úti_newÚti_oldr   r   r   Úadd_downgrade  s    zRPMTransaction.add_downgradec                 C   s   |   ||¡ d S r   )Ú
add_remove)r   rw   rT   r   r   r   Ú	add_erase  s    zRPMTransaction.add_erasec                 C   s4   |d u rt jj}|  |t jj|¡}| j||d d S rt   )r    r!   r"   r3   r'   rs   )r   r3   rr   rT   rx   r   r   r   Úadd_install  s    zRPMTransaction.add_installc                 C   s6   |   |tjj¡}| j |tjj|d}| j||d d S rt   )r3   r    r!   ÚTransactionItemAction_REINSTALLÚ!TransactionItemAction_REINSTALLEDrs   rv   r   r   r   Úadd_reinstall  s    zRPMTransaction.add_reinstallc                 C   s"   |p
t jj}|  |t jj|¡}d S r   )r    r!   r"   r3   r)   )r   rw   rT   ry   r   r   r   r{   $  s    zRPMTransaction.add_removec                 C   s6   |   |tjj¡}| j |tjj|d}| j||d d S rt   )r3   r    r!   r+   ÚTransactionItemAction_UPGRADEDrs   rv   r   r   r   Úadd_upgrade(  s    zRPMTransaction.add_upgradec                 C   s^   |j r
dS |jjrdS z.|d rB| ¡ sBt tdƒ |¡¡ W dS W n tyX   Y dS 0 dS )Nr   Zmodularitylabelz\No available modular metadata for modular package '{}', it cannot be installed on the systemé   )	Z_from_cmdlineZrepoZmodule_hotfixesZ_is_in_active_moduler   Zcriticalr   ÚformatÚ
ValueError)r   ÚhdrrW   r   r   r   Ú_test_fail_safe-  s    ÿ
zRPMTransaction._test_fail_safec                 C   sL  d}| D ]&}zâ|j tjjkrL|jj}||  ||j¡7 }| ||d¡ n¤|j tjjkrl| 	|jj
¡ n„|j tjjkr¦|jj}||  ||j¡7 }| ||d¡ nJ|j tjjkrà|jj}||  ||j¡7 }| ||d¡ n|j tjjkrþ| 	|jj
¡ nò|j tjjkr6|jj}||  ||j¡7 }| ||¡ nº|j tjjkrV| 	|jj
¡ nš|j tjjkrv| 	|jj
¡ nz|j tjjkr°|jj}||  ||j¡7 }| ||d¡ n@|j tjjkrÐ| 	|jj
¡ n |j tjjkrântd|j  ƒ‚W q tjy. } z tj td| ƒ¡‚W Y d}~qd}~0 0 q|rHtj tdƒ¡‚|S )z!Populate the RPM transaction set.r   Úur?   z%TransactionItemAction not handled: %szAn rpm exception occurred: %sNz1No available modular metadata for modular package)r$   r    r!   r-   rW   Z_headerr‡   Z
addInstallru   ZaddEraseÚidxr'   ZTransactionItemAction_OBSOLETErq   r~   ZaddReinstallr   r)   r+   r   Z#TransactionItemAction_REASON_CHANGEÚRuntimeErrorÚrpmÚerrorr   Ú
exceptionsÚErrorr   )r   ZtsZmodular_problemsÚtsir†   Úer   r   r   Ú_populate_rpm_ts;  sR    
,zRPMTransaction._populate_rpm_tsc              	   C   sR   t ƒ }| D ]B}|jtjjv r
z| |j¡ W q
 tyJ   td| ƒ‚Y q
0 q
|S ©Nz*TransactionItem is has no RPM attached: %s)	rQ   r$   r   r!   ZFORWARD_ACTIONSrS   rW   ÚKeyErrorrŠ   ©r   rk   r   r   r   r   Úinstall_setm  s    zRPMTransaction.install_setc              	   C   s\   t ƒ }| D ]L}|jtjjtjjg v r
z| |j¡ W q
 t	yT   t
d| ƒ‚Y q
0 q
|S r’   )rQ   r$   r   r!   ZBACKWARD_ACTIONSr    r   rS   rW   r“   rŠ   r”   r   r   r   Ú
remove_sety  s    zRPMTransaction.remove_setc                 C   s,   dd„ | j D ƒ}t|ƒr(tdƒ|d  S dS )zj Ensures all the members can be passed to rpm as they are to perform
            the transaction.
        c                 S   s   g | ]}|j d kr|‘qS )Úsrc)rd   )r>   rW   r   r   r   r@   ‰  rA   z3RPMTransaction._rpm_limitations.<locals>.<listcomp>z+Will not install a source rpm package (%s).r   N)r•   r   r   )r   Zsrc_installsr   r   r   Ú_rpm_limitations…  s    ÿzRPMTransaction._rpm_limitationsc                    s   ‡ fdd„| D ƒS )Nc                    s   g | ]}|j ˆ kr|‘qS r   ©r$   )r>   r   r™   r   r   r@     rA   z-RPMTransaction._get_items.<locals>.<listcomp>r   )r   r$   r   r™   r   Ú
_get_items  s    zRPMTransaction._get_items)N)NN)N)N)N)NN)N)N)N)r8   r9   r:   r   rG   r   rf   r3   rg   rh   rp   rs   rz   r|   r}   r€   r{   r‚   r‡   r‘   Úpropertyr•   r–   r˜   rš   r   r   r   r   r_   Ê   s.   
		







2


r_   )Zlibdnf.transactionr    Zdnf.db.historyr   Zdnf.transactionZdnf.exceptionsZdnf.i18nr   Zdnf.utilr   r‹   Úobjectr   r;   rY   r_   r   r   r   r   Ú<module>   s   3<<