a
    Œ�éir*  ã                
   @   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rÀd 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)ÚargsÚcommand_argsÚarg© r   úN/home/Claro/venv/lib/python3.9/site-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
   Ú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)ÚdescÚ zŸCommand 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_displayÚ
line_countÚoutputÚdivider)r&   r   r   r$   ÚformatÚlenÚLOG_DIVIDER)	Úcmd_argsÚcwdÚlinesr,   Úcommandr-   r.   r0   Úmsgr   r   r   Úmake_subprocess_output_errorE   s    
ü	òr:   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¡ q†z.tjt| ƒtjtj|
s¶tjntj||d�}W n8 tyþ } z |	rèt  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˜|	�r˜t"| |||j d
�}t  #|¡ t$|j |ƒ‚n8|dk�rÄt  %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)ÚstdinÚstdoutÚstderrr6   Úenvz#Error %s while executing command %sÚ
r+   ÚerrorÚdoner;   )r5   r6   r7   r,   Úwarnz$Command "%s" had error code %s in %sÚignorez!Invalid value: on_returncode={!r})(r	   ÚinfoÚloggingÚINFOÚdebugÚDEBUGÚgetEffectiveLevelr&   ÚosÚenvironÚcopyÚupdateÚpopÚ
subprocessÚPopenr)   ÚPIPEÚSTDOUTÚ	ExceptionÚcriticalr=   r<   Úcloser   ÚreadlineÚrstripr   ÚspinÚwaitr$   ÚcommunicateÚ
splitlinesÚ
returncodeÚfinishr:   rA   r   ÚwarningÚ
ValueErrorr2   )ÚcmdÚshow_stdoutr6   Úon_returncodeÚextra_ok_returncodesÚcommand_descÚextra_environÚunset_environÚspinnerÚlog_failed_cmdÚstdout_onlyÚlog_subprocessÚ
used_levelÚshowing_subprocessÚuse_spinnerr?   ÚnameÚprocÚexcÚ
all_outputÚliner0   Ú	out_bytesÚ	err_bytesÚoutÚout_lineÚerrÚerr_lineÚproc_had_errorr9   r   r   r   Úcall_subprocesso   sÀ    


ù
	ÿ


ÿ

ÿ


ü

ü
ÿr{   c                    s   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.
    Nc                    s<   t ˆ ƒ� }t| |||d� W d   ƒ n1 s.0    Y  d S )N)r6   rf   rh   )r   r{   )ra   r6   rf   rh   ©Úmessager   r   Úrunner  s    
üz+runner_with_spinner_message.<locals>.runner)NNr   )r}   r~   r   r|   r   Úrunner_with_spinner_message  s    
  ýr   )
FNr;   NNNNNTF)(Ú
__future__r   rF   rK   rP   Zpip._vendor.six.movesr   Úpip._internal.cli.spinnersr   r   Úpip._internal.exceptionsr   Úpip._internal.utils.compatr   r   Úpip._internal.utils.loggingr	   Úpip._internal.utils.miscr
   r   Úpip._internal.utils.typingr   Útypingr   r   r   r   r   r   r   r   r    ZCommandArgsr4   r   r&   r)   r:   r{   r   r   r   r   r   Ú<module>   s>   (
,          õ
 '