B
    lz]C                 @   s>  d dl mZmZmZmZ d dlZd dlmZ d dlZd dl	Z	ddl
mZ ddlmZmZmZ ddlmZmZ ddlmZmZ dd	lmZ d d
lmZmZmZmZ d dlmZ d dlmZ e e!Z"eZ#dd Z$d_ddZ%dd Z&dd Z'dd Z(dd Z)e*dddde$e$ddd d!d"d#d$d%d&gdd'd(dd)d*Z+e*e+e%edd+d,Z,ere*d-d.d/d0dd1d2d3d3d4d5d6d7d8d9d:ge$e$d;d<d=d>e*e+d?d@e'e&dAe*e,d?dBe*e,dCdBe*e,dDdBe*e,dEdBe*e,dFdBdGZ-n2e*e+dCdBe*e+dHdIdJe*e+dFdBe*e+dKdLdMdNZ-e Z.Z/dOdP Z0d`dRdSZ1edTdU Z2dadVdWZ3dbdYdZZ4d[d\ Z5d]d^ Z6dS )c    )absolute_importdivisionprint_functionunicode_literalsN)dirname   )memoize)shlex_split_unicodestring_typesUtf8NamedTemporaryFile)on_win
isiterable)win_path_to_unixwhich)path_to_url)abspathjoinisfilebasename)environ)list2cmdlinec             C   s   | S )z<Used as a dummy path converter where no conversion necessary )pathr   r   *lib/python3.7/site-packages/conda/utils.pypath_identity   s    r    c                sr   t | dkr:d| ks.| d dkr:| ddkr:| ddS  d } fdd}t||| }td	d
d |}|S )zConvert a path or :-separated string of paths into a Windows representation

    Does not add cygdrive.  If you need that, set root_prefix to "/cygdrive"
    r   ;:/\z$(/[a-zA-Z]/(?:(?![:\s]/)[^:*?"<>])*)c                s:   |  d}d|t d  |t d d  ddS )Nr   z{0}:{1}r      r   r   )groupformatlenreplace)Z
found_pathr!   )root_prefixr   r   _translation*   s    
z&unix_path_to_win.<locals>._translationz:([a-zA-Z]):\\c             S   s   d|  dd  d S )Nr   r   r   z:\)r!   )matchr   r   r   <lambda>0       z"unix_path_to_win.<locals>.<lambda>)r#   countr$   resub)r   r%   Zpath_rer&   Ztranslationr   )r%   r   unix_path_to_win    s    .r-   c             C   s
   t | dS )Nz	/cygdrive)r   )r   r   r   r   win_path_to_cygwin6   s    r.   c             C   s
   t | dS )Nz	/cygdrive)r-   )r   r   r   r   cygwin_path_to_win:   s    r/   c                s   d  fdd| dD S )N
c             3   s   | ]} |V  qd S )Nr   ).0line)
translatorr   r   	<genexpr>?   s    z#translate_stream.<locals>.<genexpr>)r   split)streamr3   r   )r3   r   translate_stream>   s    r7   c             C   sT   | dk rd|  S | d }|dk r,dt | S |d }|dk rDd| S |d }d| S )a  
    Return the number of bytes n in more human readable form.

    Examples:
        >>> human_bytes(42)
        '42 B'
        >>> human_bytes(1042)
        '1 KB'
        >>> human_bytes(10004242)
        '9.5 MB'
        >>> human_bytes(100000004242)
        '93.13 GB'
    i   z%d Bz%d KBz%.1f MBz%.2f GB)round)nkmgr   r   r   human_bytesB   s    r=   z/bin/echoz.shz2>/dev/nullr   zecho $CONDA_DEFAULT_ENVz
echo $PATHzecho $CONDA_PROMPT_MODIFIERZPS1r   zexport z-lz-c)r   r   sourcez${})binpathr>   env_script_suffixnul	path_frompath_topathsepprintdefaultenv	printpathprintps1	promptvarsepset_var
shell_argsshell_suffixslash_convertsource_setuptest_echo_extra
var_formatz_python -c "import os; print(';'.join(os.environ['PATH'].split(';')[1:]))" | cygpath --path -f -)rC   rD   r@   rG   z@echoz%{}%z	\Scripts\Zcallz
1>NUL 2>&1zset z.batz@echo %PROMPT%ZPROMPTzMIF NOT "%CONDA_DEFAULT_ENV%" == "" (
echo %CONDA_DEFAULT_ENV% ) ELSE (
echo()z@echo %PATH%zcmd.exez/dz/c)r   r   r   r   )r>   rQ   r@   rO   rP   rB   rK   rM   rA   rH   rI   rF   rG   exerL   rC   rD   rN   rJ   rE   zbash.exez	/Scripts/)rR   r@   rC   rD   )rR   bashzsh.exezzsh.exezsh)zcmd.execygwinzbash.exerS   zsh.exezzsh.exerT   dash.)rR   rO   fish )rR   rE   )rS   rV   rT   rX   c             C   s   ddl m} || S )Nr   )compute_md5sum)Zgateways.disk.readrZ   )r   rZ   r   r   r   md5_file   s    r[   md5c          	   C   sP   dd l }||}t| d&}x|d}|s0P || q W W d Q R X | S )Nr   rbi   )hashlibnewopenreadupdateZ	hexdigest)r   moder^   hZfichunkr   r   r   hashsum_file   s    

rf   c              C   s^   yBt tt  } x| jr&| j} qW | j}|j}tt|}W n t	k
rX   tj
S X |S )a  Since conda is installed into non-root environments as a symlink only
    and because sys.prefix follows symlinks, this function can be used to
    get the 'unfollowed' sys.prefix.

    This value is usually the same as the prefix of the environment into
    which conda has been symlinked. An example of when this is necessary
    is when conda looks for external sub-commands in find_commands.py
    )nextitersys_current_framesvaluesf_backf_codeco_filenamer   	Exceptionprefix)framecodefilenameZ
unfollowedr   r   r   sys_prefix_unfollowed   s    

rt   c                s   |st rdnd}|dkr t| S g }xZ| D ]R d kr<d}n.d krJd}n t fdddD sfd}nd}||  |  q*W d	|S d S )
Nzcmd.exerS   "'c             3   s   | ]}| kV  qd S )Nr   )r1   _)argr   r   r4     s    z"quote_for_shell.<locals>.<genexpr>)rY   r0   r   rY   )r   r   anyappendr   )	argumentsshellZquotedZquoter   )rx   r   quote_for_shell  s    
r}   assertc             C   sf   t | tr2|dkr ds2tdnt| } td t| s@| f} tdd | D rZtdt| } | S )Nr~   Fz'Please ensure arguments are not stringszKPlease ensure arguments is not a string; used `shlex_split_unicode()` on itc             S   s   g | ]}t |qS r   )r   )r1   rx   r   r   r   
<listcomp>=  s    z%massage_arguments.<locals>.<listcomp>z)Individual arguments must not be iterable)	
isinstancer
   AssertionErrorr	   logZwarningr   ry   list)r{   errorsr   r   r   massage_arguments%  s    

r   c          	   C   s  | r
t   t|}tt|d}d }d}t|dkrDd|d krDd}| r@ttd }	|rvddlm}
 t|
d	d
d}nt	dtt|d
d}t
d|ddd}|rdnd}|d| |d| |d| |d| |d| |rjddlm}
 |d| |d|t|
 |d|tj |d| |d| |r|d |d |d||| |d| |r|d  |d |r|d!|d  n2td"d# |D rtd$|d%|t| |d&| |j}W d Q R X |	d'd(|g}nntd)pPtd*}|d krdtd+|rtt|d,d-d.d/g}d0}|g}n"t	d1tt|d,d/g}d}g }t
d|dd2}|rddlm}
 |d3t|
 d  t|d4d5g | }|r|d6 |d7| |d8| |d9|t|f |rR|d: |rp|d!d;| n|d!t| |j}W d Q R X |r|d<|g}n||g}||fS )=Nz.tmpFr   r0   r   TCOMSPEC)CONDA_PACKAGE_ROOTr|   Zcondabinz	conda.batZ	CONDA_BATwz.bat)rc   rp   suffixdeleter   @z{}ECHO OFF
z{}SET PYTHONIOENCODING=utf-8
z{}SET PYTHONUTF8=1
z_{}FOR /F "tokens=2 delims=:." %%A in ('chcp') do for %%B in (%%A) do set "_CONDA_OLD_CHCP=%%B"
z{}chcp 65001 > NUL
z{}SET CONDA_DEV=1
z{}SET PYTHONPATH={}
z{}SET CONDA_EXE={}
z{}SET _CE_M=-m
z{}SET _CE_CONDA=conda
z%echo *** environment before *** 1>&2
z	SET 1>&2
z{0}CALL "{1}" activate "{2}"
z-{}IF %ERRORLEVEL% NEQ 0 EXIT /b %ERRORLEVEL%
z$echo *** environment after *** 1>&2
z{0}
c             s   s   | ]}d |kV  qdS )r0   Nr   )r1   rx   r   r   r   r4   w  s    z'wrap_subprocess_call.<locals>.<genexpr>aW  Support for scripts where arguments contain newlines not implemented.
.. requires writing the script to an external file and knowing how to transform the command-line (e.g. `python -c args` => `python file`) in a tool dependent way, or attempting something like:
.. https://stackoverflow.com/a/15032476 (adds unacceptable escapingrequirements)z{0}{1}
z{}chcp %_CONDA_OLD_CHCP%>NUL
z/dz/crS   ZshzNo compatible shell found!binZpythonz-mcondaz--devZ	CONDA_EXE)rc   rp   r   z>&2 export PYTHONPATH=zshell.posixhookz.>&2 echo '*** environment before ***'
>&2 env
z>&2 echo "$({0})"
zeval "$({0})"
zconda activate {0} {1}
z->&2 echo '*** environment after ***'
>&2 env
rY   z-x)ensure_comspec_setr   r   r   r#   r   strr   r   getr   writer"   Zconda.core.initializer   ri   
executablery   r   r}   namer   ro   )r   r%   rp   dev_modeZdebug_wrapper_scriptsr{   Z
tmp_prefixZscript_callerZ	multilineZcomspecr   Z	conda_batZfhZsilencerZcommand_argsZ
shell_pathZ	conda_exeZdev_argZdev_argsZhook_quotedr   r   r   wrap_subprocess_callC  s    






r   c              C   sd   t tdd dkr`ttddd} t| sDttddd} t| sXtd n| td< d S )Nr   r   zcmd.exeZ
SystemRootZSystem32ZwindirzFcmd.exe could not be found. Looked in SystemRoot and windir env vars.
)r   r   r   lowerr   r   r   warn)Zcmd_exer   r   r   r     s    r   )r   )r\   )N)r~   )7Z
__future__r   r   r   r   Zloggingos.pathr   r+   ri   Z_vendor.auxlib.decoratorsr   Z_vendor.auxlib.compatr	   r
   r   Zcommon.compatr   r   Zcommon.pathr   r   Z
common.urlr   r   r   r   r   osr   
subprocessr   Z	getLogger__name__r   Zmemoizedr   r-   r.   r/   r7   r=   dictZunix_shell_baseZmsys2_shell_baseZshellsZurlpathZurl_pathr[   rf   rt   r}   r   r   r   r   r   r   r   <module>   s   

	


n