a
   o\                   @   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 u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   6/usr/lib/python3.9/site-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_list4   s    r'   c              	   C   s  |pg }|st  }tj|r dnd|d}|d u r:t| }tdd |D }|D ]}||v r^qPtj| |}|j	||d}	|	d u rqP|	j
dk s|	j
dkrt|	j
|	_
tr|	jd	@ d
B |	_|	 r"z:t|d}
||	|
 W d    n1 s0    Y  W n" ty   td|Y n0 qP||	d  qP|D ]:\}}t|}|d}t||_||t| q4|  |d |S )Nzw:gzwmoder   c                 s   s   | ]}|d  V  qdS )r   Nr   ).0er   r   r   	<genexpr>H       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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   @   sF    
.



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/   )r2   r3   r4   r5   
isinstancerA   StringIOr=   sixZPY3	TypeErrorr?   getvaluer@   rD   rB   r6   r:   rC   )r   rH   rE   Zdfinfor   r   r   mkbuildcontextu   s"    



rQ   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>   r.   zsplit_path.<locals>.<listcomp>)resplit_SEPpr   r   r   
split_path   s    rZ   c                 C   s   t rdt| S | S )Nr   )r   r   rZ   rX   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\   )dirsrX   r   r   r   <lambda>   r.   z)PatternMatcher.__init__.<locals>.<lambda>c                 S   s   g | ]}t |qS r   )Pattern)r+   rY   r   r   r   rT      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}||}|sr|dkrrt|jt|krr|t jj	
|d t|j }|r| }q|S )NFr    )r   r   r#   rZ   r   	exclusionmatchr?   r^   sepr   )rc   filepathZmatchedparent_pathZparent_path_dirspatternnegativerf   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 )NrR   r   TF)r   listdirr   r   relpath
startswithrg   rl   isdirislinkr   re   cleaned_patternr[   )Zcurrent_dirrH   Zfpathrf   Zcurskippatsubrec_walkr
   rc   r   r   rw      s4    

z%PatternMatcher.walk.<locals>.rec_walkr   )rc   r
   r   rv   r   r      s    "zPatternMatcher.walkN)__name__
__module____qualname__rd   rl   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   )re   ro   	normalizer^   r   rr   )rc   Zpattern_strr   r   r   rd      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   )rZ   r?   )clsrY   rG   rV   r   r   r   r{      s    


zPattern.normalizec                 C   s   t t|| jS r\   )r   r[   rr   )rc   rh   r   r   r   rf      s    zPattern.matchN)rx   ry   rz   rd   classmethodr{   rf   r   r   r   r   r`      s   	
r`   )NNNF)N)NNFN)T)rA   r   rU   r4   r2   rN   r   Z	constantsr   compilerW   r   r   r'   r   rQ   rZ   r[   r   objectr   r`   r   r   r   r   <module>   s(   

  
5
@