B
    XM\p  ã               @   sl   d dl mZmZmZ d dlZd dlmZ d dlZd dlm	Z	m
Z
 dd„ ZG dd„ deƒZd	d
„ Zdd„ ZdS )é    )Úabsolute_importÚdivisionÚprint_functionN)Úbasename)ÚcodecÚfilter_info_filesc             C   s<   |   d¡r| d d… S |   d¡r,| d d… S td|  ƒ‚d S )Nz.taréüÿÿÿz.tar.bz2iøÿÿÿzdid not expect filename: %r)ÚendswithÚ	Exception)Úfn© r   ú3lib/python3.7/site-packages/conda_build/tarcheck.pyÚdist_fn
   s
    

r   c               @   sD   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dS )ÚTarCheckc             C   sd   t  |¡| _tdd„ | j ¡ D ƒƒ| _tt|ƒƒ| _| j 	dd¡d  
dd¡\| _| _| _|| _d S )Nc             s   s   | ]}|j V  qd S )N)Úpath)Ú.0Úmr   r   r   ú	<genexpr>   s    z$TarCheck.__init__.<locals>.<genexpr>z::é   éÿÿÿÿú-é   )ÚtarfileÚopenÚtÚsetÚ
getmembersÚpathsr   r   ZdistÚsplitÚrsplitÚnameÚversionZbuildÚconfig)Úselfr   r"   r   r   r   Ú__init__   s
    &zTarCheck.__init__c             C   s   | S )Nr   )r#   r   r   r   Ú	__enter__   s    zTarCheck.__enter__c             C   s   | j  ¡  d S )N)r   Úclose)r#   Ze_typeZe_valueÚ	tracebackr   r   r   Ú__exit__   s    zTarCheck.__exit__c             C   sÎ   dd„ | j  d¡ ¡ D ƒ}t|ƒ}t|ƒt|ƒkr:tdƒ‚dd„ | j  ¡ D ƒ}t|dƒ}t|ƒ}t|ƒt|ƒkrxtdƒ‚||kr„d S x<t||B ƒD ],}||krªt	d| ƒ ||kr’t	d	| ƒ q’W tdƒ‚d S )
Nc             S   s   g | ]}|  ¡  d ¡‘qS )zutf-8)ÚstripÚdecode)r   Úpr   r   r   ú
<listcomp>"   s    z'TarCheck.info_files.<locals>.<listcomp>z
info/fileszinfo/files: duplicatesc             S   s   g | ]
}|j ‘qS r   )r   )r   r   r   r   r   r,   (   s    Ú zinfo_files: duplicate membersz%r not in info/filesz%r not in tarball)
r   ÚextractfileÚ	readlinesr   Úlenr
   r   r   ÚsortedÚprint)r#   ZlistaZsetaZfiles_in_tarZsetbr+   r   r   r   Ú
info_files!   s$    
zTarCheck.info_filesc             C   sn   t  | j d¡ ¡  d¡¡}x:dD ]2}|| t| |ƒkr"td||| t| |ƒf ƒ‚q"W t|d t	ƒsjt
‚d S )Nzinfo/index.jsonzutf-8)r    r!   z%s: %r != %rZbuild_number)ÚjsonÚloadsr   r.   Úreadr*   Úgetattrr
   Ú
isinstanceÚintÚAssertionError)r#   ÚinfoZvarnamer   r   r   Ú
index_json7   s    
zTarCheck.index_jsonc          	   C   s„   d }d| j  ¡ kr€| j  d¡ ¡ }x\|D ]T}y| ¡ \}}}W n tk
rT   w(Y nX t|dƒrj| t¡}|dkr(t	|ƒ}P q(W |S )Nzinfo/has_prefixr*   Zbinary)
r   Zgetnamesr.   r/   r   Ú
ValueErrorÚhasattrr*   r   r0   )r#   Úprefix_lengthZprefix_filesÚlineÚprefixZ	file_typeÚ_r   r   r   r?   ?   s    


zTarCheck.prefix_lengthc             C   sR   t  | j d¡ ¡  d¡¡}|d | jjd| jjgksNt	d 
| jj|d ¡ƒ‚d S )Nzinfo/index.jsonzutf-8ZsubdirZnoarchzBInconsistent subdir in package - index.json expecting {0}, got {1})r4   r5   r   r.   r6   r*   r"   Zhost_subdirZtarget_subdirr:   Úformat)r#   r;   r   r   r   Úcorrect_subdirP   s    zTarCheck.correct_subdirN)
Ú__name__Ú
__module__Ú__qualname__r$   r%   r(   r3   r<   r?   rD   r   r   r   r   r      s   r   c             C   s0   t | |ƒ}| ¡  | ¡  | ¡  |j ¡  d S )N)r   r3   r<   rD   r   r&   )r   r"   Úxr   r   r   Ú	check_allW   s
    
rI   c             C   s:   i }x0| D ](}t ||ƒ ¡ }|r
||jk r
|||< q
W |S )N)r   r?   )Úfilesr"   ZlengthsÚfÚlengthr   r   r   Úcheck_prefix_lengths_   s    
rM   )Z
__future__r   r   r   r4   Úos.pathr   r   Zconda_build.utilsr   r   r   Úobjectr   rI   rM   r   r   r   r   Ú<module>   s   	D