???<!-- GIF89;a -->
123123123123
.....................................................................................................................................???<!-- GIF89;a -->
123123123123
.....................................................................................................................................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re
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rt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 )zDecorator 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 )zLike 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 )zDecide 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rd	S |dkrdS td|dS )zDecide 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 )zUse 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 )zSplit 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 rx:|D ]2}	|	j
t jjkrql|	j|krqlt|	|krl|	}P qlW |d kst	|d rtjtdj| d}q>|j rt jj|_
d}q>t jj|_
q>W x6|D ].}|j
t jjkrtjtdjt| d}qW |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 )BunchzDictionary 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 }xt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 qW |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 )zCompares 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   
 


						
(-