
    wBf|@                     F   d Z ddlZ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
 ddlmZ ddl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mZ ddl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,m-Z-m.Z. ddl/m0Z0 ddlm1Z1 ddl2m3Z3m4Z4 ddl5m6Z6m7Z7m5Z5m8Z8m9Z9 ddl:m;Z; ddl<m=Z=  G d d      Z> ee?      Z@ ed      ZAe1Z1 ed      ZB ed      ZCd ZDd ZEd ZF G d  d!      ZG	 d/d"ZHd0d$ZId% ZJd& ZKd' ZLd( ZMd) ZNd* ZOe0j                  d#fd+ZQd, ZRd- ZSd. ZTy)1z=Disk utility functions for creating new files or directories.    N)EACCESEPERMEROFS)	getLogger)dirnameisdirisfilejoinsplitext)copyfileobjcopystat   )
CondaError)dals)CONDA_PACKAGE_EXTENSION_V1PACKAGE_CACHE_MAGIC_FILE)context)on_linuxon_win)TRACE)
ensure_padexpandwin_path_double_escapewin_path_ok)	json_dump)BasicClobberErrorCondaOSErrormaybe_raise)LinkType   )mkdir_p)path_is_cleanrm_rf)islinklexistslinkreadlinksymlink)make_executable)touchc                   D    e Zd ZdZdZdZd
dZd Zd Zde	fdZ
d Zd	 Zy)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.
    NFc                 <    t        j                  |||      | _        y N)tempfilemkdtempname)selfsuffixprefixdirs       :lib/python3.12/site-packages/conda/gateways/disk/create.py__init__zTemporaryDirectory.__init__2   s    $$VVS9	    c                 P    d| j                   j                   d| j                  dS )N< >)	__class____name__r1   r2   s    r6   __repr__zTemporaryDirectory.__repr__5   s&    4>>**+1TYYM;;r8   c                     | j                   S r.   )r1   r?   s    r6   	__enter__zTemporaryDirectory.__enter__8   s    yyr8   c                     ddl m} | j                  r(| j                  s	  || j                         d| _        y y y # t        t
        f$ r"}d| vr  || j                         Y d }~6d }~ww xY w)Nr    )r#   NoneT)deleter#   r1   _closed	TypeErrorAttributeError)r2   _warn	_warnings_rm_rfexs        r6   cleanupzTemporaryDirectory.cleanup;   sf    +99T\\"tyy!
  DL *9 ~. "B4(tyy!!"s   < A-A((A-c                 $    | j                          y r.   rM   )r2   excvaluetbs       r6   __exit__zTemporaryDirectory.__exit__G   s    r8   c                 (    | j                  d       y )NT)rI   rO   r?   s    r6   __del__zTemporaryDirectory.__del__J   s    4 r8   ) tmpN)r>   
__module____qualname____doc__r1   rF   r7   r@   rB   rJ   rM   rS   rU    r8   r6   r,   r,   "   s8    	 DG:< "Y 
 !r8   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                     t         j                  t        d|        t        j                  | dd      5 }t	        |      }|j                  |       d d d        y # 1 sw Y   y xY w)Nzwriting json to file %swbutf-8modeencoding)logr   codecsopenr   write)	file_pathobjfojson_strs       r6   write_as_json_to_filerj   q   sO    GGE,i8	YTG	< S>
  s   AA#c                    t        |       r t        t        d | t              t               |j	                  d      d   }t
        |||dz  }|ddlm}  ||      }nd }t        j                  | dd	      5 }||j                  |       |j                  |       d d d        |t        |        | S # 1 sw Y   xY w)
Nsource_pathtarget_pathr   .r   )modulefuncimport_namer   ) generate_shebang_for_entry_pointr]   r^   r_   )r%   r   r   r   splitpython_entry_point_templatecore.portabilityrs   rc   rd   re   r)   )	target_full_pathpython_full_pathrp   rq   rr   pyscriptrs   shebangrh   s	            r6   create_python_entry_pointr{   x   s      ,
 	
 **S/!$K*". H
 #H23CD	%D7	C rHHW

 () s   8%B44B=c                    t        |      r t        t        d |t              t               t        dt        |       iz  }t        t        |            st        t        |             t        |d      5 }d|v rt        |d      }|j                  d|z         |j                  |       d d d        t        |       y # 1 sw Y   xY w)Nrl   source_full_pathwr;   "z#!%s
)r%   r   r   r    application_entry_point_templater   r   r   r!   rd   r   re   r)   )r}   rw   rx   entry_pointrh   s        r6   create_application_entry_pointr      s    
   ,
 	
 323CD6 K )*+()*		$ "")*:C@
,,-
	
 $% s   46B>>Cc                   8     e Zd Zd Zd Z fdZddZd Z xZS )ProgressFileWrapperc                     || _         || _        t        dt        j                  |j                               j                        | _        d| _        y )Nr    r   )	progress_fileprogress_update_callbackmaxosfstatfilenost_sizeprogress_file_sizeprogress_max_pos)r2   fileobjr   s      r6   r7   zProgressFileWrapper.__init__   s?    $(@%"%a'..2B)C)K)K"L !r8   c                 .    t        | j                  |      S r.   )getattrr   )r2   r1   s     r6   __getattr__zProgressFileWrapper.__getattr__   s    t))400r8   c                 x    |j                  d      rt        | 	  ||       y t        | j                  ||       y )N	progress_)
startswithsuper__setattr__setattrr   )r2   r1   rQ   r=   s      r6   r   zProgressFileWrapper.__setattr__   s0    ??;'Ge,D&&e4r8   c                 \    | j                   j                  |      }| j                          |S r.   )r   readprogress_update)r2   sizedatas      r6   r   zProgressFileWrapper.read   s)    !!&&t,r8   c                     t        | j                  | j                  j                               }t	        || j
                        }|| _        || j
                  z  }| j                  |       y r.   )r   r   r   tellminr   r   )r2   posrel_poss      r6   r   z#ProgressFileWrapper.progress_update   s[    $''););)@)@)BC#t../ #///%%g.r8   ))	r>   rX   rY   r7   r   r   r   r   __classcell__)r=   s   @r6   r   r      s    "15
/r8   r   c                     dd l }|%| dd  t        k(  r| d d }n| j                         d   }t        j	                  d| |       t        |      st        j	                  d|       |j                  j                  | |       t        |j                  d      ry t        rat        j                         dk(  rIt        j                  |      D ]0  \  }}}|D ]%  }t        ||      }t        j                  |dd       ' 2 y y y )Nr   izextracting %s
  to %sz9package folder %s was not empty, but we're writing there.)dest_dirTHREADSAFE_EXTRACT)conda_package_handling.apir   r   rb   debugr"   apiextracthasattrr   r   getuidwalkr
   lchown)	tarball_full_pathdestination_directoryr   conda_package_handlingrootdirsfilesfnps	            r6   extract_tarballr      s	    &$RS!%??$5cr$:!$5$>$>$@$C!II&(9;PQ ./		G!	

 &&$9 '  %))+?@BIIK1$ "$)>!? 	#D$ #rN		!Q"#	#	 %xr8   Fc                     	 ddl }|j                  t        | t        |            || t        j
                         y# t        $ r t        j                  dd       Y yw xY w)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.
    r   N)remover4   root_prefixzmenuinst ExceptionT)exc_info)	menuinstinstallr
   r   r   r   	Exception	stdoutlogerror)r4   rf   r   r   s       r6   	make_menur      s]    
=Y/0++	 	 	
  =,t<=s   :=  A A c                 
   t        |       rt        d|  d| d      }t        |      	 t        j                  t        d| |       t        | |       y # t        $ r& t        j                  d| |       t        | |       Y y w xY w)Nz8
        Cannot hard link a soft link
          source: z
          destination: z	
        zcreating hard link %s => %sz%hard link failed, so copying %s => %s)	r$   r   r   rb   r   r&   OSErrorinfo_do_copy)srcdstmessages      r6   create_hard_link_or_copyr     s    c{% u 	
 7##4c3?S# 8#sCcs   (A ,BBc                     t         ryt        |       xr2 t        |        xr$ t        j                  | t        j
                        S )NF)r   r	   r$   r   accessX_OK)paths    r6    _is_unix_executable_using_ORIGINr   "  s2    d|MF4L 0MRYYtRWW5MMr8   c                     t        |       rt        | |       y t        j                  t        d| |       t	        | |       y )Nsoft linking %s => %s)r   copyrb   r   r(   )r   r   s     r6   _do_softlinkr   )  s2    ',
 	S#.S9Sr8   c                     t         sJ t        |       \  }}t        |d      5 }|j                  d|z         d d d        |S # 1 sw Y   |S xY w)Nr~   z@echo off
call "%s" %%*
)r   r   rd   re   )r   r   src_root_fs        r6   create_fake_executable_softlinkr   5  sM    M63-KHa	c3 91	,x789J9Js   AAc                     t         sPt        |       rEt        |       }|j                  d      s)t        j	                  t
        d| |       t        ||       y t        | |       y )N/r   )r   r$   r'   r   rb   r   r(   r   )r   r   src_points_tos      r6   r   r   >  sL    fSk '',GGE2C=M3'S#r8   c                 P   t         j                  t        d| |       d}t        | d      5 }t        |d      5 }t        |||       d d d        d d d        	 t	        | |       y # 1 sw Y   xY w# 1 sw Y   #xY w# t
        $ r }t         j                  d|       Y d }~y d }~ww xY w)Nzcopying %s => %si  @ rbr]   %r)rb   r   rd   r   r   r   r   )r   r   buffer_sizefsrcfdstes         r6   r   r   J  s    GGE%sC0 K	c4 1D#t_ 	1dK0	11c		1 	11 1   			$s:   A0A$A0A< $A-	)A00A9<	B%B  B%c                    |t         j                  k(  rft        |      rOt        |      sD|st	        t        | |t              t               t        j                  d|z         t        |       t        |       y t        |       st        d| z        t        |      rD|st	        t        | |t              t               t        j                  d|z         t        |       |t         j                  k(  rCt        |       rt        d| z        	 t        j                  t        d| |       t        | |       y |t         j$                  k(  rt'        | |       y |t         j"                  k(  rt#        | |       y t        d|z        # t        $ rD}t        j!                  d|       t        j!                  d|| |       t#        | |       Y d }~y d }~ww xY w)	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   	directoryr%   r   r   r   r   rb   r   r#   r!   r   hardlinkr   r&   r   r   r   softlinkr   )r   r   	link_typeforcer   s        r6   create_linkr   _  s   H&&& 3<c
-c3@'JHHDsJK#J3<IKNO
 	

 s|)#sG<gF2S89c
H%%%:?#EFF	GGE2C=cN 
h''	'S#	hmm	#S#5	ABB%  	IIdAII  cNN	s   (F 	G:GGc           
         t        |      }t        |      }t        |      dk(  rg S t        j                         \  }}	 |D ]l  }t        j
                  j                  ||      }t        |d      r%|j                  t        j                         d      }t	        j                  ||dz          n t	        j                  |       dddd	d
d|g}t        |d         dk\  r3t        |j                  d      d         dkD  r|j                  ddg       | g|dd t         j!                  t"        |       ddlm}	  |	||      \  }
}}t	        j(                  |       g }t+        ||      D ]H  \  }}t-        |      s't/        d      }t         j1                  || ||||
|       8|j3                  |       J |S # t	        j(                  |       w xY w)Nr   encodereplace)errors   
z-Wiz-m
compileallz-qz-lz-ir   ro   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lenr/   mkstempr   r   relpathr   r   sysgetfilesystemencodingre   closeintrt   extendrb   r   
subprocessr   r   zipr	   r   r   append)python_exe_full_pathpy_full_pathspyc_full_pathsr4   py_verfdfilenamer   commandr   stdoutstderrrccreated_pyc_pathspy_full_pathpyc_full_pathr   s                    r6   compile_multiple_pycr    s    -(M>*N
=Q	##%LB 	$A6*Aq(#HHS668HKHHRU#		$
 	$dD$I vay>Q3v||C'8';#<q#@NND#;',-!w/ ,GV<
		('*=.'I 4#mm$
G HH$ $$]3/42 9 			(s   DF5 5Gc                    	 t         j                  t        d|        t        |       j                  t        d            }t	        t        | t              d|       t	        t        | d      |       y# t        $ rC}|j                  t        t        t        fv r t         j                  t        d|        Y d }~y d }~ww xY w)	Nz%creating package cache directory '%s'~Tmkdir	sudo_safeurls)r  z*cannot create package cache directory '%s'F)rb   r   r   r   r*   r
   r   r   errnor   r   r   )pkgs_dirr  r   s      r6   create_package_cache_directoryr    s    
>I8$//s<	d856diXd8V$	:   77vue,,GGEGRs   A1A4 4	C =8B;:B;;C c                 h   t        | d      }	 t        j                  t        d|        t        |       j	                  t        d            }t        t        | |      d|       y# t        $ rC}|j                  t        t        t        fv r t        j                  t        d|        Y d }~y d }~ww xY w)Nz.conda_envs_dir_testzcreating envs directory '%s'r  Tr  z!cannot create envs directory '%s'F)r
   rb   r   r   r   r*   r   r  r   r   r   )envs_direnvs_dir_magic_filer  r   s       r6   create_envs_directoryr    s     x)?@	5x@8$//s<	d801S   77vue,,GGE>Is   AA% %	B1.8B,+B,,B1)NN)F)UrZ   rc   r   r   r/   warningsrJ   r  r   r   r   loggingr   os.pathr   r   r	   r
   r   shutilr   r   rV   r   
auxlib.ishr   base.constantsr   r   base.contextr   common.compatr   r   common.constantsr   common.pathr   r   r   r   common.serializer   
exceptionsr   r   r   models.enumsr   r!   rE   r"   r#   r&   r$   r%   r'   r(   permissionsr)   updater*   r,   r>   rb   r   ru   r   rj   r{   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r[   r8   r6   <module>r*     s   D  	 
   & &  : : (   R # - % R R ) F F $  ( : : ( 
*! *!Z '(	 "
  $(	$   F&8/ /< MQ$#N=(&N		* %-$5$5U 0Cf=@ r8   