U
    +|j4'  ã                
   @   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 d dlmZmZ d dlmZ d dl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 )é    N)ÚAnyÚCallableÚIterableÚListÚMappingÚOptionalÚUnion)ÚSpinnerInterfaceÚopen_spinner)ÚInstallationSubprocessError)Úsubprocess_logger)Ú
HiddenTextz(----------------------------------------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   úfC:\Users\snmko\Desktop\web_content\django_cbt\venv\Lib\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   s0   | ](}t |tƒrt t|ƒ¡nt |¡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_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>9   s     z'reveal_command_args.<locals>.<listcomp>r   r    r   r   r   Úreveal_command_args4   s    r$   c                 C   s0   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 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   ÚformatÚlenÚLOG_DIVIDER)Úcmd_argsÚcwdÚlinesr&   Úcommandr*   Úmsgr   r   r   Úmake_subprocess_output_error<   s    
ü	òr4   FÚraiseTc              
   C   s¼  |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¡ q†z0tjt| ƒtjtj|
s¶tjntj||dd�}W n6 tk
rþ } z|	rìt  d||¡ ‚ W 5 d}~X Y nX g }|
�s¨|j�st‚|j�s"t‚|j ¡  |j ¡ }|�s@�qz| ¡ }| |d ¡ ||ƒ |�r,|�snt‚| ¡  �q,z| ¡  W 5 |j�rš|j ¡  X d |¡}nT| ¡ \}}| ¡ D ]}||ƒ �q¼| |¡ | ¡ D ]}||ƒ �qÞ| |¡ |}|j �o|j |k}|�r:|�st‚|�r0| !d¡ n
| !d	¡ |�r¸|d
k�r€|�sr|	�rrt"| |||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Úbackslashreplace)ÚstdinÚstdoutÚstderrr0   ÚenvÚerrorsz#Error %s while executing command %sÚ
r%   ÚerrorÚdoner5   )r/   r0   r1   r&   Úwarnz$Command "%s" had error code %s in %sÚignorezInvalid value: on_returncode=)'r   ÚinfoÚloggingÚINFOÚdebugÚDEBUGÚgetEffectiveLevelr!   ÚosÚenvironÚcopyÚupdateÚpopÚ
subprocessÚPopenr$   ÚPIPEÚSTDOUTÚ	ExceptionÚcriticalr8   ÚAssertionErrorr7   ÚcloseÚreadlineÚrstripr   ÚspinÚwaitr   ÚcommunicateÚ
splitlinesÚ
returncodeÚfinishr4   r=   r   ÚwarningÚ
ValueError)ÚcmdÚshow_stdoutr0   Ú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Úliner*   ÚoutÚerrÚout_lineÚerr_lineÚproc_had_errorr3   r   r   r   Úcall_subprocess`   s¸    


ø

ý







ü

ü
rv   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 5 Q R X d S )N)r0   rc   re   )r
   rv   )r^   r0   rc   re   ©Úmessager   r   Úrunner  s    
üz+runner_with_spinner_message.<locals>.runner)NNr   )rx   ry   r   rw   r   Úrunner_with_spinner_message  s    
  ýrz   )
FNr5   NNNNNTF)rB   rG   r   rL   Útypingr   r   r   r   r   r   r   Úpip._internal.cli.spinnersr	   r
   Úpip._internal.exceptionsr   Úpip._internal.utils.loggingr   Úpip._internal.utils.miscr   r   ÚCommandArgsr.   r   r!   r$   r4   rv   rz   r   r   r   r   Ú<module>   s6   $&          õ
 $