
    S                        S SK r S SKrS SKrS SKrS SKrSSKJr  SSKJr  \(       a  \R                  " S5      O\R                  " S5      r	SS jr
SS	 jrS
 r  SS jrS rS rS rSS jr " S S5      r " S S5      rg)    N   )fnmatch   )IS_WINDOWS_PLATFORMz/|\\/c           
      
   [         R                  R                  U 5      nU=(       d    / nU=(       d    Sn/ nUS   b(  SR                  U=(       d    S/US   /-   5      nSU4U/n[	        [        [        XQUS   S95      XSXFS9$ )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_contentss           %lib/third_party/docker/utils/build.pytarr      s    77??4 DmG+|JK!}  $		))jm_<!
 34
 ]4Z]KL     c                 ~    Uc  SnUR                  SU-   5        [        U5      n[        UR                  U 5      5      $ )z
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.

Dockerfile!)appendPatternMatchersetwalk)r   patternsr
   pms       r   r   r   !   s=     !
OOC*$%		!Brwwt}r   c           	          / n[         R                  " U 5       Ha  u  p#nXC-    HS  n[         R                  R                  X%5      nUR	                  UR                  U SS5      R                  S5      5        MU     Mc     U$ )N r   r   )r   r"   r   r   r   replacelstrip)r   r   dirnamedirnamesfnamesfilenamelongpaths          r   build_file_listr.   2   sm    E%'WWT]!6)Hww||G6HLL  r1-44S9 * &3 Lr   c                 ,   U=(       d    / nU(       d  [         R                  " 5       n[        R                  " U(       a  SOSUS9nUc  [	        U 5      nU Vs1 s H  ofS   iM	     nnU H  nX;   a  M
  [
        R                  R                  X5      n	UR                  XS9n
U
c  M=  U
R                  S:  d  U
R                  S:  a  [        U
R                  5      U
l	        [        (       a  U
R                  S-  S-  U
l        U
R                  5       (       a)   [        U	S	5       nUR                  X5        S S S 5        M  UR                  U
S 5        M     U Hb  u  p[        R                   " U5      nUR#                  S5      n[%        U5      Ul        UR                  U[(        R*                  " U5      5        Md     UR-                  5         UR/                  S5        U$ s  snf ! , (       d  f       GM  = f! [         a    [        S
U	 35      ef = f)Nzw:gzwmoder   r   )arcnamel    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   teextra_namesr   	full_pathifnamecontentsinfocontents_encodeds                   r   r   r   >   s   #K--/D&c7CA}%!,-AQ4K-GGLL,	LLL19  77Q;!''I-!''lAG VVe^e+AF88::)T*aIIaO +* IIa? B &t$#??73()				$

#345	 & GGILLONU .0 +* 4YK@ s0   G"G:%G'7G:'
G7	1G:7G::Hc                 (   [         R                  " 5       n[        R                  " SUS9n[	        U [
        R                  5      (       a!  [        R                  " S5      n[        S5      e[	        U [
        R                  5      (       aF  [        R                  " S5      n[        U R                  5       5      Ul        U R                  S5        OUR                  U SS9nUR                  X05        UR!                  5         UR                  S5        U$ )Nr0   r1   r   zCPlease use io.BytesIO to create in-memory Dockerfiles with Python 3r   )r   r3   )r6   r7   r8   r9   
isinstancerD   StringIOr@   	TypeErrorrE   rB   getvaluerC   rG   r:   r>   rF   )r
   rM   rH   dfinfos       r   mkbuildcontextrX   s   s    ##%A#q)A*bkk**. 4 5 	5	J

	+	+.*--/0j,GIIf!GGIFF1IHr   c                     [         R                  " [        U 5       Vs/ s H  o(       d  M  US:w  d  M  UPM     sn$ s  snf )N.)resplit_SEP)ppts     r   
split_pathr`      s1    $*?*2bBR3YB*???s   
===c                 P    [         (       a  SR                  [        U 5      5      $ U $ )Nr   )r   r   r`   r^   s    r   normalize_slashesrc      s     xx
1&&Hr   c                 :    [        U5      nUR                  U 5      $ N)r    r"   )r   r#   defaultr$   s       r   r"   r"      s    		!B774=r   c                   &    \ rS rSrS rS rS rSrg)r       c                     [        [        S U Vs/ s H  n[        U5      PM     sn5      5      U l        U R                  R	                  [        S5      5        g s  snf )Nc                     U R                   $ re   )dirsrb   s    r   <lambda>)PatternMatcher.__init__.<locals>.<lambda>   s    affr   z!.dockerignore)listfilterPatternr#   r   )selfr#   r^   s      r   __init__PatternMatcher.__init__   sL    V8<8awqz8<
  	W%567 =s   Ac           
         Sn[         R                  R                  U5      n[        U5      nU R                   H  nUR
                  nUR                  U5      nU(       dv  US:w  ap  [        UR                  5      [        U5      ::  aN  UR                  [         R                  R                  R                  US [        UR                  5       5      5      nU(       d  M  U(       + nM     U$ )NFr&   )r   r   r)   r`   r#   	exclusionmatchrB   rk   sepr   )rq   filepathmatchedparent_pathparent_path_dirspatternnegativerv   s           r   matchesPatternMatcher.matches   s    ggooh/%k2}}G((HMM(+E[B.w||$,<(==#MM(()9:L3w||;L)MNE u&, % r   c                 (   ^ ^^ UUU 4S jmT" T5      $ )Nc              3   0  >#    [         R                  " U 5       GHt  n[         R                  R                  [         R                  R	                  U T5      U5      nUR                  S[         R                  R                  -   5      (       a  USS  nT	R                  U5      nU(       d  Uv   [         R                  R                  TU5      n[         R                  R                  U5      (       a$  [         R                  R                  U5      (       a  M  U(       a_  SnT	R                   HC  nUR                  (       d  M  UR                  R                  [        U5      5      (       d  MA  Sn  O   U(       a  GMd  T" U5       S h  vN   GMw     g  N
7f)NrZ   r   TF)r   listdirr   r   relpath
startswithrw   r~   isdirislinkr#   ru   cleaned_patternrc   )
current_dirrM   fpathrv   curskippatrec_walkr   rq   s
          r   r   %PatternMatcher.walk.<locals>.rec_walk   s!    ZZ,GGOOK6 ##C"''++$566!!"IEU+Kggll4/ww}}S))RWW^^C-@-@
  D#}}"}}$..99 1% 8: :#(D!  -  #C=((= -< )s   E'F.F	F
F )rq   r   r   s   ``@r   r"   PatternMatcher.walk   s    	)B ~r   )r#   N)__name__
__module____qualname____firstlineno__rr   r~   r"   __static_attributes__r   r   r   r    r       s    8&"r   r    c                   0    \ rS rSrS r\S 5       rS rSrg)rp      c                     SU l         UR                  S5      (       a  SU l         USS  nU R                  U5      U l        SR	                  U R                  5      U l        g )NFr   Tr   r   )ru   r   	normalizerk   r   r   )rq   pattern_strs     r   rr   Pattern.__init__   sQ    !!#&&!DN%ab/KNN;/	"xx		2r   c                     UR                  5       nSn[        U5      nU[        U5      :  a1  X2   S:X  a  X2	 US:  a
  X2S-
  	 US-  nOUS-  nU[        U5      :  a  M1  U$ )Nr   z..r   )stripr`   rB   )clsr^   rL   r\   s       r   r   Pattern.normalize   sp     GGI 1#e*nx4Hq5!eFAQ #e*n r   c                 @    [        [        U5      U R                  5      $ re   )r   rc   r   )rq   rx   s     r   rv   Pattern.match   s    (2D4H4HIIr   )r   rk   ru   N)	r   r   r   r   rr   classmethodr   rv   r   r   r   r   rp   rp      s!    3  4Jr   rp   )NNNFre   )NNFN)T)rD   r   r[   r8   r6   r   	constantsr   compiler]   r   r   r.   r   rX   r`   rc   r"   r    rp   r   r   r   <module>r      s    	 	 	    +  3rzz(

3&"	 9>#2j&@< <~&J &Jr   