U
    K7\                     @   s   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mZ ddlmZ erVe	dne	dZ
dd	d
ZdddZdd Zd ddZdd Zdd Zdd Zd!ddZG dd deZG dd deZdS )"    N   )fnmatch   )IS_WINDOWS_PLATFORMz/|\\/Fc                 C   sv   t j| }|pg }|pd}g }|d d k	rRd|p8dg|d g }d|f|g}ttt|||d d||||dS )N)NNr   
z.dockerignorer   )
dockerfile)filesrootfileobjgzipextra_files)ospathabspathjoincreate_archivesortedexclude_paths)r   Zexcluder   r   r   r
   r   Zdockerignore_contents r   4/usr/lib/python3/dist-packages/docker/utils/build.pytar   s$       r   c                 C   s0   |dkrd}| d|  t|}t|| S )a	  
    Given a root directory path and a list of .dockerignore patterns, return
    an iterator of all paths (both regular files and directories) in the root
    directory that do *not* match any of the patterns.

    All paths returned are relative to the root.
    N
Dockerfile!)appendPatternMatchersetwalk)r
   patternsr   pmr   r   r   r   #   s
    	r   c              	   C   sT   g }t | D ]@\}}}|| D ],}t j||}||| ddd q q|S )N r   r   )r   r   r   r   r   replacelstrip)r
   r	   dirnameZdirnamesfnamesfilenameZlongpathr   r   r   build_file_list4   s    r&   c              
   C   sp  |pg }|st  }tj|r dnd|d}|d kr:t| }tdd |D }|D ]}||kr^qPtj| |}|j	||d}	|	d krqP|	j
dk s|	j
dkrt|	j
|	_
tr|	jd	@ d
B |	_|	 rz&t|d}
||	|
 W 5 Q R X W n$ tk
r   td|Y nX qP||	d  qP|D ]6\}}t|}t||_||t|d q"|  |d |S )Nzw:gzwmoder   c                 s   s   | ]}|d  V  qdS )r   Nr   ).0er   r   r   	<genexpr>H   s     z!create_archive.<locals>.<genexpr>)arcnamer   l    i  I   rbz Can not read file in context: {}zutf-8)tempfileNamedTemporaryFiletarfileopenr&   r   r   r   r   
gettarinfomtimeintr   r)   isfileaddfileIOErrorformatTarInfolensizeioBytesIOencodecloseseek)r
   r	   r   r   r   tZextra_namesr   	full_pathifnamecontentsinfor   r   r   r   @   sD    



r   c                 C   s   t  }tjd|d}t| tjrVtd}tj	r<t
dqt|  |_| d n>t| tjrtd}t|  |_| d n|j| dd}|||  |  |d |S )Nr'   r(   r   zCPlease use io.BytesIO to create in-memory Dockerfiles with Python 3r   )r   r-   )r0   r1   r2   r3   
isinstancer>   StringIOr;   sixZPY3	TypeErrorr<   getvaluer=   rB   r?   r4   r8   rA   )r   rF   rC   Zdfinfor   r   r   mkbuildcontextt   s"    



rO   c                 C   s   dd t t| D S )Nc                 S   s   g | ]}|r|d kr|qS ).r   )r*   Zptr   r   r   
<listcomp>   s       zsplit_path.<locals>.<listcomp>)resplit_SEPpr   r   r   
split_path   s    rW   c                 C   s   t rdt| S | S )Nr   )r   r   rW   rU   r   r   r   normalize_slashes   s    rX   Tc                 C   s   t |}|| S N)r   r   )r
   r   defaultr   r   r   r   r      s    r   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )r   c                 C   s2   t tdd dd |D | _| jtd d S )Nc                 S   s   | j S rY   )dirsrU   r   r   r   <lambda>       z)PatternMatcher.__init__.<locals>.<lambda>c                 S   s   g | ]}t |qS r   )Pattern)r*   rV   r   r   r   rQ      s     z+PatternMatcher.__init__.<locals>.<listcomp>z!.dockerignore)listfilterr   r   r^   )selfr   r   r   r   __init__   s
     zPatternMatcher.__init__c              	   C   s   d}t j|}t|}| jD ]^}|j}||}|sr|dkrrt|jt|krr|t jj	
|d t|j }|r| }q|S )NFr    )r   r   r#   rW   r   	exclusionmatchr<   r[   sepr   )ra   filepathZmatchedparent_pathZparent_path_dirspatternnegativerd   r   r   r   matches   s    

zPatternMatcher.matchesc                    s    fdd  S )Nc                 3   s   t | D ]}t jt j| |}|dt jj rD|dd  }|}|sX|V  t j|}t j|r
t j	|rq
|rd}j
D ]$}|jsq|jt|rd} qq|rq
 |D ]
}|V  qq
d S )NrP   r   TF)r   listdirr   r   relpath
startswithre   rj   isdirislinkr   rc   cleaned_patternrX   )Zcurrent_dirrF   Zfpathrd   ZcurskipZpatsubrec_walkr
   ra   r   r   rt      s6     

z%PatternMatcher.walk.<locals>.rec_walkr   )ra   r
   r   rs   r   r      s    "zPatternMatcher.walkN)__name__
__module____qualname__rb   rj   r   r   r   r   r   r      s   r   c                   @   s(   e Zd Zdd Zedd Zdd ZdS )r^   c                 C   s@   d| _ |dr"d| _ |dd  }| || _d| j| _d S )NFr   Tr   r   )rc   rm   	normalizer[   r   rp   )ra   Zpattern_strr   r   r   rb      s    
zPattern.__init__c                 C   sT   d}t |}|t|k rP|| dkrF||= |dkrN||d = |d8 }q|d7 }q|S )Nr   z..r   )rW   r<   )clsrV   rE   rS   r   r   r   rx      s    


zPattern.normalizec                 C   s   t t|| jS rY   )r   rX   rp   )ra   rf   r   r   r   rd      s    zPattern.matchN)ru   rv   rw   rb   classmethodrx   rd   r   r   r   r   r^      s   	
r^   )NNNF)N)NNFN)T)r>   r   rR   r2   r0   rL   r   Z	constantsr   compilerT   r   r   r&   r   rO   rW   rX   r   objectr   r^   r   r   r   r   <module>   s(   

  
4
@