a
    ©!cÐ  ã                   @   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 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| ƒ ||¡ || _|| _d S ©N)Úsuperr   Ú__init__Ú
delta_infoÚdelta)Úselfr   r   ÚpkgÚprogress©Ú	__class__© ú,/usr/lib/python3.9/site-packages/dnf/drpm.pyr   )   s    zDeltaPayload.__init__c                 C   s   t j | jj¡S r	   )ÚosÚpathÚbasenamer   Úlocation©r   r   r   r   Ú__str__.   s    zDeltaPayload.__str__c                    s2   t t| ƒ |||¡ |tjjjkr.| j | ¡ d S r	   )	r
   r   Ú_end_cbÚlibdnfÚrepoZPackageTargetCBZTransferStatus_ERRORr   Úenqueue)r   ZcbdataZ	lr_statusÚmsgr   r   r   r   1   s    zDeltaPayload._end_cbc                 C   sh   | j }|j\}}t |¡}t|ƒ ¡ }tjj 	|¡}|tjjj
krRt 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 r	   )r   r$   r   r   r   r   Údownload_sizeH   s    zDeltaPayload.download_sizec                 C   s   | j jS r	   )r   r$   r   r   r   r   Ú
_full_sizeL   s    zDeltaPayload._full_sizec                 C   s$   | j j}tj | jjjtj |¡¡S r	   )	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 ttj¡rd| _ zt d¡| _W n ttfyF   d| _Y n0 |du r`t	j
 ¡ j| _n|| _|| _|| _g | _i | _i | _dS )z·A 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   r;   r   r:   r   r   r   r   V   s    zDeltaInfo.__init__c                 C   s¤   | j s
dS |jjr| jsdS | ¡ r(dS tj | ¡ ¡r<dS |j	| j d }d}| j
j|j|jdD ](}| |j¡}|rd|j|k rd|j}|}qd|r t| |||ƒS dS )z&Turn a po to Delta RPM po, if possibleNéd   )ÚnameÚarch)r2   r   Zdeltarpmr:   Z_is_local_pkgr   r   Úexistsr)   Z_sizer;   Úfilterr@   rA   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  tjjd||d? |d@ ¡ | j |¡}|j}|dkrXt|j 	¡ ƒ t
dƒg| j|< nB|j ¡ stt
dƒg| j|< n&t | 	¡ ¡ | 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 failedZ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   sb   t t d|jj| ¡ |j ¡ g}tjtjg|¢R Ž }t t	j
jd|d |dd … ¡¡ || j|< d S )Nz-azdrpm: spawned %d: %sú é   )r4   r   rA   r)   r   ÚspawnlÚP_NOWAITr#   rG   r   rH   rI   r(   r=   )r   rP   Z
spawn_argsrN   r   r   r   Ú	start_job—   s    þÿzDeltaInfo.start_jobc                 C   sh   | j r,t dtj¡\}}|sq,|  ||¡ q | j |¡ t| j ƒ| jk rd|  	| j 
d¡¡ | js8qdq8d S )Néÿÿÿÿr   )r=   r   ÚwaitpidÚWNOHANGrQ   r<   ÚappendÚlenr7   rV   rJ   )r   rP   rN   rO   r   r   r   r   ¡   s    zDeltaInfo.enqueuec                 C   s<   | j r8t ¡ \}}|  ||¡ | jr |  | j d¡¡ q dS )z!Wait until all jobs have finishedr   N)r=   r   ÚwaitrQ   r<   rV   rJ   )r   rN   rO   r   r   r   r\   ®   s
    zDeltaInfo.wait)N)	r*   r+   r,   r   rD   rQ   rV   r   r\   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!   rH   Zlibdnf.repor   r   r4   Z	getLoggerr#   r   ZPackagePayloadr   Úobjectr/   r   r   r   r   Ú<module>   s   
-