509318396
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
3
©ft`—O  ã               @   sv  d dl mZ d dl mZ d dl mZ ddlmZmZ d dlmZ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Zd dlZd dlZd dlZd dlZd dlZejdƒZe
j ƒ j!d	krþe
j ƒ j!ndZ"e"j#ƒ Z$d
d„ Z%d^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d„ Z.dd „ Z/d!d"„ Z0d#d$„ Z1d%d&„ Z2d'd(„ Z3d)d*„ Z4d+d,„ Z5d-d.„ Z6d/d0„ Z7d1d2„ Z8d3d4„ Z9d5d6„ Z:d7d8„ Z;d9d:„ Z<d;d<„ Z=d=d>„ Z>d?d@„ Z?dAdB„ Z@dCdD„ ZAd`dFdG„ZBdHdIejCfdJdK„ZDdLdM„ ZEdNdO„ ZFdPdQ„ ZGdRdS„ ZHG dTdU„ dUeIƒZJG dVdW„ dWeKƒZLG dXdY„ dYeMƒZNdZd[„ ZOd\d]„ ZPdS )aé    )Úprint_function)Úabsolute_import)Úunicode_literalsé   )ÚPY3Ú
basestring)Ú_ÚucdNÚdnfZyumc             C   sÀ   t | dg ƒ t | dg ƒ t | dg ƒ tƒ }x�|D ]ˆ}||kr>q0|j|ƒ tjjj|ƒd }|jdƒrr| jj|ƒ q0|rŒ|dkrŒ| jj|ƒ q0|j	d
ƒr¬| j
j|dd… ƒ q0| jj|ƒ q0W dS )a¨  
    Categorize :param values list into packages, groups and filenames

    :param namespace: argparse.Namespace, where specs will be stored
    :param values: list of specs, whether packages ('foo') or groups/modules ('@bar')
                   or filenames ('*.rmp', 'http://*', ...)

    To access packages use: specs.pkg_specs,
    to access groups use: specs.grp_specs,
    to access filenames use: specs.filenames
    Ú	filenamesÚ	grp_specsÚ	pkg_specsr   z.rpmÚhttpÚftpÚfileÚhttpsú@r   N)r   r   r   r   )ÚsetattrÚsetÚaddr
   ÚpycompZurlparseÚendswithr   ÚappendÚ
startswithr   r   )Ú	namespaceÚvaluesZtmp_setÚvalueZschemes© r   ú/usr/lib/python3.6/util.pyÚ_parse_specs7   s     



r   c             C   s¾   |d krt jjƒ }t jj| ||ƒ}tjj|jƒr6|jS t	|j
gƒ}|jd|ƒ |jƒ g}ytjjjtjj|ƒdƒ W nB tk
r¶ } z&|jr˜tt|ƒƒ‚tjt|ƒƒ W Y d d }~X nX |jS )Nr   T)r
   ÚcallbackZNullDownloadProgressÚrepoZRemoteRPMPayloadÚosÚpathÚexistsZ
local_pathÚsumZdownload_sizeÚstartZ_librepo_targetÚlibdnfZPackageTargetZdownloadPackagesZVectorPPackageTargetÚRuntimeErrorÚstrictÚIOErrorÚstrÚloggerÚerror)ÚurlÚconfZprogressZploadZest_remote_sizeZtargetsÚer   r   r   Ú_urlopen_progressW   s    

 r1   úw+bc             K   s    t rd|kr|jddƒ tj|f|Ž}y<|r@|jj| |jƒ ƒ n tjj	j
|rR|jnd| |jƒ ƒ W n. tk
r� } ztt|ƒƒ‚W Y dd}~X nX |jdƒ |S )z|
    Open the specified absolute url, return a file object
    which respects proxy setting even for non-repo downloads
    ÚbÚencodingzutf-8Nr   )r   Ú
setdefaultÚtempfileZNamedTemporaryFileZ_repoZdownloadUrlÚfilenor'   r!   Z
DownloaderZdownloadURLZ_configr(   r*   r+   Úseek)r.   r/   r!   ÚmodeÚkwargsZfor0   r   r   r   Ú_urlopenh   s    $
r;   c             C   s    | j |ƒr| d t|ƒ … } | S )N)r   Úlen)ÚsÚrr   r   r   Úrtrim|   s    
r?   c               C   s   t jƒ dkS )Nr   )r"   Úgeteuidr   r   r   r   Ú	am_i_root‚   s    rA   c             C   s.   x(t j| ƒD ]}t jj| |ƒ}t|ƒ qW dS )zBRemove all files and dirs under `path`

    Also see rm_rf()

    N)r"   Úlistdirr#   ÚjoinÚrm_rf)r#   ÚentryZcontained_pathr   r   r   Ú	clear_dir†   s    rF   c             C   sX   yt j| dd� W n@ tk
rR } z$|jtjks>t jj| ƒ rB|‚W Y d d }~X nX d S )Nií  )r9   )r"   ÚmakedirsÚOSErrorÚerrnoZEEXISTr#   Úisdir)Zdnamer0   r   r   r   Ú
ensure_dir�   s
    rK   c             C   sJ   g }| }x<t jj|ƒ\}}|s6|s(| r4|jd|ƒ P |jd|ƒ q
W |S )z`
    Split path by path separators.
    Use os.path.join() to join the path back to string.
    r   )r"   r#   ÚsplitÚinsert)r#   ÚresultÚheadÚtailr   r   r   Ú
split_path™   s    
rQ   c             C   s6   yt | ƒ}W n  tk
r,   t t| ƒƒ}Y nX |dkS )Nr   )r<   Ú	TypeErrorÚlist)ÚiterableÚlr   r   r   Úempty­   s
    rV   c             C   s*   t | ƒ}yt|ƒS  tk
r$   dS X dS )zFReturns the first item from an iterable or None if it has no elements.N)ÚiterÚnextÚStopIteration)rT   Úitr   r   r   Úfirst´   s
    r[   c             C   s4   t | ƒ}ytdd„ |D ƒƒS  tk
r.   d S X d S )Nc             s   s   | ]}|d k	r|V  qd S )Nr   )Ú.0Úitemr   r   r   ú	<genexpr>À   s    z!first_not_none.<locals>.<genexpr>)rW   rX   rY   )rT   rZ   r   r   r   Úfirst_not_none½   s
    r_   c             C   s   t j ƒ t| ƒ S )N)ÚtimeÚfile_timestamp)Úfnr   r   r   Úfile_ageÅ   s    rc   c             C   s   t j| ƒjS )N)r"   ÚstatÚst_mtime)rb   r   r   r   ra   È   s    ra   c               C   s4   yt jtjƒ ƒd S  tk
r.   dtjƒ  S X d S )Nr   zUID: %s)ÚpwdÚgetpwuidr"   r@   ÚKeyErrorr   r   r   r   Úget_effective_loginË   s    ri   c             C   s(   x"|D ]}| j |ƒ} | dkr|S qW | S )z!Like dict.get() for nested dicts.N)Úget)ZdctÚkeysZ	not_foundÚkr   r   r   Úget_inÑ   s
    

rm   c                s   ‡ fdd„}t j||g g fƒS )Nc                s   | t ˆ |ƒƒ  j|ƒ | S )N)Úboolr   )Zaccr]   )rb   r   r   ÚsplitterÚ   s    z!group_by_filter.<locals>.splitter)Ú	functoolsÚreduce)rb   rT   ro   r   )rb   r   Úgroup_by_filterÙ   s    rr   c             c   s&   x |D ]}||ƒr| V  |V  qW dS )z/Insert an item into an iterable by a condition.Nr   )r]   rT   Ú	conditionZoriginal_itemr   r   r   Ú	insert_ifß   s    
rt   c             C   s*   yt | ƒ W n tk
r    dS X dS dS )z&Test whether an iterator is exhausted.TFN)rX   rY   )Úiteratorr   r   r   Úis_exhaustedæ   s
    rv   c             C   s*   t | ƒr| g} t| tƒo(tdd„ | D ƒƒS )Nc             s   s   | ]}t |ƒt d ƒ@ V  qdS )z*[?N)r   )r\   Úpr   r   r   r^   ò   s    z"is_glob_pattern.<locals>.<genexpr>)Úis_string_typeÚ
isinstancerS   Úany)Úpatternr   r   r   Úis_glob_patternï   s    r|   c             C   s   t rt| tƒS t| tƒS d S )N)r   ry   r+   r   )Úobjr   r   r   rx   ô   s    
rx   c                s   ‡ fdd„}|S )z…Decorator to get lazy attribute initialization.

    Composes with @property. Force reinitialization by deleting the <attrname>.
    c                s   ‡‡ fdd„}|S )Nc                s8   y
t | ˆ ƒS  tk
r2   ˆ| ƒ}t| ˆ |ƒ |S X d S )N)ÚgetattrÚAttributeErrorr   )r}   Úval)Úattrnamerb   r   r   Úcached_getter   s    
z6lazyattr.<locals>.get_decorated.<locals>.cached_getterr   )rb   r‚   )r�   )rb   r   Úget_decoratedÿ   s    zlazyattr.<locals>.get_decoratedr   )r�   rƒ   r   )r�   r   Úlazyattrú   s    	r„   c             G   s   t t| f|žŽ ƒS )zžLike functools.map(), but return a list instead of an iterator.

    This means all side effects of fn take place even without iterating the
    result.

    )rS   Úmap)rb   Úseqr   r   r   Úmapall  s    r‡   c             C   s8   t jdt j| ƒƒ}tjjs4tjƒ d }|r4|j|ƒ}|S )z6Convert time into locale aware datetime string object.z%cr   )	r`   ZstrftimeZ	localtimer
   r   r   ÚlocaleZ	getlocaleÚdecode)Z	timestampÚtZcurrent_locale_settingr   r   r   Únormalize_time  s    
r‹   c              C   sz   y\d} dd„ t j| ƒD ƒ}t|ƒdkrZ|d }tdj| |ƒƒ�}|jƒ }t|ƒdkS Q R X dS  ttfk
rt   dS X dS )z†Decide whether we are on line power.

    Returns True if we are on line power, False if not, None if it can not be
    decided.

    z/sys/class/power_supplyc             S   s   g | ]}|j d ƒr|‘qS )ZAC)r   )r\   Znoder   r   r   ú
<listcomp>&  s    zon_ac_power.<locals>.<listcomp>r   z{}/{}/onliner   N)	r"   rB   r<   ÚopenÚformatÚreadÚintr*   Ú
ValueError)Z	ps_folderZac_nodesZac_nodeZ	ac_statusÚdatar   r   r   Úon_ac_power  s    r“   c              C   sœ   yddl } W n tk
r    dS X y0| jƒ }|jddƒ}| j|dƒ}|jddƒ}W n | jk
rh   dS X |dkrvdS |dkr‚d	S |dkrŽdS td|ƒ‚dS )z�Decide whether we are on metered connection.

    Returns:
      True: if on metered connection
      False: if not
      None: if it can not be decided
    r   Nzorg.freedesktop.NetworkManagerz/org/freedesktop/NetworkManagerzorg.freedesktop.DBus.PropertiesZMeteredr   é   Té   é   Fz&Unknown value for metered property: %r)r   r”   )r•   r–   )ÚdbusÚImportErrorZ	SystemBusZ
get_objectZ	InterfaceZGetZDBusExceptionr‘   )r—   ZbusÚproxyZifaceZmeteredr   r   r   Úon_metered_connection1  s&    rš   c             C   s&   t j|ƒ\}}tjj| |ƒt| |ƒfS )z…Use a predicate to partition entries into false entries and true entries.

    Credit: Python library itertools' documentation.

    )Ú	itertoolsÚteer
   r   ÚfilterfalseÚfilter)ZpredrT   Zt1Zt2r   r   r   Ú	partitionN  s    rŸ   c             C   s(   yt j| ƒ W n tk
r"   Y nX d S )N)ÚshutilZrmtreerH   )r#   r   r   r   rD   W  s    rD   c             #   sF   t ƒ ‰ ‡ fdd„}tˆ | |ƒ}||ƒV  x||ƒ}|s8P |V  q*W dS )z«Split an iterable into tuples by a condition.

    Inserts a separator before each item which meets the condition and then
    cuts the iterable by these separators.

    c                s   t tj‡ fdd„| ƒƒS )Nc                s   | ˆ kS )Nr   )r0   )Ú	separatorr   r   Ú<lambda>g  s    z4split_by.<locals>.next_subsequence.<locals>.<lambda>)Útupler›   Ú	takewhile)rZ   )r¡   r   r   Únext_subsequencef  s    z"split_by.<locals>.next_subsequenceN)Úobjectrt   )rT   rs   r¥   ZmarkedZsubsequencer   )r¡   r   Úsplit_by]  s    
r§   c             C   s   | j |ƒr| t|ƒd … S d S )N)r   r<   )r=   Úprefixr   r   r   Ústrip_prefixu  s    
r©   Fc          	   C   s8   |st j| t jƒrt j| dƒS t| dƒ� W dQ R X dS )z{Create an empty file if it doesn't exist or bump it's timestamps.

    If no_create is True only bumps the timestamps.
    NÚa)r"   ÚaccessÚF_OKÚutimer�   )r#   Z	no_creater   r   r   Útouch{  s    r®   ÚwriteÚ c             C   s¬   yh| dkr|j |ƒ nP| dkr(|jƒ  n>| dkrD|j |ƒ |jƒ  n"| dkrZt||d� ntd|  ƒ‚W n> tk
r¦ } z"tjdjt|ƒj	t
|ƒƒƒ W Y d d }~X nX d S )Nr¯   ÚflushZwrite_flushÚprint)r   zUnsupported type: z{}: {})r¯   r±   r²   r‘   r*   r,   ÚcriticalrŽ   ÚtypeÚ__name__r	   )ÚtpÚmsgÚoutr0   r   r   r   Ú_terminal_messenger†  s    


r¹   c             C   sn   d}t | ƒdk}xXt| dd�D ]H\}}|rD|dtdƒ d|  7 }n|dtdƒ d 7 }|dj|ƒ7 }qW |S )	zž
    Format string about problems in resolve

    :param resolve_problems: list with list of strings (output of goal.problem_rules())
    :return: string
    r°   r   )r&   z
 ZProblemz %d: z: z
  - )r<   Ú	enumerater   rC   )Zresolve_problemsr·   Zcount_problemsÚiZrsr   r   r   Ú_format_resolve_problems˜  s    r¼   c             C   sX   | j ƒ d }| jƒ d k	r4| jƒ dkr4|| jƒ d 7 }|| jƒ  d | jƒ  d | jƒ  S )Nú-Ú0ú:Ú.)ÚNÚEÚVÚRÚA)ZteZnevrar   r   r   Ú	_te_nevraª  s    rÆ   c             C   s”   t jdƒ xH| D ]@}|jƒ }d }|d k	r.|j}djt|ƒ|||jƒ ƒ}t j|ƒ qW x:|D ]2}djt|ƒ|j|j|j	|j
|jƒ ƒ}t j|ƒ qZW d S )NzLogging transaction elementsz@RPM element: '{}', Key(): '{}', Key state: '{}', Failed() '{}': z^SWDB element: '{}', State: '{}', Action: '{}', From repo: '{}', Reason: '{}', Get reason: '{}')r,   ÚdebugÚKeyÚstaterŽ   rÆ   ÚFailedr+   ÚactionZ	from_repoÚreasonZ
get_reason)Úrpm_transactionÚswdb_transactionÚrpm_elÚtsiZ	tsi_stater·   r   r   r   Ú_log_rpm_trans_with_swdb±  s    



rÑ   c       
      C   sV  t jjt jjt jjt jjt jjh}dd„ |D ƒ}d}d}x¼| D ]´}t|ƒ}|jƒ }|d ksft	|dƒ r¢x:|D ]2}	|	j
t jjkr€ql|	j|krŒqlt|	ƒ|krl|	}P qlW |d ks¶t	|dƒ rÐtjtdƒj|ƒƒ d}q>|jƒ rèt jj|_
d}q>t jj|_
q>W x6|D ].}|j
t jjkrütjtdƒjt|ƒƒƒ d}qüW |�rBtjtdƒƒ |�rRt| |ƒ d S )	Nc             S   s   g | ]}|‘qS r   r   )r\   rÐ   r   r   r   rŒ   È  s    z-_sync_rpm_trans_with_swdb.<locals>.<listcomp>FZpkgz%TransactionItem not found for key: {}Tz)TransactionSWDBItem not found for key: {}z#Errors occurred during transaction.)r'   ÚtransactionZ TransactionItemAction_DOWNGRADEDZTransactionItemAction_OBSOLETEDÚTransactionItemAction_REMOVEZTransactionItemAction_UPGRADEDZ!TransactionItemAction_REINSTALLEDrÆ   rÈ   ÚhasattrrÉ   ZTransactionItemState_UNKNOWNrË   r+   r,   r³   r   rŽ   rÊ   ÚTransactionItemState_ERRORZTransactionItemState_DONErÇ   rÑ   )
rÍ   rÎ   Zrevert_actionsZ
cached_tsiZel_not_foundr-   rÏ   Zte_nevrarÐ   Ztsi_candidater   r   r   Ú_sync_rpm_trans_with_swdbÂ  sH    





rÖ   c               @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )Útmpdirc             C   s   dt jj }tj|d�| _d S )Nz%s-)r¨   )r
   ÚconstZPREFIXr6   Zmkdtempr#   )Úselfr¨   r   r   r   Ú__init__ì  s    ztmpdir.__init__c             C   s   | j S )N)r#   )rÙ   r   r   r   Ú	__enter__ð  s    ztmpdir.__enter__c             C   s   t | jƒ d S )N)rD   r#   )rÙ   Úexc_typeÚ	exc_valueÚ	tracebackr   r   r   Ú__exit__ó  s    ztmpdir.__exit__N)rµ   Ú
__module__Ú__qualname__rÚ   rÛ   rß   r   r   r   r   r×   ê  s   r×   c                   s(   e Zd ZdZ‡ fdd„Zdd„ Z‡  ZS )ÚBunchzšDictionary with attribute accessing syntax.

    In DNF, prefer using this over dnf.yum.misc.GenericHolder.

    Credit: Alex Martelli, Doug Hudgeon

    c                s   t t| ƒj||Ž | | _d S )N)Úsuperrâ   rÚ   Ú__dict__)rÙ   ÚargsÚkwds)Ú	__class__r   r   rÚ   þ  s    zBunch.__init__c             C   s   t | ƒS )N)Úid)rÙ   r   r   r   Ú__hash__  s    zBunch.__hash__)rµ   rà   rá   Ú__doc__rÚ   ré   Ú__classcell__r   r   )rç   r   râ   ö  s   râ   c                   s,   e Zd Z‡ fdd„Zdd„ Zdd„ Z‡  ZS )ÚMultiCallListc                s   t t| ƒjƒ  | j|ƒ d S )N)rã   rì   rÚ   Úextend)rÙ   rT   )rç   r   r   rÚ     s    zMultiCallList.__init__c                s   ‡ ‡fdd„}|S )Nc                 s   ‡ ‡‡fdd„}t t|ˆƒƒS )Nc                s   t | ˆƒ}|ˆ ˆŽS )N)r~   )ÚvÚmethod)rå   r:   Úwhatr   r   Ú	call_what  s    
z8MultiCallList.__getattr__.<locals>.fn.<locals>.call_what)rS   r…   )rå   r:   rñ   )rÙ   rð   )rå   r:   r   rb     s    z%MultiCallList.__getattr__.<locals>.fnr   )rÙ   rð   rb   r   )rÙ   rð   r   Ú__getattr__  s    zMultiCallList.__getattr__c                s   ‡ ‡fdd„}t t|| ƒƒS )Nc                s   t | ˆˆ ƒ d S )N)r   )r]   )r€   rð   r   r   Úsetter  s    z)MultiCallList.__setattr__.<locals>.setter)rS   r…   )rÙ   rð   r€   ró   r   )r€   rð   r   Ú__setattr__  s    zMultiCallList.__setattr__)rµ   rà   rá   rÚ   rò   rô   rë   r   r   )rç   r   rì     s   rì   c             C   sn  t g g g g g g g g g g g dœƒ}�xF| D �]<}|jtjjkrJ|jj|ƒ q(|jtjjkrf|j	j|ƒ q(|jtjj
krÖ|jtjjkr�|jj|ƒ nD|jtjjkr¬|jj|ƒ n(|jtjjkrÈ|jj|ƒ n|jj|ƒ q(|jtjjkrò|jj|ƒ q(|jtjjk�rL|jtjjk�r |jj|ƒ n*|jtjjk�r>|jj|ƒ n|jj|ƒ q(|jtjjkr(|jj|ƒ q(W |S )N)Ú
downgradedÚerasedÚerased_cleanÚ
erased_depÚ	installedÚinstalled_groupÚinstalled_depÚinstalled_weakÚreinstalledÚupgradedÚfailed)râ   rÉ   r'   rÒ   rÕ   rÿ   r   rË   ZTransactionItemAction_DOWNGRADErõ   ZTransactionItemAction_INSTALLrÌ   ZTransactionItemReason_GROUPrú   Z TransactionItemReason_DEPENDENCYrû   Z%TransactionItemReason_WEAK_DEPENDENCYrü   rù   ZTransactionItemAction_REINSTALLrý   rÓ   ZTransactionItemReason_CLEANr÷   rø   rö   ZTransactionItemAction_UPGRADErþ   )rÒ   r3   rÐ   r   r   r   Ú_make_lists  sH    
r   c                sÜ   ‡ fdd„}t jj|ƒ}ˆ jd|d�\}}|j|ƒ}g }xžtdƒ|jftdƒ|jftdƒ|j|j	 |j
 |j ftdƒ|jftd	ƒ|ftd
ƒ|j|j |j ftdƒ|jfgD ]&\}	}
|j||	t|
tj|ƒd�ƒƒ q®W |S )al  Returns a human-readable summary of the results of the
    transaction.

    :param action_callback: function generating output for specific action. It
       takes two parameters - action as a string and list of affected packages for
       this action
    :return: a list of lines containing a human-readable summary of the
       results of the transaction
    c                s’   | j |j k| j |j k  }|dkr$|S tj| j | j| j| j| jd�}tj|j |j|j|j|jd�}|j|ˆ jƒ}|dkrz|S | j|jk| j|jk  S )z…Compares two transaction items or packages by nevra.
           Used as a fallback when tsi does not contain package object.
        r   )ÚnameÚepochÚversionÚreleaseÚarch)	r  ÚhawkeyZNEVRAr  r  r  r  Zevr_cmpZsack)Zitem1Zitem2ÚretZnevra1Znevra2)Úbaser   r   Ú_tsi_or_pkg_nevra_cmpP  s    z7_post_transaction_output.<locals>._tsi_or_pkg_nevra_cmpF)Zreport_problemsrÒ   ZUpgradedZ
DowngradedZ	InstalledZReinstalledZSkippedZRemovedrÊ   )Úkey)r
   Úutilr   Z_skipped_packagesÚunionr   rþ   rõ   rù   rú   rü   rû   rý   rö   rø   r÷   rÿ   rí   Úsortedrp   Ú
cmp_to_key)r  rÒ   Zaction_callbackr	  Z
list_bunchZskipped_conflictsZskipped_brokenZskippedr¸   rË   Ztsisr   )r  r   Ú_post_transaction_outputF  s(    



r  )N)NNr2   )F)QZ
__future__r   r   r   r   r   r   Zdnf.i18nr   r	   Úargparser
   Zdnf.callbackZ	dnf.constZ
dnf.pycomprI   rp   r  r›   rˆ   Zloggingr"   rf   r    Úsysr6   r`   Zlibdnf.repor'   Zlibdnf.transactionZ	getLoggerr,   ÚArgumentParserÚprogZ	MAIN_PROGÚupperZMAIN_PROG_UPPERr   r1   r;   r?   rA   rF   rK   rQ   rV   r[   r_   rc   ra   ri   rm   rr   rt   rv   r|   rx   r„   r‡   r‹   r“   rš   rŸ   rD   r§   r©   r®   Ústdoutr¹   r¼   rÆ   rÑ   rÖ   r¦   r×   Údictrâ   rS   rì   r   r  r   r   r   r   Ú<module>   s„   
 


						
(-