???<!-- GIF89;a -->
123123123123
.....................................................................................................................................???<!-- GIF89;a -->
123123123123
.....................................................................................................................................3
gV%                 @   s   d dl mZ d dl mZ d dl mZ d dlZd dlZd dl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mZ ejdZdZG dd	 d	eZG d
d deZdd Zdd Zdd Zdd Zdd ZdS )    )absolute_import)print_function)unicode_literalsN)_dnfzdnf.plugin.dynamicc               @   s\   e Zd ZdZdZdZedd Zdd Zdd	 Z	d
d Z
dd Zdd Zdd Zdd ZdS )Pluginz5The base class custom plugins must derive from. #:apiz	<invalid>Nc                s   t jj }| jr| jn| j  fdd|jD }xb|D ]Z}tjj|r6y|j	| W q6 t
k
r } ztjjtdt| W Y d d }~X q6X q6W |S )Nc                s   g | ]}d | f qS )z
%s/%s.conf ).0path)namer   /usr/lib/python3.6/plugin.py
<listcomp>9   s    z&Plugin.read_config.<locals>.<listcomp>zParsing file failed: %s)libdnfconfZConfigParserconfig_namer   Zpluginconfpathosr
   isfileread	Exceptionr   
exceptionsZConfigErrorr   str)clsr   parserfilesfileer   )r   r   read_config4   s    

.zPlugin.read_configc             C   s   || _ || _d S )N)basecli)selfr   r   r   r   r   __init__B   s    zPlugin.__init__c             C   s   d S )Nr   )r   r   r   r   
pre_configG   s    zPlugin.pre_configc             C   s   d S )Nr   )r   r   r   r   configK   s    zPlugin.configc             C   s   d S )Nr   )r   r   r   r   resolvedO   s    zPlugin.resolvedc             C   s   d S )Nr   )r   r   r   r   sackS   s    zPlugin.sackc             C   s   d S )Nr   )r   r   r   r   pre_transactionW   s    zPlugin.pre_transactionc             C   s   d S )Nr   )r   r   r   r   transaction[   s    zPlugin.transaction)__name__
__module____qualname____doc__r   r   classmethodr   r    r!   r"   r#   r$   r%   r&   r   r   r   r   r   .   s   r   c               @   s~   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dddZ
dd Zdd Zdd Zdd Zdd Zdd ZdS )Pluginsc             C   s   g | _ g | _d S )N)
plugin_clsplugins)r   r   r   r   r    a   s    zPlugins.__init__c             C   s   | j   d S )N)_unload)r   r   r   r   __del__e   s    zPlugins.__del__c             C   s~   xx| j D ]n}yt||  W q tjjk
r6    Y q tk
rt   tj \}}}tj	|||}t
jdj| Y qX qW d S )N )r.   getattrr   r   Errorr   sysexc_info	tracebackformat_exceptionloggerZcriticaljoin)r   methodpluginexc_type	exc_valueexc_tracebackZexcept_listr   r   r   _callerh   s    zPlugins._callerc                sx   xr| j dd D ]`}|j t fdd|D r2q|j|}|jdo^|jddo^|jdd }|r| j j| qW dS )zwChecks whether plugins are enabled or disabled in configuration files
           and removes disabled plugins from listNc             3   s   | ]}t j  |V  qd S )N)fnmatch)r	   pattern)r   r   r   	<genexpr>x   s    z)Plugins._check_enabled.<locals>.<genexpr>mainZenabled)r-   r   anyr   Zhas_sectionZ
has_optionZ
getbooleanremove)r   r   enable_pluginsZplug_clsr   Zdisabledr   )r   r   _check_enableds   s    

zPlugins._check_enabledc             C   s   t tjkrtdtjjt  tjt < }g |_t|j	||}t
|| t dd | _| j|| t| jdkrtdd | jD }tjtddj| dS )z)Dynamically load relevant plugin modules.zload_plugins() called twiceNr   c             s   s   | ]}|j V  qd S )N)r   )r	   r;   r   r   r   rB      s    z Plugins._load.<locals>.<genexpr>zLoaded plugins: %sz, )DYNAMIC_PACKAGEr4   modulesRuntimeErrorr   Zpycomp
ModuleType__path___get_plugins_filesZ
pluginpath_import_modules_plugin_classesr-   rG   lensortedr8   debugr   r9   )r   r   ZskipsrF   packager   namesr   r   r   _load   s    

zPlugins._loadc             C   s   | j d d S )Nr!   )r?   )r   r   r   r   _run_pre_config   s    zPlugins._run_pre_configc             C   s   | j d d S )Nr"   )r?   )r   r   r   r   _run_config   s    zPlugins._run_configNc             C   s*   x$| j D ]}|||}| jj| qW d S )N)r-   r.   append)r   r   r   Zp_clsr;   r   r   r   	_run_init   s    
zPlugins._run_initc             C   s   | j d d S )Nr$   )r?   )r   r   r   r   run_sack   s    zPlugins.run_sackc             C   s   | j d d S )Nr#   )r?   )r   r   r   r   run_resolved   s    zPlugins.run_resolvedc             C   s   | j d d S )Nr%   )r?   )r   r   r   r   run_pre_transaction   s    zPlugins.run_pre_transactionc             C   s   | j d d S )Nr&   )r?   )r   r   r   r   run_transaction   s    zPlugins.run_transactionc             C   s&   t tjkr"tjtjjd tjt = d S )NzPlugins were unloaded.)rH   r4   rI   r8   logr   loggingZDDEBUG)r   r   r   r   r/      s    
zPlugins._unloadc             C   s   |j s
dS t }x| jD ]}||tj|j< qW t|j }t }x |j D ]}|j|j	|j
 qJW |sldS x|jD ]}|j|j
 qtW x|D ]}| jj||  qW dS )zH
        Unload plugins that were removed in the `transaction`.
        N)Z
remove_setdictr.   inspectZgetfile	__class__setkeysupdateintersectionr   Zinstall_setdifference_updaterE   )r   r&   r.   r;   Zplugin_filesZerased_plugin_filesZpkgZplugin_filer   r   r   unload_removed_plugins   s    
zPlugins.unload_removed_plugins)N)r'   r(   r)   r    r0   r?   rG   rU   rV   rW   rY   rZ   r[   r\   r]   r/   rh   r   r   r   r   r,   `   s   
r,   c               C   s   t j S )N)r   __subclasses__r   r   r   r   rO      s    rO   c             C   s   x|D ]}t jj|\}}| jj| t jj|\}}d| j|f }ytj|}W q t	k
r } z,t
jtd|| t
jtjjddd W Y d d }~X qX qW d S )Nz%s.%szFailed loading plugin "%s": %sr1   T)r5   )r   r
   splitrL   rX   splitextr'   	importlibimport_moduler   r8   errorr   r^   r   r_   ZSUBDEBUG)rS   Zpy_filesfnr
   moduleZextr   r   r   r   r   rN      s    
rN   c             C   sJ  g }t |}t |}t  }t  }x| D ]}xtjd| D ]}tjjtjj|\}}	d}
d}xN|D ]F}t||rd|j| d}
x$|D ]}t||rd}
|j| qW d}qdW |sx |D ]}t||r|j| qW |
r:|j| q:W q&W |j	|}|rt
jtdjdjt| |j	|}|rFt
jtdjdjt| |S )Nz%s/*.pyTFz=No matches found for the following enable plugin patterns: {}z, z>No matches found for the following disable plugin patterns: {})rc   globr   r
   rk   basename_plugin_name_matches_patternaddrX   
differencer8   Zwarningr   formatr9   rQ   )pathsZdisable_pluginsrF   r.   Zpattern_enable_foundZpattern_disable_foundpro   plugin_nameZdummyZmatchedZenable_pattern_testedZpattern_skipZpattern_enableZenable_not_foundZdisable_not_foundr   r   r   rM      sD    









rM   c                s*   t | | jddf}t fdd|D S )z
    Checks plugin name matches the pattern.

    The alternative plugin name using dashes instead of underscores is tried
    in case of original name is not matched.

    (see https://bugzilla.redhat.com/show_bug.cgi?id=1980712)
    r   -c             3   s   | ]}t j | V  qd S )N)r@   )r	   r   )rA   r   r   rB     s    z/_plugin_name_matches_pattern.<locals>.<genexpr>)rc   replacerD   )ry   rA   Z	try_namesr   )rA   r   rs     s    
rs   c                s<    fdd}t t jd tjf| jd d}| _ S )z5A class decorator for automatic command registration.c                s   |r|j   d S )N)register_command)r   r   r   )command_classr   r   r      s    z"register_command.<locals>.__init__r   r   )r    r   )typer   r'   r   r   aliasesZ_plugin)r}   r    Zplugin_classr   )r}   r   r|     s    r|   )Z
__future__r   r   r   r@   rq   rl   ra   r_   operatorr   r4   r6   r   Zdnf.loggingr   Z
dnf.pycompZdnf.utilZdnf.i18nr   Z	getLoggerr8   rH   objectr   r,   rO   rN   rM   rs   r|   r   r   r   r   <module>   s2   
2k%