o
    NrfJ                      @   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	edZ
d	ed
efd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   )IS_WINDOWS_PLATFORM   )fnmatchz/|\\/zy^[a-z0-9]+((\.|_|__|-+)[a-z0-9]+)*(?::[0-9]+)?(/[a-z0-9]+((\.|_|__|-+)[a-z0-9]+)*)*(:[a-zA-Z0-9_][a-zA-Z0-9._-]{0,127})?$tagreturnc                 C   s   t t| S N)bool_TAGmatch)r    r   [/var/www/html/software/conda/envs/catlas/lib/python3.10/site-packages/docker/utils/build.py	match_tag   s   r   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   Zdockerignore_contentsr   r   r   tar   s   r   c                 C   s2   |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_list:   s   r/   c                 C   s  |pg }|s
t  }tj|rdnd|d}|d u rt| }dd |D }|D ]p}||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 } ztd| |d }~w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>N       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   r2   isfileaddfileOSErrorTarInfoencodelensizeioBytesIOcloseseek)r   r   r   r   r   tZextra_namesr   	full_pathifZoenamecontentsinfoZcontents_encodedr   r   r   r   F   sR   



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 )Nr0   r1   r    zCPlease use io.BytesIO to create in-memory Dockerfiles with Python 3r   )r   r7   )r:   r;   r<   r=   
isinstancerH   StringIOrD   	TypeErrorrI   rF   getvaluerG   rK   r>   rB   rJ   )r   rO   rL   Zdfinfor   r   r   mkbuildcontext{   s   


rW   c                 C   s   dd t t| D S )Nc                 S   s   g | ]
}|r|d kr|qS ).r   )r3   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   ra   Tc                 C   s   t |}|| S r	   )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)r3   r_   r   r   r   rZ      r6   z+PatternMatcher.__init__.<locals>.<listcomp>z!.dockerignore)listfilterr&   r"   re   )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&   	exclusionr   rF   rc   sepr   )rh   filepathZmatchedparent_pathZparent_path_dirspatternnegativer   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|rAt j	|rBq|r_d}j
D ]}|jsOqI|jt|r[d} nqI|r_q |E d H  qd S )NrX   r   TF)r   listdirr   r   relpath
startswithrk   rp   isdirislinkr&   rj   cleaned_patternra   )Zcurrent_dirrO   Zfpathr   curskippatrec_walkr   rh   r   r   r{      s8   

z%PatternMatcher.walk.<locals>.rec_walkr   )rh   r   r   rz   r   r%      s   !zPatternMatcher.walkN)__name__
__module____qualname__ri   rp   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 )re   c                 C   s@   d| _ |drd| _ |dd  }| || _d| j| _d S )NFr!   Tr   r   )rj   rs   	normalizerc   r   rv   )rh   Zpattern_strr   r   r   ri      s   
zPattern.__init__c                 C   sf   |  }d}t|}|t|k r1|| dkr'||= |dkr&||d = |d8 }n|d7 }|t|k s|S )Nr   z..r   )stripr`   rF   )clsr_   rN   r\   r   r   r   r      s   
zPattern.normalizec                 C   s   t t|| jS r	   )r   ra   rv   )rh   rl   r   r   r   r     s   zPattern.matchN)r|   r}   r~   ri   classmethodr   r   r   r   r   r   re      s
    	
re   )NNNFr	   )NNFN)T)rH   r   r[   r<   r:   	constantsr   r   compiler]   r   strr
   r   r   r   r/   r   rW   r`   ra   r%   r#   re   r   r   r   r   <module>   s0    


5
?