U
    b?                     @   s@  d dl mZmZmZ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Zd dlmZmZmZmZmZmZ d dlmZmZ d dlZd dlZd dlZdd	lmZ dd
lm Z m!Z! ddl"m#Z#m$Z$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/m0Z0 ddl1m2Z2 ddl3m4Z4 ddl5m6Z6m7Z7m8Z8m9Z9 ddl:m;Z; ddl<m=Z=m>Z>m?Z? ddl@mAZAmBZB G dd deCZDeeEZFedZGeZe-dZHe-dZIdd ZJdd  ZKd!d" ZLG d#d$ d$eCZMd>d%d&ZNd?d(d)ZOd*d+ ZPd,d- ZQd.d/ ZRd0d1 ZSd2d3 ZTd4d5 ZUeBjVd'fd6d7ZWd8d9 ZXd:d; ZYd<d= ZZdS )@    )absolute_importdivisionprint_functionunicode_literalsN)EACCESEPERMEROFS)open)	getLogger)basenamedirnameisdirisfilejoinsplitext)copyfileobjcopystat   )mkdir_p)path_is_cleanrm_rf)islinklexistslinkreadlinksymlink)make_executable)touch   )
CondaError)dals)CONDA_PACKAGE_EXTENSION_V1PACKAGE_CACHE_MAGIC_FILE)context)on_win)
ensure_padexpandwin_path_double_escapewin_path_ok)	json_dump)BasicClobberErrorCondaOSErrormaybe_raise)FileModeLinkTypec                   @   sP   e Zd ZdZdZdZdddZdd	 Zd
d Zde	fddZ
dd Zdd ZdS )TemporaryDirectorya+  Create and return a temporary directory.  This has the same
    behavior as mkdtemp but can be used as a context manager.  For
    example:

        with TemporaryDirectory() as tmpdir:
            ...

    Upon exiting the context, the directory and everything contained
    in it are removed.
    NF tmpc                 C   s   t |||| _d S N)tempfileZmkdtempname)selfsuffixprefixdir r9   9lib/python3.8/site-packages/conda/gateways/disk/create.py__init__3   s    zTemporaryDirectory.__init__c                 C   s   d | jj| jS )Nz	<{} {!r}>)format	__class____name__r4   r5   r9   r9   r:   __repr__6   s    zTemporaryDirectory.__repr__c                 C   s   | j S r2   )r4   r?   r9   r9   r:   	__enter__9   s    zTemporaryDirectory.__enter__c              
   C   sr   ddl m} | jrn| jsnz|| j W n@ ttfk
rf } zdd|f krL || j W 5 d }~X Y nX d| _d S )Nr   )r   Nonez%sT)deleter   r4   _closed	TypeErrorAttributeError)r5   _warn	_warningsZ_rm_rfexr9   r9   r:   cleanup<   s    zTemporaryDirectory.cleanupc                 C   s   |    d S r2   rJ   )r5   excvaluetbr9   r9   r:   __exit__G   s    zTemporaryDirectory.__exit__c                 C   s   | j dd d S )NT)rG   rK   r?   r9   r9   r:   __del__J   s    zTemporaryDirectory.__del__)r0   r1   N)r>   
__module____qualname____doc__r4   rD   r;   r@   rA   rH   rJ   rO   rP   r9   r9   r9   r:   r/   #   s   
r/   zconda.stdoutlogz
# -*- coding: utf-8 -*-
import re
import sys

from %(module)s import %(import_name)s

if __name__ == '__main__':
    sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
    sys.exit(%(func)s())
z
# -*- coding: utf-8 -*-
if __name__ == '__main__':
    import os
    import sys
    args = ["%(source_full_path)s"]
    if len(sys.argv) > 1:
        args += sys.argv[1:]
    os.execv(args[0], args)
c              	   C   s>   t d|  tj| ddd}t|}|| W 5 Q R X d S )Nzwriting json to file %swbutf-8modeencoding)logtracecodecsr	   r)   write)	file_pathobjfoZjson_strr9   r9   r:   write_as_json_to_filem   s    r`   c           	   	   C   s   t | rttd | tdt |dd }t|||d }|d k	rdd| }ddlm} |tj	|}nd }t
j| dd	d
(}|d k	r||d	 || W 5 Q R X |d k	rt|  | S )Nsource_pathZtarget_pathr#   .r   )modulefuncimport_name#!%s
r   )replace_long_shebangrT   rU   rV   )r   r,   r*   r#   splitpython_entry_point_templateZcore.portabilityrh   r-   textr[   r	   r\   decoder   )	target_full_pathpython_full_pathrd   re   rf   ZpyscriptZshebangrh   r_   r9   r9   r:   create_python_entry_pointt   s4    ro   c              	   C   s   t |rttd |tdt tdt| i }tt|sDtt| t	|t
d0}d|krft|d}|d|  || W 5 Q R X t| d S )Nra   source_full_pathw "rg   )r   r,   r*   r#    application_entry_point_templater'   r   r   r   r	   strr%   r\   r   )rp   rm   rn   Zentry_pointr_   r9   r9   r:   create_application_entry_point   s(     
rv   c                       s>   e Zd Zdd Zdd Z fddZddd	Zd
d Z  ZS )ProgressFileWrapperc                 C   s.   || _ || _tdt| j| _d| _d S )Nr   r   )	progress_fileprogress_update_callbackmaxosfstatfilenost_sizeprogress_file_sizeprogress_max_pos)r5   Zfileobjry   r9   r9   r:   r;      s    zProgressFileWrapper.__init__c                 C   s   t | j|S r2   )getattrrx   )r5   r4   r9   r9   r:   __getattr__   s    zProgressFileWrapper.__getattr__c                    s0   | drtt| || nt| j|| d S )NZ	progress_)
startswithsuperrw   __setattr__setattrrx   )r5   r4   rM   r=   r9   r:   r      s    
zProgressFileWrapper.__setattr__c                 C   s   | j |}|   |S r2   )rx   readprogress_update)r5   sizedatar9   r9   r:   r      s    zProgressFileWrapper.readc                 C   s<   t | j| j }t|| j}|| _|| j }| | d S r2   )rz   r   rx   tellminr   ry   )r5   posZrel_posr9   r9   r:   r      s
    
z#ProgressFileWrapper.progress_update)r   )	r>   rQ   rR   r;   r   r   r   r   __classcell__r9   r9   r   r:   rw      s
   
rw   c           	      C   s   dd l }|d kr:| dd  tkr.| d d }n|  d }td| | t|s\td| |jj| |d tj	
drt dkrt|D ],\}}}|D ]}t||}t|dd qqd S )Nr   izextracting %s
  to %sz9package folder %s was not empty, but we're writing there.)Zdest_dirZlinux)Zconda_package_handling.apir!   r   rY   debugr   Zapiextractsysplatformr   r{   getuidwalkr   lchown)	Ztarball_full_pathZdestination_directoryry   Zconda_package_handlingrootdirsfilesfnpr9   r9   r:   extract_tarball   s     
r   Fc                 C   sp   t sdS t| dr$td dS z$ddl}|t| t|||  W n" t	k
rj   t
jddd Y nX dS )z
    Create cross-platform menu items (e.g. Windows Start Menu)

    Passes all menu config files %PREFIX%/Menu/*.json to ``menuinst.install``.
    ``remove=True`` will remove the menu items.
    N_zHEnvironment name starts with underscore '_'. Skipping menu installation.r   zmenuinst ExceptionT)exc_info)r$   r   r   rY   warnmenuinstZinstallr   r(   	Exception	stdoutlogerror)r7   r]   remover   r9   r9   r:   	make_menu   s    
r   c              	   C   st   t | r"td| |d }t|ztd| | t| | W n0 ttfk
rn   td| | t	| | Y nX d S )Nz|
        Cannot hard link a soft link
          source: %(source_path)s
          destination: %(destination_path)s
        )rb   Zdestination_pathzcreating hard link %s => %sz%hard link failed, so copying %s => %s)
r   r    r+   rY   rZ   r   IOErrorOSErrorinfo_do_copy)srcdstmessager9   r9   r:   create_hard_link_or_copy   s    r   c                 C   s,   t rdS t| o&t|  o&t| tjS d S )NF)r$   r   r   r{   accessX_OK)pathr9   r9   r:    _is_unix_executable_using_ORIGIN  s    r   c                 C   s0   t | rt| | ntd| | t| | d S )Nsoft linking %s => %s)r   copyrY   rZ   r   )r   r   r9   r9   r:   _do_softlink  s    r   c              	   C   s<   t stt| \}}t|d}|d|  W 5 Q R X |S )Nrq   z@echo off
call "%s" %%*
)r$   AssertionErrorr   r	   r\   )r   r   Zsrc_rootr   fr9   r9   r:   create_fake_executable_softlink"  s    r   c                 C   sH   t s:t| r:t| }|ds:td| | t|| d S t| | d S )N/r   )r$   r   r   r   rY   rZ   r   r   )r   r   Zsrc_points_tor9   r9   r:   r   -  s    

r   c              
   C   s   t d| | d}t| d(}t|d}t||| W 5 Q R X W 5 Q R X zt| | W n2 ttfk
r } zt d| W 5 d }~X Y nX d S )Nzcopying %s => %si  @ rbrT   %r)rY   rZ   r	   r   r   r   r   r   )r   r   Zbuffer_sizeZfsrcZfdster9   r9   r:   r   9  s     r   c              
   C   sh  |t jkrRt|rFt|sF|s0tt| |tt td|  t	| t
| d S t| sftd|  t|r|stt| |tt td|  t	| |t jkr(t| rtd|  ztd| | t| | W nN ttfk
r$ } z*td| td|| | t| | W 5 d }~X Y nX n<|t jkr@t| | n$|t jkrXt| | ntd| d S )	Nz-file exists, but clobbering for directory: %rzgCannot link a source that does not exist. %s
Running `conda clean --packages` may resolve your problem.zfile exists, but clobbering: %rz Cannot hard link a directory. %szhard linking %s => %sr   zFhard-link failed. falling back to copy
  error: %r
  src: %s
  dst: %szDid not expect linktype=%r)r.   Z	directoryr   r   r,   r*   r#   rY   r   r   r   r   hardlinkrZ   r   r   r   r   r   Zsoftlinkr   )r   r   Z	link_typeZforcer   r9   r9   r:   create_linkN  sH    
  r   c              
   C   sX  t |}t |}t|dkr g S t \}}z|D ]>}tj||}t|dr`|j	t
 dd}t||d  q2t| dddd	d
d|g}t|d dkrt|dd dkr|ddg | g|dd< t| ddlm}	 |	||\}
}}W 5 t| X g }t||D ]>\}}t|sFtd}t|| ||||
| n
|| q|S )Nr   encodereplace)errors   
z-Wiz-mZ
compileallz-qz-lz-ir   rc   r      z-j0)any_subprocessa  
            pyc file failed to compile successfully (run_command failed)
            python_exe_full_path: %s
            py_full_path: %s
            pyc_full_path: %s
            compile rc: %s
            compile stdout: %s
            compile stderr: %s
            )tuplelenr3   Zmkstempr{   r   r   relpathhasattrr   r   getfilesystemencodingr\   closeintri   extendrY   rZ   Zconda.gateways.subprocessr   zipr   r    r   append)Zpython_exe_full_pathZpy_full_pathsZpyc_full_pathsr7   Zpy_verfdfilenamer   Zcommandr   stdoutstderrZrcZcreated_pyc_pathsZpy_full_pathZpyc_full_pathr   r9   r9   r:   compile_multiple_pycz  s>    

&

	  r   c              
   C   s   zHt d|  t| td}tt| td|d tt| d|d W nN ttfk
r } z,|j	t
ttfkrt d|  W Y 
dS  W 5 d }~X Y nX dS )	Nz%creating package cache directory '%s'~Tmkdir	sudo_safeZurls)r   z*cannot create package cache directory '%s'F)rY   rZ   r&   r   r   r   r"   r   r   errnor   r   r   )Zpkgs_dirr   r   r9   r9   r:   create_package_cache_directory  s    
r   c              
   C   s   t | d}z6td|  t| td}tt | |d|d W nN ttfk
r } z,|jt	t
tfkr|td|  W Y 
dS  W 5 d }~X Y nX dS )Nz.conda_envs_dir_testzcreating envs directory '%s'r   Tr   z!cannot create envs directory '%s'F)r   rY   rZ   r&   r   r   r   r   r   r   r   r   )Zenvs_dirZenvs_dir_magic_filer   r   r9   r9   r:   create_envs_directory  s    

r   )NN)F)[Z
__future__r   r   r   r   r[   r   r   r   r   ior	   Zloggingr
   r{   os.pathr   r   r   r   r   r   Zshutilr   r   r   r3   warningsrH   r0   r   rC   r   r   r   r   r   r   r   Zpermissionsr   updater   r   Z
auxlib.ishr    Zbase.constantsr!   r"   Zbase.contextr#   Zcommon.compatr$   Zcommon.pathr%   r&   r'   r(   Zcommon.serializer)   
exceptionsr*   r+   r,   Zmodels.enumsr-   r.   objectr/   r>   rY   r   rj   rt   r`   ro   rv   rw   r   r   r   r   r   r   r   r   r   r   r   r   r   r9   r9   r9   r:   <module>   s\    ,!

,4