o
    uJAfN                     @  s~  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rbddlmZmZ dd	lmZ ejed
ef Zeje ZdOddZ dOddZ!dOddZ"dPddZ#dej$v Z%G dd dej&Z'eG dd dZ(e( Z)e)j*Z*e)j+Z+e)j,Z,e)j-Z-e)j.Z.e)j/Z/e)j0Z0e)j1Z1e)j2Z2e)j3Z3e)j4Z4e)j5Z5e)j6Z6e)j7Z7e)j8Z8e)j9Z9e)j:Z:e)j;Z;e)j<Z<e)j=Z=e)j>Z>e)j?Z?e)j@Z@e)jAZAG dd
 d
ZBG dd dZCdQdRd"d#ZDdQdRd$d%ZEdSd&d'ZFdSd(d)ZGdSd*d+ZHdSd,d-ZIdSd.d/ZJdSd0d1ZKdSd2d3ZLdSd4d5ZMdSd6d7ZNdSd8d9ZOdSd:d;ZPdTd@dAZQdUdEdFZRdVdIdJZSdWdMdNZTdS )XzThis 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AnsiDecoratorreturnboolc                  C  s   t   } | dkS )NZwindows)platformsystemlower)Zplatname r   4/usr/lib/python3.10/site-packages/mesonbuild/mlog.py
is_windows+   s   r   c                  C  sh   ddl m} m} ddlm} | j}|d}| }||||s#dS t|	||j
dB p2tjdS )Nr   )windllbyref)DWORDiF   ZANSICON)Zctypesr   r   Zctypes.wintypesr   Zkernel32ZGetStdHandleZGetConsoleModer   ZSetConsoleModevalueosenvironget)r   r   r   Zkernelstdoutmoder   r   r   _windows_ansi/   s   
"r   c                  C  s   t tjdd } | d ur| S z"t rttj ot } nttj o-tj	dddk} W n t
y:   d} Y nw | tj_| S )Ncolorize_consoleTERMZdumbF)getattrsysr   r   r   isattyfilenor   r   r   	Exceptionr   )Z_colorize_consoler   r   r   r   >   s   "r   Nonec                   C  s2   t  rz	ttjd W d S  ty   Y d S w d S )Nr   )r   delattrr"   r   AttributeErrorr   r   r   r   setup_consoleN   s   r)   ZCIc                   @  s,   e Zd Ze Ze Ze Ze ZdS )	_SeverityN)	__name__
__module____qualname__enumautoNOTICEWARNINGERRORDEPRECATIONr   r   r   r   r*   [   s
    r*   c                   @  sH  e Zd ZU dZded< eedZded< dZded< dZ	d	ed
< dZ
dZdZeedZded< dZdZded< dZded< edxddZedxddZdyddZdyddZdzd!d"Zd{d#d$Zdyd%d&Zdyd'd(Zd|d}d-d.Zd~dd4d5Zddd6dd:d;Zddd/d<dd>d?Zdd/ddd/d@ddBdCZddEdFZ ddHdIZ!ddd/ddd/dJddLdMZ"ddNdOZ#dd/ddd/d@ddPdQZ$dd/dd/ddd/dRddYdZZ%dd/dd/ddd[dd\d]Z&dd/dd/ddd[dd^d_Z'dd/dd/ddd[dd`daZ(dd/dd/ddd[ddbdcZ)dddhdiZ*edddmdnZ+ddodpZ,ddrdsZ-edxdtduZ.ddvdwZ/dS )_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_FNAMEr   T.Iterator[None]c                 c  s$    d| _ z	d V  W d| _ d S d| _ w )NTFlog_disable_stdoutselfr   r   r   
no_loggingr   s
   z_Logger.no_loggingc                 c  *    | j }d| _ z	d V  W || _ d S || _ w NFr@   )rC   Zrestorer   r   r   force_loggingz      z_Logger.force_loggingr&   c                 C  
   d| _ d S )NTlog_errors_onlyrB   r   r   r   	set_quiet      
z_Logger.set_quietc                 C  rI   rF   rJ   rB   r   r   r   set_verbose   rM   z_Logger.set_verbosestartfloatc                 C  
   || _ d S N)r;   )rC   rO   r   r   r   set_timestamp_start   rM   z_Logger.set_timestamp_startc                 C  s6   | j d ur| j j}| j }d | _ |  |S |   d S rR   )r:   nameclose
stop_pager)rC   pathZexception_around_goerr   r   r   shutdown   s   
z_Logger.shutdownc              
   C  s  t  sd S g }dtjv rttjd }n*td}|s:t r:td}|r:t|j	d d d }tjdt
|d}|r?|g}|sCd S z$tj }d|vrQd	|d< d
|vrYd|d
< tj|tjdd|d| _W d S  ty } zdtjv rddlm} |dt
| W Y d }~d S d }~ww )NZPAGERlessgitr   usrbin)rW   LESSZRXFZ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PIPEr=   r%   mesonlibrc   )rC   Z	pager_cmdrY   rZ   rW   rb   erc   r   r   r   start_pager   s>   






z_Logger.start_pagerc                 C  sN   | j r%z| j j  | j j  W n	 ty   Y nw | j   d | _ d S d S rR   )r=   r_   flushrU   OSErrorwaitrB   r   r   r   rV      s   

z_Logger.stop_pagerlogdirri   fatal_warningsr   c                 C  s,   || _ ttj|| jddd| _|| _d S )Nwr^   )ra   )r6   openr   rW   joinr>   r:   log_fatal_warnings)rC   rt   ru   r   r   r   
initialize   s   
z_Logger.initializeTargsT.Sequence[TV_Loggable]keepdisplay_timestampc                 C  s   g }| j d ur|rdt | j  g}|D ]'}|d u rqt|tr(|| qt|tr6||| q|t| q|S )Nz[{:.3f}])	r;   formattime	monotonic
isinstanceri   appendr   get_text)rC   r{   r}   r~   arrargr   r   r   process_markup   s   

z_Logger.process_markup)sependnestedr   r   c                G  s   | j rd S t }t||||d | }| jrB|r"| jd d nd}g }|dD ]}	|	 }	||	r9||	 nd q+d	|}z| j
rJ| j
jnd }
t|d|
d W d S  tyn   |ddd}t|dd	 Y d S w )
N)r   r   filez|  
)r   r   asciireplace)r   )rA   ioStringIOprintgetvaluer9   re   stripr   rx   r=   r_   UnicodeEncodeErrorencodedecode)rC   r   r   r   r{   Ziostrrawprependlinesloutputcleanedr   r   r   force_print   s&   
z_Logger.force_print)r   r   r~   TV_Loggablec                G  s<   t |d|}| jd urt|| j||d | j  d S d S )NFr   r   r   )r   r:   r   rq   )rC   r   r   r~   r{   r   r   r   r   debug   s
   
z_Logger.debugis_errorr   r   r   r~   r   c                G  sj   t |d|}| jd urt|| j||d | j  t r#t |d|}| jr(|r3t||||d d S d S )NFr   T)r   r   r   )r   r:   r   rq   r   rK   r   )rC   r   r   r   r   r~   r{   r   r   r   r   _log   s   


z_Logger._logcmdc                 C  s2   t sd S dd |D }| d|d| d S )Nc                 S  s   g | ]}d | d qS )"r   .0xr   r   r   
<listcomp>  s    z*_Logger._debug_log_cmd.<locals>.<listcomp>z!meson_ci!/{} {} )_in_cir   r   rx   )rC   r   r{   r   r   r   _debug_log_cmd  s   z_Logger._debug_log_cmdr   c                 C  s   |  d|g d S )NZ
ci_include)r   )rC   r   r   r   r   cmd_ci_include  s   z_Logger.cmd_ci_include)r   oncer   r   r   r~   r   c                G  s<   |r| j ||||||d d S | j||||||d d S )Nr   )	_log_oncer   )rC   r   r   r   r   r   r~   r{   r   r   r   log  s   z_Logger.logc                 G  s   | j r
| j|  d S d S rR   )r;   r   rC   r{   r   r   r   log_timestamp  s   z_Logger.log_timestampc                  sV   ddd t  fdd|D }|| jv rd	S | j| | j||||||d
 d	S )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.
        r   r   r   ri   c                 S  s&   t | tr| S t | tr| jS t| S rR   )r   ri   r   r`   )r   r   r   r   to_str$  s
   

z!_Logger._log_once.<locals>.to_strc                 3  s    | ]} |V  qd S rR   r   r   ar   r   r   	<genexpr>*      z$_Logger._log_once.<locals>.<genexpr>Nr   )r   r   r   ri   )tupler<   addr   )rC   r   r   r   r   r~   r{   tr   r   r   r     s   

z_Logger._log_oncer   fatallocationr   r   r   r   severityr*   rargsr   r   T.Optional[BaseNode]c                G  s   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 r3t	dg}|t|	 }|d urV||jt }t||j}td|g}|| }t||||||d |  jd7  _| jrq|rs|
d	d S d S )
Nr   )rc   relpathzNOTICE:zWARNING:ERROR:zDEPRECATION:TV_LoggableList)r   r   r   r   r   z Fatal warnings enabled, aborting)rn   rc   r   r*   r0   boldr1   yellowr2   redr3   listfilenamer   getcwdget_error_location_stringlinenoTcastr   log_warnings_counterry   )rC   r   r   r   r   r   r   r   r   r   rc   r   labelr{   Zlocation_fileZlocation_strZlocation_listr   r   r   
_log_error0  s(   





z_Logger._log_error)r   r   r   r   r   r   c             
   G  &   | j tjg|R ||||||ddS NTr   )r   r*   r2   rC   r   r   r   r   r   r   r{   r   r   r   errorT     z_Logger.errorc             
   G  r   r   )r   r*   r1   r   r   r   r   warning\  r   z_Logger.warningc             
   G  r   r   )r   r*   r3   r   r   r   r   deprecationd  r   z_Logger.deprecationc             
   G  r   )NFr   )r   r*   r0   r   r   r   r   noticel  r   z_Logger.noticero   r%   prefixT.Optional[AnsiDecorator]c                   s   |d u rt d}|   g }t fdddD r5tt jtt }|| d j	 d j
 d |r<|| |t  |   | j|ddi W d    d S 1 s[w   Y  d S )Nr   c                 3  s     | ]}t  |d d uV  qd S rR   )r!   r   ro   r   r   r   y  s    z$_Logger.exception.<locals>.<genexpr>)r   r   colno:r   T)r   r   allget_relative_pathr   r   r   r   r   r   r   ri   rG   )rC   ro   r   r{   rW   r   r   r   	exceptiont  s    

"z_Logger.exceptionr   rT   T.Generator[None, None, None]c                 c  s2    | j | zd V  W | j   d S | j   w rR   )r9   r   pop)rC   rT   r   r   r   r     s
   z_Logger.nestedc                 C     | j S rR   )r6   rB   r   r   r   get_log_dir     z_Logger.get_log_dirintc                 C  
   t | jS rR   )lenr9   rB   r   r   r   get_log_depth  rM   z_Logger.get_log_depthc                 c  rE   )Nr   r   )rC   oldr   r   r   nested_warnings  rH   z_Logger.nested_warningsc                 C  r   rR   r   rB   r   r   r   get_warning_count  r   z_Logger.get_warning_count)r   r?   r   r&   )rO   rP   r   r&   )r   r5   F)rt   ri   ru   r   r   r&   )T)r{   r|   r}   r   r~   r   r   r8   )
r{   ri   r   r   r   r5   r   r5   r   r&   )
r{   r   r   r5   r   r5   r~   r   r   r&   )r{   r   r   r   r   r   r   r5   r   r5   r~   r   r   r&   )r   ri   r{   r8   r   r&   )r   ri   r   r&   )r{   r   r   r   r   r   r   r   r   r5   r   r5   r~   r   r   r&   )r{   r   r   r&   )r   r*   r   r   r   r   r   r   r   r   r   r   r   r5   r   r5   r   r   r   r&   )r{   r   r   r   r   r   r   r   r   r   r   r5   r   r5   r   r&   rR   )ro   r%   r   r   r   r&   )r   )rT   ri   r   r   r   ri   r   r   )0r+   r,   r-   r6   __annotations__r   r   r9   r:   r;   ry   rA   rK   setr<   r   r=   r>   r   rD   rG   rL   rN   rS   rX   rp   rV   rz   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r4   b   s   
 






&




%			

r4   c                   @  s:   e Zd ZdZdddd	ZdddZdddZdddZdS )r   z[0mFr`   ri   codequotedr   c                 C  s   || _ || _|| _d S rR   )r`   r   r   )rC   r`   r   r   r   r   r   __init__  s   
zAnsiDecorator.__init__
with_codesr   c                 C  s8   | j }|r| jr| j| j  tj }| jrd| d}|S )Nr   )r`   r   r   
plain_coder   )rC   r   r`   r   r   r   r     s   
zAnsiDecorator.get_textr   c                 C  r   rR   )r   r`   rB   r   r   r   __len__  rM   zAnsiDecorator.__len__c                 C  s   |  t S rR   )r   r   rB   r   r   r   __str__  s   zAnsiDecorator.__str__Nr   )r`   ri   r   ri   r   r   )r   r   r   ri   r   r   )r+   r,   r-   r   r   r   r   r   r   r   r   r   r     s    

c                   @  s*   e Zd ZdddZdddZdd
dZdS )AnsiTextr{   'SizedStringProtocol'c                 G  rQ   rR   )r{   r   r   r   r   r     rM   zAnsiText.__init__r   r   c                 C  s   t dd | jD S )Nc                 s      | ]}t |V  qd S rR   )r   r   r   r   r   r     r   z#AnsiText.__len__.<locals>.<genexpr>)sumr{   rB   r   r   r   r     s   zAnsiText.__len__ri   c                 C  s   d dd | jD S )Nr   c                 s  r   rR   )ri   r   r   r   r   r     r   z#AnsiText.__str__.<locals>.<genexpr>)rx   r{   rB   r   r   r   r     s   zAnsiText.__str__N)r{   r   r   r   )r+   r,   r-   r   r   r   r   r   r   r   r     s    

r   Fr`   ri   r   c                 C     t | d|dS )Nz[1mr   r   r`   r   r   r   r   r        r   c                 C  r  )Nz[3mr  r  r  r   r   r   italic  r  r  c                 C  
   t | dS )Nr   r  r`   r   r   r   plain  rM   r
  c                 C  r  )Nz[1;31mr  r	  r   r   r   r     rM   r   c                 C  r  )Nz[1;32mr  r	  r   r   r   green  rM   r  c                 C  r  )Nz[1;33mr  r	  r   r   r   r     rM   r   c                 C  r  )Nz[1;34mr  r	  r   r   r   blue  rM   r  c                 C  r  )Nz[1;36mr  r	  r   r   r   cyan  rM   r  c                 C  r  )Nz[31mr  r	  r   r   r   
normal_red  rM   r  c                 C  r  )Nz[32mr  r	  r   r   r   normal_green  rM   r  c                 C  r  )Nz[33mr  r	  r   r   r   normal_yellow  rM   r  c                 C  r  )Nz[34mr  r	  r   r   r   normal_blue  rM   r  c                 C  r  )Nz[36mr  r	  r   r   r   normal_cyan  rM   r  fnamer   r   r   c                 C  s   |  d| dS )Nr   r   )r  r   r   r   r   r     s   r   targetr   currentc              	   C  s\   dg}|g|j D ]"}z| |}tg ||R  W   S  ty%   Y nw |dg7 }q	| S )z#Get the path to target from current.z..)rh   relative_tor   
ValueError)r  r  accpartrW   r   r   r   r     s   
r   
input_listr8   c                 C  sV   t | }|dkrdd| d d | d gS |dkr!d| S |dkr)| d S dS )N   z and z, r   r   r   r   )r   rx   )r  r   r   r   r   format_list  s    
r  liner   c                 C  s   |  d| dd|  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   ^r   )r`   r  r   r   r   r   	code_line!  s   r   )r   r   r   r   )r`   ri   r   r   r   r   )r`   ri   r   r   )r  r   r   r   r   ri   )r  r   r  r   r   r   )r  r8   r   ri   )r`   ri   r  ri   r   r   r   ri   )U__doc__
__future__r   r.   r   r   r"   r   r   rd   rk   rf   typingr   
contextlibr   dataclassesr   r   pathlibr   TYPE_CHECKINGZ_typingr   r	   Zmparserr
   Unionri   r   Listr   r   r   r   r)   r   r   Enumr*   r4   Z_loggerr   r   r   r   r   r   r   r   r   rz   r   r   r   r   rD   r   r   rL   rS   rN   rX   rp   rV   r   r   r   r   r  r
  r   r  r   r  r  r  r  r  r  r  r   r   r  r   r   r   r   r   <module>   s   






  >













