
    eL6                    r   d dl mZ d dlmZmZmZ d dlZd dlZd dlZ	ddl
mZmZmZ ddl
mZ ddlmZmZmZmZ dd	lmZmZmZmZ dd
lmZmZmZmZmZ ddlm Z m!Z!m"Z"m#Z#m$Z$ e	jJ                  r<ddl
m&Z& ddlm'Z' ddl(m)Z) ddlm*Z* ddlm+Z+m,Z, d dl-m.Z.  G d de.      Z/ G d de.      Z0 G d de      Z1ddZ2y)    )annotations)PathPurePathPureWindowsPathN   )ExtensionModuleModuleReturnValue
ModuleInfo   )mlog)BuildTargetCustomTargetCustomTargetIndexInvalidArguments)
INSTALL_KWINSTALL_MODE_KWINSTALL_TAG_KWNoneType)
FeatureNew	KwargInfotyped_kwargstyped_pos_argsnoKwargs)FileMesonExceptionhas_path_seppath_is_in_rootrelpath)ModuleState)BuildTargetTypes)Interpreter)TYPE_kwargs)FileOrStringFileMode)	TypedDictc                      e Zd ZU dZded<   y)
ReadKwArgszKeyword Arguments for fs.read.strencodingN__name__
__module____qualname____doc____annotations__     7/usr/lib/python3/dist-packages/mesonbuild/modules/fs.pyr'   r'   %   s
    ,r1   r'   c                  :    e Zd ZU dZded<   ded<   ded<   ded<   y	)
CopyKwzKwargs for fs.copyboolinstallzT.Optional[str]install_dirr$   install_modeinstall_tagNr*   r0   r1   r2   r4   r4   *   s     $$$$r1   r4   c                  T    e Zd Z edd      Zd1 fdZd2dZd2dZe e	dd       e
de      d3d                     Ze e	d	d       e
d	eef      d4d
                     Ze e	dd       e
de      d3d                     Ze e
de      d5d              Ze e
deef      d4d              Ze e
de      d5d              Ze e
de      d5d              Ze e
deefe      d6d              Ze e
deef      d7d              Ze e
deefeef      d8d              Ze e
deefe      d6d              Ze e
deef      d9d              Ze e
deef      d9d               Ze e
d!eef       e	d!d      d9d"                     Z e	d#d$       e
d#eef       ed# ed%ed&'            d:d(                     Z e	d)d*       e
d)eefeg+       ed)eee  ed,ee!f            	 	 	 	 d;d-                     Z" e	d.d/       e
d.eee#e$e%feee#e$e%f      ed<d0                     Z& xZ'S )=FSModulefsz0.53.0c                   t         |   |       | j                  j                  i d| j                  d| j
                  d| j                  d| j                  d| j                  d| j                  d| j                  d| j                  d	| j                  d
| j                  d| j                  d| j                  d| j                   d| j"                  d| j$                  d| j&                  d| j(                         y )N
expanduseris_absoluteas_posixexists
is_symlinkis_fileis_dirhashsizeis_samepathreplace_suffixparentnamestemreadcopyfilerelative_to)super__init__methodsupdater>   r?   r@   rA   rB   rC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   rN   )selfinterpreter	__class__s     r2   rP   zFSModule.__init__8   s;   % 
$//
4++
 
 dkk	

 $//
 t||
 dkk
 DII
 DII
 4++
 d11
 dkk
 DII
 DII
 DII
  !
" 4++#
 	r1   c                :   t        |t              rGt        |j                  |j                  | j
                  j                  j                                     S t        |j                        t        |j                        z  t        |      j                         z  S )zX
        make an absolute path from a relative path, WITHOUT resolving symlinks
        )

isinstancer   r   absolute_pathsource_rootrT   environmentget_build_dirsubdirr>   )rS   stateargs      r2   _absolute_dirzFSModule._absolute_dirN   sr     c4 ))%*;*;T=M=M=Y=Y=g=g=ijkkE%%&ell);;d3i>R>R>TTTr1   c                l    | j                  ||      }	 |j                         }|S # t        $ r Y |S w xY w)z
        resolves symlinks and makes absolute a directory relative to calling meson.build,
        if not already absolute
        )r_   resolve	Exception)rS   r]   r^   paths       r2   _resolve_dirzFSModule._resolve_dirV   sF    
 !!%-	<<>D   		s   & 	33zfs.expanduserz0.54.0c                L    t        t        |d         j                               S Nr   )r(   r   r>   rS   r]   argskwargss       r2   r>   zFSModule.expanduserd   s      4Q=++-..r1   zfs.is_absolutec                    t        |d   t              r%t        dd      j                  |j                         t        t        |d               j                         S )Nr   zfs.is_absolute_file0.59.0)rW   r   r   use
subprojectr   r(   r?   rg   s       r2   r?   zFSModule.is_absolutej   sJ     d1gt$,h7;;E<L<LMDG%1133r1   zfs.as_posixc                :    t        |d         j                         S )z
        this function assumes you are passing a Windows path, even if on a Unix-like system
        and so ALL '' are turned to '/', even if you meant to escape a character
        r   )r   r@   rg   s       r2   r@   zFSModule.as_posixr   s     tAw'0022r1   z	fs.existsc                H    | j                  ||d         j                         S rf   )rd   rA   rg   s       r2   rA   zFSModule.exists|   $       Q07799r1   zfs.is_symlinkc                    t        |d   t              r%t        dd      j                  |j                         | j                  ||d         j                         S )Nr   zfs.is_symlink_filerk   )rW   r   r   rl   rm   r_   rB   rg   s       r2   rB   zFSModule.is_symlink   sN     d1gt$+X6::5;K;KL!!%a1<<>>r1   z
fs.is_filec                H    | j                  ||d         j                         S rf   )rd   rC   rg   s       r2   rC   zFSModule.is_file   s$       Q088::r1   z	fs.is_dirc                H    | j                  ||d         j                         S rf   )rd   rD   rg   s       r2   rD   zFSModule.is_dir   rp   r1   zfs.hashc                >   t        |d   t              r%t        dd      j                  |j                         | j                  ||d         }|j                         st        | d      	 t        j                  |d         }t        j                  dj                  |d   ||j                         j                               |j!                  |j#                                |j%                         S # t        $ r t        dj                  |d               w xY w)Nr   zfs.hash_filerk   z- is not a file and therefore cannot be hashedr   z"hash algorithm {} is not availablez$computing {} sum of {} size {} bytes)rW   r   r   rl   rm   rd   rC   r   hashlibnew
ValueErrorformatr   debugstatst_sizerR   
read_bytes	hexdigest)rS   r]   rh   ri   filehs         r2   rE   zFSModule.hash   s     d1gt$~x044U5E5EF  Q0||~ D6)V!WXX	WDG$A 	

9@@a$PTPYPYP[PcPcde	"#{{}	  	W !E!L!LTRSW!UVV	Ws   -C5 5'Dzfs.sizec                b   t        |d   t              r%t        dd      j                  |j                         | j                  ||d         }|j                         st        | d      	 |j                         j                  S # t        $ r t        dj                  |d               w xY w)Nr   zfs.size_filerk   z, is not a file and therefore cannot be sizedz{} size could not be determined)rW   r   r   rl   rm   rd   rC   r   rz   r{   rw   rx   )rS   r]   rh   ri   r~   s        r2   rF   zFSModule.size   s     d1gt$~x044U5E5EF  Q0||~ D6)U!VWW	T99;&&& 	T !B!I!I$q'!RSS	Ts   -B 'B.zfs.is_samepathc                r   t        |d   t              st        |d   t              r%t        dd      j                  |j                         | j                  ||d         }| j                  ||d         }|j                         sy|j                         sy	 |j                  |      S # t        $ r Y yw xY w)Nr   r   zfs.is_samepath_filerk   F)	rW   r   r   rl   rm   rd   rA   samefileOSError)rS   r]   rh   ri   file1file2s         r2   rG   zFSModule.is_samepath   s     d1gt$
47D(A,h7;;E<L<LM!!%a1!!%a1||~||~	>>%(( 		s   B* *	B65B6zfs.replace_suffixc                    t        |d   t              r%t        dd      j                  |j                         t        t        |d               }|j                  |d         }t        |      S )Nr   zfs.replace_suffix_filerk   r   )rW   r   r   rl   rm   r   r(   with_suffixrS   r]   rh   ri   originalrv   s         r2   rH   zFSModule.replace_suffix   s]     d1gt$/:>>u?O?OPCQL)""47+3xr1   z	fs.parentc                    t        |d   t              r%t        dd      j                  |j                         t        t        |d               }|j                  }t        |      S )Nr   zfs.parent_filerk   )rW   r   r   rl   rm   r   r(   rI   r   s         r2   rI   zFSModule.parent   sR     d1gt$'266u7G7GHCQL)oo3xr1   zfs.namec                    t        |d   t              r%t        dd      j                  |j                         t        t        |d               }|j                  }t        |      S )Nr   zfs.name_filerk   )rW   r   r   rl   rm   r   r(   rJ   r   s         r2   rJ   zFSModule.name   sQ     d1gt$~x044U5E5EFCQL)mm3xr1   zfs.stemc                    t        |d   t              r%t        dd      j                  |j                         t        t        |d               }|j                  }t        |      S )Nr   zfs.stem_filerk   )rW   r   r   rl   rm   r   r(   rK   r   s         r2   rK   zFSModule.stem   sQ     d1gt$~x044U5E5EFCQL)mm3xr1   zfs.readz0.57.0r)   zutf-8)defaultc                   |d   }|d   }| j                   j                  j                  }| j                   j                  }| j                   j                  j	                         }t        |t              rF|j                  rt        d      t        j                  j                  ||j                               }nB|r t        j                  j                  ||      }t        j                  j                  ||      }t        j                  j                  |      }t        t        |      t        |      d      rt        d      	 t!        ||      5 }	|	j#                         }
ddd       | j                   j)                  |       
S # 1 sw Y   &xY w# t$        $ r t        d	|d    d
      t&        $ r t        d|d          w xY w)aO  Read a file from the source tree and return its value as a decoded
        string.

        If the encoding is not specified, the file is assumed to be utf-8
        encoded. Paths must be relative by default (to prevent accidents) and
        are forbidden to be read from the build directory (to prevent build
        loops)
        r   r)   z2fs.read_file does not accept built files() objectsT)ra   z"path must not be in the build tree)r)   NzFile z does not exist.zdecoding failed for )rT   rZ   
source_dirr\   r[   rW   r   is_builtr   osrc   joinrelative_nameabspathr   r   openrL   FileNotFoundErrorUnicodeDecodeErroradd_build_def_file)rS   r]   rh   ri   rc   r)   src_dirsub_dir	build_dirfdatas              r2   rL   zFSModule.read   s    Aw*%""..99""))$$00>>@	dD!}}$HJ J77<<););)=>D'',,w877<<.Dwwt$4:tIE !EFF	CdX.  !vvx  	++D1     	D 5a	1A!BCC! 	C #7Qy!ABB	Cs$   F F&F FF 5Gzfs.copyfilez0.64.0)optargsr7   c                   |d   r|d   st        d      | j                  j                  |d   g      d   }|d   r|d   n(t        j                  j                  |j                        }t        |      rt        d      t        ||j                  |j                  |j                  |j                  j                         g dz   |g|gd|d   |d   g|d	   |d
   g|j                  d      }t        ||g      S )z3Copy a file into the build directory at build time.r6   r7   z6"install_dir" must be specified when "install" is truer   r   z-Destination path may not have path separators)z
--internalcopyz@INPUT@z@OUTPUT@Tr8   r9   zCopying file {})build_by_defaultr6   r7   r8   r9   backenddescription)r   rT   source_strings_to_filesr   rc   basenamefnamer   r   r\   rm   rZ   get_build_commandr   r	   )rS   r]   rh   ri   srcdestcts          r2   rM   zFSModule.copyfile  s    )VM%:"#[\\66QyA!D q'tAwrww'7'7		'B"#RSSLL//14aaEF!9%.//./MM)
" !bT**r1   zfs.relative_toz1.3.0c                T    dfd} ||d         } ||d         }t        ||      S )Nc                   t        | t              r:| j                  j                  j                  j                  j
                        S t        | t        t        t        f      rj                  j                  |       S t        j                  j                  j                  j                  j                  |       S N)rW   r   rX   rZ   r   r   r   r   r   r   get_target_filename_absr   rc   r   r\   )r^   r]   s    r2   to_pathz%FSModule.relative_to.<locals>.to_path>  s    #t$(():):)E)EuGXGXGbGbccC,0A;!OP}}<<SAAww||E$5$5$@$@%,,PSTTr1   r   r   )r^   zCT.Union[FileOrString, CustomTarget, CustomTargetIndex, BuildTarget]returnr(   )r   )rS   r]   rh   ri   r   tr   s    `     r2   rN   zFSModule.relative_to:  s3    	U DGDGq!}r1   )rT   z'Interpreter'r   None)r]   'ModuleState'r^   z'FileOrString'r   r   )r]   r   rh   T.Tuple[str]ri   T.Dict[str, T.Any]r   r(   )r]   r   rh   T.Tuple['FileOrString']ri   r   r   r5   )r]   r   rh   r   ri   r   r   r5   )r]   r   rh   zT.Tuple['FileOrString', str]ri   r   r   r(   )r]   r   rh   r   ri   r   r   int)r]   r   rh   z'T.Tuple['FileOrString', 'FileOrString']ri   r   r   r5   )r]   r   rh   r   ri   r   r   r(   )r]   r   rh   r   ri   z'ReadKwArgs'r   r(   )r]   r   rh   z&T.Tuple[FileOrString, T.Optional[str]]ri   r4   r   r	   )r]   r   rh   zYT.Tuple[T.Union[FileOrString, BuildTargetTypes], T.Union[FileOrString, BuildTargetTypes]]ri   r"   r   r(   )(r+   r,   r-   r
   INFOrP   r_   rd   r   r   r   r(   r>   r   r?   r@   rA   rB   rC   rD   rE   rF   rG   rH   rI   rJ   rK   r   r   rL   r   r   r   r   rM   r   r   r   rN   __classcell__)rU   s   @r2   r;   r;   4   s   dH%D,U *OS)/ * + /  (+$sDk24 3 , 4
 x(M3'3 ( ) 3 K%: & : Oc4[1? 2 ?
 L#&; ' ; K%: & : IT{C0 1  IT{+	T , 	T $sDkC;? @  '#tc: ;  K#t- .  IT{+ ,  IT{+	8$ % ,  	8$IT{+)Yz3HI' J , %'R x(MD#;>-#x1++$5+ ? )+B  '*$sD,@QS^&_begkmy  |M  OZ  b[  \  \ +r1   r;   c                     t        | i |S r   )r;   )rh   ri   s     r2   
initializer   L  s    T$V$$r1   )rh   T.Anyri   r   r   r;   )3
__future__r   pathlibr   r   r   ru   r   typingT r   r	   r
   r   buildr   r   r   r   interpreter.type_checkingr   r   r   r   interpreterbaser   r   r   r   r   mesonlibr   r   r   r   r   TYPE_CHECKINGr   r    rT   r!   r"   r#   r$   typing_extensionsr%   r'   r4   r;   r   r0   r1   r2   <module>r      s    # 3 3  	  < <  R R ] ] [ [ S S??()-1+Y 
% %U Up%r1   