a
    ©!cæÍ ã                   @   s\  d Z ddlmZ 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Z	ddl
mZ ddlmZ dd	lmZmZmZ dd
lmZ ddlmZ ddlmZ zddlmZ W n eyÊ   ddlmZ Y n0 ddlZddlZddlZddlZddlZddl Zddl!Zddl"Zddl#Zddl$Zddl%Zddl&Zddl'Zzddl(ZdZ)W n ey\   dZ)Y n0 ddl*Zddl+Zddl,Zddl-Zddl.Zddl/Zddl0Zddl1Zddl2Zddl3Zddl4Zddl5ZddlZddl6Zddl7Z7ddl8Z8ddl9Z9ddl:Z:ddl;Z;ddl<Z<ddl=Z=ddl>Z>ddl?Z?ddl@Z@ddlAZAddlBZBddlCZCe; Dd¡ZEG dd„ deFƒZGdd„ ZHdS )z
Supplies the Base class.
é    )Úabsolute_import)Údivision)Úprint_function)Úunicode_literalsN)Údeepcopy)Ú
CompsQuery)Ú_ÚP_Úucd)Ú_parse_specs)ÚSwdbInterface)Úmisc)ÚSequenceTFÚdnfc                   @   s„  e Zd Zdçdd„Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Ze	dd„ ƒZ
dd„ Zdèdd„Zdd„ Zedd„ ƒZedd„ ƒZedd„ ƒZejdd„ ƒZeej d¡dd „ ƒƒZed!d"„ ƒZed#d$„ ƒZed%d&„ ƒZejd'd&„ ƒZd(d)„ Zdéd+d,„Zd-d.„ Zd/d0„ Zd1d2„ Zdêd3d4„Z dëd6d7„Z!dìd8d9„Z"d:d;„ Z#d<d=„ Z$díd>d?„Z%dîd@dA„Z&dBdC„ Z'e(j)e(j*e(j+e(j,e(j-e(j.e(j/dDœZ0e1e(dEƒrˆe(j2e0dF< dGe(j3e(j4B iZ5edHdI„ ƒZ6edJdK„ ƒZ7e7jdLdK„ ƒZ7dïdMdN„Z8dOdP„ Z9edQdR„ dSdR„ dTdR„ dUdVZ:dWdX„ Z;dYdZ„ Z<d[d\„ Z=d]d^„ Z>d_d`„ Z?dadb„ Z@dðdcdd„ZAdñdedf„ZBdgdh„ ZCdidj„ ZDdkdl„ ZEdòdmdn„ZFdódodp„ZGdôdqdr„ZHdõdsdt„ZIdudv„ ZJdwdx„ ZKdydz„ ZLdöd|d}„ZMd÷d~d„ZNd€d„ ZOd‚dƒ„ ZPd„d…„ ZQd†d‡„ ZRdødˆd‰„ZSdŠd‹„ ZTdùdŒd„ZUdúdŽd„ZVdd‘„ ZWd’d“„ ZXd”d•„ ZYd–d—„ ZZd˜d™„ Z[dšd›„ Z\dûdœd„Z]dždŸ„ Z^d d¡„ Z_d¢d£„ Z`düd¤d¥„Zadýd¦d§„Zbdþd¨d©„Zcdÿdªd«„Zdd d¬d­„Zed®d¯„ Zfd°d±„ Zgd²d³„ Zhdd´dµ„Zidd¶d·„Zjdd¸d¹„Zkddºd»„Zldd¼d½„Zmdd¾d¿„ZnddÀdÁ„ZodÂdÃ„ ZpddÄdÅ„ZqdÆdÇ„ Zrd	dÈdÉ„ZsdÊdË„ Ztd
dÌdÍ„ZuddÎdÏ„ZvddÐdÑ„ZwdÒdÓ„ ZxddÕdÖ„Zydd×dØ„ZzdÙdÚ„ Z{dÛdÜ„ Z|dÝdÞ„ Z}dßdà„ Z~dádâ„ Zdãdä„ Z€dådæ„ ZdS (  ÚBaseNc                 C   sÎ   d| _ |p|  ¡ | _d | _d | _d | _d | _d | _d | _t	j
 ¡ | _d | _tƒ | _tƒ | _t	j ¡ | _t	j ¡ | _t	j ¡ | _ttjgƒ| _t	j ¡ | _d| _ d| _!d | _"g | _#i | _$d| _%tƒ | _&d | _'d S )NF)(Ú_closedÚ_setup_default_confÚ_confÚ_goalÚ_repo_persistorÚ_sackÚ_transactionÚ_priv_tsÚ_compsr   ÚcompsÚTransactionBunchÚ_comps_transÚ_historyÚsetÚ
_tempfilesÚ_trans_tempfilesÚcallbackZDepsolveÚ_ds_callbackÚloggingZLoggingÚ_loggingÚrepodictÚRepoDictÚ_reposÚrpmZRPMPROB_FILTER_OLDPACKAGEÚ_rpm_probfilterZpluginZPluginsÚ_pluginsÚ_trans_successÚ_trans_install_setÚ_tempfile_persistorÚ_update_security_filtersÚ_update_security_optionsÚ_allow_erasingÚ_repo_set_imported_gpg_keysÚoutput)ÚselfÚconf© r5   ú,/usr/lib/python3.9/site-packages/dnf/base.pyÚ__init__^   s2    zBase.__init__c                 C   s   | S ©Nr5   ©r3   r5   r5   r6   Ú	__enter__{   s    zBase.__enter__c                 G   s   |   ¡  d S r8   ©Úclose)r3   Zexc_argsr5   r5   r6   Ú__exit__~   s    zBase.__exit__c                 C   s   |   ¡  d S r8   r;   r9   r5   r5   r6   Ú__del__   s    zBase.__del__c                 C   s.   | j r| j |¡ n| jjrn| j |¡ d S r8   )r   r    Úupdater4   Údestdirr   )r3   Úfilesr5   r5   r6   Ú_add_tempfiles„   s
    zBase._add_tempfilesc              
   C   s    |  ¡  td|jdd}|jr&d|d< z| jj|jfddi|¤Ž W nV tjyš } z<t	 
tdƒ |j|¡¡ tj tdƒ |j¡¡‚W Y d }~n
d }~0 0 d S )NT©Zload_filelistsZload_prestoZload_updateinfoÚ
load_otherÚbuild_cacheúloading repo '{}' failure: {}z"Loading repository '{}' has failed)ÚloadÚdictÚdeltarpmÚload_metadata_otherr   Ú	load_repoÚ_repoÚhawkeyÚ	ExceptionÚloggerÚdebugr   ÚformatÚidr   Ú
exceptionsÚ	RepoError)r3   ÚrepoÚmdload_flagsÚer5   r5   r6   Ú_add_repo_to_sackŒ   s    þÿzBase._add_repo_to_sackc                  C   s.   t j ¡ } | j}d|vr*t j | j¡|d< | S )NÚ
releasever)r   r4   ZConfÚsubstitutionsr(   Zdetect_releaseverÚinstallroot)r4   Úsubstr5   r5   r6   r   š   s    
ÿzBase._setup_default_confc              
   C   sœ   dd„ | j  ¡ D ƒ}z0| jj| j|| jj| jjd| jj| jj	d}W n6 t
jyz } ztj t|ƒ¡‚W Y d }~n
d }~0 0 |r˜t tjj |d ¡¡ d S )Nc                 S   s   g | ]}|j r|j‘qS r5   )Zmodule_hotfixesrR   ©Ú.0Úir5   r5   r6   Ú
<listcomp>¤   ó    z0Base._setup_modular_excludes.<locals>.<listcomp>F)Zupdate_onlyZdebugsolverÚmodule_obsoletesr   )ÚreposÚiter_enabledÚsackZfilter_modulesÚ_moduleContainerr4   r[   Zmodule_platform_idÚdebug_solverrb   rM   rN   r   rS   ÚErrorr
   rO   ÚwarningÚmoduleÚmodule_baseZformat_modular_solver_errors)r3   Zhot_fix_reposZsolver_errorsrW   r5   r5   r6   Ú_setup_modular_excludes£   s    ý
&ÿzBase._setup_modular_excludesFc              
   C   sŠ  t | jjƒ}d|v r$tr$|  ¡  d S g }g }|s0| j ¡ D ]ò}|j|v rLq<t|j	ƒdkrÄ| j
 ¡ jdd}t |j	ƒD ]*}tj |¡}| |j| j
dddd¡}qv|j|jd | | ¡ |jf¡ | j
 ¡ jdd}	t |jƒD ]*}
tj |
¡}|	 |j| j
dddd¡}	qà|	j|jd |	r<| |	|jf¡ q<d|vr | j
 ¡ jdd}t| jj	ƒdkr˜t | jj	ƒD ],}tj |¡}| |j| j
dddd¡}qj| j
 ¡ jdd}t | jjƒD ],}
tj |
¡}| |j| j
dddd¡}q¶t| jj	ƒdkr| j
 |¡ | j
 d¡ |r | j
 |¡ |rP|D ]$\}}| j
 |¡ | j
 d|¡ q*|rr|D ]\}}| j
 |¡ qZ|s†tr†|  ¡  d S )	NÚallr   T©ÚemptyF©Z
with_nevraÚwith_providesZwith_filenames©ÚreponameÚmain)r   r4   Zdisable_excludesÚWITH_MODULESrl   rc   rd   rR   ÚlenZincludepkgsre   ÚqueryÚfiltermr   ÚsubjectÚSubjectÚunionÚget_best_queryÚappendÚapplyZexcludepkgsZadd_includesZset_use_includesÚadd_excludes)r3   Ú	only_mainZdisabledZrepo_includesZrepo_excludesÚrZ
incl_queryZinclÚsubjZ
excl_queryZexclZinclude_queryÚexclude_queryrw   Úrepoidr5   r5   r6   Ú_setup_excludes_includes°   sp    

ÿ

ÿ


ÿ
ÿzBase._setup_excludes_includesc                 C   sN   | j r:| jjs:dd„ | j ¡ D ƒ}| j j |¡ | j  ¡  | jrJ| j ¡  d S )Nc                 S   s"   g | ]}|j r|j ¡ r|j‘qS r5   )ÚmetadatarL   Z	isExpiredrR   )r^   r   r5   r5   r6   r`   ï   s   ÿz/Base._store_persistent_data.<locals>.<listcomp>)	r   r4   Ú	cacheonlyrc   rd   Zexpired_to_addr?   Úsaver-   )r3   Zexpiredr5   r5   r6   Ú_store_persistent_dataí   s    
zBase._store_persistent_datac                 C   s   | j d u r| jdd | j S )NT)Úarch_filter)r   Ú
read_compsr9   r5   r5   r6   r   ÷   s    
z
Base.compsc                 C   s   | j S r8   )r   r9   r5   r5   r6   r4   þ   s    z	Base.confc                 C   s   | j S r8   ©r'   r9   r5   r5   r6   rc     s    z
Base.reposc                 C   s
   d | _ d S r8   rŒ   r9   r5   r5   r6   rc     s    Z_priv_rpmconnc                 C   s   t jj | jj¡S r8   )r   r(   Z
connectionZRpmConnectionr4   r[   r9   r5   r5   r6   Ú_rpmconn  s    zBase._rpmconnc                 C   s   | j S r8   )r   r9   r5   r5   r6   re     s    z	Base.sackc                 C   sP   | j d u rtj d¡‚| j jd u rHtj d| jj	| jj
d | jj¡| j _| j jS )NzSack was not initializedFÚarch)re   r   rS   rh   rf   Úlibdnfrj   ZModulePackageContainerr4   r[   rZ   Ú
persistdirr9   r5   r5   r6   rf     s    
ÿzBase._moduleContainerc                 C   s   | j S r8   )r   r9   r5   r5   r6   Útransaction   s    zBase.transactionc                 C   s   | j rtdƒ‚|| _ d S )Nztransaction already set)r   Ú
ValueError©r3   Úvaluer5   r5   r6   r‘   %  s    c                 C   s   t j | jj¡| _d S r8   )r   Ú	persistorZRepoPersistorr4   Úcachedirr   r9   r5   r5   r6   Ú_activate_persistor,  s    zBase._activate_persistorr5   c                 C   s,   | j jr| j | j ||¡ | j | |¡ dS )z&Load plugins and run their __init__().N)r4   Zpluginsr*   Ú_loadZ	_run_init)r3   Zdisabled_globZenable_pluginsÚclir5   r5   r6   Úinit_plugins/  s    zBase.init_pluginsc                 C   s   | j  ¡  dS )z#Run plugins pre_configure() method.N)r*   Z_run_pre_configr9   r5   r5   r6   Úpre_configure_plugins6  s    zBase.pre_configure_pluginsc                 C   s   | j  ¡  dS )zRun plugins configure() method.N)r*   Z_run_configr9   r5   r5   r6   Úconfigure_plugins;  s    zBase.configure_pluginsc                 C   s   | j  ¡  dS )zRun plugins unload() method.N)r*   Z_unloadr9   r5   r5   r6   Úunload_plugins@  s    zBase.unload_pluginsc           
      C   sÖ  | j j}| jd u r|  ¡  | j}|rÌtj ¡ rDtdƒ}t 	|¡ dS tj 
¡ du rhtdƒ}t 	|¡ dS |dkr†tdƒ}t 	|¡ dS | ¡ }|d ur°||k r°t 	tdƒ¡ dS | j ¡ D ]}|j d¡ qº| j ¡ søt 	tdƒ d	 | j j¡¡¡ dS | j ¡ D ]¦}| ¡ \}}	|	d u r0t 	td
ƒ|j¡ nv|r@|	dkr^t tdƒ|j¡ |j ¡  nH|r’|	|k r’tdƒ}t ||j|	¡ |j ¡  nt tdƒ|j|	¡ q|r¶d|_| jddd t 	tdƒ¡ dS )NzCMetadata timer caching disabled when running on metered connection.Fz:Metadata timer caching disabled when running on a battery.r   z Metadata timer caching disabled.z"Metadata cache refreshed recently.é   z*There are no enabled repositories in "{}".z", "z4%s: will never be expired and will not be refreshed.z&%s: has expired and will be refreshed.zC%s: metadata will expire after %d seconds and will be refreshed nowz!%s: will expire after %d seconds.T)Úload_system_repoÚload_available_reposzMetadata cache created.)r4   Zmetadata_timer_syncr   r—   r   ÚutilZon_metered_connectionr   rO   ÚinfoZon_ac_powerÚsince_last_makecacherc   ÚvaluesrL   ZsetMaxMirrorTriesÚ_any_enabledrQ   ÚjoinZreposdirrd   Z_metadata_expire_inrR   rP   ÚexpireZreset_last_makecacheÚ	fill_sack)
r3   ÚtimerZperiodr•   Úmsgr£   rU   r   Zis_cacheZ
expires_inr5   r5   r6   Úupdate_cacheE  s^    





ÿ
ÿzBase.update_cacheTc                 C   sb  t j d¡}| jddd t j | ¡| _t j | j	j
| j	j¡}|¸ |dur~z| jjdd W n ty|   |dkrx‚ Y n0 |ràg }d}t ¡ }| j	jr¨t jj ¡  | j ¡ D ]È}z`|  |¡ |j ¡ |krÚ|j ¡ }|j ¡ |k rò|j ¡ }t tdƒ|jt j |j ¡ ¡¡ W q² t j j!yx }	 zD|j "¡  |j#du rD‚ t $d	|	¡ | %|j¡ | &¡  W Y d
}	~	q²d
}	~	0 0 q²|r˜t $tdƒd '|¡¡ | j (¡ rî|dkrî|dkrît )tdƒt*j+t,|ƒdt j |¡¡ n| j -¡  &¡  W d
  ƒ n1 s0    Y  | j	}
| j .|
j/|
j0|
j1¡ |  2¡  |ƒ  t j3 4| j¡| _5|
j6| j5_6| j7 8¡  | jS )z'Prepare the Sack and the Goal objects. ú
sack setupT©re   ÚgoalF©rE   Úautor   ú%s: using metadata from %s.z	Error: %sNúIgnoring repositories: %sú, z-Last metadata expiration check: %s ago on %s.)Zseconds)9r   r#   ÚTimerÚresetre   Ú_build_sackr   ÚlockÚbuild_metadata_lockr4   r–   Úexit_on_lockrŸ   ÚIOErrorÚtimeÚgpgkey_dns_verificationÚdnssecÚRpmImportedKeysÚcheck_imported_keys_validityrc   rd   rX   rL   ZgetTimestampZgetAgerO   rP   r   rR   r¡   Únormalize_timeÚgetMaxTimestamprS   rT   r§   Úskip_if_unavailableri   r}   Údisabler¦   r¥   r¢   ÚdatetimeZ	timedeltaÚintrm   Ú
_configureÚinstallonlypkgsÚinstallonly_limitÚallow_vendor_changer…   r®   ÚGoalr   Úprotect_running_kernelr*   Úrun_sack)r3   rŸ   r    r©   r·   Úerror_reposZmtsZager   rW   r4   r5   r5   r6   r¨   }  sn    


ÿÿ
 ÿ

þ.

zBase.fill_sackc           	      C   s"  t j d¡}| jddd t j | ¡| _t j | j	j
| j	j¡}|x |dur~z| jjdd W n ty|   |dkrx‚ Y n0 g }| j	jr–t jj ¡  | j ¡ D ]ð}zj|jjddd td|jdd}|jrÔd|d	< | jj|jfi |¤Ž t td
ƒ|jt j |j  ¡ ¡¡ W q  t!t"j#fyŽ } z`|j$du rNt j% &tdƒ '|j|¡¡‚nt tdƒ '|j|¡¡ | (|j¡ | )¡  W Y d}~q d}~0 0 q |r®t *tdƒd +|¡¡ W d  ƒ n1 sÄ0    Y  | j	}| j ,|j-|j.|j/¡ |  0¡  |ƒ  t j1 2| j¡| _3|j4| j3_4| j5 6¡  | jS )a¥  
        Prepare Sack and Goal objects and also load all enabled repositories from cache only,
        it doesn't download anything and it doesn't check if metadata are expired.
        If there is not enough metadata present (repond.xml or both primary.xml and solv file
        are missing) given repo is either skipped or it throws a RepoError exception depending
        on skip_if_unavailable configuration.
        r¬   Tr­   Fr¯   r°   )ZthrowExceptZignoreMissingrC   rD   r±   rF   Nr²   r³   )7r   r#   r´   rµ   re   r¶   r   r·   r¸   r4   r–   r¹   rŸ   rº   r¼   r½   r¾   r¿   rc   rd   rL   Z	loadCacherH   rI   rJ   rK   rO   rP   r   rR   r¡   rÀ   rÁ   ÚRuntimeErrorrM   rN   rÂ   rS   rT   rQ   r}   rÃ   ri   r¦   rÆ   rÇ   rÈ   rÉ   r…   r®   rÊ   r   rË   r*   rÌ   )	r3   rŸ   r©   r·   rÍ   rU   rV   rW   r4   r5   r5   r6   Úfill_sack_from_repos_in_cache¸  sb    	þÿÿÿ ÿ$

z"Base.fill_sack_from_repos_in_cachec                 C   sÌ   t j | jj¡| _| jjsl|  | j¡ | j	r\| j
 | j ¡ ¡ | j ¡  | jrl|  | j
¡ n| jj | j
¡ | jjržt tdƒ¡ t tdƒdjt jjd¡ | jd ur²| j ¡  |  ¡  |  ¡  d| _	d S )NzRThe downloaded packages were saved in cache until the next successful transaction.z1You can remove cached packages by executing '%s'.z{prog} clean packages©ÚprogF)r   r•   ZTempfilePersistorr4   r–   r-   Z	keepcacheÚ_clean_packagesr   r+   r    r?   Zget_saved_tempfilesro   r,   Ztempfiles_to_addrO   r¢   r   rQ   r¡   Z	MAIN_PROGr   Úhistoryr<   r‰   Ú_closeRpmDBr9   r5   r5   r6   Ú_finalize_baseö  s2    ÿÿ
ÿ
ÿ

zBase._finalize_basec                 C   sB   | j r
dS t tjjd¡ d| _ |  ¡  | jdddd d| _dS )ztClose all potential handles and clean cache.

        Typically the handles are to data sources and sinks.

        NzCleaning up.T)re   rc   r®   )	r   rO   Úlogr   r#   ÚDDEBUGrÕ   rµ   r*   r9   r5   r5   r6   r<     s    z
Base.closec                 C   sd   t jj | j|¡}|D ]H}z| j |¡ W q t jjy\ } zt 	|¡ W Y d}~qd}~0 0 qdS )z?Read repositories from the main conf file and from .repo files.N)
r   r4   ÚreadZ
RepoReaderrc   ÚaddrS   ZConfigErrorrO   ri   )r3   ZoptsÚreaderrU   rW   r5   r5   r6   Úread_all_repos#  s    zBase.read_all_reposc                 C   s    |r
d| _ |rtj ¡ | _|r†d| _| j durJtj | j ¡| _| jj	| j_	| j r`| j
r`| j
 ¡  | jdurt| j ¡  tj ¡ | _d| _g | _|rœ|rœt ¡  dS )z1Make the Base object forget about various things.N)r   r   r%   r&   r'   r   r®   rÊ   r4   rË   rf   Zrollbackr   rÓ   r<   r   r   r   r   r.   ÚgcZcollect)r3   re   rc   r®   r5   r5   r6   rµ   .  s$    



'z
Base.resetc                 C   s   | ` dS )z6Closes down the instances of rpmdb that could be open.N)Ú_tsr9   r5   r5   r6   rÔ   k  s    zBase._closeRpmDB)Z	noscriptsZ
notriggersZnodocsÚtestZjustdbZ
nocontextsÚnocryptoÚRPMTRANS_FLAG_NOCAPSZnocapsrß   c                 C   s   | j S r8   )r   r9   r5   r5   r6   r®   }  s    z	Base.goalc                 C   sà   | j dur| j S tjj | jj¡| _ | j  d¡ | jjD ]V}| j	 
|¡}|du rbt tdƒ|¡ q8| j  |¡ | j 
|¡}|dur8| j  |¡ q8| jjs¦| j tj¡ | jjr¼| j tj¡ t tj| jd¡}| j  |¡ | j S )zMSet up the RPM transaction set that will be used
           for all the work.Nr   z!Invalid tsflag in config file: %s)r   r   r(   r‘   ZTransactionWrapperr4   r[   ÚsetFlagsZtsflagsÚ_TS_FLAGS_TO_RPMÚgetrO   Úcriticalr   Z	addTsFlagÚ_TS_VSFLAGS_TO_RPMÚpushVSFlagsZdiskspacecheckr)   rÙ   ZRPMPROB_FILTER_DISKSPACEZ
ignorearchZRPMPROB_FILTER_IGNOREARCHÚ	functoolsÚreduceÚoperatorÚor_ZsetProbFilter)r3   ÚflagZrpm_flagZvs_flagZ
probfilterr5   r5   r6   rÝ     s,    
ÿzBase._tsc                 C   s&   | j du rdS | j  ¡  | ` d| _ dS )z"Releases the RPM transaction set. N)r   r<   r9   r5   r5   r6   rÝ   ž  s
    

c           
      C   sˆ  t j d¡}t j ¡ | _t t jjd¡ | j	 
¡ D ](}|js@q2|jsHq2|j ¡ }|sXq2t t jjd|j¡ tj tj |¡d¡}tj |d¡}d}z.tj |¡s°tj|dd tj||d	d
 W n8 tt jjfyú   t ¡ }|j}tj||dd
 Y n0 z| j |¡ W nB t jjyN } z$t dƒ}	t !|	|j|¡ W Y d}~n
d}~0 0 |r2| "¡  q2|r|| jj# $| j%j&d g¡ |ƒ  | jS )z6Create the groups object to access the comps metadata.zloading compszGetting group metadataz%Adding group file from repository: %sÚgenz
groups.xmlNií  )ÚmodeT)ÚdestZcheck_timestampsFz1Failed to add groups file for repository: %s - %sÚbasearch)'r   r#   r´   r   ZCompsr   rO   rÖ   r×   rc   rd   Zenablegroupsr†   rL   Z
getCompsFnrR   ÚosÚpathr¦   ÚdirnameÚexistsÚmakedirsr   Ú
decompressÚPermissionErrorrS   Z	MiscErrorÚtempfileZNamedTemporaryFileÚnameZ_add_from_xml_filenameÚ
CompsErrorr   rä   r<   Z_irŠ   r   rZ   )
r3   rŠ   r©   rU   Zcomps_fnZgen_dirZgen_fileZ	temp_filerW   rª   r5   r5   r6   r‹   §  sL    

ÿ&
ÿzBase.read_compsc                 C   s*   | j du r$| jj}t| jj|d| _ | j S )zeauto create the history object that to access/append the transaction
           history information. N)rY   )r   r4   rY   r   r   )r3   rY   r5   r5   r6   Ú_getHistoryÒ  s    
zBase._getHistoryc                 C   s   |   ¡ S r8   )rú   r9   r5   r5   r6   Ú<lambda>Ú  ra   zBase.<lambda>c                 C   s   t | d|ƒS ©Nr   ©Úsetattrr“   r5   r5   r6   rû   Û  s   ÿc                 C   s   t | dd ƒS rü   rý   r9   r5   r5   r6   rû   Ý  ra   zDNF SWDB Interface Object)ÚfgetÚfsetÚfdelÚdocc                    s*  ˆj j}t| ¡ ƒ‰ ˆ ¡ }| ¡  | ¡  ¡ }| ¡ D ]H‰| ˆ¡}|d }ˆj	 
|d¡ ˆj	 
ˆd¡ | ˆ||dd … ¡ q8| ¡ D ]t‰ˆj	 
ˆd¡ | ˆ¡}tˆƒ}g }|D ](}	t|	ƒ|krÔ| d|	¡ q¶| |	¡ q¶|d }
| ˆ|
|dd … ¡ qŠ| ¡ D ]¶‰ˆj	 
ˆd¡ | ˆ¡}‡ ‡fdd„|D ƒ}| ˆ¡}ˆ|v rf|jˆjd	rf| ˆ¡}|D ](}| |¡}tj ||¡d
krj|}qj| ˆ||¡ ‡fdd„}tj ||¡ q| ¡ D ]È‰| ˆ¡}d }|D ]}|jˆjkrÞ|} qþqÞ|d u r| d¡}n
| |¡ ‡ ‡fdd„|D ƒ}‡fdd„}tj ||¡ ˆ|v rd| ˆ|¡ n| ˆ||¡ ˆj	 
|d¡ ˆj	 
ˆd¡ qÈ|  ¡ }|r&ˆj!j"t#j$d ¡ }|j%|d |D ]`‰|jˆjd	rþ|d }| |¡ ˆj  &|| |¡¡ ˆj	 
ˆd¡ | ˆ¡}| 'ˆ|¡ qÄ|S )Nr   ÚddÚdrž   r   r_   c                    s$   g | ]}|ˆ v s|j ˆj kr|‘qS r5   ©rø   r]   ©Úall_obsoletedÚpkgr5   r6   r`     ra   z*Base._goal2transaction.<locals>.<listcomp>r  éÿÿÿÿc                    s   ˆ j  | d¡S ©NZod©r"   Ú	pkg_added©r  r9   r5   r6   rû     ra   z(Base._goal2transaction.<locals>.<lambda>c                    s$   g | ]}|ˆ v s|j ˆj kr|‘qS r5   r  r]   r  r5   r6   r`   $  ra   c                    s   ˆ j  | d¡S r
  r  r  r9   r5   r6   rû   &  ra   ZudÚu©Úflags)Zpkg__neqrW   )(rÓ   r(   r   Zlist_obsoletedÚ_get_installonly_queryr~   Ú	installedÚlist_downgradesZobsoleted_by_packager"   r  Zadd_downgradeÚlist_reinstallsÚstrÚinsertr}   Zadd_reinstallÚlist_installsÚ
get_reasonÚfilterrø   r   r‘   ZTransactionItemReasonCompareZadd_installr   r¡   ZmapallÚlist_upgradesÚpopÚremoveZadd_upgradeZlist_erasuresre   rw   rM   ÚIGNORE_EXCLUDESrx   Ú
set_reasonZ	add_erase)r3   r®   ÚtsZinstallonly_queryZinstallonly_query_installedZobsZ
downgradedZ	nevra_pkgÚ	obsoletesZobs_pkgZreinstalledÚreasonZobsoleteZreason_obsoleteÚcbZupgradedr_   ZerasuresZremaining_installed_queryZ	remainingr5   )r  r  r3   r6   Ú_goal2transactionà  s†    












zBase._goal2transactionc                 C   s`   |  ¡ }| ¡ }| ¡  ¡ }g }g }|D ].}||v rH| || d ¡ q(| || ¡ q(||fS )aJ   See what packages in the query match packages (also in older
            versions, but always same architecture) that are already installed.

            Unlike in case of _sltr_matches_installed(), it is practical here
            to know even the packages in the original query that can still be
            installed.
        r   )r  Ú_na_dictÚ	availabler}   )r3   ÚqÚinstZinst_per_archZavail_per_archZavail_lZinst_lZnar5   r5   r6   Ú_query_matches_installed<  s    zBase._query_matches_installedc                 C   s"   | j  ¡  ¡ j| ¡ d}t|ƒS )zƒ See if sltr matches a patches that is (in older version or different
            architecture perhaps) already installed.
        r  )re   rw   r  rx   ÚmatchesÚlist)r3   Úsltrr'  r5   r5   r6   Ú_sltr_matches_installedP  s    zBase._sltr_matches_installedc                    s   ‡ fdd„ˆ j  ¡  ¡ D ƒS )z5Get iterator over the packages installed by the user.c                 3   s   | ]}ˆ j  |¡r|V  qd S r8   )rÓ   Zuser_installed©r^   r  r9   r5   r6   Ú	<genexpr>Y  s   ÿz*Base.iter_userinstalled.<locals>.<genexpr>)re   rw   r  r9   r5   r9   r6   Úiter_userinstalledW  s    zBase.iter_userinstalledc                 C   s0   |j || jj| jj d}| jjr,| d¡ |S )N)Úallow_uninstallÚ
force_bestZignore_weak_depsz./debugdata/rpms)Úrunr4   ÚbestZinstall_weak_depsrg   Zwrite_debugdata)r3   r®   Úallow_erasingÚretr5   r5   r6   Ú_run_hawkey_goal\  s    þ
zBase._run_hawkey_goalc                 C   sb   | j  ¡  | jjr| j  ¡  | jjD ]8}tj |¡}|j| j	dddd}| 
¡ }| j  |¡ q$dS )z›
        Add exclude_from_weak from configuration and autodetect unmet weak deps exclude them from candidates to satisfy
        weak dependencies
        TFrp   N)r   Zreset_exclude_from_weakr4   Zexclude_from_weak_autodetectZexclude_from_weakr   ry   rz   r|   re   r%  Zadd_exclude_from_weak)r3   Zweak_excluder‚   rw   r5   r5   r6   Ú_set_excludes_from_weak_to_goald  s    

z$Base._set_excludes_from_weak_to_goalc           	      C   s|  d}|   ¡  tj d¡}| j ¡  | j}| ¡ rJ| | j	 
¡  ¡ | j¡ n| jjsd|  ¡ }| | ¡ | | j	 
¡ j| jjd¡ |  ¡  |  ||¡sÆ| jjdkr¨| ¡  tj | ¡ ¡}tj |¡}n|  |¡| _| j ¡  |ƒ  | jduoøt | jƒdk}|r| j !¡ }|rtj "|¡}|dur*|‚| j# $¡  | j %¡ }|| j &¡ 7 }|| j '¡ 7 }|| j (¡ 7 }| j	 )| j*|¡ |S )zBuild the transaction set.NZdepsolver  é   r   )+Ú_finalize_comps_transr   r#   r´   r"   Ústartr   Zreq_has_eraseZpush_userinstalledre   rw   r  rÓ   r4   Zupgrade_group_objects_upgradeÚ_build_comps_solverZ'_exclude_packages_from_installed_groupsZadd_protectedrx   Zprotected_packagesr7  r6  Ú
debuglevelZlog_decisionsr¡   Ú_format_resolve_problemsÚproblem_rulesrS   ZDepsolveErrorr#  r   Úendrv   Z_rpm_limitationsrh   r*   Zrun_resolvedr  r  r  r  Zset_modules_enabled_by_pkgsetrf   )	r3   r4  Úexcr©   r®   Úsolverrª   Zgot_transactionZnew_pkgsr5   r5   r6   Úresolves  sP    
ÿ
ÿ

ÿ



zBase.resolvec                 C   sl  t |tƒs|g}tjj ¡ gt|ƒ }| jsô| j 	¡  | j 
¡  | jrÖ| jjsV| jjrÖd }t| dƒrx| jrxd | j¡}nt| dƒr”| jr”d | j¡}| j ¡ }|d u r²| j ¡ }n|j}| j |g g |¡ | j |¡ | j ¡  | j ¡  d| _d S d }t tdƒ¡ tj  !| j"j#| j"j$¡}|ê | j %| j¡ |  &¡ }|rttdƒ}t '|¡ |D ]}t '|¡ qVtj( )|¡‚t tdƒ¡ tj* +d¡}	t td	ƒ¡ | j ,¡  | j -¡  tjjj.| dd
}
| j /|
¡}t0|ƒdkrP|
 1¡ D ]}t 2tdƒ 3|¡¡ qätdƒd }|D ]}|dt4|ƒ 7 }q|  5|¡}|rD|d| 7 }tj( 6|¡‚~
t tdƒ¡ | j 7t8j9¡r€W d   ƒ d S |	ƒ  | j 	¡  | j 
¡  tj* +d¡}	tjjj.| |d}| j"j:dk rÚ|j;D ]}d|_<qÌ| j ¡  t tdƒ¡ | j=|d}W d   ƒ n1 s0    Y  |	ƒ  | j >| j¡ | j ¡  dd„ }tj? @| | j|¡D ]}t A|¡ qV|S )NÚargsú ÚcmdsTzRunning transaction checkz%Error: transaction check vs depsolve:zTransaction check succeeded.ztransaction testzRunning transaction test)rÞ   r   úRPM: {}zTransaction test error:Ú
z  %s
zTransaction test succeeded.r‘   )Údisplaysé   FzRunning transaction)r"  c                 S   s(   g }|D ]}|  d | t|ƒ¡¡ q|S )Nz{}: {})r}   rQ   r  )ÚactionZtsisÚmsgsÚtsir5   r5   r6   Ú_pto_callback  s    z*Base.do_transaction.<locals>._pto_callback)BÚ
isinstancer   r   ZyumZrpmtransZLoggingTransactionDisplayr*  r‘   rf   rˆ   ZupdateFailSafeDatar   ÚgroupÚenvÚhasattrrC  r¦   rE  rÓ   ÚlastrÝ   ÚdbCookieÚend_rpmdb_versionÚbegr?  r*   Zrun_pre_transactionZrun_transactionr+   rO   r¢   r   r·   Zbuild_rpmdb_lockr4   r   r¹   Z_populate_rpm_tsÚ_run_rpm_checkÚerrorrS   ZTransactionCheckErrorr#   r´   ÚorderZcleanZRPMTransactionrÞ   rv   Úmessagesrä   rQ   r
   Ú_trans_error_summaryrh   ÚisTsFlagSetr(   ÚRPMTRANS_FLAG_TESTr<  rH  r2   Ú_run_transactionZunload_removed_pluginsr¡   Z_post_transaction_outputrP   )r3   ZdisplayÚcmdlineÚoldZrpmdb_versionÚtidr·   rK  rª   r©   ZtestcbZtserrorsÚ	errstringZdescrÚsummaryr"  Zdisplay_rM  r5   r5   r6   Údo_transaction®  s˜    
ÿ




ÿ








,
zBase.do_transactionc                 C   sô   d}t  d¡}i }| |¡D ]t}| d¡dkr<t| d¡ƒnt t| d¡ƒd ¡}| d¡|vrp||| d¡< || d¡ |k r||| d¡< q|rØ|tdƒd	 7 }|D ],}|d
tdd|| ƒ 	|| |¡ d	 7 }qª|sàdS tdƒd | }|S )zÚParse the error string for 'interesting' errors which can
        be grouped, such as disk space issues.

        :param errstring: the error string
        :return: a string containing a summary of the errors
        Ú z9needs (\d+)(K|M)B(?: more space)? on the (\S+) filesystemrI  ÚMrž   g      @é   zDisk Requirements:rG  z   z7At least {0}MB more space needed on the {1} filesystem.NzError Summaryz
-------------
)
ÚreÚcompileÚfinditerrO  rÅ   ÚmathZceilr   r	   rQ   )r3   ra  rb  ÚpZdiskÚmZ
size_in_mbÚkr5   r5   r6   rZ    s6    
 ÿýýýzBase._trans_error_summaryc                 C   s   | j jo| j tj¡ S r8   )r4   Zhistory_recordrÝ   r[  r(   r\  r9   r5   r5   r6   Ú_record_history<  s    ÿzBase._record_historyc              
   C   sè  d}|   ¡ rèt| jjƒ}| j ¡  ¡ }|j|d ¡ }| j	 
¡ }| j ¡ }|durX|j}|du sh||kr‚t tdƒjtjjd¡ d}t| dƒr¤| jr¤d | j¡}nt| dƒrÀ| jrÀd | j¡}| jjrÐ| jjnd}	| j ||g ||	¡}| jjr$t d	¡}
|
r$zt |
 ¡ W n   d	}
Y n0 t tjj d
¡ | j	 |j!d¡}t tjj d¡ | jjrzzt |
¡ W n   Y n0 tj "| j	| j#¡ |du r˜nÄt$|ƒd	krödd„ | j	D ƒ}|s\| %¡ D ]}t &tdƒ |¡¡ qÄtdƒ}tj' (|¡‚nft &tdƒ¡ |D ]}t &t)|d	 ƒ¡ q|   ¡ rH| j	 *t+j,¡sH| j -|¡ tdƒ}tj' (|¡‚dD ]X}t||ƒr`t.||ƒ}zt/ 0|¡ W n, t1t2fy´   tdƒ}t &||¡ Y n0 q`t3| j#j4ƒ| _5| j	 *t+j,¡sä|  6|j7¡ |S )zh
        Perform the RPM transaction.

        :return: history database transaction ID or None
        Nr  z RPMDB altered outside of {prog}.rÐ   rC  rD  rE  rd  r   zRPM transaction start.zRPM transaction over.c                 S   s   g | ]}|  ¡ r|‘qS r5   )ZFailed)r^   Zelr5   r5   r6   r`   |  ra   z)Base._run_transaction.<locals>.<listcomp>rF  zCould not run transaction.zTransaction couldn't start:)Z	ts_all_fnZ
ts_done_fnz$Failed to remove transaction file %s)8rn  r*  r4   Zhistory_record_packagesre   rw   r  r  r2  rÝ   rS  rÓ   rR  rT  rO   rP   r   rQ   r   r¡   ZMAIN_PROG_UPPERrQ  rC  r¦   rE  ÚcommentrU  Z
reset_nicerð   ÚnicerÖ   r#   r×   r!   Z_sync_rpm_trans_with_swdbr   rv   rY  rä   rS   rh   r
   r[  r(   r\  r?  Úgetattrr   Úunlink_frº   ÚOSErrorÚboolZinstall_setr,   Ú_verify_transactionZverify_tsi_package)r3   r"  r`  Zusing_pkgs_patsÚinstalled_queryZ
using_pkgsÚrpmdbvZlastdbvr^  ro  ZoniceÚerrorsZfailedrª   rW   r_   Úfnr5   r5   r6   r]  @  s€    

ÿ





zBase._run_transactionc                    sÞ   dd„ | j D ƒ}t|ƒ‰ ‡ ‡fdd„}tj d¡}d}tj | ¡}| ¡  ¡ }t	dd„ |D ƒƒ}| j
jD ]8}	|	 ¡ }
|
 ¡ D ]"}| ¡ |v r|| d¡ | ¡  q|qh|D ]}||j|ƒ}q¦| j ¡ }| j
 |¡ |ƒ  d| _d S )	Nc                 S   s   g | ]}|j tjjkr|‘qS r5   )rJ  r   r‘   Z#TransactionItemAction_REASON_CHANGE©r^   rL  r5   r5   r6   r`   ž  s   ÿz,Base._verify_transaction.<locals>.<listcomp>c                    s    |d7 }ˆd urˆ| |ˆ ƒ |S ©Nrž   r5   )r  Úcount©ÚtotalÚverify_pkg_cbr5   r6   Údisplay_banner£  s    z0Base._verify_transaction.<locals>.display_bannerzverify transactionr   c                 S   s   g | ]
}|j ‘qS r5   r  r]   r5   r5   r6   r`   °  ra   T)r‘   rv   r   r#   r´   re   Ú
rpmdb_sackrw   r  r   rÓ   rO  ZgetCompsGroupItemZgetPackagesZgetNameZsetInstalledrˆ   r  rÝ   rS  r?  r+   )r3   r  Ztransaction_itemsr€  r©   r|  r  r&  ÚnamesZtiÚgrk  rL  rw  r5   r}  r6   ru    s,    ÿ

zBase._verify_transactionc                    s|  t j | jj| jj¡}|Æ t ¡ }tdd„ |D ƒƒ}tdd„ |D ƒƒ}	ˆj	j
jdkrnˆj	t|ƒ||	d nˆ 	t|ƒ|¡ t j |||¡‰ ˆ  ¡ r¦t j ˆ  ¡ ¡‚t‡ fdd„|D ƒƒ}
t j d|ˆ j¡}| jj}|d	k}ˆ jr²|sô|d	kr²|d	kr|d
8 }tdƒ}t |¡ dd„ ˆ jD ƒ}‡fdd„|D ƒ}tdd„ |D ƒƒ}ˆ 	t|ƒ|¡ t j |||¡‰ ˆ  ¡ r†t j ˆ  ¡ ¡‚|
t‡ fdd„|D ƒƒ7 }
t j ||i ¡}qÞˆ jrÔt jj ˆ j¡}t |¡ W d   ƒ n1 sê0    Y  |d ur||
|ƒ |\}}||krx||k r>tdƒ}d|| d  }n"||kr`tdƒ}d|| d  }t ||d |d |¡ d S )Nc                 s   s   | ]}|j V  qd S r8   ©Zdownload_size©r^   Zploadr5   r5   r6   r.  Ë  ra   z1Base._download_remote_payloads.<locals>.<genexpr>c                 S   s   g | ]}t |tjjƒr|‘qS r5   )rN  r   ÚdrpmZDeltaPayload)r^   Zpayloadr5   r5   r6   r`   Í  ra   z2Base._download_remote_payloads.<locals>.<listcomp>é   )Ztotal_drpmsc                 3   s   | ]}ˆ   |¡V  qd S r8   ©Z_bandwidth_usedr…  ©rx  r5   r6   r.  Ø  s   ÿ)r   r   r   rž   z,Some packages were not downloaded. Retrying.c                 S   s   g | ]}|‘qS r5   r5   r-  r5   r5   r6   r`   æ  ra   c                    s    g | ]}t j |ˆ t jj¡‘qS r5   )r   rU   Ú_pkg2payloadÚ
RPMPayloadr-  )Úprogressr5   r6   r`   è  s   ÿc                 s   s   | ]}|j V  qd S r8   r„  r…  r5   r5   r6   r.  ê  s   ÿc                 3   s   | ]}ˆ   |¡V  qd S r8   rˆ  r…  r‰  r5   r6   r.  ó  ra   z?Delta RPMs reduced %.1f MB of updates to %.1f MB (%.1f%% saved)éd   zIFailed Delta RPMs increased %.1f MB of updates to %.1f MB (%.1f%% wasted)i   )r   r·   Zbuild_download_lockr4   r–   r¹   r»   Úsumrv   r:  Ú__code__Úco_argcountrU   Z_download_payloadsZ_irrecoverablerS   ZDownloadErrorZ_update_savingZ_recoverableÚretriesr   rO   r¢   Z
errmap2str)r3   Úpayloadsr†  rŒ  Úcallback_totalZ	fail_fastr·   Zbeg_downloadZest_remote_sizeZ
total_drpmZremote_sizeZsavingr‘  Zforeverrª   Zremaining_pkgsÚrealZfullÚpercentr5   )rx  rŒ  r6   Ú_download_remote_payloadsÇ  st    ÿÿ
ÿ


ÿÿÿ
ÿÿ*




zBase._download_remote_payloadsc           	         sÜ   |   |¡\}}|rzˆdu r$tj ¡ ‰tj | j ¡  ¡ ˆ| j	j
¡‰ |  dd„ |D ƒ¡ ‡ ‡fdd„|D ƒ}|  |ˆ ˆ|¡ | j	jrØ|D ]P}|jr¬tj | ¡ |j d¡¡}ntj |jj|j d¡¡}t || j	j¡ q†dS )a  Download the packages specified by the given list of packages.

        `pkglist` is a list of packages to download, `progress` is an optional
         DownloadProgress instance, `callback_total` an optional callback to
         output messages about the download operation.

        Nc                 S   s   g | ]}|  ¡ ‘qS r5   )ÚlocalPkgr-  r5   r5   r6   r`     ra   z*Base.download_packages.<locals>.<listcomp>c                    s$   g | ]}t j |ˆˆ jt jj¡‘qS r5   )r   rU   rŠ  Zdelta_factoryr‹  r-  ©r†  rŒ  r5   r6   r`     s   þÿú/)Ú_select_remote_pkgsr   r!   ZNullDownloadProgressr†  Z	DeltaInfore   rw   r  r4   Zdeltarpm_percentagerB   r–  r@   Zbaseurlrð   rñ   r¦   Zget_local_baseurlÚlocationÚlstriprU   ZpkgdirÚshutilÚcopy)	r3   ZpkglistrŒ  r“  Úremote_pkgsZ
local_pkgsr’  r  r›  r5   r˜  r6   Údownload_packages
  s(    	
ÿþ
ÿzBase.download_packagesc                 C   sæ   g }|s|S | j  ¡ r&tj tdƒ¡‚g }|D ]†}tj |¡sdd|v rdtj	 
|| j|¡}|  |g¡ z| | j |¡¡ W q. ty² } z t |¡ | |¡ W Y d }~q.d }~0 0 q.| jdd |râ|râttdƒ d |¡¡ƒ‚|S )NzACannot add local packages, because transaction job already existsz://T)r€   zCould not open: {}rD  )r   Z
req_lengthr   rS   rh   r   rð   rñ   ró   r¡   Z_urlopen_progressr4   rB   r}   re   Zadd_cmdline_packagerº   rO   ri   r…   rQ   r¦   )r3   Ú	path_listÚstrictrŒ  ÚpkgsZ
pkgs_errorrñ   rW   r5   r5   r6   Úadd_remote_rpms(  s*    
ÿ
"zBase.add_remote_rpmsc                 C   s  |j r| jj}d}n| j|j }|j}|j  }|r| jj}tj	j
 |¡}tj	j || ¡ ¡}tj | ¡ ¡}~|dkr„d}	d}
n€|dkr¨|r–d}	nd}	tdƒ| }
n\|dkrÂd}	tdƒ| }
nB|dkrê|rÔd}	nd}	d}	tdƒ| }
n|d	krd}	td
ƒ| }
nd}	d}
|	|
fS )a¼  Verify the GPG signature of the given package object.

        :param po: the package object to verify the signature of
        :return: (result, error_string)
           where result is::

              0 = GPG signature verifies ok or verification is not required.
              1 = GPG verification failed but installation of the right GPG key
                    might help.
              2 = Fatal GPG verification error, give up.
        r   rd  rž   rI  z"Public key for %s is not installedzProblem opening package %srf  z Public key for %s is not trustedr‡  zPackage %s is not signed)Ú_from_cmdliner4   Zlocalpkg_gpgcheckrc   r„   ZgpgcheckÚgpgkeyr[   r   r(   r‘   ÚinitReadOnlyTransactionZ	miscutilsZcheckSigr—  rð   rñ   Úbasenamer   )r3   ÚpoÚcheckZ	hasgpgkeyrU   Úrootr  Z	sigresultZlocalfnÚresultrª   r5   r5   r6   Ú_sig_check_pkg@  sF    

zBase._sig_check_pkgc                 C   s
   |   |¡S )a½  Verify the GPG signature of the given package object.

        :param pkg: the package object to verify the signature of
        :return: (result, error_string)
           where result is::

              0 = GPG signature verifies ok or verification is not required.
              1 = GPG verification failed but installation of the right GPG key
                    might help.
              2 = Fatal GPG verification error, give up.
        )r­  ©r3   r  r5   r5   r6   Úpackage_signature_check{  s    zBase.package_signature_checkc              	   C   sh   |D ]^}t j |¡sqzt |¡ W n& tyJ   t tdƒ|¡ Y qY q0 t 	t
jjtdƒ|¡ qd S )NzCannot remove %sz
%s removed)rð   rñ   ró   r   rr  rs  rO   ri   r   rÖ   r   r#   r×   )r3   Úpackagesry  r5   r5   r6   rÒ   Š  s    

ÿzBase._clean_packagesrm   c                 C   s†   |du r| j j}|du r*|  |||||¡S tj |¡r:J ‚tj| j||||d}|du sdt|ƒdkrl|dƒS t	||ƒ}t 
dd„ |¡S )aR  Return a :class:`misc.GenericHolder` containing
        lists of package objects.  The contents of the lists are
        specified in various ways by the arguments.

        :param pkgnarrow: a string specifying which types of packages
           lists to produces, such as updates, installed, available,
           etc.
        :param patterns: a list of names or wildcards specifying
           packages to list
        :param showdups: whether to include duplicate packages in the
           lists
        :param ignore_case: whether to ignore case when searching by
           package names
        :param reponame: limit packages list to the given repository
        :return: a :class:`misc.GenericHolder` instance with the
           following lists defined::

             available = list of packageObjects
             installed = list of packageObjects
             upgrades = tuples of packageObjects (updating, installed)
             extras = list of packageObjects
             obsoletes = tuples of packageObjects (obsoleting, installed)
             recent = list of packageObjects
        N)ÚshowdupsÚignore_casers   r   c                 S   s
   |   |¡S r8   )Zmerge_lists)ÚaÚbr5   r5   r6   rû   ¾  ra   z(Base._do_package_lists.<locals>.<lambda>)r4   ZshowdupesfromreposÚ_list_patternr   r¡   Úis_string_typerç   Úpartialrv   Úmaprè   )r3   Ú	pkgnarrowÚpatternsr±  r²  rs   Zlist_fnZyghsr5   r5   r6   Ú_do_package_lists—  s    
ÿþ
zBase._do_package_listsc           &         sL  ‡‡fdd„‰‡fdd„}‡fdd„}t j|d}g }	g }
g }g }g }g }g }g }g }g }|}ˆj ¡ }|d urtjj||d}|jˆjd	d
}|dkr¤i }i }| ¡ D ]<}|||j	< |r¾qª|j
|jf}||vsÞ||| krª|||< qªt|| ¡ ƒƒ}	|| ¡ ƒ}|s|jdd}|D ]„}|rH|j	|v r<| |¡ n
|
 |¡ nT|j
|jf}|j	|v rl| |¡ n0||vs†| || ¡r’|
 |¡ n
| |¡ qnh|dkrÜ||ƒjdd}ˆj|dd}| ¡  ¡ }n0|dkrút|| ¡ ƒƒ}	n|dkr|r~||ƒ ¡ }| ¡  ¡ }|D ]T‰ ˆ j
ˆ jf}| |g ¡}‡ fdd„|D ƒ}t|ƒdkrn| ˆ ¡ n
|
 ˆ ¡ q&nž||ƒ ¡ jdd ¡ }| ¡  ¡  ¡ }|D ]p\} }!|| |!f d ‰ | | |!fd g¡d }"|"rêˆ  |"¡rö|
 ˆ ¡ n"ˆ  |"¡r| ˆ ¡ n
| ˆ ¡ qªnî|dkrD||ƒ ˆjj¡}#|# ¡ }nÈ|dkrf‡fdd„| ¡ D ƒ}n¦|dkrÖ| ¡ }$|ˆj ¡ ƒj|$d}ˆj|d	dd}g }|D ],‰ˆj}%| ‡fdd„|$j|%dD ƒ¡ q¦n6|dkr| ¡ }|sú|jdd}||ƒ  ˆj!j"¡}|	|_|
|_||_#||_$||_%||_||_&||_"||_||_'|S )Nc                    s   ˆ du rdS ˆj  | ¡ˆ kS )z:Test whether given package originates from the repository.NT©rÓ   rU   )Úpackage©rs   r3   r5   r6   Úis_from_repoÂ  s    z(Base._list_pattern.<locals>.is_from_repoc                    s   ‡ fdd„| D ƒS )ú=Filter out the packages which do not originate from the repo.c                 3   s   | ]}ˆ |ƒr|V  qd S r8   r5   )r^   r½  ©r¿  r5   r6   r.  Ê  ra   z=Base._list_pattern.<locals>.pkgs_from_repo.<locals>.<genexpr>r5   )r°  rÁ  r5   r6   Úpkgs_from_repoÈ  s    z*Base._list_pattern.<locals>.pkgs_from_repoc                    s   ˆ du r| S | j ˆ dS )rÀ  Nrr   )r  )rw   rr   r5   r6   Úquery_for_repoÌ  s    z*Base._list_pattern.<locals>.query_for_repo)Úiter©r²  F)rq   rm   T)Zlatest_per_arch_by_priorityÚupgrades)Zupgrades_by_priority)Úupgrader  r%  c                    s   g | ]}|j ˆ j kr|‘qS r5   )Úevrr-  )Ú	avail_pkgr5   r6   r`     s   ÿz&Base._list_pattern.<locals>.<listcomp>r   Ú
autoremoveÚextrasc                    s   g | ]}ˆ |ƒr|‘qS r5   r5   r-  rÁ  r5   r6   r`   5  ra   r   )Zobsoletes_by_priority)ri   rÇ  c                    s   g | ]}ˆ |f‘qS r5   r5   )r^   r_  )Únewr5   r6   r`   B  ra   ©ÚprovidesÚrecent)(r   ZGenericHolderre   rw   r   ry   rz   r|   r  Zpkgtuprø   rŽ   r*  r¤   r%  rx   r}   Zevr_gtÚ_merge_update_filtersÚlatestr2  r$  rã   rv   Zevr_eqÚ	_unneededrÓ   ÚswdbrË  r  r   ÚextendZ_recentr4   rÏ  Úreinstall_availableÚold_availableÚupdatesÚobsoletesTuplesrÊ  )&r3   r¹  Úpatternr±  r²  rs   rÂ  rÃ  Zyghr  r%  rÕ  rÖ  r×  r   rØ  rÏ  rË  rÊ  Zicr&  r‚   ZdinstZndinstr©  ÚkeyZavailr  Zinstalled_dictÚinstalled_pkgsZsame_verZavailable_dictrø   rŽ   Zinst_pkgZautoremove_qr'  Zobsoleted_reldepsr5   )rÉ  r¿  rÌ  rs   r3   r6   rµ  À  sà    






ÿÿ




ÿÿ

ÿÿ

zBase._list_patternc                 C   s   |  j |7  _ t|ƒS r8   )r   rv   )r3   Útransr5   r5   r6   Ú_add_comps_transY  s    zBase._add_comps_transc                    sœ   |  ¡ }|sdS |jˆ jjdd}|j‡ fdd„|D ƒd}| |¡}|D ]}ˆ j |tjj	¡ qJ| 
|¡}| 
|¡}|r˜|D ]}ˆ jj|ˆ jjd q~dS )z«
        Mark to remove packages that are not required by any user installed package (reason group
        or user)
        :param query: dnf.query.Query() object
        NF©rg   c                    s    g | ]}ˆ j j |j¡r|‘qS r5   )rÓ   rO  Zis_removable_pkgrø   r]   r9   r5   r6   r`   i  ra   z,Base._remove_if_unneeded.<locals>.<listcomp>r  ©Ú
clean_deps)r  Z_safe_to_removerÓ   rÓ  r  Ú
differencer  r   r‘   Z TransactionItemReason_DEPENDENCYÚintersectionr   Úeraser4   Úclean_requirements_on_remove)r3   rw   Zunneeded_pkgsZunneeded_pkgs_historyZpkg_with_dependent_pkgsr  Zremove_packagesr5   r9   r6   Ú_remove_if_unneeded]  s    ÿ


zBase._remove_if_unneededc                    s:  ˆ j }ˆ jjd }‡ fdd„}‡ fdd„}dd„ }ˆ j ¡ jdd	}|jtj|dd
f|j	tj|dd
f|j
|f|j|ff}|D ]ª\}}	|D ]œ}
d|
ji}|
jr®| d|i¡ ˆ j ¡ jf i |¤Ž ¡ }|jddgd |s|
j}|
jrö|d| 7 }t tdƒ |¡¡ qŒ|	|||
ƒ}ˆ jj |
j¡ qŒq€ˆ  |¡ d S )Nrï   c                    s,   t j ˆ j¡}|j| d ˆ jj|d |S )Nr  ©Úselect)r   ÚselectorÚSelectorre   r   r   rÇ  )rw   Úremove_queryÚ	comps_pkgr+  r9   r5   r6   Útrans_upgrade{  s    z1Base._finalize_comps_trans.<locals>.trans_upgradec                    sâ   ˆ j jdkrr|js"ˆ j| |d qÞ|  ¡  ¡ }ˆ  |¡ tj 	ˆ j
¡}|jd |j|j¡d ˆ jj|| d nltj 	ˆ j
¡}|jr |jd |j|j¡d n,ˆ j jrÀ|  ˆ j
 ¡ j| d¡} |j| d ˆ jj|| d |S )Nrm   ©r¢  z
({} if {})rÍ  ©rç  Zoptional©r   r  )r4   Úmultilib_policyZrequiresÚ_install_multiarchr  r~   Ú_report_already_installedr   rè  ré  re   r   rQ   rø   r   Úinstallr   r{   rw   rx   )rw   rê  rë  r¢  rv  r+  r9   r5   r6   Útrans_install  s     
z1Base._finalize_comps_trans.<locals>.trans_installc                 S   s   |  | ¡}|S r8   )r{   )rw   rê  rë  r5   r5   r6   Útrans_remove˜  s    
z0Base._finalize_comps_trans.<locals>.trans_removeTrn   rí  Frø   rŽ   ÚsrcZnosrc)Z	arch__neqÚ.zNo match for group package "{}")r   r4   rZ   re   rw   rx   ró  rç   r·  Úinstall_optrÇ  r  rø   Zbasearchonlyr?   r~   rO   ri   r   rQ   r   Zgroup_membersrÙ   rå  )r3   rÜ  rï   rì  rô  rõ  rê  Zattr_fnÚattrry  rë  Z
query_argsr&  Zpackage_stringr5   r9   r6   r9  w  s6    ý
zBase._finalize_comps_transc                    s    ‡ fdd„}t j ˆ jˆ j|¡S )Nc                    sR   ˆ j  ¡  ¡ j| d}|sd S zˆ jj |d ¡W S  tyL   tj	j
 Y S 0 d S )Nr  r   )re   rw   r  rx   rÓ   r(   r  ÚAttributeErrorr   r‘   ZTransactionItemReason_UNKNOWN)Zpkgnamer&  r9   r5   r6   Ú	reason_fnµ  s    z+Base._build_comps_solver.<locals>.reason_fn)r   r   ZSolverrÓ   r   )r3   rû  r5   r9   r6   r;  ´  s    	zBase._build_comps_solverc                 C   sX   t j |¡sJ ‚|  ¡ }t|tƒs.tj |¡}| 	|||p>t
ƒ ||¡}|sNdS |  |¡S )a&  Installs packages of environment group identified by env_id.
        :param types: Types of packages to install. Either an integer as a
            logical conjunction of CompsPackageType ids or a list of string
            package type ids (conditional, default, mandatory, optional).
        r   )r   r¡   r¶  r;  rN  rÅ   r   r‘   ÚlistToCompsPackageTypeZ_environment_installr   rÝ  )r3   Úenv_idÚtypesÚexcluder¢  Úexclude_groupsrA  rÜ  r5   r5   r6   Úenvironment_installÀ  s    
zBase.environment_installc                 C   s,   t j |¡sJ ‚|  ¡ }| |¡}|  |¡S r8   )r   r¡   r¶  r;  Z_environment_removerÝ  ©r3   rý  rA  rÜ  r5   r5   r6   Úenvironment_removeÒ  s    
zBase.environment_removec           
         s¦   ‡fdd„‰ t j |¡sJ ‚d}|rB‡ fdd„|D ƒ}tj |¡}ˆ ¡ }t|tƒs`t	j
 |¡}| ||||¡}|sxdS |r„|j}	n|j}	t tdƒ||	¡ ˆ |¡S )an  Installs packages of selected group
        :param pkg_types: Types of packages to install. Either an integer as a
            logical conjunction of CompsPackageType ids or a list of string
            package type ids (conditional, default, mandatory, optional).
        :param exclude: list of package name glob patterns
            that will be excluded from install set
        :param strict: boolean indicating whether group packages that
            exist but are non-installable due to e.g. dependency
            issues should be skipped (False) or cause transaction to
            fail to resolve (True)
        c                    s6   t j | ¡r,ˆ j ¡ j| d}tdd„ |ƒS | fS d S )N©Z
name__globc                 S   s   | j S r8   r  )rk  r5   r5   r6   rû   é  ra   zABase.group_install.<locals>._pattern_to_pkgname.<locals>.<lambda>)r   r¡   Úis_glob_patternre   rw   rx   r¸  )rÙ  r&  r9   r5   r6   Ú_pattern_to_pkgnameæ  s    z/Base.group_install.<locals>._pattern_to_pkgnameNc                    s   g | ]}ˆ |ƒ‘qS r5   r5   )r^   rk  )r  r5   r6   r`   ð  ra   z&Base.group_install.<locals>.<listcomp>r   z#Adding packages from group '%s': %s)r   r¡   r¶  Ú	itertoolsÚchainÚfrom_iterabler;  rN  rÅ   r   r‘   rü  Z_group_installró  rø  rO   rP   r   rÝ  )
r3   Úgrp_idZ	pkg_typesrÿ  r¢  Zexclude_pkgnamesZnested_excludesrA  rÜ  Zinstlogr5   )r  r3   r6   Úgroup_installÙ  s&    

ÿzBase.group_installc                 C   sò   t | j| jt jt jB t jƒ}d}d}|D ]¬}	z| |	¡}
W nF tjj	y€ } z*t
 t|ƒ¡ d}W Y d }~q(W Y d }~n
d }~0 0 |
jD ]&}|r˜||vrˆ|| j||||d7 }qˆ|
jD ]}|| j|||||d7 }q¶q(|sî|rîtj tdƒ¡‚|S )Nr   TF)rÿ  r¢  )rÿ  r¢  r   zNothing to do.)r   r   rÓ   ÚENVIRONMENTSÚGROUPSÚ	AVAILABLErã   r   rS   rù   rO   rW  r
   Úgroupsr  Úenvironmentsr  rh   r   )r3   rº  rþ  r¢  rÿ  r   r&  ÚcntÚdonerÙ  ÚresÚerrZgroup_idrý  r5   r5   r6   Úenv_group_install  s,    ÿ"

ÿzBase.env_group_installc                 C   s,   t j |¡sJ ‚|  ¡ }| |¡}|  |¡S r8   )r   r¡   r¶  r;  Z_group_removerÝ  ©r3   r
  rA  rÜ  r5   r5   r6   Úgroup_remove  s    
zBase.group_removec              
   C   s°   t | j| jt jt jB t jƒ}z|j|Ž }W nH tjj	yr } z,t
 dt|ƒ¡ tj tdƒ¡‚W Y d }~n
d }~0 0 d}|jD ]}||  |¡7 }q~|jD ]}||  |¡7 }q˜|S )NzWarning: %szNo groups marked for removal.r   )r   r   rÓ   r  r  Ú	INSTALLEDrã   r   rS   rù   rO   rW  r
   rh   r   r  r  r  r  )r3   rº  r&  r  r  r  rP  Úgrpr5   r5   r6   Úenv_group_remove   s    

þ&

zBase.env_group_removec           
      C   sb  t | j| jt jt jB t jƒ}d}|D ]}z| |¡}W nB tjj	yz } z&t
 t|ƒ¡ W Y d }~q$W Y d }~n
d }~0 0 |jD ]Z}z|  |¡ d}W q‚ tjj	yÚ } z&t
 t|ƒ¡ W Y d }~q‚W Y d }~q‚d }~0 0 q‚|jD ]\}z|  |¡ d}W qä tjj	y> } z&t
 t|ƒ¡ W Y d }~qäW Y d }~qäd }~0 0 qäq$|s^tdƒ}	tj |	¡‚d S )NFTzNo group marked for upgrade.)r   r   rÓ   r  r  r  rã   r   rS   rù   rO   rW  r
   r  Úenvironment_upgrader  Úgroup_upgrader   r™   ZCliError)
r3   rº  r&  Zgroup_upgradedrÙ  r  r  rP  r  rª   r5   r5   r6   Úenv_group_upgrade0  s8    

þ
"

$

&zBase.env_group_upgradec                 C   s,   t j |¡sJ ‚|  ¡ }| |¡}|  |¡S r8   )r   r¡   r¶  r;  Z_environment_upgraderÝ  r  r5   r5   r6   r  M  s    
zBase.environment_upgradec                 C   s,   t j |¡sJ ‚|  ¡ }| |¡}|  |¡S r8   )r   r¡   r¶  r;  Z_group_upgraderÝ  r  r5   r5   r6   r  T  s    
zBase.group_upgradec                 C   sª   | j jd }tj |¡rdS | j j}tjjj	|d}| 
tjtjB  ¡ | dd¡}t|ƒ}~~|dkrldS tj |¡}tj |¡sŽt |¡ t|dƒ}| ¡  ~dS dS )	z˜Checks for the presence of GPG keys in the rpmdb.

        :return: 0 if there are no GPG keys in the rpmdb, and 1 if
           there are keys
        z/.gpgkeyschecked.yumrž   )r«  rø   z
gpg-pubkeyr   ÚwN)r4   r–   rð   rñ   ró   r[   r   r(   r‘   r§  ræ   Ú_RPMVSF_NOSIGNATURESÚ_RPMVSF_NODIGESTSZdbMatchrv   rò   rô   Úopenr<   )r3   Zgpgkeyscheckedr[   ZmytsÚidxÚkeysZmydirZfor5   r5   r6   Ú_gpg_key_check[  s&    

zBase._gpg_key_checkc           	      C   sœ   |   |¡\}}|  |¡ |D ]v}tj | j¡}| j ¡ j|d}| jj	r`| 
| j ¡ j|d¡}|j|d}|d ur€|j|d}| jj|| d qt|ƒS )Nr  rï  rr   rî  )r(  rò  r   rè  ré  re   rw   rx   r4   r   r{   r   r   ró  rv   )	r3   rw   rs   r¢  Úalready_instr%  r°  r+  r&  r5   r5   r6   rñ  y  s    
zBase._install_multiarchc                 C   s,   t  ¡ }t  ¡ }t||ƒ t||ƒ ||fS )aá  
        Categorize :param install and :param exclude list into two groups each (packages and groups)

        :param install: list of specs, whether packages ('foo') or groups/modules ('@bar')
        :param exclude: list of specs, whether packages ('foo') or groups/modules ('@bar')
        :return: categorized install and exclude specs (stored in argparse.Namespace class)

        To access packages use: specs.pkg_specs,
        to access groups use: specs.grp_specs
        )ÚargparseZ	Namespacer   )r3   ró  rÿ  Úinstall_specsÚexclude_specsr5   r5   r6   Ú_categorize_specs‡  s
    

zBase._categorize_specsc                    sd   dd„ |j D ƒ‰ ‡ fdd„|j D ƒ}| j ¡ j|d}| j ¡ jˆ d}| j |¡ | j |¡ d S )Nc                 S   s   g | ]}t j |¡r|‘qS r5   )r   r¡   r  ©r^   rÿ  r5   r5   r6   r`   š  s   ÿz/Base._exclude_package_specs.<locals>.<listcomp>c                    s   g | ]}|ˆ vr|‘qS r5   r5   r*  ©Zglob_excludesr5   r6   r`   œ  s   ÿr  r  )Ú	pkg_specsre   rw   r  r   )r3   r(  Úexcludesrƒ   Zglob_exclude_queryr5   r+  r6   Ú_exclude_package_specs™  s    zBase._exclude_package_specsc           
      C   sØ   t ƒ }t| j| jtjtjB tjtjB ƒ}|D ]¢}z| |¡}W nD t	j
jy‚ } z(t dt|ƒ¡ W Y d }~q,W Y d }~n
d }~0 0 | |j¡ | |j¡ |jD ]*}| j |¡}| ¡ D ]}	| |	j¡ qºq¢q,t|ƒS )NzWarning: Module or %s)r   r   r   rÓ   r  r  r  r  rã   r   rS   rù   rO   rW  r
   r?   r  r  Z_environment_by_idZgroups_iterrÙ   rR   r*  )
r3   Úgroup_specsr  r&  rÙ  r  r  Zenvironment_idZenvironmentrO  r5   r5   r6   Ú_expand_groups¥  s$    


þ"
zBase._expand_groupsc              	   C   s€   |D ]v}zL| j j}d|v r:| d¡}|d }|d  d¡}|  |g|||j|j¡ W q tjjyx   | 	d| ¡ Y q0 qd S )Nr™  r   rž   ú,ú@)
r4   Zgroup_package_typesÚsplitr  r,  Ú	grp_specsr   rS   rh   r}   )r3   r/  r-  Zskippedr¢  Z
group_specrþ  r3  r5   r5   r6   Ú_install_groups¼  s    
ÿzBase._install_groupsc                 C   s¨  |d u rg }g }g }g }g }	|   ||¡\}
}|  |¡ |
jD ]\}z| j||||d W q< tjjy– } z$t t	|ƒ¡ | 
|¡ W Y d }~q<d }~0 0 q<g }d}trF|
jrFz tjj | ¡}| |
j|¡ W nr tjjyB } zT|jr|jD ]}| 
|¡ qô|jr(|jD ]}| 
d| ¡ q|j}W Y d }~n
d }~0 0 n|
j}|rp|  |j¡|_|  ||||¡ |sŽ|sŽ|sŽ|	sŽ|r¤tjj||||	|d‚d S )N)rs   r¢  Úformsr5   r2  )Úno_match_group_specsÚerror_group_specsÚno_match_pkg_specsÚerror_pkg_specsÚmodule_depsolv_errors)r)  r.  r,  ró  r   rS   ÚMarkingErrorrO   rW  r  r}   ru   r4  rj   rk   Z
ModuleBaseZMarkingErrorsr7  r8  r;  r0  r5  )r3   ró  rÿ  rs   r¢  r6  r7  r8  r9  r:  r'  r(  ÚspecrW   Zno_match_module_specsr;  rk   Ze_specr5   r5   r6   r'  Ë  sR    

"

ÿüzBase.install_specsc           
      C   sÎ   t j |¡}|j| j|dd}| jjdks4| |¡rr|d }|durP|j|d |sb|  	|||¡ | j
|||dS | jjdkrÊ|j| || jj|d	|d
}|sª|  	|||¡ |D ]}	| jj|	| d q®dS dS )z@Mark package(s) given by pkg_spec and reponame for installation.F)r6  Úwith_srcrm   rw   Nrr   )rs   r¢  r3  T)r6  r   rs   ÚreportsÚsolutionrî  rž   r   )r   ry   rz   Úget_best_solutionre   r4   rð  Z_is_arch_specifiedrx   Ú_raise_package_not_found_errorrñ  Ú_get_best_selectorsr   r   ró  )
r3   Úpkg_specrs   r¢  r6  r‚   r@  r&  Úsltrsr+  r5   r5   r6   ró  ú  s.    ûzBase.installc                 C   sÈ   |j rd}t|ƒ‚| j ¡  ¡ j|j|jdgd}|shtdƒ}t	 
||j¡ tj tdƒ|j |j¡‚n\t|ƒd |krªtj | j¡}|j|gd | jj|| d d	S td
ƒ}t	 
||j¡ dS d S )Nz-downgrade_package() for an installed package.Únoarch©rø   rŽ   z.Package %s not installed, cannot downgrade it.úNo match for argument: %sr   r  rî  rž   zCPackage %s of lower version already installed, cannot downgrade it.)Ú_from_systemÚNotImplementedErrorre   rw   r  rx   rø   rŽ   r   rO   ri   r   rS   r<  r›  Úsortedrè  ré  r   r   ró  )r3   r  r¢  rª   r&  r+  r5   r5   r6   Úpackage_downgrade  s      zBase.package_downgradec                 C   s˜   | j  ¡  |j|j|j¡}|  |¡\}}||v r>|  |g¡ nV|tj	 
|¡vrftj tdƒ|j ¡‚n.tj | j ¡}|j|gd | jj|| d dS )NrH  r  rî  rž   )re   rw   Ú_nevrarø   rÈ  rŽ   r(  rò  r  r  r	  r   rS   ÚPackageNotFoundErrorr   r›  rè  ré  r   r   ró  )r3   r  r¢  r&  r%  r%  r+  r5   r5   r6   Úpackage_install.  s    zBase.package_installc                 C   sf   | j  ¡  ¡ j|j|j|jdr0| j |¡ dS t	dƒ}t
 |t|ƒ¡ tj t	dƒ|j |j¡‚d S )N)rø   rÈ  rŽ   rž   z.Package %s not installed, cannot reinstall it.rH  )re   rw   r  rx   rø   rÈ  rŽ   r   ró  r   rO   ri   r  r   rS   r<  r›  )r3   r  rª   r5   r5   r6   Úpackage_reinstall<  s     zBase.package_reinstallc                 C   s   | j  |¡ dS r{  )r   rã  r®  r5   r5   r6   Úpackage_removeD  s    zBase.package_removec                 C   s`  |j rd}t|ƒ‚|jdkr6tdƒ}t ||j¡ dS | j ¡  	¡  
¡ }| jjrš| j ¡ j|gdj|drštj | j¡}|j|gd | jj|d dS |jd	kr´|j|jd
}n|j|j|jd	gd}|stdƒ}t ||j¡ tj tdƒ|j |j¡‚nZt|ƒd |k rBtj | j¡}|j|gd | jj|d dS tdƒ}t ||j¡ dS d S )Nz+upgrade_package() for an installed package.rö  z<File %s is a source package and cannot be updated, ignoring.r   r  rï  ræ  rž   rF  r  rG  z+Package %s not installed, cannot update it.rH  r	  zHThe same or higher version of %s is already installed, cannot update it.)rI  rJ  rŽ   r   rO   r¢   r›  re   rw   r  r~   r4   r   rx   r   rè  ré  r   r   rÇ  r  rø   ri   rS   r<  rK  )r3   r  rª   r  r+  r&  r5   r5   r6   Úpackage_upgradeH  s<    
$
ÿzBase.package_upgradec           	      C   sÚ   | j  ¡  ¡ }| | j  ¡ jdd„ |D ƒd¡}| ¡ }|rf| j  ¡  ¡ j| | ¡ ¡d}| |¡}|d urz|j|d | j||dd}|rÖ| | 	¡ j
dd„ |D ƒd¡}tj | j ¡}|j|d	 | jj|d
 dS )Nc                 S   s   g | ]
}|j ‘qS r5   r  r-  r5   r5   r6   r`   p  ra   z*Base._upgrade_internal.<locals>.<listcomp>r  rï  rr   T)rD  rÇ  c                 S   s   g | ]
}|j ‘qS r5   r  r-  r5   r5   r6   r`   Œ  ra   r  ræ  rž   )re   rw   r  râ  rx   r%  r{   rÆ  rÐ  rÑ  r  r   rè  ré  r   r   rÇ  )	r3   rw   r   rs   rD  Zinstalled_allr&  rv  r+  r5   r5   r6   Ú_upgrade_internalm  s"    "ÿ
 zBase._upgrade_internalc                 C   sv  t j |¡}| | j¡}|d }|r\t j |¡}|s,|d r,|d jr,|d j}| j ¡  	¡  
¡ }| jjr~|j|dn| j ¡ jdd}	|	s,|j|d 
¡ }
|
sÖtdƒ}t ||¡ t j tdƒ| |¡‚nV|d jr,t j |d j¡s,|
j|d jd	s,td
ƒ}t |d ||d j¡¡ | jjoJ|d oJ|d  ¡ }|  ||||¡S t j tdƒ| |¡‚d S )Nrw   Únevrarï  Trn   r  z(Package %s available, but not installed.rH  )rŽ   z?Package %s available, but installed for different architecture.z{}.{})r   ry   rz   rA  re   r¡   r  rø   rw   r  r~   r4   r   r  rx   r   rO   ri   rS   ÚPackagesNotInstalledErrorrŽ   rQ   Zhas_just_namerS  r<  )r3   rD  rs   r‚   r@  r&  ZwildcardÚpkg_namer  Z
obsoletersZinstalled_namerª   r   r5   r5   r6   rÇ  “  s:    
ÿÿÿ 
ÿzBase.upgradec                 C   s   | j | j ¡ | jj|d dS )N)rD  )rS  re   rw   r4   r   )r3   rs   r5   r5   r6   Úupgrade_all±  s    ÿzBase.upgrade_allc                 C   sŒ   |d u r| j  ¡  nttj |¡}|j| jdd}|d jtj	d |j
| || jjdd}|spt tdƒ|¡ dS |D ]}| j j|d	 qtd
S )NF)r>  rw   ©Zreponame__neqT)r@  r   r?  zNo package %s installed.r   ræ  rž   )r   Zdistupgrade_allr   ry   rz   rA  re   rx   rM   ZSYSTEM_REPO_NAMErC  r4   r   rO   r¢   r   Zdistupgrade)r3   rD  ry   r@  rE  r+  r5   r5   r6   Údistro_sync¹  s    ÿzBase.distro_syncc                 C   sô   t |||gƒrÀ||7 }d}|rB|rB|D ]}tdƒ}t ||¡ q&n|rT|  |¡rTd}|D ]R}z| j||d W n6 tjjy¤ }	 zt 	t
|	ƒ¡ W Y d}	~	qXd}	~	0 0 d}qX|sðt tdƒ¡ n0| j ¡ j| jj| jjd}
|
D ]}|  |¡ qàdS )z»Removes all 'leaf' packages from the system that were originally
        installed as dependencies of user-installed packages but which are
        no longer required by any such package.FzNot a valid form: %sT©r6  NzNo packages marked for removal.rÞ  )Úanyr   rO   ri   r  r  r   rS   r<  r¢   r  re   rw   rÒ  rÓ   rÓ  r4   rg   rQ  )r3   r6  r,  r4  Ú	filenamesr  Zgrp_specrª   rD  rW   r£  r  r5   r5   r6   rÊ  É  s.    
$ÿzBase.autoremovec                    sl   t j |¡jˆj|d}‡ ‡fdd„| ¡ D ƒ}|sBˆ ||ˆ ¡ ˆjj}|D ]}ˆj	j
||d qNt|ƒS )z'Mark the specified package for removal.rZ  c                    s(   g | ] }ˆ d u s ˆj  |¡ˆ kr|‘qS r8   r¼  r-  r¾  r5   r6   r`   ñ  s   þzBase.remove.<locals>.<listcomp>rß  )r   ry   rz   r|   re   r  Ú"_raise_package_not_installed_errorr4   rä  r   rã  rv   )r3   rD  rs   r6  r)  r  rà  r  r5   r¾  r6   r  ì  s    ÿzBase.removec              	      s  t j |¡}| ˆj¡}‡ ‡fdd„| ¡ D ƒ}| ¡ }	|d urL|	j|d |d ur`|	j|d t j 	|	¡}
|s„t j
 d||
 ¡ ¡‚d}ˆjj}|D ]T}z|
t|ƒ }W n* tyÒ   |s¾Y q”ˆjj||d Y n0 ˆj |¡ |d7 }q”|dkrt j
 d||¡‚|S )	Nc                    s(   g | ] }ˆ d u s ˆj  |¡ˆ kr|‘qS r8   r¼  r-  ©Úold_reponamer3   r5   r6   r`   	  s   þz"Base.reinstall.<locals>.<listcomp>rr   rX  zno package matchedr   rß  rž   )r   ry   rz   r|   re   r  r%  rx   rw   Z_per_nevra_dictrS   rU  r¤   r4   rä  r
   ÚKeyErrorr   rã  ró  ZPackagesNotAvailableError)r3   rD  r_  Znew_reponameZnew_reponame_neqZ	remove_nar‚   r&  rÛ  Zavailable_qZavailable_nevra2pkgr  rà  Zinstalled_pkgZavailable_pkgr5   r^  r6   Ú	reinstallý  s>    ÿ
ÿ

ÿzBase.reinstallc                 C   s
   |   |¡S )z§Mark a package to be downgraded.

        This is equivalent to first removing the currently installed package,
        and then installing an older version.

        )Údowngrade_to)r3   rD  r5   r5   r6   Ú	downgrade$	  s    zBase.downgradec                 C   s   t j |¡}| | j¡}|s6tdƒ| }t j ||¡‚d}| ¡ }t	| 
¡  ¡ ƒ}| j ¡  ¡ j|d}	t|	ƒdkrtdƒ| }t j |||¡‚|	 
¡  ¡ D ]^}
| ¡ j|
d}|sÊtdƒ}t ||
¡ qœt j | j¡}|j|d | jj|| d d}qœ|S )	zDowngrade to specific version if specified otherwise downgrades
        to one version lower than the package installed.
        rH  r   r  z6Packages for argument %s available, but not installed.zDPackage %s of lowest version already installed, cannot downgrade it.r  rî  rž   )r   ry   rz   r|   re   r   rS   rN  r%  r*  Ú
_name_dictr#  rw   r  rx   rv   rU  Z
downgradesr  rO   ri   rè  ré  r   r   ró  )r3   rD  r¢  r‚   r&  rª   r  Zavailable_pkgsZavailable_pkg_namesZq_installedrV  Zdowngrade_pkgsr+  r5   r5   r6   rb  .	  s.    zBase.downgrade_toc                    sš   | j  ¡ jˆ d}|r |ˆ gfS tj | j ˆ ¡}|r>|ˆ gfS ˆ  d¡sRˆ  d¡r^dˆ  g}n&ˆ  d¡rr|ˆ gfS ‡ fdd„dD ƒ}| j  ¡ j|d|fS )	N)Z
file__globú/bin/ú/sbin/z/usrr™  c                    s   g | ]}|ˆ  ‘qS r5   r5   )r^   Úprefix©Úprovides_specr5   r6   r`   Y	  s   ÿz!Base.provides.<locals>.<listcomp>)re  rf  z	/usr/bin/z
/usr/sbin/)re   rw   rx   r   Z_by_providesÚ
startswith)r3   ri  Z	providersZbinary_providesr5   rh  r6   rÎ  J	  s    




ÿzBase.providesc           
      C   sÐ   dddœ}||vrt dƒ‚|| }|rDd| }	| j |	tƒ ¡ |¡ |rfd| }	| j |	tƒ ¡ |¡ |rˆd| }	| j |	tƒ ¡ |¡ |rªd| }	| j |	tƒ ¡ |¡ |rÌd	| }	| j |	tƒ ¡ |¡ d
S )aý  
        It modifies results of install, upgrade, and distrosync methods according to provided
        filters.

        :param cmp_type: only 'eq' or 'gte' allowed
        :param types: List or tuple with strings. E.g. 'bugfix', 'enhancement', 'newpackage',
        'security'
        :param advisory: List or tuple with strings. E.g.Eg. FEDORA-2201-123
        :param bugzilla: List or tuple with strings. Include packages that fix a Bugzilla ID,
        Eg. 123123.
        :param cves: List or tuple with strings. Include packages that fix a CVE
        (Common Vulnerabilities and Exposures) ID. Eg. CVE-2201-0123
        :param severity: List or tuple with strings. Includes packages that provide a fix
        for an issue of the specified severity.
        Z__eqgZ	__eqg__gt)ÚeqZgtez Unsupported value for `cmp_type`Zadvisory_typeÚadvisoryZadvisory_bugZadvisory_cveZadvisory_severityN)r’   r/   Ú
setdefaultr   r?   )
r3   Zcmp_typerþ  rl  ZbugzillaZcvesZseverityZcmp_dictÚcmprÚ  r5   r5   r6   Úadd_security_filters]	  s&    
zBase.add_security_filtersc                 C   s
   i | _ dS )z,
        Reset all security filters
        N)r/   r9   r5   r5   r6   Úreset_security_filters‚	  s    zBase.reset_security_filtersc                 C   s4  | j s| jr|s|S | j ¡ jdd}| jrJ| jD ]}| |¡}q2|g| _| j rŽ| j  ¡ D ]2\}}|rn|d }||i}	| |jf i |	¤Ž¡}qZ| |¡}|s0|r0| 	¡ }t
| ¡  ¡ ƒ}
|
dkr0|du rþtdƒ |
¡}tdƒ |
¡}t t|||
ƒ¡ n2tdƒ ||
¡}td	ƒ ||
¡}t t|||
ƒ¡ |S )
z†
        Merge Queries in _update_filters and return intersection with q Query
        @param q: Query
        @return: Query
        Trn   Z	__upgrader   Nz3No security updates needed, but {} update availablez4No security updates needed, but {} updates availablez<No security updates needed for "{}", but {} update availablez=No security updates needed for "{}", but {} updates available)r/   r.   re   rw   rx   r{   Úitemsr  râ  rÆ  rv   rd  r#  r   rQ   rO   ri   r	   )r3   r&  rD  ri   rÇ  Zmerged_queriesrw   Zfilter_namer¤   Úkwargsr|  Zmsg1Zmsg2r5   r5   r6   rÐ  ‰	  sF    


ÿÿÿÿzBase._merge_update_filtersc              
      s  ˆ j rtdƒ}t|ˆ  ƒ‚| jˆ j ‰ˆj| jv }|r:g nˆj}‡ ‡fdd„}d}| j ˆj¡ |D ]}	t	j
 |	ˆ¡}
|
D ]ö}t | j|j|j¡dkr´tdƒ}t ||	|j¡ q|| jjròt	jj |j|j¡}t	jj |¡}t t	j ||¡¡ |	|_| jjrt	j
 ||¡ nt	j
  |¡ d}| jj!r2d}n¨| jj"rž| jjr˜|t	jj#j$t	jj#j%fv r|d}t t	j &tdƒ¡¡ nd}t t	j &td	ƒ¡¡ nd}n<|rÄ|ˆ |j|j|	|j'|jd
œƒ}n|rÚ|ˆ |j|jƒ}|sæd}q|| j (t)j*¡}|r| j +¡ }| j ,|t)j* ¡ | j -t .|j¡¡}|r<| j ,|¡ |dkrbtdƒ| }t	j/ 0||ƒ¡‚t tdƒ¡ d}q|qd|s”|r”t	j/ 0tdƒ¡‚|s¸tdƒˆj1 }t	j/ 0||ƒ¡‚|  2ˆ ¡\}}|dkr |rètdƒ}t |¡ t3|ƒ}t	j/ 0||ƒ¡‚dS )aº  Retrieve a key for a package. If needed, use the given
        callback to prompt whether the key should be imported.

        :param po: the package object to retrieve the key of
        :param askcb: Callback function to use to ask permission to
           import a key.  The arguments *askcb* should take are the
           package object, the userid of the key, and the keyid
        :param fullaskcb: Callback function to use to ask permission to
           import a key.  This differs from *askcb* in that it gets
           passed a dictionary so that we can expand the values passed.
        :raises: :class:`dnf.exceptions.Error` if there are errors
           retrieving the keys
        z6Unable to retrieve a key for a commandline package: %sc                    s0   | t dƒˆ  d 7 } | t dƒd ˆj¡ 7 } | S )Nz. Failing package is: %sz
 zGPG Keys are configured as: %sr³   )r   r¦   r¦  )rª   ©r©  rU   r5   r6   Ú_prov_key_dataÉ	  s
    
ÿz1Base._get_key_for_package.<locals>._prov_key_dataFr   z)GPG key at %s (0x%s) is already installedTzThe key has been approved.zThe key has been rejected.)r©  ÚuseridZhexkeyidÚkeyurlÚfingerprintÚ	timestampzKey import failed (code %d)zKey imported successfullyzDidn't install any keysz°The GPG keys listed for the "%s" repository are already installed but they are not correct for this package.
Check that the correct key URLs are configured for this repository.z+Import of key(s) didn't help, wrong key(s)?N)4r¥  r   r’   rc   r„   rR   r1   r¦  rÙ   r   ZcryptoZretriever   ZkeyInstalledrÝ   Zrpm_idrx  rO   r¢   Zshort_idr4   r¼   r½   ZKeyInfoZfrom_rpm_key_objectru  Zraw_keyZDNSSECKeyVerificationZverifyZnice_user_msgÚurlZlog_dns_key_importZlog_key_importZassumenoZ	assumeyesZValidityZVALIDZPROVEN_NONEXISTENCEZany_msgrw  r[  r(   r\  Z
getTsFlagsrá   ZpgpImportPubkeyZ
procgpgkeyrS   rh   rø   r­  r
   )r3   r©  ÚaskcbÚ	fullaskcbrª   Zkey_installedZkeyurlsrt  Zuser_cb_failrv  r#  r¢   Zdns_input_keyZ
dns_resultZrcZ	test_flagZ
orig_flagsr¬  Úerrmsgr5   rs  r6   Ú_get_key_for_package²	  sš    

ÿ




ÿü


ü

zBase._get_key_for_packagec                 C   s   |   |||¡ dS )a»  Retrieve a key for a package. If needed, use the given
        callback to prompt whether the key should be imported.

        :param pkg: the package object to retrieve the key of
        :param askcb: Callback function to use to ask permission to
           import a key.  The arguments *askcb* should take are the
           package object, the userid of the key, and the keyid
        :param fullaskcb: Callback function to use to ask permission to
           import a key.  This differs from *askcb* in that it gets
           passed a dictionary so that we can expand the values passed.
        :raises: :class:`dnf.exceptions.Error` if there are errors
           retrieving the keys
        N)r}  )r3   r  rz  r{  r5   r5   r6   Úpackage_import_key8
  s    zBase.package_import_keyc                 C   s0   g }| j  ¡  | j  ¡ D ]}| t|ƒ¡ q|S r8   )rÝ   rª  Zproblemsr}   r
   )r3   ÚresultsZprobr5   r5   r6   rV  I
  s
    
zBase._run_rpm_checkúw+bc                 K   s   t jj|| j||fi |¤ŽS )zˆ
        Open the specified absolute url, return a file object
        which respects proxy setting even for non-repo downloads
        )r   r¡   Z_urlopenr4   )r3   ry  rU   rí   rr  r5   r5   r6   ÚurlopenT
  s    zBase.urlopenc                 C   s,   |d u r| j jtjd}|j| jjd}|S )Nr  rÍ  )r   rw   rM   r  r  r4   rÇ   )r3   r&  Zinstallonlyr5   r5   r6   r  \
  s    zBase._get_installonly_queryc                 C   sr   t jj|dd}|j| jdddd}|d rn|d rn|d jrn||d d jkrnt tdƒ 	|d d j¡¡ d S )	NTrÅ  Frp   rw   rT  r   z  * Maybe you meant: {})
r   ry   rz   rA  re   rø   rO   r¢   r   rQ   )r3   rD  r‚   r@  r5   r5   r6   Ú_report_icase_hintb
  s    
ÿÿzBase._report_icase_hintc                 C   sœ   dd„ }g }g }|D ].}|  ¡ r8|jtjkrB| |¡ q| |¡ qtdƒ}|||ƒsftj tdƒ¡‚| j	j
r”tdƒ}|||ƒstj tdƒ¡‚g }||fS )a   Check checksum of packages from local repositories and returns list packages from remote
        repositories that will be downloaded. Packages from commandline are skipped.

        :param install_pkgs: list of packages
        :return: list of remote pkgs
        c                 S   sv   d}| D ]h}d}z|  ¡ }W n2 tyN } zt t|ƒ¡ W Y d }~n
d }~0 0 |durt | ||j¡¡ d}q|S )NTF)ZverifyLocalPkgrN   rO   rä   r  rQ   rs   )Zpkg_listZ
logger_msgZall_packages_verifiedr  Zpkg_successfully_verifiedrW   r5   r5   r6   Ú_verification_of_packagesq
  s    $z;Base._select_remote_pkgs.<locals>._verification_of_packagesz>Package "{}" from local repository "{}" has incorrect checksumz;Some packages from local repository have incorrect checksumz8Package "{}" from repository "{}" has incorrect checksumzVSome packages have invalid cache, but cannot be downloaded due to "--cacheonly" option)Z_is_local_pkgrs   rM   ZCMDLINE_REPO_NAMEr}   r   r   rS   rh   r4   r‡   )r3   Zinstall_pkgsrƒ  rŸ  Zlocal_repository_pkgsr  rª   r5   r5   r6   rš  j
  s*    
ÿ
ÿzBase._select_remote_pkgsc                 C   s   |D ]}t |ƒ qd S r8   )Ú_msg_installed)r3   r°  r  r5   r5   r6   rò  —
  s    zBase._report_already_installedc           	      C   sª   | j jtjd}tj |¡}|j| j |d|d}|d urH|d j|d |d sdtj	 
tdƒ|¡‚nB| j jtjd}|d  |¡}|rtdƒ}ntdƒ}tj	 
||¡‚d S )	Nr  F©r6  r>  rw   rw   rr   úNo match for argumentú?All matches were filtered out by exclude filtering for argumentz?All matches were filtered out by modular filtering for argument)re   rw   rM   r  r   ry   rz   rA  rx   rS   rN  r   ZIGNORE_REGULAR_EXCLUDESrâ  )	r3   rD  r6  rs   Ú	all_queryry   r@  Zwith_regular_queryrª   r5   r5   r6   rB  ›
  s    
ÿ
z#Base._raise_package_not_found_errorc           	         s    ˆj jtjd ¡ }tj |¡}|jˆj |d|d}|d sNtj	 
tdƒ|¡‚ˆ d urp‡ ‡fdd„|d D ƒ}n|d }|s†tdƒ}ntd	ƒ}tj	 
||¡‚d S )
Nr  Fr…  rw   r†  c                    s    g | ]}ˆj  |¡ˆ kr|‘qS r5   r¼  r-  r¾  r5   r6   r`   ¹
  ra   z;Base._raise_package_not_installed_error.<locals>.<listcomp>zCAll matches were installed from a different repository for argumentr‡  )re   rw   rM   r  r  r   ry   rz   rA  rS   rU  r   )	r3   rD  r6  rs   rˆ  ry   r@  r  rª   r5   r¾  r6   r]  °
  s    
ÿ
z'Base._raise_package_not_installed_errorc                 C   s   | j j| jdd dS )z
        Setup DNF file loggers based on given configuration file. The loggers are set the same
        way as if DNF was run from CLI.
        T)Zfile_loggers_onlyN)r$   Z_setup_from_dnf_confr4   r9   r5   r5   r6   Úsetup_loggersÂ
  s    zBase.setup_loggersc                    sä   | j jtjtjB tjB @ r d}nd}t| j ƒ}| j|ddœ}|jf i |¤Ž}|sn|rnt	j
 | ¡ ¡}t |¡ t|jddƒ}t|jddƒ| }	dd„ ‰ ‡ fdd„|D ƒ‰t‡ ‡fd	d„|D ƒƒ}
t‡ ‡fd
d„|	D ƒƒ}|
|fS )zšreturns set of conflicting packages and set of packages with broken dependency that would
        be additionally installed when --best and --allowerasingTF)r0  r1  Zignore_weak)r%  c                 S   s   t j| j| j| j| j| jdS )N)rø   ÚepochÚversionÚreleaserŽ   )rM   ZNEVRArø   rŠ  r‹  rŒ  rŽ   )Úitemr5   r5   r6   rM  Ü
  s    ÿz&Base._skipped_packages.<locals>._nevrac                    s   g | ]}ˆ |ƒ‘qS r5   r5   rz  )rM  r5   r6   r`   á
  ra   z*Base._skipped_packages.<locals>.<listcomp>c                    s   g | ]}ˆ |ƒˆvr|‘qS r5   r5   r-  ©rM  Ztransaction_nevrasr5   r6   r`   ã
  ra   c                    s   g | ]}ˆ |ƒˆvr|‘qS r5   r5   r-  rŽ  r5   r6   r`   å
  ra   )r   ZactionsrM   ZINSTALLZUPGRADEZUPGRADE_ALLr   r0   r2  r   r¡   r=  r>  rO   ri   r   Úproblem_conflictsZproblem_broken_dependency)r3   Zreport_problemsr‘   r3  ZngÚparamsr5  rª   r  Zproblem_dependencyZskipped_conflictsZskipped_dependencyr5   rŽ  r6   Ú_skipped_packagesÊ
  s.    
þ
ÿÿzBase._skipped_packages)N)F)r5   r5   N)F)TT)T)N)FFF)F)F)r5   )N)T)NN)TN)rm   NNFN)N)NTN)NT)TNN)NT)T)NNTN)NTN)F)T)N)N)N)N)NNNN)NN)NNNF)F)r5   r5   r5   r5   r5   )NTF)NN)NN)Nr€  )N)‚Ú__name__Ú
__module__Ú__qualname__r7   r:   r=   r>   rB   rX   Ústaticmethodr   rl   r…   r‰   Úpropertyr   r4   rc   Údeleterr   r¡   Zlazyattrr   re   rf   r‘   Úsetterr—   rš   r›   rœ   r   r«   r¨   rÏ   rÕ   r<   rÛ   rµ   rÔ   r(   ZRPMTRANS_FLAG_NOSCRIPTSZRPMTRANS_FLAG_NOTRIGGERSZRPMTRANS_FLAG_NODOCSr\  ZRPMTRANS_FLAG_JUSTDBZRPMTRANS_FLAG_NOCONTEXTSZRPMTRANS_FLAG_NOFILEDIGESTrâ   rQ  rà   r  r   rå   r®   rÝ   r‹   rú   rÓ   r#  r(  r,  r/  r6  r7  rB  rc  rZ  rn  r]  ru  r–  r   r¤  r­  r¯  rÒ   r»  rµ  rÝ  rå  r9  r;  r  r  r  r  r  r  r  r  r  r$  rñ  r)  r.  r0  r5  r'  ró  rL  rO  rP  rQ  rR  rS  rÇ  rW  rY  rÊ  r  ra  rc  rb  rÎ  ro  rp  rÐ  r}  r~  rV  r  r  r‚  rš  rò  rB  r]  r‰  r‘  r5   r5   r5   r6   r   \   s&  


=











8
;
>

=ú
ÿ



+ü\
;
l"]
*
C

;  ÿ
* ÿ
 =

*



/

%&# ÿ
'
%) -r   c                 C   s    t | ƒ}tdƒ}t ||¡ d S )Nz Package %s is already installed.)r
   r   rO   r¢   )r  rø   rª   r5   r5   r6   r„  ê
  s    r„  )IÚ__doc__Z
__future__r   r   r   r   r&  r   Zlibdnf.transactionr   rž  r   Z	dnf.compsr   Zdnf.i18nr   r	   r
   Zdnf.utilr   Zdnf.db.historyr   Zdnf.yumr   Úcollections.abcr   ÚImportErrorÚcollectionsrÄ   Zdnf.callbackZdnf.confZdnf.conf.readZ
dnf.cryptoZ
dnf.dnssecZdnf.drpmZdnf.exceptionsZdnf.goalZdnf.historyZdnf.lockZdnf.loggingZdnf.module.module_baseru   Zdnf.persistorZ
dnf.pluginZ	dnf.queryZdnf.repoZdnf.repodictZdnf.rpm.connectionZdnf.rpm.miscutilsZdnf.rpm.transactionZdnf.sackZdnf.selectorZdnf.subjectZdnf.transactionZdnf.yum.rpmtransrç   rÜ   rM   r  r#   rj  rð   ré   rg  r(   r÷   r»   r  Z	getLoggerrO   Úobjectr   r„  r5   r5   r5   r6   Ú<module>   s¬   

                     #