U
    fmf&                  	   @   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 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 erd d
lmZmZmZmZmZmZmZmZ d dl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)InstallationError)console_to_strstr_to_display)subprocess_logger)
HiddenTextpath_to_display)MYPY_CHECK_RUNNING)open_spinner)AnyCallableIterableListMappingOptionalTextUnion)SpinnerInterfacez(----------------------------------------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   /home/dh_an3skk/arjun-chandrasekhar-teaching.com/tomato/tomatoenvy/lib/python3.8/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>;   s   z&format_command_args.<locals>.<genexpr>)joinr   r   r   r   format_command_args1   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>F   s    z'reveal_command_args.<locals>.<listcomp>r   r$   r   r   r   reveal_command_argsA   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 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+   commandr,   r-   r.   msgr   r   r   make_subprocess_output_errorK   s    
	r7   FraiseTc
              
   C   s4  |dkrg }|dkrg }|r*t j}
tj}nt j}
tj}t  |k}| oN|dk	}|dkr`t| }|
d| tj	
 }|r|| |D ]}||d qz.tjt| tjtjtj||d}|j  W n6 tk
r } z|	rt d||  W 5 d}~X Y nX g }t|j }|sqJ| }||d  |
| |r|  qz|  W 5 |jrj|j  X |jo||j|k}|r|r|d n
|d |r*|dkr|s|	rt| |||jd	}t  | d
!|j|}t"|n:|dkrt #d||j| n|dkrnt$d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.
    NzRunning command %s)stderrstdinstdoutr3   envz#Error %s while executing command %s
errordoner8   )r2   r3   r4   r+   zSCommand errored out with exit status {}: {} Check the logs for full command output.warnz$Command "%s" had error code %s in %signorezInvalid value: on_returncode=%sr*   )'r   infologgingINFOdebugDEBUGgetEffectiveLevelr%   osenvironcopyupdatepop
subprocessPopenr(   STDOUTPIPEr:   close	Exceptioncriticalr   r;   readlinerstripr   spinwait
returncodefinishr7   r>   r/   r   warning
ValueErrorreprr#   )cmdshow_stdoutr3   Zon_returncodeZextra_ok_returncodesZcommand_descextra_environZunset_environspinnerZlog_failed_cmdZlog_subprocessZ
used_levelZshowing_subprocessZuse_spinnerr<   nameprocexcZ
all_outputlineZproc_had_errorr6   Zexc_msgr   r   r   call_subprocessu   s    


     


 

  
re   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 5 Q R X d S )N)r3   r_   r`   )r   re   )r]   r3   r_   r`   messager   r   runner  s    
z+runner_with_spinner_message.<locals>.runner)NNr   )rg   rh   r   rf   r   runner_with_spinner_message   s    
  ri   )	FNr8   NNNNNT)(
__future__r   rC   rH   rM   Zpip._vendor.six.movesr   pip._internal.exceptionsr   pip._internal.utils.compatr   r   pip._internal.utils.loggingr   pip._internal.utils.miscr   r	   pip._internal.utils.typingr
   pip._internal.utils.uir   typingr   r   r   r   r   r   r   r   r   r   ZCommandArgsr1   r   r%   r(   r7   re   ri   r   r   r   r   <module>   s>   (
,         
 