3
ûâde-  ã               @   sÚ  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	m
Z
mZmZmZmZmZ d dlmZmZ d dlmZ d dlmZ d dlmZ yd dlZW n ek
rÀ   d dlZY nX yd dlmZ W n ek
rê   dZY nX ejƒ Z ed	ƒZ!G d
d„ deƒZ"ee# e#e$dœdd„Z%e j&d&e'ed dœdd„ƒZ(e'dœdd„Z)G dd„ dej*ƒZ+e,e
e,ge,f dœdd„Z-G dd„ dej.ƒZ/G dd„ dej0j1ƒZ2G dd „ d eƒZ3G d!d"„ d"eƒZ4e'e$ee, e'd#œd$d%„Z5dS )'é    N)ÚFilter)ÚIOÚAnyÚCallableÚIteratorÚOptionalÚTextIOÚTypeÚcast)ÚVERBOSEÚ	getLogger)ÚWINDOWS)ÚDEPRECATION_MSG_PREFIX)Ú
ensure_dir)Úcoloramazpip.subprocessorc               @   s   e Zd ZdZdS )ÚBrokenStdoutLoggingErrorzO
    Raised if BrokenPipeError occurs for the stdout stream while logging.
    N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__© r   r   ú:/tmp/pip-build-red6nood/pip/pip/_internal/utils/logging.pyr   !   s   r   )Ú	exc_classÚexcÚreturnc             C   s0   | t krdS tsdS t|tƒo.|jtjtjfkS )NTF)ÚBrokenPipeErrorr   Ú
isinstanceÚOSErrorÚerrnoÚEINVALÚEPIPE)r   r   r   r   r   Ú_is_broken_pipe_error'   s
    r!   é   )Únumr   c             c   s6   t ƒ t_t j| 7  _z
dV  W dt j| 8  _X dS )zv
    A context manager which will cause the log output to be indented for any
    log messages emitted inside it.
    N)Úget_indentationÚ
_log_stateÚindentation)r#   r   r   r   Ú
indent_log4   s
    
r'   )r   c               C   s   t tddƒS )Nr&   r   )Úgetattrr%   r   r   r   r   r$   C   s    r$   c                   sZ   e Zd ZdZddœeeeddœ‡ fdd„Zeeedœd	d
„Z	e
jedœ‡ fdd„Z‡  ZS )ÚIndentingFormatterz%Y-%m-%dT%H:%M:%SF)Úadd_timestampN)Úargsr*   Úkwargsr   c               s   || _ tƒ j||Ž dS )zÎ
        A logging.Formatter that obeys the indent_log() context manager.

        :param add_timestamp: A bool indicating output lines should be prefixed
            with their record's timestamp.
        N)r*   ÚsuperÚ__init__)Úselfr*   r+   r,   )Ú	__class__r   r   r.   J   s    zIndentingFormatter.__init__)Ú	formattedÚlevelnor   c             C   s.   |t jk rdS |jtƒrdS |t jk r*dS dS )zv
        Return the start of the formatted log message (not counting the
        prefix to add to each line).
        Ú z	WARNING: zERROR: )ÚloggingÚWARNINGÚ
startswithr   ÚERROR)r/   r1   r2   r   r   r   Úget_message_startY   s    


z$IndentingFormatter.get_message_start)Úrecordr   c                sl   t ƒ j|ƒ}| j||jƒ}|| }d‰ | jr<| j|ƒ› d�‰ ˆ dtƒ  7 ‰ dj‡ fdd„|jdƒD ƒƒ}|S )z†
        Calls the standard formatter, but will indent all of the log message
        lines by our current indentation level.
        r3   ú c                s   g | ]}ˆ | ‘qS r   r   )Ú.0Úline)Úprefixr   r   ú
<listcomp>v   s    z-IndentingFormatter.format.<locals>.<listcomp>T)	r-   Úformatr8   r2   r*   Ú
formatTimer$   ÚjoinÚ
splitlines)r/   r9   r1   Zmessage_start)r0   )r=   r   r?   i   s    zIndentingFormatter.format)r   r   r   Údefault_time_formatr   Úboolr.   ÚstrÚintr8   r4   Ú	LogRecordr?   Ú__classcell__r   r   )r0   r   r)   G   s   

r)   )Úcolorsr   c                 s   t t dœ‡ fdd„}|S )N)Úinpr   c                s   dj tˆ ƒ| tjjg ƒS )Nr3   )rA   Úlistr   ÚStyleÚ	RESET_ALL)rJ   )rI   r   r   Úwrapped{   s    z_color_wrap.<locals>.wrapped)rE   )rI   rN   r   )rI   r   Ú_color_wrapz   s    rO   c                   s¢   e Zd Zer2ejeejjƒfej	eejj
ƒfgZng Zdee eddœ‡ fdd„Zedœdd„Zedœdd	„Zejed
œ‡ fdd„Zejdd
œ‡ fdd„Z‡  ZS )ÚColorizedStreamHandlerN)ÚstreamÚno_colorr   c                s,   t ƒ j|ƒ || _tr(tr(tj| jƒ| _d S )N)r-   r.   Ú	_no_colorr   r   ÚAnsiToWin32rQ   )r/   rQ   rR   )r0   r   r   r.   �   s    zColorizedStreamHandler.__init__)r   c             C   s.   t r"tr"ttj| jƒ}|jtjkS | jtjkS )zA
        Return whether the handler is using sys.stdout.
        )r   r   r
   rT   rQ   rN   ÚsysÚstdout)r/   rQ   r   r   r   Ú_using_stdout”   s    z$ColorizedStreamHandler._using_stdoutc             C   sZ   t  s| jrdS t| jt jƒs$| jn| jj}t|dƒrB|jƒ rBdS tj	j
dƒdkrVdS dS )NFÚisattyTÚTERMÚANSI)r   rS   r   rQ   rT   rN   ÚhasattrrX   ÚosÚenvironÚget)r/   Úreal_streamr   r   r   Úshould_colorŸ   s    z#ColorizedStreamHandler.should_color)r9   r   c                s@   t ƒ j|ƒ}| jƒ r<x&| jD ]\}}|j|kr||ƒ}P qW |S )N)r-   r?   r`   ÚCOLORSr2   )r/   r9   ÚmsgÚlevelÚcolor)r0   r   r   r?   µ   s    
zColorizedStreamHandler.formatc                s@   t jƒ d d… \}}|r4|r4| jƒ r4t||ƒr4tƒ ‚tƒ j|ƒS )Nr"   )rU   Úexc_inforW   r!   r   r-   ÚhandleError)r/   r9   r   r   )r0   r   r   rf   Á   s    
z"ColorizedStreamHandler.handleError)NN)r   r   r   r   r4   r7   rO   ÚForeÚREDr5   ÚYELLOWra   r   r   rD   r.   rW   r`   rG   rE   r?   rf   rH   r   r   )r0   r   rP   �   s   rP   c                   s&   e Zd Zee dœ‡ fdd„Z‡  ZS )ÚBetterRotatingFileHandler)r   c                s   t tjj| jƒƒ tƒ jƒ S )N)r   r\   ÚpathÚdirnameÚbaseFilenamer-   Ú_open)r/   )r0   r   r   rn   Ó   s    zBetterRotatingFileHandler._open)r   r   r   r   r   rn   rH   r   r   )r0   r   rj   Ò   s   rj   c               @   s.   e Zd Zeddœdd„Zejedœdd„ZdS )ÚMaxLevelFilterN)rc   r   c             C   s
   || _ d S )N)rc   )r/   rc   r   r   r   r.   Ù   s    zMaxLevelFilter.__init__)r9   r   c             C   s   |j | jk S )N)r2   rc   )r/   r9   r   r   r   ÚfilterÜ   s    zMaxLevelFilter.filter)	r   r   r   rF   r.   r4   rG   rD   rp   r   r   r   r   ro   Ø   s   ro   c                   s*   e Zd ZdZejedœ‡ fdd„Z‡  ZS )ÚExcludeLoggerFilterzQ
    A logging Filter that excludes records from a logger (or its children).
    )r9   r   c                s   t ƒ j|ƒ S )N)r-   rp   )r/   r9   )r0   r   r   rp   æ   s    zExcludeLoggerFilter.filter)	r   r   r   r   r4   rG   rD   rp   rH   r   r   )r0   r   rq   à   s   rq   )Ú	verbosityrR   Úuser_log_filer   c             C   s€  | dkrt j}nD| dkrt}n6| d1kr.t j}n&| d2kr>t j}n| d3krNt j}nt j}t j|ƒ}|dk	}|rt|}d}nd}|}|d4krˆd	nd}d
ddœ}	dddœ}
dddg|r²dgng  }t jj	dddt jdœdt
jdœdt
jdœdœtddœtdddœdœ||
d  ||	d! d"d#gd$d%œd	|
d  ||	d& d"gd$d%œ||
d  ||	d& d'gd$d%œd|
d( |d)dd*d+œd,œ||d-œd.d/|iid0œƒ |S )5znConfigures and sets up all of the logging

    Returns the requested logging level, as its integer value.
    r"   é   é   NÚDEBUGz	/dev/nullÚINFOr7   r5   zext://sys.stdoutzext://sys.stderr)rV   Ústderrz2pip._internal.utils.logging.ColorizedStreamHandlerz5pip._internal.utils.logging.BetterRotatingFileHandler)rQ   ÚfileÚconsoleÚconsole_errorsÚconsole_subprocessÚuser_logFz*pip._internal.utils.logging.MaxLevelFilter)z()rc   zlogging.Filter)z()Únamez/pip._internal.utils.logging.ExcludeLoggerFilter)Úexclude_warningsÚrestrict_to_subprocessÚexclude_subprocessz%(message)s)z()r?   T)z()r?   r*   )ÚindentÚindent_with_timestamprQ   rV   r�   r   r‚   )rc   ÚclassrR   rQ   ÚfiltersÚ	formatterrx   r€   ry   zutf-8rƒ   )rc   r„   ÚfilenameÚencodingÚdelayr†   )rz   r{   r|   r}   )rc   Úhandlerszpip._vendorrc   )ÚversionÚdisable_existing_loggersr…   Ú
formattersrŠ   ÚrootÚloggerséÿÿÿÿéþÿÿÿéýÿÿÿ)rw   r7   )r4   rv   r   r5   r7   ÚCRITICALrw   ÚgetLevelNameÚconfigÚ
dictConfigÚsubprocess_loggerr~   r)   )rr   rR   rs   Zlevel_numberrc   Zinclude_user_logZadditional_log_fileÚ
root_levelZvendored_log_levelÚlog_streamsZhandler_classesrŠ   r   r   r   Úsetup_loggingì   s†    


rš   )r"   )6Ú
contextlibr   r4   Úlogging.handlersr\   rU   r   Útypingr   r   r   r   r   r   r	   r
   Zpip._internal.utils._logr   r   Zpip._internal.utils.compatr   Zpip._internal.utils.deprecationr   Zpip._internal.utils.miscr   Ú	threadingÚImportErrorÚdummy_threadingÚpip._vendorr   Ú	ExceptionÚlocalr%   r—   r   ÚBaseExceptionrD   r!   ÚcontextmanagerrF   r'   r$   Ú	Formatterr)   rE   rO   ÚStreamHandlerrP   rŠ   ÚRotatingFileHandlerrj   ro   rq   rš   r   r   r   r   Ú<module>   sB   (
3Q