a
    `r*                  
   @   s   d dl m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 d dlmZmZ d dlmZ d dlmZmZ d d	lmZ erd d
lmZmZmZmZmZmZmZmZ eeeef  Z dZ!dd Z"dd Z#dd Z$dd Z%dddZ&dd Z'dS )    )absolute_importN)shlex_quote)SpinnerInterfaceopen_spinner)InstallationSubprocessError)console_to_strstr_to_display)subprocess_logger)
HiddenTextpath_to_display)MYPY_CHECK_RUNNING)AnyCallableIterableListMappingOptionalTextUnionz(----------------------------------------c                  G   s2   g }| D ]$}t |tr"|| q|| q|S )z&
    Create a CommandArgs object.
    )
isinstancelistextendappend)argsZcommand_argsarg r   @/usr/lib/python3/dist-packages/pip/_internal/utils/subprocess.pymake_command   s    
r   c                 C   s   d dd | D S )z/
    Format command arguments for display.
     c                 s   s,   | ]$}t |trtt|nt|V  qd S )N)r   r
   r   str.0r   r   r   r   	<genexpr>5   s   z&format_command_args.<locals>.<genexpr>)joinr   r   r   r   format_command_args+   s    

r%   c                 C   s   dd | D S )z=
    Return the arguments in their raw, unredacted form.
    c                 S   s    g | ]}t |tr|jn|qS r   )r   r
   Zsecretr    r   r   r   
<listcomp>@   s   z'reveal_command_args.<locals>.<listcomp>r   r$   r   r   r   reveal_command_args;   s    r'   c           	      C   sD   t | }t|dd}t|}d|}dj|||t||td}|S )z
    Create and return the error message to use to log a subprocess error
    with command output.

    :param lines: A list of lines, each ending with a newline.
    zcommand bytes)Zdesc zCommand errored out with exit status {exit_status}:
 command: {command_display}
     cwd: {cwd_display}
Complete output ({line_count} lines):
{output}{divider})exit_statuscommand_displaycwd_displayZ
line_countoutputZdivider)r%   r   r   r#   formatlenLOG_DIVIDER)	cmd_argscwdlinesr)   Zcommandr*   r+   r,   msgr   r   r   make_subprocess_output_errorE   s    
	r4   FraiseTc              
   C   s  |du rg }|du rg }|r*t j}tj}nt j}tj}t  |k}| oN|du}|du r`t| }|d| tj	
 }|r|| |D ]}||d qz.tjt| tjtj|
stjntj||d}W n8 ty } z |	rt d||  W Y d}~n
d}~0 0 g }|
s|jsJ |js"J |j  t|j }|sDq~| }||d  || |r,|srJ |  q,z|  W |jr|j  n|jr|j  0 d|}nd| \}}t|}| D ]}|| q|| t|}| D ]}|| q|| |}|j o2|j |v}|r`|sDJ |rV|!d n
|!d |r|d	kr|s|	rt"| |||j d
}t #| t$|j |n8|dkrt %d||j | n|dkrnt&d'||S )a  
    Args:
      show_stdout: if true, use INFO to log the subprocess's stderr and
        stdout streams.  Otherwise, use DEBUG.  Defaults to False.
      extra_ok_returncodes: an iterable of integer return codes that are
        acceptable, in addition to 0. Defaults to None, which means [].
      unset_environ: an iterable of environment variable names to unset
        prior to calling subprocess.Popen().
      log_failed_cmd: if false, failed commands are not logged, only raised.
      stdout_only: if true, return only stdout, else return both. When true,
        logging of both stdout and stderr occurs when the subprocess has
        terminated, else logging occurs as subprocess output is produced.
    NzRunning command %s)stdinstdoutstderrr1   envz#Error %s while executing command %s
r(   errorZdoner5   )r0   r1   r2   r)   warnz$Command "%s" had error code %s in %signorez!Invalid value: on_returncode={!r})(r	   infologgingINFOdebugDEBUGZgetEffectiveLevelr%   osenvironcopyupdatepop
subprocessPopenr'   PIPEZSTDOUT	ExceptionZcriticalr7   r6   closer   readlinerstripr   Zspinwaitr#   Zcommunicate
splitlines
returncodeZfinishr4   r;   r   Zwarning
ValueErrorr-   )cmdZshow_stdoutr1   Zon_returncodeZextra_ok_returncodesZcommand_descextra_environZunset_environspinnerZlog_failed_cmdZstdout_onlyZlog_subprocessZ
used_levelZshowing_subprocessZuse_spinnerr9   nameprocexcZ
all_outputliner,   Z	out_bytesZ	err_bytesoutZout_lineerrZerr_lineZproc_had_errorr3   r   r   r   call_subprocesso   s    



	










r\   c                    s   d fdd	}|S )zProvide a subprocess_runner that shows a spinner message.

    Intended for use with for pep517's Pep517HookCaller. Thus, the runner has
    an API that matches what's expected by Pep517HookCaller.subprocess_runner.
    Nc                    s<   t   }t| |||d W d    n1 s.0    Y  d S )N)r1   rT   rU   )r   r\   )rS   r1   rT   rU   messager   r   runner  s    
z+runner_with_spinner_message.<locals>.runner)NNr   )r^   r_   r   r]   r   runner_with_spinner_message  s    
  r`   )
FNr5   NNNNNTF)(Z
__future__r   r?   rC   rH   Zpip._vendor.six.movesr   Zpip._internal.cli.spinnersr   r   Zpip._internal.exceptionsr   Zpip._internal.utils.compatr   r   Zpip._internal.utils.loggingr	   Zpip._internal.utils.miscr
   r   Zpip._internal.utils.typingr   typingr   r   r   r   r   r   r   r   r   ZCommandArgsr/   r   r%   r'   r4   r\   r`   r   r   r   r   <module>   s>   (
,          
 '