3
ûâdeJ'  ã               @   sž  d dl Z d dlZd dlZd dl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mZ d dlmZ er�d dlmZ e	eeef  ZdZeeeef ed	œd
d„Zee	e ef ed	œdd„Zee	e ef e	e d	œdd„Zee	e ef ee e	e eedœdd„Zdee	e ef e ee deee  ee ee
eef  eee  ee ee  ee  edœdd„Z!eed dœdd„Z"dS ) é    N)ÚTYPE_CHECKINGÚAnyÚCallableÚIterableÚListÚMappingÚOptionalÚUnion)ÚSpinnerInterfaceÚopen_spinner)ÚInstallationSubprocessError)ÚVERBOSEÚsubprocess_logger)Ú
HiddenText)ÚLiteralz(----------------------------------------)ÚargsÚreturnc              G   s6   g }x,| D ]$}t |tƒr$|j|ƒ q
|j|ƒ q
W |S )z&
    Create a CommandArgs object.
    )Ú
isinstanceÚlistÚextendÚappend)r   Zcommand_argsÚarg© r   ú=/tmp/pip-build-red6nood/pip/pip/_internal/utils/subprocess.pyÚmake_command!   s    

r   c             C   s   dj dd„ | D ƒƒS )z/
    Format command arguments for display.
    ú c             s   s0   | ](}t |tƒrtjt|ƒƒntj|ƒV  qd S )N)r   r   ÚshlexÚquoteÚstr)Ú.0r   r   r   r   ú	<genexpr><   s   z&format_command_args.<locals>.<genexpr>)Újoin)r   r   r   r   Úformat_command_args2   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secret)r   r   r   r   r   ú
<listcomp>E   s    z'reveal_command_args.<locals>.<listcomp>r   )r   r   r   r   Úreveal_command_argsA   s    r$   )Úcmd_argsÚcwdÚlinesÚexit_statusr   c             C   s0   t | ƒ}dj|ƒ}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 errored out with exit status {exit_status}:
 command: {command_display}
     cwd: {cwd_display}
Complete output ({line_count} lines):
{output}{divider})r(   Zcommand_displayZcwd_displayZ
line_countÚoutputZdivider)r"   r!   ÚformatÚlenÚLOG_DIVIDER)r%   r&   r'   r(   Úcommandr*   Úmsgr   r   r   Úmake_subprocess_output_errorH   s    
r0   FÚraiseTz"Literal["raise", "warn", "ignore"])ÚcmdÚshow_stdoutr&   Úon_returncodeÚextra_ok_returncodesÚcommand_descÚextra_environÚunset_environÚspinnerÚlog_failed_cmdÚstdout_onlyr   c             C   sÌ  |dkrg }|dkrg }|r*t j}tj}n
t j}t}t jƒ |k}| oL|dk	}|dkr^t| ƒ}|d|ƒ tj	j
ƒ }|r€|j|ƒ x|D ]}|j|dƒ q†W y0tjt| ƒtjtj|
s¸tjntj||dd�}W n8 tk
�r } z|	rðt jd||ƒ ‚ W Y dd}~X nX g }|
�s®|j�st‚|j�s&t‚|jjƒ  xN|jjƒ }|�sDP |jƒ }|j|d ƒ ||ƒ |�r2|�srt‚|jƒ  �q2W z|jƒ  W d|j�r |jjƒ  X dj|ƒ}n\|jƒ \}}x|jƒ D ]}||ƒ �qÄW |j|ƒ x|jƒ D ]}||ƒ �qêW |j|ƒ |}|j �o|j |k}|�rH|�s,t‚|�r>|j!dƒ n
|j!d	ƒ |�rÈ|d
k�r�| �r‚|	�r‚t"| |||j d�}t j#|ƒ t$|j |ƒ‚n8|dk�r®t j%d||j |ƒ n|dk�rºn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Úbackslashreplace)ÚstdinÚstdoutÚstderrr&   ÚenvÚerrorsz#Error %s while executing command %sÚ
r)   ÚerrorÚdoner1   )r%   r&   r'   r(   Úwarnz$Command "%s" had error code %s in %sÚignorezInvalid value: on_returncode=)'r   ÚinfoÚloggingÚINFOÚverboser   ÚgetEffectiveLevelr"   ÚosÚenvironÚcopyÚupdateÚpopÚ
subprocessÚPopenr$   ÚPIPEÚSTDOUTÚ	ExceptionÚcriticalr>   ÚAssertionErrorr=   ÚcloseÚreadlineÚrstripr   ÚspinÚwaitr!   ÚcommunicateÚ
splitlinesÚ
returncodeÚfinishr0   rC   r   ÚwarningÚ
ValueError)r2   r3   r&   r4   r5   r6   r7   r8   r9   r:   r;   Zlog_subprocessZ
used_levelZshowing_subprocessZuse_spinnerr@   ÚnameÚprocÚexcÚ
all_outputÚliner*   ÚoutÚerrZout_lineZerr_lineZproc_had_errorr/   r   r   r   Úcall_subprocessk   s²    















rj   .)Úmessager   c                s2   dt t tt ttttf  ddœ‡ fdd„}|S )zÜProvide 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.
    N)r2   r&   r7   r   c                s(   t ˆ ƒ�}t| |||d� W d Q R X d S )N)r&   r7   r9   )r   rj   )r2   r&   r7   r9   )rk   r   r   Úrunner  s    
z+runner_with_spinner_message.<locals>.runner)NN)r   r   r   r   r   )rk   rl   r   )rk   r   Úrunner_with_spinner_message  s    	 	rm   )
FNr1   NNNNNTF).N)#rH   rL   r   rQ   Útypingr   r   r   r   r   r   r   r	   Zpip._internal.cli.spinnersr
   r   Zpip._internal.exceptionsr   Zpip._internal.utils.loggingr   r   Zpip._internal.utils.miscr   r   r   ZCommandArgsr-   r   r"   r$   Úintr0   Úboolrj   rm   r   r   r   r   Ú<module>   sB   (           T 