???<!-- GIF89;a -->
123123123123
.....................................................................................................................................???<!-- GIF89;a -->
123123123123
.....................................................................................................................................3
g                @   sX  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 yddlmZ W n  ek
r   ddlmZ Y nX 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yddl(ZdZ)W n ek
r`   dZ)Y nX 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lBZBe;jCdZDG dd deEZFdd ZGd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dddZdd Zdd Zdd	 Zd
d Zdd Ze	dd Z
dd Zdd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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f f dfd*d+Zd,d- Zd.d/ Zd0d1 Zdd2d3Z dd5d6Z!dd7d8Z"d9d: Z#d;d< Z$dd=d>Z%dd?d@Z&dAdB Z'e(j)e(j*e(j+e(j,e(j-e(j.e(j/dCZ0e1e(dDre(j2e0dE< dFe(j3e(j4B iZ5edGdH Z6edIdJ Z7e7jdKdJ Z7ddLdMZ8dNdO Z9edPdQ dRdQ dSdQ dTdUZ:dVdW Z;dXdY Z<dZd[ Z=d\d] Z>d^d_ Z?dd`daZ@f fdbdcZAddde ZBdfdg ZCdhdi ZDddjdkZEddldmZFddndoZGddpdqZHdrds ZIdtdu ZJdvdw ZKddydzZLdd{d|ZMd}d~ ZNdd ZOdd ZPdd ZQdddZRdd ZSdddZTdddZUdd ZVdd ZWdd ZXdd ZYdd ZZdd Z[dddZ\dd Z]dd Z^dd Z_dddZ`dddZadddZbdddZcdddZddd Zedd Zfdd ZgdddZhdddZidddZjdddZkd ddZldddZmdddZndd ZodddZpddĄ Zqf f f f f fddƄZrddȄ ZsdddʄZtddd̄Zuddd΄ZvddЄ ZwdddӄZxdddՄZyddׄ Zzddل Z{ddۄ Z|dd݄ Z}dd߄ Z~dd Zdd ZdS (	  BaseNc             C   s   d| _ |p| j | _d | _d | _d | _d | _d | _d | _t	j
j | _d | _t | _t | _t	jj | _t	jj | _t	jj | _ttjg| _t	j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.6/base.py__init__]   s2    zBase.__init__c             C   s   | S )Nr5   )r3   r5   r5   r6   	__enter__z   s    zBase.__enter__c             G   s   | j   d S )N)close)r3   Zexc_argsr5   r5   r6   __exit__}   s    zBase.__exit__c             C   s   | j   d S )N)r9   )r3   r5   r5   r6   __del__   s    zBase.__del__c             C   s.   | j r| jj| n| jjrn| jj| d S )N)r   r    updater4   destdirr   )r3   filesr5   r5   r6   _add_tempfiles   s
    zBase._add_tempfilesc             C   s   |j   td|jdd}|jr&d|d< y| jj|jfddi| W nT tjk
r } z6t	j
tdj|j| tjjtdj|jW Y d d }~X nX d S )NT)load_filelistsload_prestoload_updateinfo
load_otherbuild_cachez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 } | j}d|kr*t jj| j|d< | S )N
releasever)r   r4   ZConfsubstitutionsr(   Zdetect_releaseverinstallroot)r4   Zsubstr5   r5   r6   r      s
    
zBase._setup_default_confc             C   s   dd | j j D }y0| jj| j|| jj| jjd| jj| jj	d}W n4 t
jk
rx } ztjjt|W Y d d }~X nX |rtjtjjj|d  d S )Nc             S   s   g | ]}|j r|jqS r5   )Zmodule_hotfixesrP   ).0ir5   r5   r6   
<listcomp>   s    z0Base._setup_modular_excludes.<locals>.<listcomp>F)Zupdate_onlyZdebugsolvermodule_obsoletesr   )repositer_enabledsackZfilter_modules_moduleContainerr4   rY   Zmodule_platform_iddebug_solverr]   rK   rL   r   rQ   Errorr
   rM   warningmodulemodule_baseZformat_modular_solver_errors)r3   Zhot_fix_reposZsolver_errorsrU   r5   r5   r6   _setup_modular_excludes   s    "zBase._setup_modular_excludesFc          	   C   s  t | jj}d|kr$tr$| j  d S g }g }|s>x| jj D ]}|j|krPq@t|j	dkr| j
j jdd}x8t |j	D ]*}tjj|}|j|j| j
dddd}q|W |j|jd |j|j |jf | j
j jdd}	x8t |jD ]*}
tjj|
}|	j|j| j
dddd}	qW |	j|jd |	r@|j|	|jf q@W d|kr6| j
j jdd}t| jj	dkrx<t | jj	D ],}tjj|}|j|j| j
dddd}qzW | j
j jdd}x<t | jjD ],}
tjj|
}|j|j| j
dddd}qW t| jj	dkr$| j
j| | j
jd |r6| j
j| |rjx,|D ]$\}}| j
j| | j
jd| qBW |rx|D ]\}}| j
j| qvW | rtr| j  d S )	Nallr   T)emptyF)
with_nevrawith_provideswith_filenames)reponamemain)r   r4   Zdisable_excludesWITH_MODULESrg   r^   r_   rP   lenZincludepkgsr`   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_queryrq   repoidr5   r5   r6   _setup_excludes_includes   sh    

zBase._setup_excludes_includesc             C   sP   | j r<| jj r<dd | jj D }| j jj| | j j  | jrL| jj  d S )Nc             S   s"   g | ]}|j r|jj r|jqS r5   )metadatarJ   Z	isExpiredrP   )rZ   r{   r5   r5   r6   r\      s    z/Base._store_persistent_data.<locals>.<listcomp>)	r   r4   	cacheonlyr^   r_   Zexpired_to_addr<   saver-   )r3   Zexpiredr5   r5   r6   _store_persistent_data   s    
zBase._store_persistent_datac             C   s   | j d kr| jdd | j S )NT)arch_filter)r   
read_comps)r3   r5   r5   r6   r      s    
z
Base.compsc             C   s   | j S )N)r   )r3   r5   r5   r6   r4      s    z	Base.confc             C   s   | j S )N)r'   )r3   r5   r5   r6   r^     s    z
Base.reposc             C   s
   d | _ d S )N)r'   )r3   r5   r5   r6   r^     s    Z_priv_rpmconnc             C   s   t jjj| jjS )N)r   r(   Z
connectionZRpmConnectionr4   rY   )r3   r5   r5   r6   _rpmconn  s    zBase._rpmconnc             C   s   | j S )N)r   )r3   r5   r5   r6   r`     s    z	Base.sackc             C   sP   | j d krtjjd| j jd krHtjjd| jj	| jj
d | jj| j _| j jS )NzSack was not initializedFarch)r`   r   rQ   rc   ra   libdnfre   ZModulePackageContainerr4   rY   rX   
persistdir)r3   r5   r5   r6   ra     s    
 zBase._moduleContainerc             C   s   | j S )N)r   )r3   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j| _d S )N)r   	persistorZRepoPersistorr4   cachedirr   )r3   r5   r5   r6   _activate_persistor+  s    zBase._activate_persistorc             C   s,   | j jr| jj| 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 j  dS )z#Run plugins pre_configure() method.N)r*   Z_run_pre_config)r3   r5   r5   r6   pre_configure_plugins5  s    zBase.pre_configure_pluginsc             C   s   | j j  dS )zRun plugins configure() method.N)r*   Z_run_config)r3   r5   r5   r6   configure_plugins:  s    zBase.configure_pluginsc             C   s   | j j  dS )zRun plugins unload() method.N)r*   Z_unload)r3   r5   r5   r6   unload_plugins?  s    zBase.unload_pluginsc       
      C   s  | j j}| jd kr| j  | j}|rtjj rDtd}tj	| dS tjj
 dkrhtd}tj	| dS |dkrtd}tj	| dS |j }|d k	r||k rtj	td dS x| jj D ]}|jjd qW | jj stj	tdjd	j| j j dS x| jj D ]}|j \}}	|	d kr6tj	td
|j nx| sH|	dkrftjtd|j |jj  nH|r|	|k rtd}tj||j|	 |jj  ntjtd|j|	 qW |rd|_| jddd tj	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   rM   infoZon_ac_powersince_last_makecacher^   valuesrJ   ZsetMaxMirrorTries_any_enabledrO   joinZreposdirr_   Z_metadata_expire_inrP   rN   expireZreset_last_makecache	fill_sack)
r3   timerZperiodr   msgr   rS   r{   Zis_cacheZ
expires_inr5   r5   r6   update_cacheD  sZ    






zBase.update_cacheTc              C   sP  t jjd}| jddd t jj| | _t jj| j	j
| j	j}| |dk	ry| jjdd W n tk
r~   |dkrz Y nX |rg }d}tj }| j	jrt jjj  x| jj D ]}y`| j| |jj |kr|jj }|jj |k r|jj }tjtd|jt jj|jj  W q t j j!k
rz }	 z>|jj"  |j#dkrJ tj$d	|	 |j%|j |j&  W Y d
d
}	~	X qX qW |rtj$tddj'| | jj( r|dkr|dkrtj)tdt*j+t,|dt jj| n| jj- j&  W d
Q R X | j	}
| jj.|
j/|
j0|
j1 | j2  |  t j3j4| j| _5|
j6| j5_6| j7j8  | jS )z'Prepare the Sack and the Goal objects. z
sack setupT)r`   goalF)rD   autor   z%s: using metadata from %s.z	Error: %sNzIgnoring repositories: %sz, z-Last metadata expiration check: %s ago on %s.)Zseconds)9r   r#   Timerresetr`   _build_sackr   lockbuild_metadata_lockr4   r   exit_on_lockr   IOErrortimegpgkey_dns_verificationdnssecRpmImportedKeyscheck_imported_keys_validityr^   r_   rV   rJ   ZgetTimestampZgetAgerM   rN   r   rP   r   normalize_timegetMaxTimestamprQ   rR   r   skip_if_unavailablerd   rw   disabler   r   r   datetimeZ	timedeltaintrh   
_configureinstallonlypkgsinstallonly_limitallow_vendor_changer   r   Goalr   protect_running_kernelr*   run_sack)r3   r   r   r   r   error_reposZmtsZager{   rU   r4   r5   r5   r6   r   |  sf    






zBase.fill_sackc       	       C   s  t jjd}| jddd t jj| | _t jj| j	j
| j	j}|n |dk	ry| jjdd W n tk
r~   |dkrz Y nX g }| j	jrt jjj  x| jj D ]}yf|jjddd td|jdd}|jrd|d	< | jj|jf| tjtd
|jt jj|jj   W q t!t"j#fk
r } zZ|j$dkrPt j%j&tdj'|j|ntjtdj'|j| |j(|j |j)  W Y dd}~X qX qW |rtj*tddj+| W dQ R X | j	}| jj,|j-|j.|j/ | j0  |  t j1j2| j| _3|j4| j3_4| j5j6  | 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.
        z
sack setupT)r`   r   F)rD   r   )ZthrowExceptZignoreMissing)r@   rA   rB   rC   z%s: using metadata from %s.zloading repo '{}' failure: {}NzIgnoring repositories: %sz, )7r   r#   r   r   r`   r   r   r   r   r4   r   r   r   r   r   r   r   r   r^   r_   rJ   Z	loadCacherF   rG   rH   rI   rM   rN   r   rP   r   r   r   RuntimeErrorrK   rL   r   rQ   rR   rO   rw   r   rd   r   r   r   r   r   r   r   r   r   r   r*   r   )	r3   r   r   r   r   rS   rT   rU   r4   r5   r5   r6   fill_sack_from_repos_in_cache  sX    	

z"Base.fill_sack_from_repos_in_cachec             C   s   t jj| jj| _| jjsl| j| j | j	r\| j
j| jj  | jj  | jrl| j| j
 n| jjj| j
 | jjrtjtd tjtddjt jjd | jd k	r| jj  | j  | 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_tempfilesri   r,   Ztempfiles_to_addrM   r   r   rO   r   Z	MAIN_PROGr   historyr9   r   _closeRpmDB)r3   r5   r5   r6   _finalize_base  s*    



zBase._finalize_basec             C   sB   | j r
dS tjtjjd d| _ | j  | 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)r`   r^   r   )	r   rM   logr   r#   DDEBUGr   r   r*   )r3   r5   r5   r6   r9     s    z
Base.closec             C   sf   t jjj| j|}xN|D ]F}y| jj| W q t jjk
r\ } ztj	| W Y dd}~X qX qW dS )z?Read repositories from the main conf file and from .repo files.N)
r   r4   readZ
RepoReaderr^   addrQ   ZConfigErrorrM   rd   )r3   ZoptsreaderrS   rU   r5   r5   r6   read_all_repos"  s    
zBase.read_all_reposc             C   s   |r
d| _ |rtjj | _|rd| _| j dk	rJtjj| j | _| jj	| j_	| j r`| j
r`| j
j  | jdk	rt| jj  tjj | _d| _g | _|r|rtj  dS )z1Make the Base object forget about various things.N)r   r   r%   r&   r'   r   r   r   r4   r   ra   Zrollbackr   r   r9   r   r   r   r   r.   gcZcollect)r3   r`   r^   r   r5   r5   r6   r   -  s$    



'z
Base.resetc             C   s   | ` dS )z6Closes down the instances of rpmdb that could be open.N)_ts)r3   r5   r5   r6   r   j  s    zBase._closeRpmDB)Z	noscriptsZ
notriggersZnodocstestZjustdbZ
nocontextsnocryptoRPMTRANS_FLAG_NOCAPSZnocapsr   c             C   s   | j S )N)r   )r3   r5   r5   r6   r   |  s    z	Base.goalc             C   s   | j dk	r| j S tjjj| jj| _ | j jd xb| jjD ]V}| j	j
|}|dkrdtjtd| q:| j j| | jj
|}|dk	r:| j j| q:W | jjs| jjtj | jjr| jjtj tjtj| jd}| j 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   rY   setFlagsZtsflags_TS_FLAGS_TO_RPMgetrM   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krdS | j j  | ` d| _ dS )z"Releases the RPM transaction set. N)r   r9   )r3   r5   r5   r6   r     s
    

c             C   s$  t jjd}t jj | _tjt jjd x| j	j
 D ]}|js@q4|jsHq4|jj }|sXq4tjt jjd|j |jj t jjkrtj|d}tjj|sq4ntj|d}y| jj| W q4 t jjk
r } ztd}tj||j| W Y dd}~X q4X q4W |r| j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: %sz
groups.xmlz1Failed to add groups file for repository: %s - %sNbasearch)"r   r#   r   r   ZCompsr   rM   r   r   r^   r_   Zenablegroupsr   rJ   Z
getCompsFnrP   ZgetSyncStrategyrS   ZSYNC_ONLY_CACHEr   Zcalculate_repo_gen_destospathexistsZrepo_gen_decompressZ_add_from_xml_filenamerQ   
CompsErrorr   r   Z_ir   r   rX   )r3   r   r   rS   Zcomps_fnZdecompressedrU   r   r5   r5   r6   r     s:    


&zBase.read_compsc             C   s*   | j dkr$| jj}t| jj|d| _ | j S )zeauto create the history object that to access/append the transaction
           history information. N)rW   )r   r4   rW   r   r   )r3   rW   r5   r5   r6   _getHistory  s    
zBase._getHistoryc             C   s   | j  S )N)r   )r3   r5   r5   r6   <lambda>  s    zBase.<lambda>c             C   s   t | d|S )Nr   )setattr)r3   r   r5   r5   r6   r     s   c             C   s   t | dd S )Nr   )r   )r3   r5   r5   r6   r     s    zDNF SWDB Interface Object)fgetfsetfdeldocc                sF  j j}t|j  j }|j  |j j }xT|j D ]H|j}|d }j	j
|d j	j
d |j||dd   q:W x|j D ]xj	j
d |j}t}g }x0|D ](}	t|	|kr|jd|	 q|j|	 qW |d }
|j|
|dd   qW x|j D ]j	j
d |j} fdd|D }|j}|krt|jjd	rt|j}x0|D ](}|j|}tjj||dkrz|}qzW |j|| fd
d}tjj|| qW x|j D ]ȉ|j}d }x"|D ]}|jjkr|}P qW |d kr*|jd}n
|j|  fdd|D }fdd}tjj|| |krz|j| n|j|| j	j
|d j	j
d qW |j  }|rBj!j"t#j$dj }|j%|d xh|D ]`|jjd	r|d }|j| j j&||j| j	j
d |j}|j'| qW |S )Nr   Zdddr   r{   r[   c                s$   g | ]}| ks|j j kr|qS r5   )name)rZ   r[   )all_obsoletedpkgr5   r6   r\     s    z*Base._goal2transaction.<locals>.<listcomp>)r   c                s    j j| dS )Nod)r"   	pkg_added)r   )r3   r5   r6   r     s    z(Base._goal2transaction.<locals>.<lambda>c                s$   g | ]}| ks|j j kr|qS r5   )r   )rZ   r[   )r   r   r5   r6   r\     s    c                s    j j| dS )Nr   )r"   r   )r   )r3   r5   r6   r   !  s    Zudu)flags)Zpkg__neqrU   )(r   r(   r   Zlist_obsoleted_get_installonly_queryrx   	installedlist_downgradesZobsoleted_by_packager"   r   Zadd_downgradelist_reinstallsstrinsertrw   Zadd_reinstalllist_installs
get_reasonfilterr   r   r   ZTransactionItemReasonCompareZadd_installr   r   Zmapalllist_upgradespopremoveZadd_upgradeZlist_erasuresr`   rq   rK   IGNORE_EXCLUDESrr   
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   sd   |j  }|j }|j j }g }g }x6|D ].}||krJ|j|| d  q*|j||  q*W ||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	availablerw   )r3   qinstZinst_per_archZavail_per_archZavail_lZinst_lZnar5   r5   r6   _query_matches_installed7  s    
zBase._query_matches_installedc             C   s"   | j j j j|j d}t|S )z See if sltr matches a patches that is (in older version or different
            architecture perhaps) already installed.
        )r   )r`   rq   r   rr   matcheslist)r3   sltrr  r5   r5   r6   _sltr_matches_installedK  s    zBase._sltr_matches_installedc                s    fdd j j j D S )z5Get iterator over the packages installed by the user.c             3   s   | ]} j j|r|V  qd S )N)r   Zuser_installed)rZ   r   )r3   r5   r6   	<genexpr>T  s    z*Base.iter_userinstalled.<locals>.<genexpr>)r`   rq   r   )r3   r5   )r3   r6   iter_userinstalledR  s    zBase.iter_userinstalledc             C   s0   |j || jj| jj d}| jjr,|jd |S )N)allow_uninstall
force_bestZignore_weak_depsz./debugdata/rpms)runr4   bestZinstall_weak_depsrb   Zwrite_debugdata)r3   r   allow_erasingretr5   r5   r6   _run_hawkey_goalW  s    
zBase._run_hawkey_goalc       	      C   st  d}| j   tjjd}| jj  | j}|j rJ|j| j	j
 j | j n| jjsd| j }|j|  |j| j	j
 j| jjd | j||s| jjdkr|j  tjj|j }tjj|}n| j|| _| jj  |  | jdk	ot| jdk}|r| jj  }|rtjj!|}|dk	r"|| j"j#  | jj$ }|| jj% 7 }|| jj& 7 }|| jj' 7 }| j	j(| j)| |S )zBuild the transaction set.NZdepsolve)r      r   )*_finalize_comps_transr   r#   r   r"   startr   Zreq_has_eraseZpush_userinstalledr`   rq   r   r   r4   Zupgrade_group_objects_upgrade_build_comps_solverZ'_exclude_packages_from_installed_groupsZadd_protectedrr   Zprotected_packagesr  
debuglevelZlog_decisionsr   _format_resolve_problemsproblem_rulesrQ   ZDepsolveErrorr  r   endrp   Z_rpm_limitationsrc   r*   Zrun_resolvedr   r   r   r   Zset_modules_enabled_by_pkgsetra   )	r3   r  excr   r   solverr   Zgot_transactionZnew_pkgsr5   r5   r6   resolve_  sH    








zBase.resolvec             C   s^  t |ts|g}tjjj gt| }| js| jj	  | jj
  | jr| jjsV| jjrd }t| drx| jrxdj| j}nt| dr| jrdj| j}| jj }|d kr| jj }n|j}| jj|g g | | jj| | jj  | jj  d| _d S d }tjtd tj j!| j"j#| j"j$}| | jj%| j& | j' }|rxtd}tj(| x|D ]}tj(| qXW tj)j*|tjtd tj+j,d}	tjtd	 | j&j-  | j&j.  tjjj/| dd
}
| j&j0|
}t1|dkr\x&|
j2 D ]}tj3tdj4| qW tdd }x|D ]}|dt5| 7 }qW | j6|}|rP|d| 7 }tj)j7|~
tjtd | j&j8t9j:rd S |	  | jj	  | jj
  tj+j,d}	tjjj/| |d}| j"j;dk rx|j<D ]}d|_=qW | jj  tjtd | j>|d}W d Q R X |	  | jj?| j | jj  dd }x&tj@jA| | j|D ]}tjB| qFW |S )Nargs cmdsTzRunning transaction checkz%Error: transaction check vs depsolve:zTransaction check succeeded.ztransaction testzRunning transaction test)r   r   zRPM: {}zTransaction test error:
z  %s
zTransaction test succeeded.r   )displays   FzRunning transaction)r  c             S   s,   g }x"|D ]}|j dj| t| q
W |S )Nz{}: {})rw   rO   r   )actionZtsismsgstsir5   r5   r6   _pto_callback  s    
z*Base.do_transaction.<locals>._pto_callback)C
isinstancer   r   ZyumZrpmtransZLoggingTransactionDisplayr  r   ra   r   ZupdateFailSafeDatar   groupenvhasattrr"  r   r$  r   lastr`   _rpmdb_versionend_rpmdb_versionbegr  r*   Zrun_pre_transactionZrun_transactionr+   rM   r   r   r   Zbuild_rpmdb_lockr4   r   r   Z_populate_rpm_tsr   _run_rpm_checkerrorrQ   ZTransactionCheckErrorr#   r   orderZcleanZRPMTransactionr   rp   messagesr   rO   r
   _trans_error_summaryrc   isTsFlagSetr(   RPMTRANS_FLAG_TESTr  r&  r2   _run_transactionZunload_removed_pluginsr   Z_post_transaction_outputrN   )r3   ZdisplaycmdlineoldZrpmdb_versiontidr   r)  r   r   ZtestcbZtserrors	errstringZdescrsummaryr  Zdisplay_r+  r5   r5   r6   do_transaction  s    
















zBase.do_transactionc             C   s   d}t jd}i }x|j|D ]t}|jddkr>t|jdntjt|jdd }|jd|krr|||jd< ||jd |k r|||jd< qW |r|tdd	 7 }x4|D ],}|d
tdd|| j	|| | d	 7 }qW |sdS tdd | }|S )zParse 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+) filesystemr'  Mr   g      @   zDisk Requirements:r%  z   z7At least {0}MB more space needed on the {1} filesystem.NzError Summaryz
-------------
)
recompilefinditerr-  r   mathZceilr   r	   rO   )r3   r?  r@  pZdiskmZ
size_in_mbkr5   r5   r6   r8    s&    
 
*zBase._trans_error_summaryc             C   s   | j jo| jjtj S )N)r4   Zhistory_recordr   r9  r(   r:  )r3   r5   r5   r6   _record_history%  s    zBase._record_historyc             C   s  d}| j  rt| jj}| jj j }|j|dj }| jj	 }| j
j }|dk	rX|j}|dksh||krtjtdjtjjd d}t| dr| jrdj| j}nt| dr| jrdj| j}| jjr| jjnd}	| j
j||g ||	}| jjr$tjd	}
|
r$ytj|
  W n   d	}
Y nX tjtjjd
 | j j|j!d}tjtjjd | jjrzytj|
 W n   Y nX tjj"| j | j# |dkrnt$|d	krdd | j D }|sfx&|j% D ]}tj&tdj| qW td}tj'j(|nltj&td x |D ]}tj&t)|d	  qW | j  rR| j j*t+j, rR| j
j-| td}tj'j(|xbdD ]Z}t||rlt.||}yt/j0| W n. t1t2fk
r   td}tj&|| Y nX qlW t3| j#j4| _5| j j*t+j,s| j6|j7 |S )zh
        Perform the RPM transaction.

        :return: history database transaction ID or None
        N)r   z RPMDB altered outside of {prog}.)r   r"  r#  r$  rB  r   zRPM transaction start.zRPM transaction over.c             S   s   g | ]}|j  r|qS r5   )ZFailed)rZ   Zelr5   r5   r6   r\   e  s    z)Base._run_transaction.<locals>.<listcomp>zRPM: {}zCould not run transaction.zTransaction couldn't start:	ts_all_fn
ts_done_fnz$Failed to remove transaction file %s)rM  rN  )8rL  r  r4   Zhistory_record_packagesr`   rq   r   r   r  r1  r   r0  r2  rM   rN   r   rO   r   r   ZMAIN_PROG_UPPERr/  r"  r   r$  commentr3  Z
reset_nicer   nicer   r#   r   r   r!   Z_sync_rpm_trans_with_swdbr   rp   r7  r   rQ   rc   r
   r9  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   rU   r[   fnr5   r5   r6   r;  )  s~    









zBase._run_transactionc                s   dd | j D }t|  fdd}tjjd}d}tjj| }|j j }t	dd |D }xH| j
jD ]<}	|	j }
x.|
j D ]"}|j |kr|jd |j  qW qjW x|D ]}||j|}qW |j }| j
j| |  d| _d S )	Nc             S   s   g | ]}|j tjjkr|qS r5   )r(  r   r   Z#TransactionItemAction_REASON_CHANGE)rZ   r*  r5   r5   r6   r\     s    z,Base._verify_transaction.<locals>.<listcomp>c                s    |d7 }d k	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   )rZ   r[   r5   r5   r6   r\     s    T)r   rp   r   r#   r   r`   
rpmdb_sackrq   r   r   r   r-  ZgetCompsGroupItemZgetPackagesZgetNameZsetInstalledr   r   r1  r  r+   )r3   r\  Ztransaction_itemsr]  r   rZ  r^  r  namesZtigrI  r*  rW  r5   )r[  r\  r6   rU    s(    

zBase._verify_transactionc                sX  t jj| jj| jj}| tj }tdd |D }tdd |D }	j	j
jdkrnj	t|||	d nj	t|| t jj|||  j rt jj j t fdd|D }
t jjd| j}| jj}|dk}xԈ jo|s|dkr|dkr|d	8 }td
}tj| dd  jD }fdd|D }tdd |D }j	t|| t jj|||  j rt jj j |
t fdd|D 7 }
t jj||i }qW  jrt jjj j}tj| W d Q R X |d k	r||
| |\}}||krT||k rtd}n||kr,td}d|| d  }tj||d |d | d S )Nc             s   s   | ]}|j V  qd S )N)download_size)rZ   ploadr5   r5   r6   r    s    z1Base._download_remote_payloads.<locals>.<genexpr>c             S   s   g | ]}t |tjjr|qS r5   )r,  r   drpmZDeltaPayload)rZ   Zpayloadr5   r5   r6   r\     s    z2Base._download_remote_payloads.<locals>.<listcomp>   )Ztotal_drpmsc             3   s   | ]} j |V  qd S )N)_bandwidth_used)rZ   rb  )rX  r5   r6   r    s   r   r   z,Some packages were not downloaded. Retrying.c             S   s   g | ]}|qS r5   r5   )rZ   r   r5   r5   r6   r\     s    c                s    g | ]}t jj| t jjqS r5   )r   rS   _pkg2payload
RPMPayload)rZ   r   )progressr5   r6   r\     s   c             s   s   | ]}|j V  qd S )N)ra  )rZ   rb  r5   r5   r6   r    s   c             3   s   | ]} j |V  qd S )N)re  )rZ   rb  )rX  r5   r6   r    s    z?Delta RPMs reduced %.1f MB of updates to %.1f MB (%d.1%% saved)zIFailed Delta RPMs increased %.1f MB of updates to %.1f MB (%d.1%% wasted)d   i   r'  )r   r   i   i   )r   r   Zbuild_download_lockr4   r   r   r   sumrp   r  __code__co_argcountrS   Z_download_payloadsZ_irrecoverablerQ   ZDownloadErrorZ_update_savingZ_recoverableretriesr   rM   r   Z
errmap2str)r3   payloadsrc  rh  callback_totalZ	fail_fastr   Zbeg_downloadZest_remote_sizeZ
total_drpmZremote_sizeZsavingrm  Zforeverr   Zremaining_pkgsrealZfullZpercentr5   )rX  rh  r6   _download_remote_payloads  sb    












zBase._download_remote_payloadsc       	         s   | j |\}}|rzdkr$tjj tjj| jj j | j	j
 | jdd |D   fdd|D }| j| | | j	jrxX|D ]P}|jrtjj|j |jjd}ntjj|jj|jjd}tj|| j	j qW 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 | ]}|j  qS r5   )localPkg)rZ   r   r5   r5   r6   r\     s    z*Base.download_packages.<locals>.<listcomp>c                s$   g | ]}t jj| jt jjqS r5   )r   rS   rf  Zdelta_factoryrg  )rZ   r   )rc  rh  r5   r6   r\     s   /)_select_remote_pkgsr   r!   ZNullDownloadProgressrc  Z	DeltaInfor`   rq   r   r4   Zdeltarpm_percentager?   rq  r=   Zbaseurlr   r   r   Zget_local_baseurllocationlstriprS   Zpkgdirshutilcopy)	r3   Zpkglistrh  ro  remote_pkgsZ
local_pkgsrn  r   ru  r5   )rc  rh  r6   download_packages  s"    	

zBase.download_packagesc             C   s   g }|s|S | j j r&tjjtdg }x|D ]}tjj| rhd|krhtj	j
|| j|}| j|g y|j| jj| W q0 tk
r } ztj| |j| W Y d d }~X q0X q0W | jdd |r|rttdjdj||S )NzACannot add local packages, because transaction job already existsz://T)rz   zCould not open: {}r#  )r   Z
req_lengthr   rQ   rc   r   r   r   r   r   Z_urlopen_progressr4   r?   rw   r`   Zadd_cmdline_packager   rM   rd   r   rO   r   )r3   	path_liststrictrh  pkgsZ
pkgs_errorr   rU   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
j|}tj	jj||j }tjj|j }~|dkrd}	d}
n|dkr|rd}	nd}	td| }
n\|dkrd}	td| }
nB|dkr|rd}	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   rB  r   r'  z"Public key for %s is not installedzProblem opening package %srD  z Public key for %s is not trustedrd  zPackage %s is not signed)_from_cmdliner4   Zlocalpkg_gpgcheckr^   r~   ZgpgcheckgpgkeyrY   r   r(   r   initReadOnlyTransactionZ	miscutilsZcheckSigrr  r   r   basenamer   )r3   pocheckZ	hasgpgkeyrS   rootr   Z	sigresultZlocalfnresultr   r5   r5   r6   _sig_check_pkg(  sF    

zBase._sig_check_pkgc             C   s
   | j |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_checkc  s    zBase.package_signature_checkc             C   sl   xf|D ]^}t jj|sqytj| W n& tk
rL   tjtd| wY qX tj	t
jjtd| qW d S )NzCannot remove %sz
%s removed)r   r   r   r   rR  rS  rM   rd   r   r   r   r#   r   )r3   packagesrY  r5   r5   r6   r   r  s    

zBase._clean_packagesrh   c             C   s   |dkr| j j}|dkr*| j|||||S tjj| s<ttj| j||||d}|dksft	|dkrn|dS t
||}tj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_caserm   r   c             S   s
   | j |S )N)Zmerge_lists)abr5   r5   r6   r     s    z(Base._do_package_lists.<locals>.<lambda>)r4   Zshowdupesfromrepos_list_patternr   r   is_string_typeAssertionErrorr   partialrp   mapr   )r3   	pkgnarrowpatternsr  r  rm   Zlist_fnZyghsr5   r5   r6   _do_package_lists  s    

zBase._do_package_listsc       &         s  fddfdd}fdd}t j|d}g }	g }
g }g }g }g }g }g }g }g }|}jj }|d k	rtjj||d}|jjd	d
}|dkri }i }xH|j D ]<}|||j	< |rq|j
|jf}||ks||| kr|||< qW t||j }	||j }|s|jdd}x|D ]}|rN|j	|krB|j| n
|
j| nT|j
|jf}|j	|krr|j| n0||ks|j|| r|
j| n
|j| q W n|dkr||jdd}j|dd}|jddgd |j j }nP|dkrt||j }	n2|dkrB|r||j }|j j }x\|D ]T  j
 jf}|j|g } fdd|D }t|dkr|j  n
|
j  q@W n||j jddj }|j j j }xz|D ]r\} }!|| |!f d  |j| |!fd gd }"|" s
 j|"r|
j  n" j|"r.|j  n
|j  qW n|dkrh||jjj}#|#j }n|dkrfdd|j D }n|dkr|j }$|jj j|$d}j|d	dd}|jddgd g }xl|D ],j}%|jfdd|$j|%d D  qW n6|d!krD|j }|s2|jdd}||j j!j"}|	|_|
|_||_#||_$||_%||_||_&||_"||_||_'|S )"Nc                s    dkrdS j j|  kS )z:Test whether given package originates from the repository.NT)r   rS   )package)rm   r3   r5   r6   is_from_repo  s    z(Base._list_pattern.<locals>.is_from_repoc                s    fdd| D S )z=Filter out the packages which do not originate from the repo.c             3   s   | ]} |r|V  qd S )Nr5   )rZ   r  )r  r5   r6   r    s    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kr| S | j  dS )z=Filter out the packages which do not originate from the repo.N)rm   )r   )rq   )rm   r5   r6   query_for_repo  s    z*Base._list_pattern.<locals>.query_for_repo)iter)r  F)rk   rh   T)Zlatest_per_arch_by_priorityupgrades)Zupgrades_by_priority)upgradesrcnosrc)	arch__neqr   r  c                s   g | ]}|j  j kr|qS r5   )evr)rZ   r   )	avail_pkgr5   r6   r\     s    z&Base._list_pattern.<locals>.<listcomp>r   
autoremoveextrasc                s   g | ]} |r|qS r5   r5   )rZ   r   )r  r5   r6   r\     s    r  )Zobsoletes_by_priority)rd   r  c                s   g | ]} |fqS r5   r5   )rZ   r=  )newr5   r6   r\   .  s    )providesrecent)(r   ZGenericHolderr`   rq   r   rs   rt   rv   r   Zpkgtupr   r   r  r   r  rr   rw   Zevr_gt_merge_update_filterslatestr  r  r   rp   Zevr_eq	_unneededr   swdbr  r   r  extendZ_recentr4   r  reinstall_availableold_availableupdatesobsoletesTuplesr  )&r3   r  patternr  r  rm   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  rm   r3   r6   r    s    














zBase._list_patternc             C   s   |  j |7  _ t|S )N)r   rp   )r3   transr5   r5   r6   _add_comps_transE  s    zBase._add_comps_transc                s   |j  }|sdS |j jjdd}|j fdd|D d}|j|}x|D ]} jj|tjj	 qLW |j
|}|j
|}|rx |D ]} jj| jjd qW 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)rb   c                s    g | ]} j jj|jr|qS r5   )r   r-  Zis_removable_pkgr   )rZ   r[   )r3   r5   r6   r\   U  s    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   rq   Zunneeded_pkgsZunneeded_pkgs_historyZpkg_with_dependent_pkgsr   Zremove_packagesr5   )r3   r6   _remove_if_unneededI  s    




zBase._remove_if_unneededc                s>   j } jjd } fdd} fdd}dd } jj jdd	}|jtj|dd
f|j	tj|dd
f|j
|f|j|ff}x|D ]\}}	x|D ]}
d|
ji}|
jr|jd|i  jj jf |j }|jddgd |s|
j}|
jr|d| 7 }tjtdj| q|	|||
} jjj|
j qW qW  j| d S )Nr   c                s,   t jj j}|j| d  jj|d |S )N)r   )select)r   selectorSelectorr`   r   r   r  )rq   remove_query	comps_pkgr  )r3   r5   r6   trans_upgradeg  s    z1Base._finalize_comps_trans.<locals>.trans_upgradec                s    j jdkrr|js" j| |d q| j j } j| tjj	 j
}|jdj|j|jd  jj|| d nltjj	 j
}|jr|jdj|j|jd n, j jr| j j
j j| d} |j| d  jj|| d |S )Nrh   )r|  z
({} if {}))r  )r  optional)r  )r   )r4   multilib_policyZrequires_install_multiarchr   rx   _report_already_installedr   r  r  r`   r   rO   r   r   installr  ru   rq   rr   )rq   r  r  r|  rV  r  )r3   r5   r6   trans_installm  s     
z1Base._finalize_comps_trans.<locals>.trans_installc             S   s   |j | }|S )N)ru   )rq   r  r  r5   r5   r6   trans_remove  s    
z0Base._finalize_comps_trans.<locals>.trans_removeT)ri   )r|  Fr   r   r  r  )r  .zNo match for group package "{}")r   r4   rX   r`   rq   rr   r  r   r  install_optr  r   r   Zbasearchonlyr<   rx   rM   rd   r   rO   r   Zgroup_membersr   r  )r3   r  r   r  r  r  r  Zattr_fnattrrY  r  Z
query_argsr  Zpackage_stringr5   )r3   r6   r  c  s4    

zBase._finalize_comps_transc                s     fdd}t jj j j|S )Nc                sN    j j j j| d}|sd S y jjj|d S  tk
rH   tj	j
S X d S )N)r   r   )r`   rq   r   rr   r   r(   r   AttributeErrorr   r   ZTransactionItemReason_UNKNOWN)Zpkgnamer  )r3   r5   r6   	reason_fn  s    z+Base._build_comps_solver.<locals>.reason_fn)r   r   ZSolverr   r   )r3   r  r5   )r3   r6   r    s    	zBase._build_comps_solverc             C   sX   t jj|st| j }t|ts.tjj	|}|j
|||p>t ||}|sNdS | j|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  r  r,  r   r   r   listToCompsPackageTypeZ_environment_installr   r  )r3   env_idtypesexcluder|  exclude_groupsr   r  r5   r5   r6   environment_install  s    
zBase.environment_installc             C   s,   t jj|st| j }|j|}| j|S )N)r   r   r  r  r  Z_environment_remover  )r3   r  r   r  r5   r5   r6   environment_remove  s    
zBase.environment_removec       
         s   fdd t jj|std}|rB fdd|D }tjj|}j }t|t	s`t
jj|}|j||||}|sxdS |r|j}	n|j}	tjtd||	 j|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j| r, jj j| d}tdd |S | fS d S )N)
name__globc             S   s   | j S )N)r   )rI  r5   r5   r6   r     s    zABase.group_install.<locals>._pattern_to_pkgname.<locals>.<lambda>)r   r   is_glob_patternr`   rq   rr   r  )r  r  )r3   r5   r6   _pattern_to_pkgname  s    z/Base.group_install.<locals>._pattern_to_pkgnameNc                s   g | ]} |qS r5   r5   )rZ   rI  )r  r5   r6   r\     s    z&Base.group_install.<locals>.<listcomp>r   z#Adding packages from group '%s': %s)r   r   r  r  	itertoolschainfrom_iterabler  r,  r   r   r   r  Z_group_installr  r  rM   rN   r   r  )
r3   grp_idZ	pkg_typesr  r|  Zexclude_pkgnamesZnested_excludesr   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}x|D ]}	y|j|	}
W n: tjj	k
rv } zt
jt| d}w*W Y d d }~X nX x2|
jD ](}| s||kr|| j||||d7 }qW x&|
jD ]}|| j|||||d7 }qW q*W | r|rtjjtd|S )Nr   TF)r  r|  )r  r|  r  zNothing to do.)r   r   r   ENVIRONMENTSGROUPS	AVAILABLEr   r   rQ   r   rM   r5  r
   groupsr  environmentsr  rc   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j|st| j }|j|}| j|S )N)r   r   r  r  r  Z_group_remover  )r3   r  r   r  r5   r5   r6   group_remove  s    
zBase.group_removec             C   s   t | j| jt jt jB t j}y|j| }W nF tjj	k
rp } z&t
jdt| tjjtdW Y d d }~X nX d}x|jD ]}|| j|7 }q~W x|jD ]}|| j|7 }qW |S )NzWarning: %szNo groups marked for removal.r   )r   r   r   r  r  	INSTALLEDr   r   rQ   r   rM   r5  r
   rc   r   r  r  r  r  )r3   r  r  r  r  r  r.  grpr5   r5   r6   env_group_remove  s    

"zBase.env_group_removec       
       C   sL  t | j| jt jt jB t j}d}x
|D ] }y|j|}W n6 tjj	k
rr } zt
jt| w(W Y d d }~X nX xX|jD ]N}y| j| d}W q| tjj	k
r } zt
jt| w|W Y d d }~X q|X q|W xZ|jD ]P}y| j| d}W q tjj	k
r$ } zt
jt| wW Y d d }~X qX qW q(W |sHtd}	tjj|	d S )NFTzNo group marked for upgrade.)r   r   r   r  r  r  r   r   rQ   r   rM   r5  r
   r  environment_upgrader  group_upgrader   r   ZCliError)
r3   r  r  Zgroup_upgradedr  r  r  r.  r  r   r5   r5   r6   env_group_upgrade  s6    



zBase.env_group_upgradec             C   s,   t jj|st| j }|j|}| j|S )N)r   r   r  r  r  Z_environment_upgrader  )r3   r  r   r  r5   r5   r6   r  9  s    
zBase.environment_upgradec             C   s,   t jj|st| j }|j|}| j|S )N)r   r   r  r  r  Z_group_upgrader  )r3   r  r   r  r5   r5   r6   r  @  s    
zBase.group_upgradec             C   s   | j jd }tjj|rdS | j j}tjjj	|d}|j
tjtjB   |jdd}t|}~~|dkrldS tjj|}tjj|stj| t|d}|j  ~dS dS )	zChecks 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   rY   r   r(   r   r  r   _RPMVSF_NOSIGNATURES_RPMVSF_NODIGESTSZdbMatchrp   dirnamemakedirsopenr9   )r3   ZgpgkeyscheckedrY   ZmytsidxkeysZmydirZfor5   r5   r6   _gpg_key_checkG  s&    

zBase._gpg_key_checkc       	      C   s   | j |\}}| j| x~|D ]v}tjj| j}| jj j|d}| jj	rb|j
| jj j|d}|j|d}|d k	r|j|d}| jj|| d qW t|S )N)r   )r  )rm   )r  r  )r	  r  r   r  r  r`   rq   rr   r4   r  ru   r   r   r  rp   )	r3   rq   rm   r|  already_instr  r  r  r  r5   r5   r6   r  e  s    

zBase._install_multiarchc             C   s,   t j }t j }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_specss  s
    

zBase._categorize_specsc                sd   dd |j D   fdd|j D }| jj j|d}| jj j d}| jj| | jj| d S )Nc             S   s   g | ]}t jj|r|qS r5   )r   r   r  )rZ   r  r5   r5   r6   r\     s    z/Base._exclude_package_specs.<locals>.<listcomp>c                s   g | ]}| kr|qS r5   r5   )rZ   r  )glob_excludesr5   r6   r\     s    )r   )r  )	pkg_specsr`   rq   r   ry   )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 }x|D ]}y|j|}W n8 t	j
jk
rx } ztjdt| w.W Y d d }~X nX |j|j |j|j x8|jD ].}| jj|}x|j D ]}	|j|	j qW qW q.W t|S )NzWarning: Module or %s)r   r   r   r   r  r  r  r  r   r   rQ   r   rM   r5  r
   r<   r  r  Z_environment_by_idZgroups_iterr   rP   r  )
r3   group_specsr  r  r  r  r  Zenvironment_idZenvironmentr-  r5   r5   r6   _expand_groups  s"    


zBase._expand_groupsc             C   s   x|D ]x}yL| j j}d|kr<|jd}|d }|d jd}| j|g|||j|j W q tjjk
r|   |j	d|  Y qX qW d S )Nrs  r   r   ,@)
r4   Zgroup_package_typessplitr  r  	grp_specsr   rQ   rc   rw   )r3   r  r  Zskippedr|  Z
group_specr  r  r5   r5   r6   _install_groups  s    

zBase._install_groupsc             C   s  |d krg }g }g }g }g }	| j ||\}
}| j| xd|
jD ]Z}y| j||||d W q> tjjk
r } ztjt	| |j
| W Y d d }~X q>X q>W g }f }to|
jrLy tjjj| }|j|
j| W nx tjjk
rH } zV|jr
x|jD ]}|j
| qW |jr2x|jD ]}|j
d|  qW |j}W Y d d }~X nX n|
j}|rv| j|j|_| j|||| |s|s|s|	s|rtjj||||	|dd S )N)rm   r|  formsr  )no_match_group_specserror_group_specsno_match_pkg_specserror_pkg_specsmodule_depsolv_errors)r  r  r  r  r   rQ   MarkingErrorrM   r5  r   rw   ro   r  re   rf   Z
ModuleBaseZMarkingErrorsr  r  r  r   r  )r3   r  r  rm   r|  r  r  r  r	  r
  r  r  specrU   Zno_match_module_specsr  rf   Ze_specr5   r5   r6   r    sN    
 zBase.install_specsc       
      C   s   t jj|}|j| j|dd}| jjdks4|j|rr|d }|dk	rP|j|d |sb| j	||| | j
|||dS | jjdkr|j| || jj|d	|d
}|s| j	||| x|D ]}	| jj|	| d qW dS dS )z@Mark package(s) given by pkg_spec and reponame for installation.F)r  with_srcrh   rq   N)rm   )rm   r|  r  T)r  r  rm   reportssolution)r  r  r   r   )r   rs   rt   get_best_solutionr`   r4   r  Z_is_arch_specifiedrr   _raise_package_not_found_errorr  _get_best_selectorsr  r   r  )
r3   pkg_specrm   r|  r  r|   r  r  sltrsr  r5   r5   r6   r    s,    
zBase.installc             C   s   |j rd}t|| jj j j|j|jdgd}|shtd}t	j
||j tjjtd|j |jn\t|d |krtjj| j}|j|gd | jj|| d d	S td
}t	j
||j dS d S )Nz-downgrade_package() for an installed package.noarch)r   r   z.Package %s not installed, cannot downgrade it.zNo match for argument: %sr   )r   )r  r  r   zCPackage %s of lower version already installed, cannot downgrade it.)_from_systemNotImplementedErrorr`   rq   r   rr   r   r   r   rM   rd   r   rQ   r  ru  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|j|j}| j|\}}||kr>| j|g nT|tj	j
|krdtjjtd|jn.tjj| j }|j|gd | jj|| d dS )NzNo match for argument: %s)r   )r  r  r   )r`   rq   _nevrar   r  r   r	  r  r  r  r  r   rQ   PackageNotFoundErrorr   ru  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|j|jdr0| jj| dS t	d}t
j|t| tjjt	d|j |jd S )N)r   r  r   r   z.Package %s not installed, cannot reinstall it.zNo match for argument: %s)r`   rq   r   rr   r   r  r   r   r  r   rM   rd   r   r   rQ   r  ru  )r3   r   r   r5   r5   r6   package_reinstall(  s     zBase.package_reinstallc             C   s   | j j| dS )Nr   )r   r  )r3   r   r5   r5   r6   package_remove0  s    zBase.package_removec             C   s`  |j rd}t||jdkr6td}tj||j dS | jj j	 j
 }| jjr| jj j|gdj|drtj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||j tjjtd|j |jnZt|d |k rBtjj| j}|j|gd | jj|d dS td}tj||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   r  )r   )r   r   z+Package %s not installed, cannot update it.zNo match for argument: %szHThe same or higher version of %s is already installed, cannot update it.r   )r  r  r   r   rM   r   ru  r`   rq   r   rx   r4   r  rr   r   r  r  r   r   r  r   r   rd   rQ   r  r  )r3   r   r   r   r  r  r5   r5   r6   package_upgrade4  s:    
$
zBase.package_upgradec       	      C   s   | j j j }|j| j j jdd |D d}|j }|rf| j j j j|j|j d}|j|}|d k	rz|j|d | j||dd}|r|j|j	 j
dd |D d}tjj| j }|j|d	 | jj|d
 dS )Nc             S   s   g | ]
}|j qS r5   )r   )rZ   r   r5   r5   r6   r\   \  s    z*Base._upgrade_internal.<locals>.<listcomp>)r   )r  )rm   T)r  r  c             S   s   g | ]
}|j qS r5   )r   )rZ   r   r5   r5   r6   r\   x  s    )r   )r  r   )r`   rq   r   r  rr   r  ru   r  r  r  r   r   r  r  r   r   r  )	r3   rq   r  rm   r  Zinstalled_allr  rV  r  r5   r5   r6   _upgrade_internalY  s     "
 zBase._upgrade_internalc             C   st  t jj|}|j| j}|d }|rZt jj|}| oH|d oH|d jr*|d j}| jj j	 j
 }| jjr||j|dn| jj jdd}	|	s*|j|dj
 }
|
std}tj|| t jjtd| |nV|d jot jj|d j r*|
j|d jd	s*td
}tj|dj||d j | jjoH|d oH|d j }| j||||S t jjtd| |d S )Nrq   nevra)r  T)ri   )r   z(Package %s available, but not installed.zNo match for argument: %s)r   z?Package %s available, but installed for different architecture.z{}.{})r   rs   rt   r  r`   r   r  r   rq   r   rx   r4   r  r   rr   r   rM   rd   rQ   PackagesNotInstalledErrorr   rO   Zhas_just_namer!  r  )r3   r  rm   r|   r  r  Zwildcardpkg_namer   Z
obsoletersZinstalled_namer   r  r5   r5   r6   r    s0    
& zBase.upgradec             C   s   | j | jj | jj|d dS )N)r  )r!  r`   rq   r4   r  )r3   rm   r5   r5   r6   upgrade_all  s    zBase.upgrade_allc             C   s   |d kr| j j  nxtjj|}|j| jdd}|d jtj	d |j
| || jjdd}|sptjtd| dS x|D ]}| j j|d	 qvW d
S )NF)r  rq   )reponame__neqT)r  r  r  zNo package %s installed.r   )r  r   )r   Zdistupgrade_allr   rs   rt   r  r`   rr   rK   ZSYSTEM_REPO_NAMEr  r4   r  rM   r   r   Zdistupgrade)r3   r  rs   r  r  r  r5   r5   r6   distro_sync  s    
zBase.distro_syncc             C   s   t |||gr||7 }d}|rF|rFx4|D ]}td}tj|| q(W n|rX| j|rXd}xX|D ]P}y| j||d W n4 tjjk
r }	 ztj	t
|	 W Y dd}	~	X q^X d}q^W |stjtd n4| jj j| jj| jjd}
x|
D ]}| j| qW dS )zRemoves 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)r  NzNo packages marked for removal.)rb   )anyr   rM   rd   r  r   r   rQ   r  r   r   r`   rq   r  r   r  r4   rb   r  )r3   r  r  r  	filenamesr  Zgrp_specr   r  rU   r}  r   r5   r5   r6   r    s,    


 
zBase.autoremovec                sp   t jj|jj|d} fdd|j D }|sBj||  jj}x|D ]}j	j
||d qPW t|S )z'Mark the specified package for removal.)r  c                s(   g | ] } d ks j j| kr|qS )N)r   rS   )rZ   r   )rm   r3   r5   r6   r\     s    zBase.remove.<locals>.<listcomp>)r  )r   rs   rt   rv   r`   r   "_raise_package_not_installed_errorr4   r  r   r  rp   )r3   r  rm   r  r
  r   r  r   r5   )rm   r3   r6   r     s    
zBase.removec                s  t jj|}|jj} fdd|j D }|j }	|d k	rL|	j|d |d k	r`|	j|d t jj	|	}
|st j
jd||
j d}jj}x\|D ]T}y|
t| }W n* tk
r   |swjj||d Y nX jj| |d7 }qW |dkrt j
jd|||S )	Nc                s(   g | ] } d ks j j| kr|qS )N)r   rS   )rZ   r   )old_reponamer3   r5   r6   r\     s    z"Base.reinstall.<locals>.<listcomp>)rm   )r&  zno package matchedr   )r  r   )r   rs   rt   rv   r`   r   r  rr   rq   Z_per_nevra_dictrQ   r#  r   r4   r  r
   KeyErrorr   r  r  ZPackagesNotAvailableError)r3   r  r+  Znew_reponameZnew_reponame_neqZ	remove_nar|   r  r  Zavailable_qZavailable_nevra2pkgr  r  Zinstalled_pkgZavailable_pkgr5   )r+  r3   r6   	reinstall  s6    


zBase.reinstallc             C   s
   | j |S )zMark a package to be downgraded.

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

        )downgrade_to)r3   r  r5   r5   r6   	downgrade	  s    zBase.downgradec             C   s  t jj|}|j| j}|s6td| }t jj||d}|j }t	|j
 j }| jj j j|d}	t|	dkrtd| }t jj|||xn|	j
 j D ]^}
|j j|
d}|std}tj||
 qt jj| j}|j|d | jj|| d d}qW |S )	zDowngrade to specific version if specified otherwise downgrades
        to one version lower than the package installed.
        zNo match for argument: %sr   )r   z6Packages for argument %s available, but not installed.zDPackage %s of lowest version already installed, cannot downgrade it.)r   )r  r  r   )r   rs   rt   rv   r`   r   rQ   r  r  r  
_name_dictr  rq   r   rr   rp   r#  Z
downgradesr   rM   rd   r  r  r   r   r  )r3   r  r|  r|   r  r   r  Zavailable_pkgsZavailable_pkg_namesZq_installedr$  Zdowngrade_pkgsr  r5   r5   r6   r.  	  s.    zBase.downgrade_toc                s   | j j j d}|r | gfS tjj| j  }|r>| gfS  jdsR jdr^d  g}n& jdrr| gfS  fddd
D }| j j j|d|fS )N)Z
file__glob/bin//sbin/z/usrrs  c                s   g | ]}|  qS r5   r5   )rZ   prefix)provides_specr5   r6   r\   E	  s   z!Base.provides.<locals>.<listcomp>	/usr/bin/
/usr/sbin/)r1  r2  r5  r6  )r`   rq   rr   r   Z_by_provides
startswith)r3   r4  Z	providersZbinary_providesr5   )r4  r6   r  6	  s    




zBase.providesc       
      C   s   ddd}||krt d|| }|rDd| }	| jj|	t j| |rfd| }	| jj|	t j| |rd| }	| jj|	t j| |rd| }	| jj|	t j| |rd	| }	| jj|	t j| 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  r9  ZbugzillaZcvesZseverityZcmp_dictZcmpr  r5   r5   r6   add_security_filtersI	  s&    
zBase.add_security_filtersc             C   s
   i | _ dS )z,
        Reset all security filters
        N)r/   )r3   r5   r5   r6   reset_security_filtersn	  s    zBase.reset_security_filtersc             C   s>  | j p
| j s| r|S | jj jdd}| jrRx| jD ]}|j|}q8W |g| _| j rx<| j j D ].\}}|rx|d }||i}	|j|jf |	}qdW |j|}|s:|r:|j	 }t
|j j }
|
dkr:|dkrtdj|
}tdj|
}tjt|||
 n2tdj||
}td	j||
}tjt|||
 |S )
z
        Merge Queries in _update_filters and return intersection with q Query
        @param q: Query
        @return: Query
        T)ri   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.   r`   rq   rr   ru   itemsr   r  r  rp   r0  r  r   rO   rM   rd   r	   )r3   r  r  rd   r  Zmerged_queriesrq   Zfilter_namer   kwargsrZ  Zmsg1Zmsg2r5   r5   r6   r  u	  s>    


zBase._merge_update_filtersc          
      s   j rtd}t|  | j j j| jk}|r:g nj} fdd}d}| jjj x |D ]}	t	j
j|	}
x |
D ]}tj| j|j|jdkrtd}tj||	|j q| jjrt	jjj|j|j}t	jjj|}tjt	jj|| |	|_| jjrt	j
j|| nt	j
j | d}| jj!r:d}n| jj"r| jjr|t	jj#j$t	jj#j%fkrd}tjt	jj&td nd}tjt	jj&td	 nd}n<|r| |j|j|	|j'|jd
}n|r| |j|j}|sd}q| jj(t)j*}|r| jj+ }| jj,|t)j*  | jj-tj.|j}|rD| jj,| |dkrjtd| }t	j/j0||tjtd d}qW qhW | r|rt	j/j0td|stdj1 }t	j/j0||| j2 \}}|dkr|rtd}tj| t3|}t	j/j0||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j 7 } | S )Nz. Failing package is: %sz
 zGPG Keys are configured as: %sz, )r   r   r  )r   )r  rS   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 keyszThe 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   r^   r~   rP   r1   r  r   r   ZcryptoZretriever   ZkeyInstalledr   Zrpm_idrC  rM   r   Zshort_idr4   r   r   ZKeyInfoZfrom_rpm_key_objectr@  Zraw_keyZDNSSECKeyVerificationZverifyZnice_user_msgurlZlog_dns_key_importZlog_key_importZassumenoZ	assumeyesZValidityZVALIDZPROVEN_NONEXISTENCEZany_msgrB  r9  r(   r:  Z
getTsFlagsr   ZpgpImportPubkeyZ
procgpgkeyrQ   rc   r   r  r
   )r3   r  askcb	fullaskcbr   Zkey_installedZkeyurlsr?  Zuser_cb_failrA  r  r   Zdns_input_keyZ
dns_resultZrcZ	test_flagZ
orig_flagsr  errmsgr5   )r  rS   r6   _get_key_for_package	  s    








zBase._get_key_for_packagec             C   s   | j ||| 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)rH  )r3   r   rE  rF  r5   r5   r6   package_import_key$
  s    zBase.package_import_keyc             C   s4   g }| j j  x | j j D ]}|jt| qW |S )N)r   r  Zproblemsrw   r
   )r3   resultsZprobr5   r5   r6   r4  5
  s
    
zBase._run_rpm_checkw+bc             K   s   t jj|| j||f|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   rD  rS   moder>  r5   r5   r6   urlopen@
  s    zBase.urlopenc             C   s,   |d kr| j jtjd}|j| jjd}|S )N)r   )r  )r   rq   rK   r   r   r4   r   )r3   r  Zinstallonlyr5   r5   r6   r   H
  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jtdj	|d d j d S )	NT)r  F)rj   rk   rl   rq   r"  r   z  * Maybe you meant: {})
r   rs   rt   r  r`   r   rM   r   r   rO   )r3   r  r|   r  r5   r5   r6   _report_icase_hintN
  s    

zBase._report_icase_hintc             C   s   dd }g }g }x6|D ].}|j  r:|jtjkrD|j| q|j| qW td}|||sjtjjtd| j	j
rtd}|||stj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   sx   d}xn| D ]f}d}y|j  }W n0 tk
rN } ztjt| W Y d d }~X nX |dk	r
tj|j||j d}q
W |S )NTF)ZverifyLocalPkgrL   rM   r   r   rO   rm   )Zpkg_listZ
logger_msgZall_packages_verifiedr   Zpkg_successfully_verifiedrU   r5   r5   r6   _verification_of_packages]
  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_pkgrm   rK   ZCMDLINE_REPO_NAMErw   r   r   rQ   rc   r4   r   )r3   Zinstall_pkgsrO  ry  Zlocal_repository_pkgsr   r   r5   r5   r6   rt  V
  s&    




zBase._select_remote_pkgsc             C   s   x|D ]}t | qW d S )N)_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| j |d|d}|d k	rH|d j|d |d sdtj	j
td|nB| j jtjd}|d j|}|rtd}ntd}tj	j
||d S )	N)r   F)r  r  rq   rq   )rm   zNo match for argumentz?All matches were filtered out by exclude filtering for argumentz?All matches were filtered out by modular filtering for argument)r`   rq   rK   r   r   rs   rt   r  rr   rQ   r  r   ZIGNORE_REGULAR_EXCLUDESr  )	r3   r  r  rm   	all_queryrs   r  Zwith_regular_queryr   r5   r5   r6   r  
  s    
z#Base._raise_package_not_found_errorc       	         s   j jtjdj }tjj|}|jj |d|d}|d sNtj	j
td| d k	rp fdd|d D }n|d }|std}ntd	}tj	j
||d S )
N)r   F)r  r  rq   rq   zNo match for argumentc                s    g | ]}j j| kr|qS r5   )r   rS   )rZ   r   )rm   r3   r5   r6   r\   
  s    z;Base._raise_package_not_installed_error.<locals>.<listcomp>zCAll matches were installed from a different repository for argumentz?All matches were filtered out by exclude filtering for argument)r`   rq   rK   r   r   r   rs   rt   r  rQ   r#  r   )	r3   r  r  rm   rQ  rs   r  r   r   r5   )rm   r3   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   )r3   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 |}| rl|rlt	j
j|j }tj| 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 )zreturns set of conflicting packages and set of packages with broken dependency that would
        be additionally installed when --best and --allowerasingTF)r  r  Zignore_weak)r  c             S   s   t j| j| j| j| j| jdS )N)r   epochversionreleaser   )rK   ZNEVRAr   rS  rT  rU  r   )itemr5   r5   r6   r  
  s    z&Base._skipped_packages.<locals>._nevrac                s   g | ]} |qS r5   r5   )rZ   r*  )r  r5   r6   r\   
  s    z*Base._skipped_packages.<locals>.<listcomp>c                s   g | ]} |kr|qS r5   r5   )rZ   r   )r  transaction_nevrasr5   r6   r\   
  s    c                s   g | ]} |kr|qS r5   r5   )rZ   r   )r  rW  r5   r6   r\   
  s    )r   ZactionsrK   INSTALLZUPGRADEZUPGRADE_ALLr   r0   r  r   r   r  r  rM   rd   r   problem_conflictsZproblem_broken_dependency)r3   Zreport_problemsr   r  ZngZparamsr  r   rY  Zproblem_dependencyZskipped_conflictsZskipped_dependencyr5   )r  rW  r6   _skipped_packages
  s(    


zBase._skipped_packages)N)F)F)TT)T)N)FFF)F)F)N)T)NN)TN)rh   NNFN)N)NTN)NT)TNN)NT)T)NNTN)NTN)F)T)N)N)N)N)NNNN)NN)NNNF)F)NTF)NN)NN)NrK  )N)__name__
__module____qualname__r7   r8   r:   r;   r?   rV   staticmethodr   rg   r   r   propertyr   r4   r^   deleterr   r   Zlazyattrr   r`   ra   r   setterr   r   r   r   r   r   r   r   r   r9   r   r   r   r(   ZRPMTRANS_FLAG_NOSCRIPTSZRPMTRANS_FLAG_NOTRIGGERSZRPMTRANS_FLAG_NODOCSr:  ZRPMTRANS_FLAG_JUSTDBZRPMTRANS_FLAG_NOCONTEXTSZRPMTRANS_FLAG_NOFILEDIGESTr   r/  r   r  r  r   r   r   r   r   r   r  r	  r  r  r  r!  rA  r8  rL  r;  rU  rq  rz  r~  r  r  r   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r  r  r  r  r  r  r  r   r!  r  r%  r'  r  r   r-  r/  r.  r  r;  r<  r  rH  rI  r4  rM  r   rN  rt  r  r  r*  rR  rZ  r5   r5   r5   r6   r   [   s   
	
=
	
8
;
>

=


	
'\
8l"]
*
B

; 
)
 =

*



/


%
&


# &
%) -r   c             C   s    t | }td}tj|| d S )Nz Package %s is already installed.)r
   r   rM   r   )r   r   r   r5   r5   r6   rP  
  s    rP  )H__doc__Z
__future__r   r   r   r   r  r   Zlibdnf.transactionr   rx  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_basero   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   rK   r  r#   rH  r   r   rE  r(   r   rw  Z	getLoggerrM   objectr   rP  r5   r5   r5   r6   <module>   s   

                     