
    eN                       d Z ddlmZ 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	Z	ddl
Z
ddlZddlZddlmZ ddlmZmZ ddlmZ ej*                  r/ddlmZmZ dd	lmZ ej6                  ed
ef   Zej<                  e   Zd(dZ d(dZ!d(dZ"d)dZ#dejH                  v Z% G d dejL                        Z'e G d d             Z( e(       Z)e)jT                  Z*e)jV                  Z+e)jX                  Z,e)jZ                  Z-e)j\                  Z.e)j^                  Z/e)j`                  Z0e)jb                  Z1e)jd                  Z2e)jf                  Z3e)jh                  Z4e)jj                  Z5e)jl                  Z6e)jn                  Z7e)jp                  Z8e)jr                  Z9e)jt                  Z:e)jv                  Z;e)jx                  Z<e)jz                  Z=e)j|                  Z>e)j~                  Z?e)j                  Z@e)j                  ZA G d d
      ZB G d d      ZCd*d+dZDd*d+dZEd,dZFd,dZGd,dZHd,dZId,dZJd,dZKd,dZLd,d ZMd,d!ZNd,d"ZOd,d#ZPd-d$ZQd.d%ZRd/d&ZSd0d'ZTy)1zThis is (mostly) a standalone module used to write logging
information about Meson runs. Some output goes to screen,
some to logging dir and some goes to both.    )annotationsN)contextmanager)	dataclassfield)Path   )StringProtocolSizedStringProtocol)BaseNodeAnsiDecoratorc                 P    t        j                         j                         } | dk(  S )Nwindows)platformsystemlower)platnames    1/usr/lib/python3/dist-packages/mesonbuild/mlog.py
is_windowsr   +   s"     &&(Hy      c                 *   ddl m} m} ddlm} | j
                  }|j                  d      } |       }|j                  | ||            syt        |j                  ||j                  dz        xs t        j                  j                  d            S )Nr   )windllbyref)DWORDiF   ANSICON)ctypesr   r   ctypes.wintypesr   kernel32GetStdHandleGetConsoleModeboolSetConsoleModevalueosenvironget)r   r   r   kernelstdoutmodes         r   _windows_ansir*   /   su    $%__F  %F7D  t5 %%fdjj3.>?\2::>>R[C\]]r   c                    t        t        j                  dd       } | | S 	 t               r>t	        j
                  t        j                  j                               xr
 t               } nVt	        j
                  t        j                  j                               xr# t        j                  j                  dd      dk7  } | t        j                  _        | S # t        $ r d} Y $w xY w)Ncolorize_consoleTERMdumbF)getattrsysr(   r   r$   isattyfilenor*   r%   r&   	Exceptionr,   )_colorize_consoles    r   r,   r,   >   s    %cjj2DdK$  "< "		#***;*;*= > R=? "		#***;*;*= > k2::>>RXZ`CaekCk #4CJJ	  "!"s   BC C$#C$c                 n    t               r	 t        t        j                  d       y y # t        $ r Y y w xY w)Nr,   )r   delattrr0   r(   AttributeError r   r   setup_consoler9   N   s6     |	CJJ 23   		s   ( 	44CIc                      e Zd Z ej                         Z ej                         Z ej                         Z ej                         Zy)	_SeverityN)	__name__
__module____qualname__enumautoNOTICEWARNINGERRORDEPRECATIONr8   r   r   r<   r<   [   s6    TYY[FdiikGDIIKE$))+Kr   r<   c                     e Zd ZU dZded<    ee      Zded<   dZded<   dZ	d	ed
<   dZ
dZdZ ee      Zded<   dZdZded<   dZded<   ed8d       Zed8d       Zd9dZd9dZd:dZd;dZd9dZd9dZd<d=dZd>d?dZddd	 	 	 d@d Zdddd!	 	 	 	 	 dAd"Zdddddd#	 	 	 	 	 	 	 	 	 dBd$ZdCd%Z dDd&Z!ddddddd'	 	 	 	 	 	 	 	 	 	 	 dEd(Z"dFd)Z#dddddd#	 	 	 	 	 	 	 	 	 dBd*Z$dddddddd+	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dGd,Z%ddddddd-	 	 	 	 	 	 	 	 	 	 	 	 	 dHd.Z&ddddddd-	 	 	 	 	 	 	 	 	 	 	 	 	 dHd/Z'ddddddd-	 	 	 	 	 	 	 	 	 	 	 	 	 dHd0Z(ddddddd-	 	 	 	 	 	 	 	 	 	 	 	 	 dHd1Z)dIdJd2Z*edKdLd3       Z+dMd4Z,dNd5Z-ed8d6       Z.dNd7Z/y)O_LoggerNT.Optional[str]log_dir)default_factoryT.List[str]	log_depthzT.Optional[T.TextIO]log_filezT.Optional[float]log_timestamp_startFzT.Set[T.Tuple[str, ...]]logged_oncer   zT.Optional['subprocess.Popen']	log_pagerzmeson-log.txtzT.ClassVar[str]
_LOG_FNAMEc              #  J   K   d| _         	 d  d| _         y # d| _         w xY ww)NTFlog_disable_stdoutselfs    r   
no_loggingz_Logger.no_loggingr   s&     "&	,&+D#eD#s   # #	 #c              #  b   K   | j                   }d| _         	 d  || _         y # || _         w xY wwNFrS   )rV   restores     r   force_loggingz_Logger.force_loggingz   s1     ))"'	.&-D#gD#   /# /	,/c                    d| _         y )NTlog_errors_onlyrU   s    r   	set_quietz_Logger.set_quiet   s
    #r   c                    d| _         y rY   r^   rU   s    r   set_verbosez_Logger.set_verbose   s
    $r   c                    || _         y N)rN   )rV   starts     r   set_timestamp_startz_Logger.set_timestamp_start   s
    #( r   c                    | j                   ;| j                   j                  }| j                   }d | _         |j                          |S | j                          y rd   )rM   nameclose
stop_pager)rV   pathexception_around_goers      r   shutdownz_Logger.shutdown   sJ    ==$==%%D$(MM! DM!'')Kr   c                   t               sy g }dt        j                  v r't        j                  t        j                  d         }n{t        j                  d      }|s_t               rUt        j                  d      }|r>t        |      j                  d   dz  dz  }t        j                  dt        |            }|r|g}|sy 	 t        j                  j                         }d|vrd	|d<   d
|vrd|d
<   t        j                  |t        j                  dd|      | _        y # t         $ r6}dt        j                  v rddlm}  |dt        |             Y d }~y d }~ww xY w)NPAGERlessgitr   usrbin)rk   LESSRXFLVz-cTutf-8)stdintextencodingenv)MesonExceptionzFailed to start pager: )r,   r$   r%   shlexsplitshutilwhichr   r   parentsstrcopy
subprocessPopenPIPErP   r3   mesonlibr|   )rV   	pager_cmdrp   rq   rk   r{   er|   s           r   start_pagerz_Logger.start_pager   s3   !	bjj BJJw$78I<<'DJLll5)9,,Q/%7%?D!<<SY?D!F		I **//#CS #F3 D	'--iz37'sTDN 	I"**$4$'>s1vh%GHH %	Is   AD$ $	E#-,EE#c                   | j                   rk	 | j                   j                  j                          | j                   j                  j                          | j                   j                          d | _         y y # t        $ r Y .w xY wrd   )rP   rx   flushri   OSErrorwaitrU   s    r   rj   z_Logger.stop_pager   sl    >>$$**,$$**, NN!!DN   s   AA9 9	BBc                    || _         t        t        j                  j	                  || j
                        dd      | _        || _        y )Nwrw   )rz   )rI   openr$   rk   joinrQ   rM   log_fatal_warnings)rV   logdirfatal_warningss      r   
initializez_Logger.initialize   s5    RWW\\&$//BCRYZ"0r   Tc                v   g }| j                   3|r1dj                  t        j                         | j                   z
        g}|D ]r  }|t	        |t
              r|j                  |       (t	        |t              r!|j                  |j                  |             Y|j                  t        |             t |S )Nz[{:.3f}])	rN   formattime	monotonic
isinstancer   appendr   get_text)rV   argskeepdisplay_timestamparrargs         r   process_markupz_Logger.process_markup   s    ##/4E$$T^^%58P8P%PQRC 	%C{#s#

3C/

3<<-.

3s8$	% 
r   )sependc               F   | j                   ry t        j                         }t        ||||d |j	                         }| j
                  rg|r| j
                  d   dz   nd}g }|j                  d      D ]*  }	|	j                         }	|j                  |	r||	z   nd       , dj                  |      }	 | j                  r| j                  j                  nd }
t        |d|
       y # t        $ r1 |j                  dd      j                  d      }t        |d	       Y y w xY w)
N)r   r   filez|  
)r   r   asciireplace)r   )rT   ioStringIOprintgetvaluerL   r~   stripr   r   rP   rx   UnicodeEncodeErrorencodedecode)rV   nestedr   r   r   iostrrawprependlinesloutputcleaneds               r   force_printz_Logger.force_print   s    ""t#E2nn>>39dnnR(4/rGEYYt_ 7GGIAWq[267 ))E"C	#-1^^T^^))F#2F+! 	#jj)4;;GDG'r"	#s   32C& &7D D )r   r   r   c                   t        |d|      }| j                  2t        || j                  ||d | j                  j                          y y )NFr   r   r   )r   rM   r   r   )rV   r   r   r   r   r   s         r   debugz_Logger.debug   sB    T5*;<==$3T]]=MM! %r   is_errorr   r   r   r   c                   t        |d|      }| j                  1t        || j                  ||d | j                  j                          t	               rt        |d|      }| j
                  r|rt        ||||d y y )NFr   T)r   r   r   )r   rM   r   r   r,   r_   r   )rV   r   r   r   r   r   r   r   s           r   _logz_Logger._log   sr     T5*;<==$3T]]=MM! t->?C##xV#> (0r   c                    t         sy |D cg c]  }d| d
 }}| j                  dj                  |dj                  |                   y c c}w )N"z!meson_ci!/{} {} )_in_cir   r   r   )rV   cmdr   xs       r   _debug_log_cmdz_Logger._debug_log_cmd  sJ    "&'Q!A3a''

%,,S#((4.AB (s   Ac                *    | j                  d|g       y )N
ci_include)r   )rV   r   s     r   cmd_ci_includez_Logger.cmd_ci_include  s    L4&1r   )r   oncer   r   r   r   c          	     b    |r | j                   ||||||d y  | j                  ||||||d y )Nr   )	_log_oncer   )rV   r   r   r   r   r   r   r   s           r   logz_Logger.log  s:    
 DNND8FQThyzDIIthv3Cctur   c                <    | j                   r | j                  |  y y rd   )rN   r   rV   r   s     r   log_timestampz_Logger.log_timestamp  s    ##DHHdO $r   c          	         ddt        fd|D              }|| j                  v ry| j                  j                  |        | j                  ||||||d y)zLog variant that only prints a given message one time per meson invocation.

        This considers ansi decorated values by the values they wrap without
        regard for the AnsiDecorator itself.
        c                t    t        | t              r| S t        | t              r| j                  S t        |       S rd   )r   r   r   ry   )r   s    r   to_strz!_Logger._log_once.<locals>.to_str$  s-    !S!!]+vvq6Mr   c              3  .   K   | ]  } |        y wrd   r8   ).0ar   s     r   	<genexpr>z$_Logger._log_once.<locals>.<genexpr>*  s     *&)*s   Nr   )r   TV_Loggablereturnr   )tuplerO   addr   )	rV   r   r   r   r   r   r   tr   s	           @r   r   z_Logger._log_once  sX    	 *T**   Q		4(6s_pqr   r   fatallocationr   r   r   r   c          	     N   ddl m}
m} |t        j                  u rt        d      g}n\|t        j                  u rt        d      g}n=|t        j                  u rt        d      g}n|t        j                  u rt        d      g}t        |	      z   }|W ||j                  t        j                               }t        ||j                         }t#        j$                  d|g      }||z   }t'        ||||||d | xj(                  dz  c_        | j*                  r|r |
d	      y y )
Nr   )r|   relpathzNOTICE:zWARNING:ERROR:zDEPRECATION:TV_LoggableList)r   r   r   r   r   z Fatal warnings enabled, aborting)r   r|   r   r<   rB   boldrC   yellowrD   redrE   listfilenamer$   getcwdget_error_location_stringlinenoTcastr   log_warnings_counterr   )rV   severityr   r   r   r   r   r   r   rargsr|   r   labelr   location_filelocation_strlocation_lists                    r   
_log_errorz_Logger._log_error0  s    	6 y'''&*9o%6E***J'(E(]OE...()EtE{"#H$5$5ryy{CM4]HOOTL FF#4|nEM 4'DTV#Q!!Q&!""u !CDD (-"r   )r   r   r   r   r   r   c               V     | j                   t        j                  g|||||||ddS NTr   )r   r<   rD   rV   r   r   r   r   r   r   r   s           r   errorz_Logger.errorT  s=    
 ty O ODX`&,#3O 	Or   c               V     | j                   t        j                  g|||||||ddS r   )r   r<   rC   r   s           r   warningz_Logger.warning\  s?    
 ty00 O4 Od%Zb&,#3O 	Or   c               V     | j                   t        j                  g|||||||ddS r   )r   r<   rE   r   s           r   deprecationz_Logger.deprecationd  s?    
 ty44 Ot O$e^f&,#3O 	Or   c               V     | j                   t        j                  g|||||||ddS )NFr   )r   r<   rB   r   s           r   noticez_Logger.noticel  s?    
 ty// P$ PTYa&,#3P 	Pr   c                   |t        d      }| j                          g }t        fddD              rht        t	        j
                        t	        t        j                                     }|j                  | dj                   dj                   d       |r|j                  |       |j                  t                     | j                         5   | j                  |ddi d d d        y # 1 sw Y   y xY w)Nr   c              3  <   K   | ]  }t        |d       d u  y wrd   )r/   )r   r   r   s     r   r   z$_Logger.exception.<locals>.<genexpr>y  s     T1wq!T"$.Ts   )r   r   colno:r   T)r   r   allget_relative_pathr   r   r$   r   r   r   r  r   r[   )rV   r   prefixr   rk   s    `   r   	exceptionz_Logger.exceptiont  s    >]F
46T8STT %T!&&\4		3DEDKK4&!((1QWWIQ78KKCF! 	+DHHd*T*	+ 	+ 	+s   C66C?c              #     K   | j                   j                  |       	 d  | j                   j                          y # | j                   j                          w xY wwrd   )rL   r   pop)rV   rh   s     r   r   z_Logger.nested  s@     d#	!NN DNN s   A> AAAc                    | j                   S rd   )rI   rU   s    r   get_log_dirz_Logger.get_log_dir  s    ||r   c                ,    t        | j                        S rd   )lenrL   rU   s    r   get_log_depthz_Logger.get_log_depth  s    4>>""r   c              #  b   K   | j                   }d| _         	 d  || _         y # || _         w xY ww)Nr   r   )rV   olds     r   nested_warningsz_Logger.nested_warnings  s1     ''$%!	,(+D%D%r\   c                    | j                   S rd   r  rU   s    r   get_warning_countz_Logger.get_warning_count  s    (((r   )r   zT.Iterator[None]r   None)re   floatr   r  )r   rH   F)r   r   r   r!   r   r  )T)r   zT.Sequence[TV_Loggable]r   r!   r   r!   r   rK   )
r   r   r   r!   r   rH   r   rH   r   r  )
r   r   r   rH   r   rH   r   r!   r   r  )r   r   r   r!   r   r!   r   rH   r   rH   r   r!   r   r  )r   r   r   rK   r   r  )r   r   r   r  )r   r   r   r!   r   r!   r   r!   r   rH   r   rH   r   r!   r   r  )r   r   r   r  )r   r<   r   r   r   r!   r   r!   r   T.Optional[BaseNode]r   r!   r   rH   r   rH   r   r!   r   r  )r   r   r   r!   r   r!   r   r  r   r!   r   rH   r   rH   r   r  rd   )r   r3   r  zT.Optional[AnsiDecorator]r   r  )r   )rh   r   r   zT.Generator[None, None, None]r   r   r   int)0r=   r>   r?   rI   __annotations__r   r   rL   rM   rN   r   rT   r_   setrO   r   rP   rQ   r   rW   r[   r`   rb   rf   rm   r   rj   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r   r  r  r  r  r8   r   r   rG   rG   b   s     $G_#"48I{8%)H")-1*1O,1#,FK)F04I-4"1J1, , . .$%)$IL"1
 LP+/#(#48#0 @D%)T""">B"NR" 9> $(D
?
?'6
?!
?=A
?MQ
?C2 8=t#'#'&*	vv(,v v !v  $	v 04	v >C!%d)-rr,;r&rBFrRVr* !&T48"&t*.$("E"E.2"E1"E  "E .="E (	"E
 ""E
 .2"EJ !/3!$%)	OO)-O,O O )8O #	O /3	O #$15#D'+	OO+/O.O O +:O %	O 15	O "'d59#'+/	OO/3O2O !O />O )	O 59	O "04"4&*	PP*.P-P P *9P $	P 04	P+" ! !# , ,)r   rG   c                  2    e Zd ZdZdddZd	dZd
dZddZy)r   z[0mc                .    || _         || _        || _        y rd   )ry   codequoted)rV   ry   r&  r'  s       r   __init__zAnsiDecorator.__init__  s    		r   c                    | j                   }|r6| j                  r*| j                  | j                   z   t        j                  z   }| j                  rd| d}|S )Nr   )ry   r&  r   
plain_coder'  )rV   
with_codesry   s      r   r   zAnsiDecorator.get_text  sJ    yy$))99tyy(=+C+CCD;;tfA;Dr   c                ,    t        | j                        S rd   )r  ry   rU   s    r   __len__zAnsiDecorator.__len__  s    499~r   c                4    | j                  t                     S rd   )r   r,   rU   s    r   __str__zAnsiDecorator.__str__  s    }}-/00r   Nr  )ry   r   r&  r   r'  r!   )r+  r!   r   r   r   r  )r=   r>   r?   r*  r(  r   r-  r/  r8   r   r   r   r     s    J
1r   c                  $    e Zd ZddZddZddZy)AnsiTextc                    || _         y rd   )r   r   s     r   r(  zAnsiText.__init__  s	    	r   c                :    t        d | j                  D              S )Nc              3  2   K   | ]  }t        |        y wrd   )r  r   r   s     r   r   z#AnsiText.__len__.<locals>.<genexpr>  s     -a3q6-   )sumr   rU   s    r   r-  zAnsiText.__len__  s    -499---r   c                F    dj                  d | j                  D              S )Nr   c              3  2   K   | ]  }t        |        y wrd   )r   r5  s     r   r   z#AnsiText.__str__.<locals>.<genexpr>  s     1!s1v1r6  )r   r   rU   s    r   r/  zAnsiText.__str__  s    ww1tyy111r   N)r   z'SizedStringProtocol'r   r  )r=   r>   r?   r(  r-  r/  r8   r   r   r1  r1    s    .2r   r1  c                    t        | d|      S )Nz[1mr'  r   ry   r'  s     r   r   r         y88r   c                    t        | d|      S )Nz[3mr;  r<  r=  s     r   italicr@    r>  r   c                    t        | d      S )Nr   r<  ry   s    r   plainrC    s    r""r   c                    t        | d      S )Nz[1;31mr<  rB  s    r   r   r         |,,r   c                    t        | d      S )Nz[1;32mr<  rB  s    r   greenrG    rE  r   c                    t        | d      S )Nz[1;33mr<  rB  s    r   r   r     rE  r   c                    t        | d      S )Nz[1;34mr<  rB  s    r   bluerJ    rE  r   c                    t        | d      S )Nz[1;36mr<  rB  s    r   cyanrL    rE  r   c                    t        | d      S )Nz[31mr<  rB  s    r   
normal_redrN        z**r   c                    t        | d      S )Nz[32mr<  rB  s    r   normal_greenrQ    rO  r   c                    t        | d      S )Nz[33mr<  rB  s    r   normal_yellowrS    rO  r   c                    t        | d      S )Nz[34mr<  rB  s    r   normal_bluerU    rO  r   c                    t        | d      S )Nz[36mr<  rB  s    r   normal_cyanrW    rO  r   c                    |  d| dS )Nr  r8   )fnamer   s     r   r   r     s    WAfXQr   c                    dg}|g|j                   D ]"  }	 | j                  |      }t        g || c S  | S # t        $ r Y nw xY w|dgz  }=)z#Get the path to target from current.z..)r   relative_tor   
ValueError)targetcurrentaccpartrk   s        r   r
  r
    st     %C+7??+ 	%%d+D##d## M  		vs   :	AAc                    t        |       }|dkD  r(dj                  dj                  | d d       | d   g      S |dk(  rdj                  |       S |dk(  r| d   S y)N   z and z, r   r   r   r   )r  r   )
input_listr   s     r   format_listre    sc    JA1u||TYYz#27BHII	
a||J''	
a!}r   c                    |  d| dd|z   dS )a  Print a line with a caret pointing to the colno

    :param text: A message to display before the line
    :param line: The line of code to be pointed to
    :param colno: The column number to point at
    :return: A formatted string of the text, line, and a caret
    r   r   ^r8   )ry   liner  s      r   	code_lineri  !  s!     V2dV2cEk]!,,r   )r   r!   r  r  )ry   r   r'  r!   r   r   )ry   r   r   r   )rY  r	   r   r!  r   r   )r^  r   r_  r   r   r   )rd  rK   r   r   )ry   r   rh  r   r  r!  r   r   )U__doc__
__future__r   r@   r$   r   r0   r   r   r}   r   r   typingr   
contextlibr   dataclassesr   r   pathlibr   TYPE_CHECKING_typingr	   r
   mparserr   Unionr   r   Listr   r   r*   r,   r9   r%   r   Enumr<   rG   _loggerr   r   r  r   r  r   r  r  r  r   r   r   r   r  rW   r  r   r`   rf   rb   rm   r   rj   r   r   r1  r   r@  rC  r   rG  r   rJ  rL  rN  rQ  rS  rU  rW  r   r
  re  ri  r8   r   r   <module>rw     s(  . #  	 	 
       % ( ??<!''#>?Kff[)O!^  
			  z) z) z)x	 )''!!	!!%%!!-- 
kk%%	))
	''	11 !!!!

//1 1,2 299#-----+++++ "	-r   