U
    b                     @   s  d dl mZmZmZmZ d dlmZ d dlmZ d dl	Z	d dl
mZ d dlmZ d dlZd dlmZmZmZ dd	lmZ d
dlmZ ddlmZ ddlmZ ddlmZmZmZ ddlmZ ddl m!Z! ee"Z#eddZ$dd Z%dddZ&dddZ'd ddZ(d!ddZ)dS )"    )absolute_importdivisionprint_functionunicode_literals)
namedtuple)	getLoggerN)abspath)shlex_split_unicode)CalledProcessErrorPIPEPopen   )wrap_subprocess_call   )TRACE)ACTIVE_SUBPROCESSESdals)encode_argumentsencode_environment
isiterable)rm_rf)contextResponse)stdoutstderrrcc                 C   s   t d| ||||f S )Nzp
    $ %s
    ==> cwd: %s <==
    ==> exit code: %d <==
    ==> stdout <==
    %s
    ==> stderr <==
    %s
    r   )command_strcwdr   r   r    r   8lib/python3.8/site-packages/conda/gateways/subprocess.py_format_output   s    r!   c           	      C   s   t tj|tjtjdk| \}}t||p(|dtt|d}| \}}|d k	rndtj	kr^t
| ntd| t|dr|jddd	}t|dr|jddd	}|||jfS )
Nr   F)r   Zuniversal_newlinesr   r   envZCONDA_TEST_SAVE_TEMPSz4CONDA_TEST_SAVE_TEMPS :: retaining pip run_script {}decodeutf-8replaceerrors)r   r   Zroot_prefixZdev	verbosityr   r   communicateosenvironr   logZwarningformathasattrr#   
returncode)	argsprefixr"   r   Zscript_callerZcommand_argsprocessr   r   r   r   r    any_subprocess&   s6    



r3   Tc                 C   sf  t |r
|ntj}|dkr tjnt|}t| s8t| } t| t	rF| nd
| }td| d}|rjt}n|rxtdnd}tt| |||||d}	t|	 |	j|d\}
}t|
dr|
jdd	d
}
t|dr|jdd	d
}|	j}t|	 |r|dksttrt||||
|}|r@|dkr@t| t|| |dttrVt| t|
|t|S )zsThis utility function should be preferred for all conda subprocessing.
    It handles multiple tricky details.
    N zexecuting>> %sz/When passing stdin, output needs to be captured)r   stdinr   r   r"   )inputr#   r$   r%   r&   r   )output) r   r*   r+   sysr1   r   r   r	   
isinstancestrjoinr,   debugr   
ValueErrorr   r   r   addr)   r.   r#   r/   removeZisEnabledForr   r!   infor
   Ztracer   int)commandr"   pathr5   raise_on_errorZcapture_outputr   r   piper2   r   r   r   Zformatted_outputr   r   r    subprocess_callD   sL    






rF   c                 C   s<   g }|r| d |r | d |D ]}|| kr$| |= q$d S )N)Z
PYTHONPATHZ
PYTHONHOME)Z
CONDA_ROOTZCONDA_PROMPT_MODIFIERZ	CONDA_EXEZCONDA_DEFAULT_ENV)extend)r"   clean_pythonclean_condaZdelskeyr   r   r    _subprocess_clean_envx   s    

rK   c                 C   s(   t j }t||| t| ||||dS )N)r"   rC   r5   rD   )r*   r+   copyrK   rF   )rB   rC   r5   rD   rH   rI   r"   r   r   r    subprocess_call_with_clean_env   s    
rM   )NN)NNNTT)TT)NNTTT)*Z
__future__r   r   r   r   collectionsr   Zloggingr   r*   os.pathr   Zconda.auxlib.compatr	   r8   
subprocessr
   r   r   Zutilsr   r    r   Z
auxlib.ishr   Zcommon.compatr   r   r   Zgateways.disk.deleter   Zbase.contextr   __name__r,   r   r!   r3   rF   rK   rM   r   r   r   r    <module>   s4   

  
4
    