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   excluder   r   r   r
   r   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filename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   textra_namesr   	full_pathifnamecontentsinfo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   r2   )r5   r6   r7   r8   
isinstancerC   StringIOr?   	TypeErrorrD   rA   getvaluerB   rF   r9   r=   rE   )r   rK   rG   dfinfor   r   r   mkbuildcontexts   s   


rU   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   r^   c                 C   s   t r	dt| S | S )Nr   )r   r   r^   r\   r   r   r   normalize_slashes   s   r_   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 r`   )dirsr\   r   r   r   <lambda>   s    z)PatternMatcher.__init__.<locals>.<lambda>c                 S   s   g | ]}t |qS r   )Pattern)r.   r]   r   r   r   rX      r1   z+PatternMatcher.__init__.<locals>.<listcomp>z!.dockerignore)listfilterr    r   rd   )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%   r^   r    	exclusionmatchrA   rb   sepr   )rg   filepathmatchedparent_pathparent_path_dirspatternnegativerj   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 )NrV   r   TF)r   listdirr   r   relpath
startswithrk   rr   isdirislinkr    ri   cleaned_patternr_   )current_dirrK   fpathrj   curskippatrec_walkr
   rg   r   r   r      s8   

z%PatternMatcher.walk.<locals>.rec_walkr   )rg   r
   r   r~   r   r      s   !zPatternMatcher.walkN)__name__
__module____qualname__rh   rr   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 )rd   c                 C   s@   d| _ |drd| _ |dd  }| || _d| j| _d S )NFr   Tr   r   )ri   ru   	normalizerb   r   rx   )rg   pattern_strr   r   r   rh      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   )r^   rA   )clsr]   rJ   rZ   r   r   r   r      s   
zPattern.normalizec                 C   s   t t|| jS r`   )r   r_   rx   )rg   rl   r   r   r   rj      s   zPattern.matchN)r   r   r   rh   classmethodr   rj   r   r   r   r   rd      s
    	
rd   )NNNFr`   )NNFN)T)rC   r   rY   r7   r5   r   	constantsr   compiler[   r   r   r*   r   rU   r^   r_   r   r   rd   r   r   r   r   <module>   s(    


5
?