509318396
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
3
ÌÐgaf  ã               @   sÀ   d dl mZ d dl mZ d dl mZ d dlZd dlZd dlmZ d dlZ	d dl
Z
d Zd Zdeef ZG dd„ de	jjƒZG d	d
„ d
e	jjƒZG dd„ deƒZdd„ Zdd„ ZG dd„ deƒZdS )é    )Úabsolute_import)Úprint_function)Úunicode_literalsN)Ú_z%s.%sc                   s   e Zd Z‡ fdd„Z‡  ZS )ÚTransactionErrorc                s   t t| ƒj|ƒ d S )N)Úsuperr   Ú__init__)ÚselfÚmsg)Ú	__class__© ú$/usr/lib/python3.6/transaction_sr.pyr   /   s    zTransactionError.__init__)Ú__name__Ú
__module__Ú__qualname__r   Ú__classcell__r   r   )r   r   r   .   s   r   c                   s   e Zd Z‡ fdd„Z‡  ZS )ÚTransactionReplayErrorc                sv   || _ t|ttfƒr|| _n|g| _|r:tdƒj|d�}ntdƒ}x| jD ]}|dt|ƒ 7 }qJW tt	| ƒj
|ƒ dS )z§
        :param filename: The name of the transaction file being replayed
        :param errors: a list of error classes or a string with an error description
        zWThe following problems occurred while replaying the transaction from file "{filename}":)Úfilenamez<The following problems occurred while running a transaction:z
  N)r   Ú
isinstanceÚlistÚtupleÚerrorsr   ÚformatÚstrr   r   r   )r	   r   r   r
   Úerror)r   r   r   r   4   s    zTransactionReplayError.__init__)r   r   r   r   r   r   r   )r   r   r   3   s   r   c                   s   e Zd Z‡ fdd„Z‡  ZS )Ú#IncompatibleTransactionVersionErrorc                s   t t| ƒj||ƒ d S )N)r   r   r   )r	   r   r
   )r   r   r   r   M   s    z,IncompatibleTransactionVersionError.__init__)r   r   r   r   r   r   r   )r   r   r   L   s   r   c          "   C   s¾   | j dƒ\}}yt|ƒ}W n8 tk
rR } zt|tdƒj|d�ƒ‚W Y d d }~X nX yt|ƒ W n8 tk
r˜ } zt|tdƒj|d�ƒ‚W Y d d }~X nX |tkrºt|tdƒj|td�ƒ‚d S )NÚ.z1Invalid major version "{major}", number expected.)Úmajorz1Invalid minor version "{minor}", number expected.)ÚminorzPIncompatible major version "{major}", supported major version is "{major_supp}".)r   Z
major_supp)ÚsplitÚintÚ
ValueErrorr   r   r   ÚVERSION_MAJORr   )Úversionr   r   r   Úer   r   r   Ú_check_versionQ   s$    $$r%   c             C   s‚  dt i}g }g }g }| dkr |S �x0| jƒ D �]"}|jƒ r`|j|j|jtjj|j	ƒ|j
dœƒ q,|jƒ rØ|jƒ }|j|jƒ g tjj|jƒ ƒdœ}x:|jƒ D ].}|d j|jƒ |jƒ tjj|jƒ ƒdœƒ qšW |j|ƒ q,|jƒ r,|jƒ }	|j|	jƒ g tjj|	jƒ ƒdœ}
x<|	jƒ D ]0}|
d j|jƒ |jƒ tjj|jƒ ƒd	œƒ �qW |j|
ƒ q,W |�rb||d
< |�rp||d< |�r~||d< |S )zÌ
    Serializes a transaction to a data structure that is equivalent to the stored JSON format.
    :param transaction: the transaction to serialize (an instance of dnf.db.history.TransactionWrapper)
    r#   N)ÚactionÚnevraÚreasonÚrepo_id)r&   ÚidÚpackagesÚpackage_typesr+   )ÚnameÚ	installedÚpackage_type)r&   r*   Úgroupsr,   r0   )r*   r.   Ú
group_typeÚrpmsÚenvironments)ÚVERSIONr+   Ú
is_packageÚappendZaction_namer'   ÚlibdnfÚtransactionZTransactionItemReasonToStringr(   Z	from_repoZis_groupZ	get_groupZ
getGroupIdZcompsPackageTypeToStringZgetPackageTypesZgetPackagesZgetNameZgetInstalledZgetPackageTypeZis_environmentZget_environmentZgetEnvironmentIdZ	getGroupsZgetGroupType)r8   Údatar2   r0   r3   ÚtsiÚgroupÚ
group_dataÚpkgÚenvÚenv_dataÚgrpr   r   r   Úserialize_transactionl   sX    rA   c               @   sº   e Zd ZdZd/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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 )0ÚTransactionReplaya†  
    A class that encapsulates replaying a transaction. The transaction data are
    loaded and stored when the class is initialized. The transaction is run by
    calling the `run()` method, after the transaction is created (but before it is
    performed), the `post_transaction()` method needs to be called to verify no
    extra packages were pulled in and also to fix the reasons.
    Ú NFc             C   sv   || _ || _|| _|| _|| _| j jjs.d| _tƒ | _i | _	g | _
|rX|rXttdƒƒ‚n|rh| j|ƒ n
| j|ƒ dS )a  
        :param base: the dnf base
        :param filename: the filename to load the transaction from (conflicts with the 'data' argument)
        :param data: the dictionary to load the transaction from (conflicts with the 'filename' argument)
        :param ignore_extras: whether to ignore extra package pulled into the transaction
        :param ignore_installed: whether to ignore installed versions of packages
        :param skip_unavailable: whether to skip transaction packages that aren't available
        TzKConflicting TransactionReplay arguments have been specified: filename, dataN)Ú_baseÚ	_filenameÚ_ignore_installedÚ_ignore_extrasÚ_skip_unavailableÚconfÚstrictÚsetÚ_nevra_cacheÚ_nevra_reason_cacheÚ	_warningsr!   r   Ú_load_from_fileÚ_load_from_data)r	   Úbaser   r9   Zignore_extrasZignore_installedZskip_unavailabler   r   r   r   À   s    
zTransactionReplay.__init__c          %   C   s¤   || _ t|dƒ�N}ytj|ƒ}W n8 tjjk
rX } zt|t|ƒd ƒ‚W Y d d }~X nX W d Q R X y| j|ƒ W n, t	k
rž } zt||ƒ‚W Y d d }~X nX d S )NÚrr   )
rE   ÚopenÚjsonÚloadÚdecoderZJSONDecodeErrorr   r   rP   r   )r	   ÚfnÚfÚreplay_datar$   r   r   r   rO   ç   s    .z!TransactionReplay._load_from_filec             C   s|   || _ | j| j ƒ | j jdg ƒ| _| j| jtddƒ | j jdg ƒ| _| j| jtddƒ | j jdg ƒ| _| j| jtddƒ d S )Nr2   Zarrayr0   r3   )Ú_replay_dataÚ_verify_toplevel_jsonÚgetÚ_rpmsÚ_assert_typer   Ú_groupsÚ_environments)r	   r9   r   r   r   rP   ô   s    z!TransactionReplay._load_from_datac             C   s   |r| j j|ƒ nt|ƒ‚d S )N)rN   r6   r   )r	   Z	warn_onlyr
   r   r   r   Ú_raise_or_warn  s    z TransactionReplay._raise_or_warnc             C   s$   t ||ƒs ttdƒj||d�ƒ‚d S )Nz*Unexpected type of "{id}", {exp} expected.)r*   Zexp)r   r   r   r   )r	   ÚvalueÚtr*   Zexpectedr   r   r   r^     s    
zTransactionReplay._assert_typec             C   sJ   | j }d|kr$t|tdjdd�ƒƒ‚| j|d tddƒ t|d |ƒ d S )Nr#   zMissing key "{key}".)ÚkeyÚstring)rE   r   r   r   r^   r   r%   )r	   rY   rW   r   r   r   r[     s
    z'TransactionReplay._verify_toplevel_jsonc             C   sD  y,|d }|d }|d }t jj|d ƒ}W nv tk
rh } z ttdƒj|jd d�ƒ‚W Y d d }~X n< tk
r¢ } z ttdƒj|d |d	�ƒ‚W Y d d }~X nX t	j
|ƒ}|jt	jgd
�}t|ƒdkrÞttdƒj|d�ƒ‚|d }	d|	j|	jf }
| jjjƒ j|	j|	jd�}|	jd k	�r"|	jnd}|j||	j|	jd�}|�r`|j|d�}|�r`|j|jƒ ƒ}|�s„| j| jtdƒj|d�ƒ d S |dk�rš| jj|ƒ |d(k�r®|| j|< |d)k�r.|dk�rø|jƒ �rø| jj|ƒ �rø| j| jtdƒj|
|d�ƒ t j!j"| jjƒj#|d�}| jj$j%|| jj&j' d� �n|dk�rš|j(ƒ }|�sf| j| jtdƒj||d�ƒ d S t j!j"| jjƒj#|d�}| jj$j%|| jj&j' d� n¦|d*k�r
|jƒ }|�sÒ| j| jtd#ƒj||d�ƒ d S | j �sæ|dk�r@xX|D ]}| jj$j)|d$d%� �qìW n6|dk�r*| jj*j+|d |ƒ nttd&ƒj||d'�ƒ‚d S )+Nr&   r'   r)   r(   z%Missing object key "{key}" in an rpm.r   )rd   zFUnexpected value of package reason "{reason}" for rpm nevra "{nevra}".)r(   r'   )Zformsé   z)Cannot parse NEVRA for package "{nevra}".)r'   z%s.%s)r-   Úarch)Úepochr#   Úrelease)Zreponamez Cannot find rpm nevra "{nevra}".zReason ChangeÚInstallÚUpgradeÚ	DowngradeÚ	ReinstallÚRemovedz:Package "{na}" is already installed for action "{action}".)Únar&   )r=   )ZselectZoptionalzLPackage nevra "{nevra}" not available in repositories for action "{action}".)r'   r&   ÚUpgradedÚ
DowngradedÚReinstalledÚ	Obsoletedz<Package nevra "{nevra}" not installed for action "{action}".F)Z
clean_depszFUnexpected value of package action "{action}" for rpm nevra "{nevra}".)r&   r'   )rj   rk   rl   rm   rn   )rj   rk   rl   )rp   rq   rr   rn   rs   ),r7   r8   ZStringToTransactionItemReasonÚKeyErrorr   r   r   ÚargsÚ
IndexErrorÚhawkeyZSubjectZget_nevra_possibilitiesZ
FORM_NEVRAÚlenr-   rg   rD   ZsackÚqueryÚfilterrh   r#   ri   Úunionr.   ra   rH   rL   ÚaddrM   Z_get_installonly_queryrF   ÚdnfZselectorZSelectorrK   ZgoalÚinstallrI   rJ   Z	availableZeraseÚhistoryZ
set_reason)r	   Úpkg_datar&   r'   r)   r(   r$   ZsubjZparsed_nevrasZparsed_nevraro   Zquery_narh   ry   Z
query_repoZsltrr=   r   r   r   Ú_replay_pkg_action  sz    ("





$



z$TransactionReplay._replay_pkg_actionc             C   s2  | j jj|ƒ}|s,| j| jtdƒ| ƒ d S | j jjj||j	|j
|ƒ}y¨x¢|D ]š}|d }| j|tddƒ |d }| j|tddƒ |d }	| j|	td	dƒ y|j||tjj|	ƒƒ W qN tjjk
ræ }
 ztt|
ƒƒ‚W Y d d }
~
X qNX qNW W n> tk
�r, }
 z ttd
ƒj|
jd d�ƒ‚W Y d d }
~
X nX |S )NzGroup id '%s' is not available.r-   zgroups.packages.namere   r.   zgroups.packages.installedÚbooleanr/   zgroups.packages.package_typez.Missing object key "{key}" in groups.packages.r   )rd   )rD   ÚcompsZ_group_by_idra   rH   r   r   r;   Únewr-   Úui_namer^   r   ÚboolZ
addPackager7   r8   ÚstringToCompsPackageTyper   ÚErrorr   rt   r   ru   )r	   Úgroup_idÚ	pkg_typesÚpkgsZcomps_groupÚ
swdb_groupr=   r-   r.   r/   r$   r   r   r   Ú_create_swdb_groupv  s*    
&*z$TransactionReplay._create_swdb_groupc             C   s*   | j |||ƒ}|d k	r&| jjjj|ƒ d S )N)r�   rD   r   r;   r~   )r	   r‰   rŠ   r‹   rŒ   r   r   r   Ú_swdb_group_install“  s    z%TransactionReplay._swdb_group_installc             C   sT   | j jjj|ƒs*| j| jtdƒ| ƒ d S | j|||ƒ}|d k	rP| j jjj|ƒ d S )NzGroup id '%s' is not installed.)	rD   r   r;   r\   ra   rF   r   r�   Úupgrade)r	   r‰   rŠ   r‹   rŒ   r   r   r   Ú_swdb_group_upgrade™  s    z%TransactionReplay._swdb_group_upgradec             C   sT   | j jjj|ƒs*| j| jtdƒ| ƒ d S | j|||ƒ}|d k	rP| j jjj|ƒ d S )NzGroup id '%s' is not installed.)	rD   r   r;   r\   ra   rF   r   r�   Ú	downgrade)r	   r‰   rŠ   r‹   rŒ   r   r   r   Ú_swdb_group_downgrade£  s    z'TransactionReplay._swdb_group_downgradec             C   sT   | j jjj|ƒs*| j| jtdƒ| ƒ d S | j|||ƒ}|d k	rP| j jjj|ƒ d S )NzGroup id '%s' is not installed.)	rD   r   r;   r\   ra   rF   r   r�   Úremove)r	   r‰   rŠ   r‹   rŒ   r   r   r   Ú_swdb_group_remove­  s    z$TransactionReplay._swdb_group_removec             C   sd  | j jj|ƒ}|s,| j| jtdƒ| ƒ d S | j jjj||j	|j
|ƒ}yÚxÔ|D ]Ì}|d }| j|tddƒ |d }| j|tddƒ |d }	| j|	td	dƒ ytjj|	ƒ}	W n2 tjjk
rÜ }
 ztt|
ƒƒ‚W Y d d }
~
X nX |	tjjtjjfk�rttd
ƒj|d d�ƒ‚|j|||	ƒ qNW W n> tk
�r^ }
 z ttdƒj|
jd d�ƒ‚W Y d d }
~
X nX |S )Nz%Environment id '%s' is not available.r*   zenvironments.groups.idre   r.   zenvironments.groups.installedr‚   r1   zenvironments.groups.group_typezlInvalid value "{group_type}" of environments.groups.group_type, only "mandatory" or "optional" is supported.)r1   z2Missing object key "{key}" in environments.groups.r   )rd   )rD   rƒ   Z_environment_by_idra   rH   r   r   r>   r„   r-   r…   r^   r   r†   r7   r8   r‡   r   rˆ   r   ZCompsPackageType_MANDATORYZCompsPackageType_OPTIONALr   ZaddGrouprt   ru   )r	   Úenv_idrŠ   r0   Z	comps_envÚswdb_envr@   r*   r.   r1   r$   r   r   r   Ú_create_swdb_environment·  s8    
*z*TransactionReplay._create_swdb_environmentc             C   s*   | j |||ƒ}|d k	r&| jjjj|ƒ d S )N)r—   rD   r   r>   r~   )r	   r•   rŠ   r0   r–   r   r   r   Ú_swdb_environment_installß  s    z+TransactionReplay._swdb_environment_installc             C   sT   | j jjj|ƒs*| j| jtdƒ| ƒ d S | j|||ƒ}|d k	rP| j jjj|ƒ d S )Nz%Environment id '%s' is not installed.)	rD   r   r>   r\   ra   rF   r   r—   r�   )r	   r•   rŠ   r0   r–   r   r   r   Ú_swdb_environment_upgradeå  s    z+TransactionReplay._swdb_environment_upgradec             C   sT   | j jjj|ƒs*| j| jtdƒ| ƒ d S | j|||ƒ}|d k	rP| j jjj|ƒ d S )Nz%Environment id '%s' is not installed.)	rD   r   r>   r\   ra   rF   r   r—   r‘   )r	   r•   rŠ   r0   r–   r   r   r   Ú_swdb_environment_downgradeï  s    z-TransactionReplay._swdb_environment_downgradec             C   sT   | j jjj|ƒs*| j| jtdƒ| ƒ d S | j|||ƒ}|d k	rP| j jjj|ƒ d S )Nz%Environment id '%s' is not installed.)	rD   r   r>   r\   ra   rF   r   r—   r“   )r	   r•   rŠ   r0   r–   r   r   r   Ú_swdb_environment_removeù  s    z*TransactionReplay._swdb_environment_removec             C   s   | j S )z>
        :returns: the loaded data of the transaction
        )rZ   )r	   r   r   r   Úget_data  s    zTransactionReplay.get_datac             C   s   | j S )zW
        :returns: an array of warnings gathered during the transaction replay
        )rN   )r	   r   r   r   Úget_warnings
  s    zTransactionReplay.get_warningsc             C   s–  | j }g }xJ| jD ]@}y| j|ƒ W q tk
rP } z|j|ƒ W Y dd}~X qX qW �xŽ| jD �]‚}�y
|d }|d }ytjj|d ƒ}W n: tj	j
k
rÈ } z|jtt|ƒƒƒ w`W Y dd}~X nX |dkræ| j|||d ƒ nŠ|dk�r| j|||d ƒ nl|dk�s|d	k�r,| j|||d ƒ nD|d
k�s@|dk�rT| j|||d ƒ n|jttdƒj||d�ƒƒ W q` tk
�r¶ } z&|jttdƒj|jd d�ƒƒ W Y dd}~X q` tk
�râ } z|j|ƒ W Y dd}~X q`X q`W �x–| jD �]Š}	�y|	d }|	d }
ytjj|	d ƒ}W n> tj	j
k
�r^ } z|jtt|ƒƒƒ �wòW Y dd}~X nX |dk�r~| j|
||	d ƒ nŠ|dk�rœ| j|
||	d ƒ nl|dk�s°|d	k�rÄ| j|
||	d ƒ nD|d
k�sØ|dk�rì| j|
||	d ƒ n|jttdƒj||
d�ƒƒ W np tk
�rN } z&|jttdƒj|jd d�ƒƒ W Y dd}~X n. tk
�rz } z|j|ƒ W Y dd}~X nX �qòW |�r’t||ƒ‚dS )z*
        Replays the transaction.
        Nr&   r*   r,   rj   r+   rn   rk   rp   rl   rq   z@Unexpected value of group action "{action}" for group "{group}".)r&   r;   z&Missing object key "{key}" in a group.r   )rd   r0   zJUnexpected value of environment action "{action}" for environment "{env}".)r&   r>   z-Missing object key "{key}" in an environment.)rE   r]   r�   r   r6   r_   r7   r8   r‡   r   rˆ   r   rŽ   r”   r�   r’   r   r   rt   ru   r`   r˜   r›   r™   rš   r   )r	   rW   r   r€   r$   r<   r&   r‰   rŠ   r?   r•   r   r   r   Úrun  sv     
* 

*"zTransactionReplay.runc             C   s8  | j jsdS g }�x| j jD �] }y
|j}W n$ tk
rP } zwW Y dd}~X nX t|ƒ}|| jkrº| j sˆ|jtjj	tjj
tjjfkrºtdƒj|d�}| js®|jt|ƒƒ n| jj|ƒ y>| j| }|jtjjtjjfksðtjj||jƒdkrö||_W q tk
�r } zW Y dd}~X qX qW |�r4t| j|ƒ‚dS )zÿ
        Sets reasons in the transaction history to values from the stored transaction.

        Also serves to check whether additional packages were pulled in by the
        transaction, which results in an error (unless ignore_extras is True).
        NzgPackage nevra "{nevra}", which is not present in the transaction file, was pulled into the transaction.)r'   r   )rD   r8   r=   rt   r   rL   rF   r&   r7   ZTransactionItemAction_UPGRADEDZ TransactionItemAction_DOWNGRADEDZ!TransactionItemAction_REINSTALLEDr   r   rG   r6   r   rN   rM   ZTransactionItemAction_INSTALLZTransactionItemAction_REMOVEZTransactionItemReasonComparer(   r   rE   )r	   r   r:   r=   r$   r'   r
   Zreplay_reasonr   r   r   Úpost_transactiond  s<    



z"TransactionReplay.post_transaction)rC   NFFF)r   r   r   Ú__doc__r   rO   rP   ra   r^   r[   r�   r�   rŽ   r�   r’   r”   r—   r˜   r™   rš   r›   rœ   r�   rž   rŸ   r   r   r   r   rB   ·   s4       
 
a


(


SrB   )Z
__future__r   r   r   r7   rw   Zdnf.i18nr   Zdnf.exceptionsr}   rT   r"   ZVERSION_MINORr4   Ú
exceptionsrˆ   r   r   r   r%   rA   ÚobjectrB   r   r   r   r   Ú<module>   s    K