
    wBf                       d Z ddl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
mZ ddlmZ ddlmZ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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j`                  d      Z1 G d de2      Z3d Z4ddZ5eddd       Z6ddZ7d dZ8y)!zCDisk utility functions for modifying existing files or directories.    )annotationsN)contextmanager)EINVALEPERMEXDEV)	getLogger)basenamedirnameexistsisdirjoinsplit)move)PIPEPopen   )DRY_RUN_PREFIX)context)on_win)TRACE)expand)NotWritableError   )exp_backoff_fnmkdir_pmkdir_p_sudo_safe)rm_rf)lexistss   ^(#!((?:\\ |[^ \n\r])+)(.*))c                      e Zd Zy)CancelOperationN)__name__
__module____qualname__     :lib/python3.12/site-packages/conda/gateways/disk/update.pyr    r        s    r%   r    c                   d }	 t        t        | d      }t        j                  t        d|        |j	                         }|j                  d       	 |j                   ||             |j                          	 |r|j                          yy# t        $ r Y nw xY w	 |r|j                          y# |r|j                          w w xY w)Nzrb+z"in-place update path locked for %sr   TF)
r   openlogr   readseekwritetruncatecloser    )file_full_pathcallbackfhdatas       r&   update_file_in_place_as_binaryr3   $   s     
BD.%8;^Lwwy

	HHXd^$KKM HHJ   		HHJ HHJ s*   AB1 'B 	BB1 BB1 1Cc           	     l   t        |      r|rt        |       t        |       r4t        j                  t        d| |       	 t	        j
                  | |       y t        j                  t        d	|        y # t        $ r5}t        rt        |       t        |      k(  rt        j                  j                  |       rt        t        j                  d      }t        |d      }t        |      rIt        |       \  }}t!        |      }t#        dd||||gt$        t$              }	|	j'                         \  }
}nut        j)                  | d       nW|j*                  t,        t.        t0        fv r4t        j                  t        d| ||j*                         t3        | |       n Y d }~y Y d }~y Y d }~y d }~ww xY w)
Nzrenaming %s => %scondabinzrename_tmp.batzcmd.exez/C)stdoutstderrzv is missing.  Conda was not installed correctly or has been corrupted.  Please file an issue on the conda github repo.zHCould not rename %s => %s due to errno [%s]. Falling back to copy/unlinkz.cannot rename; source path does not exist '%s')r   r   r)   r   osrenameOSErrorr   r
   pathisfiler   r   conda_prefixr   r   r	   r   r   communicatedebugerrnor   r   r   r   )source_pathdestination_pathforceecondabin_dirrename_script_dirname_src_fn_dest_fnpr6   r7   s               r&   r9   r9   :   sy    U{*K9IJ'	IIk#34P 	GUO  %	K(G4D,EEGGNN;/#G$8$8*E $\3C D-((-k(:%Hg'(89H"D-7HU##A
 &']]_NFFII(/ *U U VUE22 &$GG ["23 4# #!%	s   A4 4
F3>D!F..F3c              #     K   |t        j                         }|rt        t         d|  d|        d y	 t	        | |d       d y# t
        $ r}t	        || d       |d}~ww xY ww)z
    Used for removing a directory when there are dependent actions (i.e. you need to ensure
    other actions succeed before removing it).

    Example:
        with rename_context(directory):
            # Do dependent actions here
    Nz rename_context z > T)rC   )tempfilemkdtempprintr   r9   	Exception)sourcedestinationdry_runexcs       r&   rename_contextrT   k   st      &&(  0K=IJv{$/ {F$/	s(   5A,A 
A,	A)A$$A))A,c                (    t        t        | ||       y )N)r   r9   )rA   rB   rC   s      r&   backoff_renamerV      s    6;(8%@r%   c                   	 t        |       } t        j                  t        d|        t        |       rt	        j
                  | d        yt        |       }t        |      s|r|rt        |       n"t        |       nt        t        |             sJ t        | d      5  	 d d d        y# 1 sw Y   yxY w# t        $ r}t        | |j                  |      d }~ww xY w)Nztouching path %sTaF)	caused_by)r   r)   r   r   r8   utimer
   r   r   r   r(   r:   r   r@   )r;   mkdir	sudo_safedirpathrD   s        r&   touchr^      s    ;d|)404=HHT4 dmG>e%g.G$WT]+++dC    ;tQWW::;s=   AB5 
AB5 B) B5 )B2.B5 2B5 5	C>CC)F)NF)rP   strrQ   z
str | NonerR   bool)FF)9__doc__
__future__r   r8   rerL   
contextlibr   r@   r   r   r   loggingr   os.pathr	   r
   r   r   r   r   shutilr   
subprocessr   r   base.constantsr   base.contextr   common.compatr   common.constantsr   common.pathr   
exceptionsr    r   r   r   deleter   linkr   r!   r)   compileSHEBANG_REGEXrO   r    r3   r9   rT   rV   r^   r$   r%   r&   <module>rt      s    J " 	 	  % & &  A A  " , # # % ! * 8 8  

;<	i 	,.Vb  4A";r%   