???<!-- GIF89;a -->
123123123123
.....................................................................................................................................???<!-- GIF89;a -->
123123123123
.....................................................................................................................................3
ft`                 @   s   d dl mZ d dl mZ 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ZejdZG d	d
 d
e
jjZG dd deZdS )    )absolute_import)unicode_literals)hexlify)unlink_f)_Nz/usr/bin/applydeltarpmdnfc                   sX   e Zd Z fddZdd Z fddZdd Zed	d
 Zedd Z	dd Z
  ZS )DeltaPayloadc                s"   t t| j|| || _|| _d S )N)superr   __init__
delta_infodelta)selfr   r   pkgprogress)	__class__ /usr/lib/python3.6/drpm.pyr
   )   s    zDeltaPayload.__init__c             C   s   t jj| jjS )N)ospathbasenamer   location)r   r   r   r   __str__.   s    zDeltaPayload.__str__c                s2   t t| j||| |tjjjkr.| jj|  d S )N)	r	   r   _end_cblibdnfrepoZPackageTargetCBZTransferStatus_ERRORr   enqueue)r   ZcbdataZ	lr_statusmsg)r   r   r   r   1   s    zDeltaPayload._end_cbc             C   sh   | j }|j\}}tj|}t|j }tjjj	|}|tjjj
krRtjtd| |j|||j|jdS )Nzunsupported checksum type: %s)Zrelative_urlZchecksum_typeZchecksumZexpectedsizeZbase_url)r   chksumhawkeyZchksum_namer   decoder   r   ZPackageTargetZchecksumTypeZChecksumType_UNKNOWNloggerZwarningr   r   downloadsizeZbaseurl)r   r   ZctypeZcsumr   Z
ctype_coder   r   r   _target_params6   s    

zDeltaPayload._target_paramsc             C   s   | j jS )N)r   r!   )r   r   r   r   download_sizeH   s    zDeltaPayload.download_sizec             C   s   | j jS )N)r   r!   )r   r   r   r   
_full_sizeL   s    zDeltaPayload._full_sizec             C   s$   | j j}tjj| jjjtjj|S )N)	r   r   r   r   joinr   r   Zpkgdirr   )r   r   r   r   r   localPkgP   s    zDeltaPayload.localPkg)__name__
__module____qualname__r
   r   r   r"   propertyr#   r$   r&   __classcell__r   r   )r   r   r   (   s   r   c               @   s>   e Zd ZdddZdd Zdd Zdd	 Zd
d Zdd ZdS )	DeltaInfoNc             C   s   d| _ tjttjrd| _ ytjd| _W n ttfk
rH   d| _Y nX |dkrbt	j
j j| _n|| _|| _|| _g | _i | _i | _dS )zA delta lookup and rebuild context
           query -- installed packages to use when looking up deltas
           progress -- progress obj to display finished delta rebuilds
        FTSC_NPROCESSORS_ONLN   N)deltarpm_installedr   access
APPLYDELTAX_OKsysconfdeltarpm_jobs	TypeError
ValueErrorr   ZconfZConfdeltarpm_percentagequeryr   queuejobserr)r   r8   r   r7   r   r   r   r
   V   s    zDeltaInfo.__init__c             C   s   | j s
dS |jj s| j r dS |j r,dS tjj|j r@dS |j	| j d }d}x@| j
j|j|jdD ](}|j|j}|rj|j|k rj|j}|}qjW |rt| |||S dS )z&Turn a po to Delta RPM po, if possibleNd   )namearch)r/   r   Zdeltarpmr7   Z_is_local_pkgr   r   existsr&   Z_sizer8   filterr=   r>   Zget_delta_from_evrZevrr!   r   )r   Zpor   ZbestZ
best_deltaZipor   r   r   r   delta_factorym   s$    zDeltaInfo.delta_factoryc             C   s   t jtjjd||d? |d@  | jj|}|j}|dkrXt|jj	  t
dg| j|< nB|jj stt
dg| j|< n&tj|j	  | jj|tjjt
d d S )Nzdrpm: %d: return code: %d, %d      r   zDelta RPM rebuild failedz(Checksum of the delta-rebuilt RPM faileddone)r    logr   loggingSUBDEBUGr:   popr   r   r&   r   r;   ZverifyLocalPkgr   unlinkr   endcallbackZSTATUS_DRPM)r   pidcodeploadr   r   r   r   job_done   s    
zDeltaInfo.job_donec             C   s`   t t d|jj|j |jj g}tjtjf| }tjt	j
jd|dj|dd   || j|< d S )Nz-azdrpm: spawned %d: %s    )r1   r   r>   r&   r   spawnlP_NOWAITr    rE   r   rF   rG   r%   r:   )r   rN   Z
spawn_argsrL   r   r   r   	start_job   s    zDeltaInfo.start_jobc             C   sp   x.| j r.tjdtj\}}|s P | j|| qW | jj| x.t| j | jk rj| j	| jj
d | js>P q>W d S )NrQ   r   )r:   r   waitpidWNOHANGrO   r9   appendlenr4   rT   rH   )r   rN   rL   rM   r   r   r   r      s    zDeltaInfo.enqueuec             C   s@   x:| j r:tj \}}| j|| | jr| j| jjd qW dS )z!Wait until all jobs have finishedr   N)r:   r   waitrO   r9   rT   rH   )r   rL   rM   r   r   r   rZ      s
    zDeltaInfo.wait)N)	r'   r(   r)   r
   rA   rO   rT   r   rZ   r   r   r   r   r,   U   s   

r,   )Z
__future__r   r   Zbinasciir   Zdnf.yum.miscr   Zdnf.i18nr   Zdnf.callbackr   Zdnf.loggingZdnf.repor   rF   Zlibdnf.repor   r   r1   Z	getLoggerr    r   ZPackagePayloadr   objectr,   r   r   r   r   <module>   s   
-