U
    bD                     @   s6  d Z ddlmZ ddlmZ ddlmZ ddlZddlm	Z	 ddl
Z
ddlmZmZmZmZmZ ddlmZ dd	lmZ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zddlmZ  W n   ddl m Z  Y nX ddl!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/m0Z0 ddl1m2Z2m3Z3 ddl4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z: ddl;m<Z<m=Z= ddl>m?Z? ddl@mAZA ddlBmCZC ddlDmEZE ddlFmGZG ddlHmIZI ddlJmKZK ddlLmMZM ddlNmOZO dd lPmQZQ dd!lRmSZS eMZTe3rd"nd#ZUe3rd$nd%ZVd&ZWd'ZXe3s,d(nd)ZYe3s:d*nd+ZZe3sHd,nd-Z[d.Z\e	e]Z^d/d0 Z_edd1d2d3 Z`daae!jbd4d5d6d7 Zcd[d9d:Zdd\d;d<Zed]d=d>ZfG d?d@ d@ZgedAdB ZhdCdD ZiedEdF ZjedGdH ZkdIdJ ZledKdL ZmdMdN ZnedOdP ZodQdR ZpdSdT ZqdUdV ZrdWdX ZsdYdZ ZtdS )^z
These helpers were originally defined in tests/test_create.py,
but were refactored here so downstream projects can benefit from
them too.
    )unicode_literals)contextmanager)	lru_cacheN)	getLogger)dirnameexistsisdirjoinlexists)sample)copyfilermtree)check_output)
gettempdir)uuid4)urlparse)Utf8NamedTemporaryFile)EntityEncoder)PACKAGE_CACHE_MAGIC_FILE)contextreset_contextconda_tests_ctxt_mgmt_def_pol)do_call)generate_parserinit_loggers)encode_argumentson_win)argvcaptureddashlistdisable_loggerenv_varstderr_log_level)path_to_urlescape_channel_url)
PrefixData)PackageCacheData)conda_exception_handler)mkdir_p)rm_rf)link)touch)DEBUG)	MatchSpec)PackageRecord)massage_argumentsz
python.exez
bin/pythonZScriptsbinu   ōγђ家固한áêñßôçZabcdefwhichwhereZcpcopyenvset c                 C   s   |  ddS )N\z\\replace)p r;   8lib/python3.8/site-packages/conda/testing/integration.pyescape_for_winpathX   s    r=   )maxsizec               	   C   s   d } t dtd dd }|d |d |j} W 5 Q R X | rzjzJt| t| d dd}t|drl|	d	n|}|
d
rW W ,dS W W "dS  tk
r   Y W 
dS X W 5 t|  X dS )Nwz.batF)modesuffixdeletez@echo Hello World
z@exit 0
)cwdstderrshelldecodezutf-8zHello WorldT)r   UNICODE_CHARACTERSwritenameosunlinkr   r   hasattrrF   
startswith	Exception)rI   Z
batch_fileoutr;   r;   r<   1running_a_python_capable_of_unicode_subprocessing\   s*      




rP   T)Zautousec                 C   s$   | st S | j}tj|kst|a d S N)tmpdir_in_useZstrpathrJ   sepAssertionError)tmpdirZtdr;   r;   r<   
set_tmpdirx   s
    rV   Fc              
   C   s(  t pt }t }|r|r2t}dt|t|}ndtttt}tj	
d| d krptt d d t | n| }t||}trtjddntj}tj|tjtj}	zt||	 W n* ttfk
r   td|tj Y nX zt|	 W n, tk
r" }
 zt|
 W 5 d }
~
X Y nX |S )N ZCONDA_TEST_TMPDIR_NAME   z.exez.pdba  
WARNING :: You are testing `conda` with `tmpdir`:-
           {}
           not on the same FS as `sys.prefix`:
           {}
           this will be slow and unlike the majority of end-user installs.
           Please pass `--basetemp=<somewhere-else>` instead.)rR   r   rP   UNICODE_CHARACTERS_RESTRICTEDr	   r   lenrG   rJ   environgetstrr   SPACER_CHARACTERr   sys
executabler9   pathbasenamer*   IOErrorOSErrorprintformatprefixr)   rN   )rI   use_restricted_unicoderU   ZcapableZ
RESTRICTEDZrandom_unicodeZtmpdir_namerg   srcZdster;   r;   r<   _get_temp_prefix   s8    
$
 
rk   c                 C   s<   |st | |d}zt| W n   Y nX t|s8t|S )a  
    When the env. you are creating will be used to install Python 2.7 on Windows
    only a restricted amount of Unicode will work, and probably only those chars
    in your current codepage, so the characters in UNICODE_CHARACTERS_RESTRICTED
    should probably be randomly generated from that instead. The problem here is
    that the current codepage needs to be able to handle 'sys.prefix' otherwise
    ntpath will fall over.
    rI   rh   )rk   rJ   makedirsr   rT   rI   rh   Z_temp_prefixr;   r;   r<   make_temp_prefix   s    	ro   c                 C   s.   t | |d}t| t| t|s*t|S )Nrl   )rk   r)   rJ   rm   r   rT   rn   r;   r;   r<   FORCE_temp_prefix   s
    
rp   c                   @   s8   e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdS )CommandsZcompareZconfigZcleanZcreateinfoZinstalllistremovesearchupdaterunN)__name__
__module____qualname__COMPARECONFIGZCLEANCREATEINFOINSTALLLISTREMOVEZSEARCHUPDATERUNr;   r;   r;   r<   rq      s   rq   c              	   c   s6   t  }| s|} zt |  d V  W 5 t | X d S rQ   )rJ   getcwdchdir)Z
target_dircurdirr;   r;   r<   
temp_chdir   s    

r   c                 O   sp  t |tstdt|}|dd}| tjtjtjtj	fk}|d|rLdnd}|dd}t
 }| tjkr|d |t|d | tjtjtjtjtjtjtj	fkr|d	d
 |d| | tjtjtjtjfkr|ddg |d	|  |r|dd |r|dd ||}	t|	 tt |dsHt nd}
tdd| tjd ttd ttd t|}|d	 dk}|rd}
tdg| 8 t|
 $}|rtt |	|}n
t |	|}W 5 Q R X W 5 Q R X |r |j!}|j}|j"}n|j!}|j}t|tj!d t|tjd W 5 Q R X W 5 Q R X | tjfkrft#t$j%|t$j& dg|	 |||fS )Nz&run_command() arguments must be tuplesuse_exception_handlerFdevTZdebug_wrapper_scriptsz--filecondarcr   z-p   z-yz-qz--devz--debug-wrapper-scriptsZ
no_capture)NNz$

EXECUTING COMMAND >>> $ conda %s

r6   )fileZcondaZrequestsrw   Z
python_api)'
isinstancetuplerT   r/   r\   rq   r}   r   r   r   r   r|   appendr	   r   r{   r   insertextend
parse_argsr   Z_set_argparse_argsr   re   r_   rD   r"   TEST_LOG_LEVELr   r   r   r'   r   stdoutZrcr   rJ   ra   rS   )Zcommandrg   Z	argumentskwargsr   Zcommand_defaults_to_devr   debugr:   argsZcap_argsZis_runcresultr   rD   r;   r;   r<   run_command   st    

	

"r   c                  o   s   | dd }| dd}| dd p.t||d}| dd }|rTtj|rTt| t|sht||| td~ tdj z8ttj|tj dg ttj|f| | |V  W 5 d	tj	krt
|d
d ntd| X W 5 Q R X W 5 Q R X d S )NrI   rh   Frg   rl   clean_prefixZfetchZ	dotupdateZCONDA_TEST_SAVE_TEMPSTignore_errorsz3CONDA_TEST_SAVE_TEMPS :: retaining make_temp_env {}r   )poprk   rJ   ra   r   r)   r   ro   r    r[   r   logZwarningrf   r   r	   rS   r   rq   r}   )packagesr   rI   rh   rg   r   r;   r;   r<   make_temp_env8  s(     

r   c               
   c   s   t td} t| d}t| tt|t z4t	d|t
d tj|fksLt|V  W 5 Q R X W 5 t| dd |tjkr~tj|= X d S )N)rh   ZpkgsTr   ZCONDA_PKGS_DIRS)Zstack_callback)ro   r   r	   r(   r+   r   r   r&   Z_cache_r!   r   r   Z	pkgs_dirsrT   )rg   pkgs_dirr;   r;   r<   make_temp_package_cacheV  s    


r   c              	   C   s(  t | ts| d} t| }|jd\}}}|d\}}}|d\}}	}
|j	d}t
|	d}|	d}t
|	d}|	d}|	d}|		d}	|
	d}
ddd |jdD }t
t
|j	dd}t
t
|j	d}d	||||||	|
f}t|||||fS )
Nutf8@:Zidna/c                 s   s&   | ]}t t |d dV  qdS )r   rW   N)urllibquoteunquoteencode).0Zpcer;   r;   r<   	<genexpr>}  s    zfixurl.<locals>.<genexpr>z=&?/rW   )r   r]   rF   r   Zurlsplitnetloc
rpartition	partitionschemer   r   r   r	   ra   splitr   queryfragmentZ
urlunsplit)urlZparsedZuserpassZatZhostportuserZcolon1Zpass_ZhostZcolon2Zportr   ra   r   r   r   r;   r;   r<   fixurlg  s*    









r   c              
   #   s  dd | D }dd | D  t | r}| D ]}t||dds*tq* fddt| D }ttj|f   | D ]}t||ddrvtqvW 5 Q R X i i d}i }|D ]T}|}|d }	t	t
 j|	||	< | }d	D ]}
||
d  qtf ||d
 |	< qt  }t	|tj}t	|d}t|}t| t| | D ]\}	}t	||	}t|| qFtt	|dd}|tj|td W 5 Q R X tt	|dd}|tji td W 5 Q R X |V  W 5 Q R X d S )Nc                 S   s   g | ]}| d dqS )-=r8   r   pkgr;   r;   r<   
<listcomp>  s     z%make_temp_channel.<locals>.<listcomp>c                 S   s   g | ]}| d d qS )r   r   )r   r   r;   r;   r<   r     s     r   r   c                    s   g | ]}|d   kr|qS )rI   r;   )r   r:   Zpackage_namesr;   r<   r     s      )rr   r   fn)r   channelZschannelr   Znoarchzrepodata.jsonr?   )cls)r   package_is_installedr9   rT   r%   Ziter_recordsr   rq   r   r	   r&   Zfirst_writabler   dumpr   r.   r   Zsubdirr#   rJ   rm   itemsr   openrH   jsondumpsr   )r   Zpackage_reqsrg   packagedataZrepodataZtarfilesZpackage_dataZpkg_datafnameZfieldr   ZsubchanZ
noarch_dirZtar_old_pathZtar_new_pathfr;   r   r<   make_temp_channel  sB    
"




r   c                   C   s   t  S rQ   )rk   r;   r;   r;   r<   create_temp_location  s    r   c                  c   s2   t  } zt|  | V  W 5 t| r,t|  X d S rQ   )r   r
   r)   rJ   rm   )rg   r;   r;   r<   tempdir  s    

r   c                 C   s   t | tj d}t|g d S )Nr   )r	   rJ   rS   r   )rg   Zprefix_condarcr;   r;   r<   reload_config  s    r   c           	      C   s   t | |}|sd|kr|dd\}}t|}|d | }t | |}|s|dr|d}d|d d |d  g }|d | }t | |}|S )Nz::r   zfile:r   )_package_is_installedr   r$   rM   r	   lower)	rg   specZis_installedr   r   Zescaped_channelZescaped_specZ
componentsZlowercase_channelr;   r;   r<   r     s    


 
r   c                 C   sL   t |}tt| |}t|dkr@tdtdd |D  tt|S )Nr   zMultiple packages installed.%sc                 s   s   | ]}|  V  qd S rQ   )Zdist_str)r   Zprecr;   r;   r<   r     s     z(_package_is_installed.<locals>.<genexpr>)r-   r   r%   r   rZ   rT   r   bool)rg   r   Zprefix_recsr;   r;   r<   r     s    r   c                    s<   t tj| \}}}|d}t fdd|D d }| S )N
c                 3   s$   | ]}|   d  r|V  qdS )r6   N)r   rM   )r   linepackage_namer;   r<   r     s      z'get_conda_list_tuple.<locals>.<genexpr>)r   rq   r   r   next)rg   r   r   rD   _Zstdout_linesZpackage_liner;   r   r<   get_conda_list_tuple  s    
 r   c                  C   s   t sttttjdrdnd} zddlm} ||  d d W S  tk
r   zddlm	} ||  d W  Y S  tk
r    Y nX Y nX d S )Nz	.nonadminr   systemr   )dirs_srcstart)dirs)
r   rT   r   r	   r_   rg   Zmenuinst.win32r   ImportErrorr   )Z	user_modeZwin_locationsr;   r;   r<   get_shortcut_dir  s    r   )NF)NFN)NF)u__doc__Z
__future__r   
contextlibr   	functoolsr   r   Zloggingr   rJ   os.pathr   r   r   r	   r
   Zrandomr   Zshutilr   r   
subprocessr   r_   Ztempfiler   Zuuidr   r   Zurllib.parseparser   ZpytestZconda.auxlib.compatr   Zconda.auxlib.entityr   Zconda.base.constantsr   Zconda.base.contextr   r   r   Zconda.cli.conda_argparser   Zconda.cli.mainr   r   Zconda.common.compatr   r   Zconda.common.ior   r   r   r    r!   r"   Zconda.common.urlr#   r$   Zconda.core.prefix_datar%   Zconda.core.package_cache_datar&   Zconda.exceptionsr'   Zconda.gateways.disk.creater(   Zconda.gateways.disk.deleter)   Zconda.gateways.disk.linkr*   Zconda.gateways.disk.updater+   Zconda.gateways.loggingr,   Zconda.models.match_specr-   Zconda.models.recordsr.   Zconda.utilsr/   r   ZPYTHON_BINARYZBIN_DIRECTORYrG   rY   Zwhich_or_whereZ
cp_or_copyZ
env_or_setr^   rx   r   r=   rP   rR   ZfixturerV   rk   ro   rp   rq   r   r   r   r   r   r   r   r   r   r   r   r   r   r;   r;   r;   r<   <module>   s    


	
(


Y

!
*


	