a
    !cP                     @   s~  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dZe
  j!d	kre
  j!ndZ"e"# Z$d
d Z%d`ddZ&dad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 ZAdbdFdGZBdHdIejCfdJdKZDdLdM ZEdNdO ZFdPdQ ZGdRdS ZHG dTdU dUeIZJG dVdW dWeKZLG dXdY dYeMZNdZd[ ZOd\d] ZPd^d_ ZQdS )c    )print_function)absolute_import)unicode_literals   )PY3
basestring)_ucdNdnfZyumc                 C   s   t | dg  t | dg  t | dg  t }|D ]}||v r<q.|| tjj|d }|drp| j| q.|r|dv r| j| q.|	dr| j
|dd	  q.| j| q.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)setattrsetaddr
   pycompurlparseendswithr   append
startswithr   r   )	namespacevaluesZtmp_setvalueZschemes r   ,/usr/lib/python3.9/site-packages/dnf/util.py_parse_specs7   s     


r    c              
   C   s   |d u rt j }t j| ||}t|jg}|d| | g}zt	jj
t	j|d W nD ty } z,|jrtt|tt| W Y d }~n
d }~0 0 |jS )Nr   T)r
   callbackZNullDownloadProgressrepoZRemoteRPMPayloadsumZdownload_sizestartZ_librepo_targetlibdnfZPackageTargetZdownloadPackagesZVectorPPackageTargetRuntimeErrorstrictIOErrorstrloggererrorZ
local_path)urlconfZprogressZploadZest_remote_sizetargetser   r   r   _urlopen_progressW   s    

$r0   w+bc              
   K   s   t rd|vr|dd tj|fi |}z<|rD|j| |  n tjj	
|rV|jnd| |  W n0 ty } ztt|W Y d}~n
d}~0 0 |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for/   r   r   r   _urlopenf   s    $"
r:   c                 C   s    |  |r| d t|  } | S N)r   len)srr   r   r   rtrimz   s    
r?   c                   C   s   t  dkS Nr   )osgeteuidr   r   r   r   	am_i_root   s    rC   c                 C   s*   t | D ]}t j| |}t| q
dS )zBRemove all files and dirs under `path`

    Also see rm_rf()

    N)rA   listdirpathjoinrm_rf)rE   entryZcontained_pathr   r   r   	clear_dir   s    rI   c              
   C   sX   zt j| dd W n@ tyR } z(|jtjks:t j| s>|W Y d }~n
d }~0 0 d S )Ni  )r8   )rA   makedirsOSErrorerrnoZEEXISTrE   isdir)Zdnamer/   r   r   r   
ensure_dir   s
    rN   c                 C   sD   g }| }t j|\}}|s2|s$|s@|d| q@|d| q|S )z`
    Split path by path separators.
    Use os.path.join() to join the path back to string.
    r   )rA   rE   splitinsert)rE   resultheadtailr   r   r   
split_path   s    rT   c                 C   s4   zt | }W n ty*   t t| }Y n0 |dkS r@   )r<   	TypeErrorlist)iterablelr   r   r   empty   s
    rY   c                 C   s,   t | }z
t|W S  ty&   Y dS 0 dS )zFReturns the first item from an iterable or None if it has no elements.NiternextStopIterationrW   itr   r   r   first   s
    
r`   c                 C   s6   t | }ztdd |D W S  ty0   Y d S 0 d S )Nc                 s   s   | ]}|d ur|V  qd S r;   r   ).0itemr   r   r   	<genexpr>       z!first_not_none.<locals>.<genexpr>rZ   r^   r   r   r   first_not_none   s
    re   c                 C   s   t   t|  S r;   )timefile_timestampfnr   r   r   file_age   s    rj   c                 C   s   t | jS r;   )rA   statst_mtimerh   r   r   r   rg      s    rg   c                   C   s8   zt t d W S  ty2   dt   Y S 0 d S )Nr   zUID: %s)pwdgetpwuidrA   rB   KeyErrorr   r   r   r   get_effective_login   s    rp   c                 C   s(   |D ]}|  |} | du r|  S q| S )z!Like dict.get() for nested dicts.N)get)ZdctkeysZ	not_foundkr   r   r   get_in   s
    

rt   c                    s    fdd}t ||g g fS )Nc                    s   | t  |  | | S r;   )boolr   )Zaccrb   rh   r   r   splitter   s    z!group_by_filter.<locals>.splitter)	functoolsreduce)ri   rW   rv   r   rh   r   group_by_filter   s    ry   c                 c   s"   |D ]}||r| V  |V  qdS )z/Insert an item into an iterable by a condition.Nr   )rb   rW   	conditionZoriginal_itemr   r   r   	insert_if   s    r{   c                 C   s*   zt |  W n ty    Y dS 0 dS dS )z&Test whether an iterator is exhausted.TFN)r\   r]   )iteratorr   r   r   is_exhausted   s
    r}   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   )ra   pr   r   r   rc      rd   z"is_glob_pattern.<locals>.<genexpr>)is_string_type
isinstancerV   any)patternr   r   r   is_glob_pattern   s    r   c                 C   s   t rt| tS t| tS d S r;   )r   r   r)   r   )objr   r   r   r      s    
r   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                    s<   zt |  W S  ty6   | }t|  | | Y S 0 d S r;   )getattrAttributeErrorr   )r   val)attrnameri   r   r   cached_getter   s    z6lazyattr.<locals>.get_decorated.<locals>.cached_getterr   )ri   r   r   rh   r   get_decorated   s    zlazyattr.<locals>.get_decoratedr   )r   r   r   r   r   lazyattr   s    	r   c                 G   s   t t| g|R  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.

    rV   map)ri   seqr   r   r   mapall	  s    r   c                 C   s8   t dt | }tjjs4t d }|r4||}|S )z6Convert time into locale aware datetime string object.z%cr   )	rf   strftime	localtimer
   r   r   localeZ	getlocaledecode)Z	timestamptZcurrent_locale_settingr   r   r   normalize_time  s    
r   c               	   C   s   zxd} dd t | D }t|dkrt|d }td| |&}| }t|dkW  d   W S 1 sj0    Y  W dS  ttfy   Y dS 0 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 | ]}| d r|qS )ZAC)r   )ra   Znoder   r   r   
<listcomp>$  rd   zon_ac_power.<locals>.<listcomp>r   z{}/{}/onliner   N)	rA   rD   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   zddl } W n ty    Y dS 0 z0|  }|dd}| |d}|dd}W n | jyh   Y dS 0 |dkrvdS |dv rdS |d	v 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Metered)r      T)      Fz&Unknown value for metered property: %r)dbusImportErrorZ	SystemBusZ
get_objectZ	InterfaceZGetZDBusExceptionr   )r   ZbusproxyZifaceZmeteredr   r   r   on_metered_connection/  s(    r   c                 C   s&   t |\}}t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predrW   t1t2r   r   r   	partitionL  s    r   c                 C   s&   zt |  W n ty    Y n0 d S r;   )shutilZrmtreerK   rE   r   r   r   rG   U  s    rG   c                 #   sB   t    fdd}t | |}||V  ||}|s6q>|V  q(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 fdd| S )Nc                    s   |  kS r;   r   )r/   	separatorr   r   <lambda>e  rd   z4split_by.<locals>.next_subsequence.<locals>.<lambda>)tupler   	takewhile)r_   r   r   r   next_subsequenced  s    z"split_by.<locals>.next_subsequenceN)objectr{   )rW   rz   r   ZmarkedZsubsequencer   r   r   split_by[  s    
r   c                 C   s   |  |r| t|d  S d S r;   )r   r<   )r=   prefixr   r   r   strip_prefixs  s    
r   Fc                 C   sL   |st | t jrt | dS t| d W d   n1 s>0    Y  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)rA   accessF_OKutimer   )rE   Z	no_creater   r   r   touchy  s    r   write c              
   C   s   zh| dkr| | nP| dkr(|  n>| dkrD| | |  n"| dkrZt||d ntd|  W n@ ty } z(tdt|j	t
| W Y d }~n
d }~0 0 d S )Nr   flushZwrite_flushprint)r   zUnsupported type: z{}: {})r   r   r   r   r(   r*   criticalr   type__name__r	   )tpmsgoutr/   r   r   r   _terminal_messenger  s    


r   c                 C   sj   d}t | dk}t| ddD ]H\}}|rB|dtd d|  7 }n|dtd d 7 }|d|7 }q|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   rF   )Zresolve_problemsr   Zcount_problemsiZrsr   r   r   _format_resolve_problems  s    r   c                 C   sX   |   d }|  d ur4|  dkr4||  d 7 }||   d |   d |   S )N-0:.)NEVRA)ZteZnevrar   r   r   	_te_nevra  s    r   c              
   C   s   t d | D ]@}| }d }|d ur,|j}dt|||| }t | q|D ]2}dt||j|j|j	|j
| }t | qTd 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   sH  t jjt jjt jjt jjt jjh}dd |D }d}d}| D ]}t|}| }|d u sbt	|ds|D ]4}	|	j
t jjkrzqf|	j|vrqft|	|krf|	} qqf|d u st	|dsttd| d}q<| rt jj|_
d}q<t jj|_
q<|D ].}|j
t jjkrttdt| d}q|r4ttd |rDt| | d S )	Nc                 S   s   g | ]}|qS r   r   )ra   r   r   r   r   r     rd   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  sJ    

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PREFIXr5   ZmkdtemprE   )selfr   r   r   r   __init__  s    ztmpdir.__init__c                 C   s   | j S r;   r   r   r   r   r   	__enter__  s    ztmpdir.__enter__c                 C   s   t | j d S r;   )rG   rE   )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|i | | | _d S r;   )superr   r   __dict__)r   argskwds	__class__r   r   r     s    zBunch.__init__c                 C   s   t | S r;   )idr   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|   | | d S r;   )r   r   r   extend)r   rW   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 | }| i S r;   )r   )vmethod)r   r9   whatr   r   	call_what  s    
z8MultiCallList.__getattr__.<locals>.fn.<locals>.call_whatr   )r   r9   r  r   r  )r   r9   r   ri   
  s    z%MultiCallList.__getattr__.<locals>.fnr   )r   r  ri   r   r  r   __getattr__	  s    zMultiCallList.__getattr__c                    s    fdd}t t|| S )Nc                    s   t |   d S r;   )r   )rb   r   r  r   r   setter  s    z)MultiCallList.__setattr__.<locals>.setterr   )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   sh  t g g g g g g g g g g g d}| D ]<}|jtjjkrF|j| q$|jtjjkrb|j	| q$|jtjj
kr|jtjjkr|j| nD|jtjjkr|j| n(|jtjjkr|j| n|j| q$|jtjjkr|j| q$|jtjjkrH|jtjjkr|j| n*|jtjjkr:|j| n|j| q$|jtjjkr$|j| q$|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   r2   r   r   r   r   _make_lists  sJ    
r  c              
      s    fdd}t j|} jd|d\}}||}g }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fD ]&\}	}
|||	t|
t|d q|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}|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_cmpN  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   sortedrw   
cmp_to_key)r  r   Zaction_callbackr  Z
list_bunchZskipped_conflictsZskipped_brokenZskippedr   r   Ztsisr   r  r   _post_transaction_outputD  s:    





r#  c                 C   s   | r| S t dS )Nz<name-unset>)r   )Z
input_namer   r   r   _name_unset_wrapperw  s    r$  )N)NNr1   )F)RZ
__future__r   r   r   r   r   r   Zdnf.i18nr   r	   argparser
   Zdnf.callbackZ	dnf.constZ
dnf.pycomprL   rw   r  r   r   ZloggingrA   rm   r   sysr5   rf   Zlibdnf.repor%   Zlibdnf.transactionZ	getLoggerr*   ArgumentParserprogZ	MAIN_PROGupperZMAIN_PROG_UPPERr    r0   r:   r?   rC   rI   rN   rT   rY   r`   re   rj   rg   rp   rt   ry   r{   r}   r   r   r   r   r   r   r   r   rG   r   r   r   stdoutr   r   r   r   r   r   r   dictr   rV   r   r  r#  r$  r   r   r   r   <module>   s   
 


						
(-3