o
    2.a                     @   s   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r'e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ZG dd dZdS )"    N   )fnmatch   )IS_WINDOWS_PLATFORMz/|\\/Fc                 C   sv   t j| }|p	g }|pd}g }|d d ur)d|pd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u 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	   dirnamedirnamesfnamesfilenameZlongpathr   r   r   build_file_list2   s   r'   c              	   C   sv  |pg }|s
t  }tj|rdnd|d}|d u rt| }dd |D }|D ]j}||v r-q&tj| |}|j||d}	|	d u r@q&|	j	dk sJ|	j	dkrPt
|	j	|	_	trZ|	jd	@ d
B |	_|	 rzt|d}
||	|
 W d    n1 suw   Y  W q& ty   td| w ||	d  q&|D ]\}}t|}|d}t||_||t| q|  |d |S )Nzw:gzwmoder   c                 S   s   h | ]}|d  qS )r   r   ).0er   r   r   	<setcomp>F       z!create_archive.<locals>.<setcomp>)arcnamer   l    i  I   rbzCan not read file in context: zutf-8)tempfileNamedTemporaryFiletarfileopenr'   r   r   r   
gettarinfomtimeintr   r*   isfileaddfileOSErrorTarInfoencodelensizeioBytesIOcloseseek)r
   r	   r   r   r   tZextra_namesr   	full_pathifnamecontentsinfoZcontents_encodedr   r   r   r   >   sL   



r   c                 C   s   t  }tjd|d}t| tjrtd}tdt| tj	r2t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/   )r2   r3   r4   r5   
isinstancer@   StringIOr<   	TypeErrorrA   r>   getvaluer?   rC   r6   r:   rB   )r   rG   rD   Zdfinfor   r   r   mkbuildcontexts   s   


rO   c                 C   s   dd t t| D S )Nc                 S   s   g | ]
}|r|d kr|qS ).r   )r+   ptr   r   r   
<listcomp>   s    zsplit_path.<locals>.<listcomp>)resplit_SEPpr   r   r   
split_path   s   rX   c                 C   s   t r	dt| S | S )Nr   )r   r   rX   rV   r   r   r   normalize_slashes   s   rY   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 rZ   )dirsrV   r   r   r   <lambda>   s    z)PatternMatcher.__init__.<locals>.<lambda>c                 S   s   g | ]}t |qS r   )Pattern)r+   rW   r   r   r   rR      r.   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}||}|s9|dkr9t|jt|kr9|t jj	
|d t|j }|r>| }q|S )NFr    )r   r   r#   rX   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 r#|dd  }|}|s-|V  t j|}t j|r@t j	|rAq|r^d}j
D ]}|jsNqH|jt|rZd} nqH|r^q |E d H  qd S )NrP   r   TF)r   listdirr   r   relpath
startswithre   rj   isdirislinkr   rc   cleaned_patternrY   )Zcurrent_dirrG   Zfpathrd   Zcurskippatrec_walkr
   ra   r   r   rt      s8   

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   s^   d}t |}|t|k r-|| dkr#||= |dkr"||d = |d8 }n|d7 }|t|k s|S )Nr   z..r   )rX   r>   )clsrW   rF   rT   r   r   r   rx      s   
zPattern.normalizec                 C   s   t t|| jS rZ   )r   rY   rp   )ra   rf   r   r   r   rd      s   zPattern.matchN)ru   rv   rw   rb   classmethodrx   rd   r   r   r   r   r^      s
    	
r^   )NNNFrZ   )NNFN)T)r@   r   rS   r4   r2   r   Z	constantsr   compilerU   r   r   r'   r   rO   rX   rY   r   r   r^   r   r   r   r   <module>   s(    


5
?