ó
N_c           @   së   d  d l  m Z d  d l m Z d  d l m Z m Z d  d l m Z d  d l m	 Z	 m
 Z
 m Z d  d l m Z m Z e e d ƒ Z d  d l m Z d  d	 l Z d  d	 l Z d
 Z d d d „  ƒ  YZ d d „ Z d d d „  ƒ  YZ d	 S(   iÿÿÿÿ(   t	   TS_UPDATE(   t	   RepoError(   t   exception2msgt   _(   t	   MiscError(   t   checksumt   repo_gen_decompresst   unlink_f(   t   grabbert   progresst   parallel_wait(   t	   iterparseNs   /usr/bin/applydeltarpmt   DeltaPackagec           B   sP   e  Z d  „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z	 RS(   c         C   s±   | |  _  | j |  _ | j |  _ | j |  _ |  j \ |  _ |  _ |  _ |  _ |  _ d  |  _
 | |  _ | |  _ t j j | j ƒ d t j j | ƒ |  _ | |  _ | |  _ d  S(   Nt   /(   t   rpmt   repot   basepatht   pkgtupt   namet   archt   epocht   versiont   releaset   Nonet   _hasht   sizet   relativepatht   ost   patht   dirnamet	   localpatht   basenamet   csumt   oldrpm(   t   selfR   R   t   remoteR    R!   (    (    s,   /usr/lib/python2.7/site-packages/yum/drpm.pyt   __init__!   s    	'			,	c         C   s   d |  j  S(   Ns   Delta RPM of %s(   R   (   R"   (    (    s,   /usr/lib/python2.7/site-packages/yum/drpm.pyt   __str__2   s    c         C   sw   | d  k r d St |  j | j ƒ pv t |  j | j ƒ pv t |  j | j ƒ pv t |  j | j ƒ pv t |  j | j ƒ S(   Ni   (   R   t   cmpR   R   R   R   R   (   R"   t   other(    (    s,   /usr/lib/python2.7/site-packages/yum/drpm.pyt   __cmp__5   s    c         C   sY   |  j  d  k rR d |  j j |  j |  j |  j |  j |  j f } t	 | ƒ |  _  n  |  j  S(   Ns   %s - %s:%s-%s-%s.%s(
   R   R   R   t   idR   R   R   R   R   t   hash(   R"   t   mystr(    (    s,   /usr/lib/python2.7/site-packages/yum/drpm.pyt   __hash__@   s
    c         C   s   |  j  S(   N(   R   (   R"   (    (    s,   /usr/lib/python2.7/site-packages/yum/drpm.pyt   localPkgG   s    c         C   s   d  S(   N(   R   (   R"   (    (    s,   /usr/lib/python2.7/site-packages/yum/drpm.pyt
   getDiscNumJ   s    c         C   s   y t  j j |  j ƒ } Wn t k
 r- t SX| |  j k rA t S|  j \ } } y t | |  j ƒ } Wn t	 k
 rz t SX| | k r‹ t St
 S(   N(   R   R   t   getsizeR   t   OSErrort   FalseR   R    R   R   t   True(   R"   t   fsizet   ctypeR    t   fsum(    (    s,   /usr/lib/python2.7/site-packages/yum/drpm.pyt   verifyLocalPkgM   s          c         C   s   |  j  S(   N(   R    (   R"   (    (    s,   /usr/lib/python2.7/site-packages/yum/drpm.pyt   returnIdSum\   s    (
   t   __name__t
   __module__R$   R%   R(   R,   R-   R.   R6   R7   (    (    (    s,   /usr/lib/python2.7/site-packages/yum/drpm.pyR       s   							i   c         C   s`   t  t d ƒ s |  St j j d ƒ s) |  St j d ƒ } y t | ƒ d k rQ | SWn n X|  S(   Nt   sysconft   SC_NPROCESSORS_ONLNi    (   t   hasattrR   t   sysconf_namest   has_keyR:   t   int(   t   unknownt   ncpus(    (    s,   /usr/lib/python2.7/site-packages/yum/drpm.pyt   _num_cpus_online_   s    t	   DeltaInfoc           B   sP   e  Z d  „  Z d d „ Z e d „ Z d „  Z d „  Z d „  Z	 e
 d „ Z RS(   c   +         sŸ  | j  ˆ _  | ˆ _ i  ˆ _ g  ˆ _ d  ˆ _ | j j ˆ _ ˆ j d k  rj t	 ƒ  } ˆ j | 9_ n  ˆ j sw d  Si  } i  } i  } xÁt
 | ƒ D]³\ } }	 |	 j j }
 |
 d  k r|	 j j } | j j }
 t | ƒ d k r| d j d ƒ rd }
 qn  |
 d k rq– n  |	 j t k r'nã |	 j | j j k r?nË | j |	 j ƒ } | d  k rìi  } | |	 j <x{ t j |	 j j ƒ D]a } t j d | ƒ } | r„| j ƒ  \ } } } } | j | | f t ƒ  ƒ j | | f ƒ q„q„Wn  |	 j |	 j f | k r
q– n  | | j |	 j i  ƒ |	 j <| j |	 j d ƒ |	 j  | |	 j <q– W| r†t j! t" t j# ƒ r†ˆ j  j$ t% d ƒ t" ƒ d  Si  ‰  xˆ| D]€} xK d  D]' } y | j& j' | ƒ } PWq q Xq Wˆ j  j$ t% d ƒ | ƒ q“| j( d	 t j) j* | j+ d ƒ } | j, }
 t- | j  ƒ |
 d
 } |
 r•t j) j. | ƒ r•| | | k r•t% d ƒ } ˆ j  j$ | | t j/ | ƒ t j/ | | ƒ ƒ q“n  | | ‡  ‡ f d † } i  } t0 rÙ| j1 rÙ| | d <t2 | d <n  y | j3 | |  ˆ  | <Wq“t4 k
 r} | | ƒ q“Xq“Wt0 r*t5 j6 ƒ  n  xnˆ  j7 ƒ  D]`\ } } | | } t8 | d d | j9 ƒ} x/t: | ƒ D]!\ } } | j; d k r“qrn  | j d ƒ } | j d ƒ }  | |  | j d ƒ | j d ƒ | j d ƒ f }! | j |! ƒ } | d  k	 r‰| | }	 | j }
 |
 d  k r*| j j }
 n  |	 j  |
 d
 }" | j | i  ƒ j | |  f i  ƒ }# x'| j< d ƒ D]} t- | j= d ƒ j> ƒ }$ |$ |" k rŸqon  | j d ƒ }% | j d ƒ }& | j d ƒ }' |& |' f |# k rýd | j | |& |' |  f }( n* | j? j@ | |% |& |' |  ƒ s!qon  d  }( |$ }" | j= d ƒ j> }) | j= d ƒ }* |* j d ƒ |* j> f }* tA |	 |$ |) |* |( ƒ | | <qoWn  | jB ƒ  qrWq7Wd  S(!   Ni    i   s   file:s   ^(.+)-(.+)-(.+)\.(.+)\.rpm$s-   Delta RPMs disabled because %s not installed.t   prestodeltat	   deltainfos#   No Presto metadata available for %sR   g      Y@s:   Not downloading deltainfo for %s, MD is %s and rpms are %sc            sT   ˆ  j  | d  ƒ t |  d ƒ r+ |  j }  n  ˆ j j t d ƒ | | t |  ƒ ƒ d  S(   Nt	   exceptions+   Failed to download %s for repository %s: %s(   t   popR   R<   RF   t   verbose_loggert   warnR   R   (   t   eR   R   (   t   mdpathR"   (    s,   /usr/lib/python2.7/site-packages/yum/drpm.pyt   failfunc´   s
     RL   t   asyncs   prestodelta.xmlt   cachedt
   newpackageR   R   R   R   R   t   deltaR   t   oldepocht
   oldversiont
   oldreleases   %s/%s-%s-%s.%s.rpmt   filenameR   t   type(   RD   RE   (C   RH   t   adderrort   jobst   _future_jobsR   R	   t   conft   deltarpmt   limitRB   t	   enumerateR   t   deltarpm_percentaget   urlst   lent
   startswitht   stateR    R   t   installonlypkgst   getR   t   listdirt   pkgdirt   ret   matcht   groupst
   setdefaultt   sett   addR   R   R   t   accesst
   APPLYDELTAt   X_OKt   infoR   t   repoXMLt   getDatat   cachedirR   R   t   locationt   deltarpm_metadata_percentageR?   t   existst   format_numberRM   t   _asyncR2   t   _retrieveMDR   R   R
   t   itemsR   t   cacheR   t   tagt   findallt   findt   textt   rpmdbt   searchNevraR   t   clear(+   R"   t   ayumt   pkgsRV   t   nprocst   oldrpmst   pinfot   reposizet   indext   pot   percR^   t   namest   rpmfnt   mt   nt   vt   rt   aR   R   t   dataR   t	   data_sizet   msgRL   t   kwargsRJ   t   cpatht
   pinfo_repot   evt   elR   t   newt   bestt   haveR   R   t   vert   relR!   R#   R    (    (   RK   R"   s,   /usr/lib/python2.7/site-packages/yum/drpm.pyR$   p   sØ    						%  2'   $	)
  
 0
	$#c         C   sX   | d k r t |  j ƒ } n  x3 | d k rS |  j s: d S| |  j d t ƒ 8} q! Wd S(   sB    Wait for "num" number of jobs to finish, or all of them. Blocks. i    Nt   block(   R   R_   RW   t   _waitR2   (   R"   t   num(    (    s,   /usr/lib/python2.7/site-packages/yum/drpm.pyt   waitë   s    	c         C   s`  d } xS|  j  r[| r- t j ƒ  \ } } n% t j d t j ƒ \ } } | sR Pn  | |  j  k sg t ‚ |  j  j | ƒ } |  j r­ |  j | j	 j
 7_ |  j j |  j ƒ n  | d k râ t | j	 j ƒ |  j | t d ƒ ƒ nb | j	 j ƒ  s
|  j | t d ƒ ƒ n: | j j | j j ƒ r5t j | j ƒ n  | j	 j | _ | d 7} | r	 Pq	 q	 W| S(   Ni    iÿÿÿÿs   Delta RPM rebuild faileds(   Checksum of the delta-rebuilt RPM failedi   (   RW   R   R¢   t   waitpidt   WNOHANGt   AssertionErrorRG   R	   t   doneR   R   t   updateR   R   RV   R   R6   R`   R   Re   t   unlink(   R"   RŸ   R¡   t   pidt   codeR‰   (    (    s,   /usr/lib/python2.7/site-packages/yum/drpm.pyR    ö   s0    	
c         C   s   |  j  j | ƒ |  j ƒ  d S(   sa    Turn a drpm into an rpm, by adding it to the queue and trying to
            service the queue. N(   RX   t   appendt   dequeue_max(   R"   R‰   (    (    s,   /usr/lib/python2.7/site-packages/yum/drpm.pyt   rebuild  s    c      	   C   s  d } } x8 |  j  j ƒ  |  j D]  } | d 7} | | j j 7} q! W| rû |  j j t d ƒ | t j	 | ƒ ƒ | j
 j rû t t d ƒ r› t j d ƒ n  | j
 j |  _ y d |  j j _ Wn n X|  j j d d d d d d	 d
 | ƒ d |  _ qû n  x |  j r|  j ƒ  qþ Wd S(   s>    De-Queue all delta rebuilds and spawn the rebuild processes. i    i   s.   Finishing delta rebuilds of %d package(s) (%s)t   text_meter_total_sizei   RT   t   urlR~   s   <locally rebuilding deltarpms>R   N(   RW   t   valuesRX   R   R   RH   Ro   R   R	   Rv   R   t   callbackR<   R®   Rf   t	   timescalet   startR   R¦   t   dequeue(   R"   t   countt   totalR‰   (    (    s,   /usr/lib/python2.7/site-packages/yum/drpm.pyt   dequeue_all  s(    

  c         C   sA   |  j  s |  j ƒ  d Sx# |  j  r< |  j d t ƒ s Pq q Wd S(   sQ    De-Queue all delta rebuilds we can and spawn the rebuild
            processes. NRŸ   (   RX   R    R´   R1   (   R"   (    (    s,   /usr/lib/python2.7/site-packages/yum/drpm.pyR¬   7  s    	
c         C   sâ   |  j  ƒ  |  j s t S|  j t |  j ƒ k r] | s9 t S|  j t |  j ƒ |  j d ƒ n  |  j j d ƒ } d | j f } | j	 r | d | j	 f 7} n  | | j
 | j j
 f 7} t j t j t t | Œ } | |  j | <t S(   s@    Try to De-Queue a delta rebuild and spawn the rebuild process. i   i    s   -as   -r(   R    RX   R1   R[   R_   RW   R¢   RG   R   R!   R   R   R   t   spawnlt   P_NOWAITRm   R2   (   R"   RŸ   R‰   t   argsR©   (    (    s,   /usr/lib/python2.7/site-packages/yum/drpm.pyR´   D  s    
	$	 N(   R8   R9   R$   R   R¢   R1   R    R­   R·   R¬   R2   R´   (    (    (    s,   /usr/lib/python2.7/site-packages/yum/drpm.pyRC   o   s   	{#			(    (    (   t   yum.constantsR    t
   yum.ErrorsR   t   yum.i18nR   R   R   t   yum.miscR   R   R   t
   urlgrabberR   R	   R<   RM   t   xml.etree.cElementTreeR   R   Rf   Rm   R   RB   RC   (    (    (    s,   /usr/lib/python2.7/site-packages/yum/drpm.pyt   <module>   s   ?