
    DIe5                     D   d Z ddl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 dd	lmZ dd
lmZmZ dZ ee          Zej        j        dk    Z	 ddlmZ eZn# e$ r d ZY nw xY wesddlmZmZ eZeZnddlmZm Z  ej!        j"        Z#e j$        e#_%        e j&        e j&        e j'        ge#_(        	 ej!        j)        Z*e j$        e*_%        e j&        e j&        e j+        ge*_(        n# e,$ r dZ*Y nw xY wd Z-d Z.e-Ze.Zeresddlm/Z/ eZ
eZe/Z/dS ddl0Z0ddl1Z1ddlZddlm2Z2m3Z3m4Z4m5Z5m6Z6mZm Z  ddlm7Z7 ddlm8Z8 d Z
d ZdZ9dZ:dZ;dZ<dZ=dZ> G d de3          Z? e2e?          Z@ej!        jA        ZBe jC        e@feB_(        e jD        eB_%        ej!        jE        ZFe jD        e@feF_(        e jG        eF_%         e jD        d           jH        ZIej!        jJ        ZKe j+        eK_%        e jC        feK_(        d! ZLd" ZM G d# d$e0jN                  ZNd% ZOd& ZPd' ZQd( ZRd) ZSd* ZTdZUd+ZVd,ZWd-ZX e2e j+                  ZYe j'        ZZ G d. d/e3          Z[ e2e[          Z\ej!        j]        Z^e jC        e j+        e j+        e\e j+        e j+        e jD        fe^_(        e jD        e^_%        ej!        j_        Z_e jD        fe__(        e jG        e__%        dd0lm`Z`maZambZbmcZcmdZdmeZe  G d1 d2e3          Zfd3 Z/ej!        jg        Zge jD        e j+        e j'        e j+        e j'        e j+        eYeZgeg_(        e j$        eg_%        	 d5d4ZhdS )6a  Disk utility functions for symlinking files and folders.

Portions of the code within this module are taken from https://github.com/jaraco/jaraco.windows
which is MIT licensed by Jason R. Coombs.

https://github.com/jaraco/skeleton/issues/1#issuecomment-285448440
    N)	getLogger)chmod)abspathisdir)islink)lexists   )on_win)CondaOSError
ParseError)r   lchmodr   linkreadlinksymlinkpypy)r   c                 H    t          |           st          | |           d S d S N)r   os_chmod)pathmodes     8lib/python3.11/site-packages/conda/gateways/disk/link.pyr   r       s2     d|| 	!T4     	! 	!    )r   r   )windllwintypesc                 R    t          || d          st          d|  d|           dS )z;Equivalent to os.link, using the win32 CreateHardLink call.Nzwin32 hard link failed
  src: 
  dst: )CreateHardLinkr   srcdsts     r   win_hard_linkr!   >   sB    c3-- 	VTTTsTTUUU	V 	Vr   c                     t           t          d          t          || t          |                     st          d|  d|           dS )zBEquivalent to os.symlink, using the win32 CreateSymbolicLink call.Nzwin32 soft link not supportedzwin32 soft link failed
  src: r   )CreateSymbolicLinkr   r   r   s     r   win_soft_linkr$   C   s]    %>???!#sE#JJ77 	VTTTsTTUUU	V 	Vr   )r   )POINTER	Structurebyrefc_uint64castr   r   )getcwd)isfilec                 >    t          |           ot          |           S )z(Determine if the given path is a symlink)is_reparse_point
is_symlinkr   s    r   r   r   ]   s    %%:*T*:*::r   c                 l    t          |           rdS t          |           rdS t          |           rdS dS )NTF)r   r   r+   r/   s    r   r   r   a   s@    $<< 	4;; 	4$<< 	4ur   i  l     @ l    i      c            
           e Zd Zdej        fdej        fdej        fdej        fdej        dz  fdej        dz  fdej        ez  fd	ej        d
z  fgZe	d             Z
dS )WIN32_FIND_DATAfile_attributescreation_timelast_access_timelast_write_timefile_size_words   reservedfilenamealternate_filename   c                 Z    t          | j        t          t                              j        S r   )r)   r8   r%   r(   contentsselfs    r   	file_sizezWIN32_FIND_DATA.file_size}   s     ,gh.?.?@@IIr   N)__name__
__module____qualname__r   DWORDFILETIMEWCHARMAX_PATH_fields_propertyrB    r   r   r3   r3   q   s        /h/0!23 12 23!+,(23!8>B#67	
 
	J 	J 
	J 	J 	Jr   r3   c                 .    | dk    rt                      d S Nr   )OSError)results    r   handle_nonzero_successrR      s    Q;;))O ;r   c           	          d}d}||z  }d}| }d}t          j                    }d}d}	t          j                            ||||t          |          ||	          }
t          |
           |j        }t          j                            |           |S )zr
        Call FormatMessage with a system error number to retrieve
        the descriptive error message.
           i   Nr   )	r   LPWSTRr   kernel32FormatMessageWr'   rR   value	LocalFree)errnoALLOCATE_BUFFERFROM_SYSTEMflagssource
message_idlanguage_idresult_bufferbuffer_size	argumentsbytesmessages               r   format_system_messagerf      s        +-
 ))	..-  
 
 	u%%%%!!-000r   c                   X     e Zd Zd fd	Zed             Zed             Zd Zd Z xZ	S )WindowsErrorNc                     |t           j                                        }t          |          }d|d |f} t	                      j        |  d S rO   )r   rV   GetLastErrorrf   super__init__)rA   rX   strerrorargs	__class__s       r   rl   zWindowsError.__init__   sP    }4466,U33Hhe+DEGGd####r   c                     | j         S r   )rm   r@   s    r   re   zWindowsError.message   
    = r   c                     | j         S r   )winerrorr@   s    r   codezWindowsError.code   rq   r   c                     | j         S r   )re   r@   s    r   __str__zWindowsError.__str__   s
    <r   c                 4     dj         di t                      S )Nz*{self.__class__.__name__}({self.winerror})rL   )formatvarsr@   s    r   __repr__zWindowsError.__repr__   s     F?FPPPPPr   r   )
rC   rD   rE   rl   rK   re   rt   rv   rz   __classcell__)ro   s   @r   rh   rh      s        	$ 	$ 	$ 	$ 	$ 	$ 
	! 	! 
	! 
	! 	! 
	!	  	  	 	Q 	Q 	Q 	Q 	Q 	Q 	Qr   rh   c                 .    | j         d         t          k    S rO   )r:   IO_REPARSE_TAG_SYMLINK)	find_datas    r   _is_symlinkr      s    !!$(>>>r   c                     |                      d          r| S t          |           } | d         dk    st                      dd         | z   } d| z   S )a;  
        Paths have a max length of api.MAX_PATH characters (260). If a target path
        is longer than that, it needs to be made absolute and prepended with
        \\?\ in order to work with API calls.
        See http://msdn.microsoft.com/en-us/library/aa365247%28v=vs.85%29.aspx for
        details.
        z\\?\   :Nr9   )
startswithr   r*   r/   s    r   _patch_pathr      sV     ??9%% 	Kt}}Aw#~~88BQB<$&D4r   c                 f    t          j                    j        j        }|                     |          S )zFormat the string using variables in the caller's local namespace.

        .. code-block:: pycon
            >>> a = 3
            >>> local_format("{a:5}")
            '    3'
        )inspectcurrentframef_backf_locals
format_map)stringcontexts     r   local_formatr      s,     &((/8  )))r   c                     t          |           } 	 t          t          t          |                               S # t          $ r(}d}t          j        t          |                    d}~ww xY w)z>Assuming path is a reparse point, determine if it's a symlink.z,Error accessing {path}: {orig_error.message}N)r   r   next
find_filesrP   builtinsrh   r   )r   
orig_errortmpls      r   r.   r.      so    4  	<tJt$4$455666 	< 	< 	<AD'T(:(:;;;	<s   (: 
A,#A''A,c              #     K   t                      }t          | t          |                    }	 |t          k    rt	                      |V  t                      }t          |t          |                    }|dk    r!t                      }|j        t          k    rn|pt          j
                            |           dS )a  
        A pythonic wrapper around the FindFirstFile/FindNextFile win32 api.
        >>> root_files = tuple(find_files(r'c:\*'))
        >>> len(root_files) > 1
        True
        >>> root_files[0].filename == root_files[1].filename
        False
        >>> # This test might fail on a non-standard installation
        >>> 'Windows' in (fd.filename for fd in root_files)
        True
        Tr   N)r3   FindFirstFiler'   INVALID_HANDLE_VALUErP   FindNextFilerh   rt   ERROR_NO_MORE_FILESr   rV   	FindClose)specfdhandlereserrors        r   r   r      s       tU2YY//	 ---iiHHH ""BvuRyy11Caxx$:!444K	  	!!&)))))r   c                 d    t          |           }|t          k    ot          |t          z            S )z
        Determine if the given path is a reparse point.
        Return False if the file does not exist or the file attributes cannot
        be determined.
        )GetFileAttributesINVALID_FILE_ATTRIBUTESboolFILE_ATTRIBUTE_REPARSE_POINT)r   r   s     r   r-   r-     s9      %%-- 
$..3
 3
 	
r   i    i   i 	 c                   B    e Zd Zdej        fdej        fdej        ffZdS )SECURITY_ATTRIBUTESlengthp_security_descriptorinherit_handleN)rC   rD   rE   r   rF   LPVOIDBOOLEANrJ   rL   r   r   r   r   $  s4        x~&$ho6x/0
r   r   )Arrayc_bytec_ulongc_ushortcreate_string_buffersizeofc                   Z    e Zd Zdefdefdefdefdefdefdefdefd	ed
z  fg	Zd Zd ZdS )REPARSE_DATA_BUFFERtagdata_lengthr:   substitute_name_offsetsubstitute_name_lengthprint_name_offsetprint_name_lengthr]   path_bufferr   c                     t          t          j                  }t          j        | j        |z  z  }t	          | j        | j                  }t          |t          |                    j	        j
        S r   )r   r   rH   r   r'   r   r   r)   r%   r?   rX   rA   
wchar_sizearr_typdatas       r   get_print_namez"REPARSE_DATA_BUFFER.get_print_nameL  sX    //Jn(>*(LMG)4+ABBDgg..//8>>r   c                     t          t          j                  }t          j        | j        |z  z  }t	          | j        | j                  }t          |t          |                    j	        j
        S r   )r   r   rH   r   r'   r   r   r)   r%   r?   rX   r   s       r   get_substitute_namez'REPARSE_DATA_BUFFER.get_substitute_nameR  sX    //Jn(Cz(QRG)4+FGGDgg..//8>>r   N)	rC   rD   rE   r   r   r   rJ   r   r   rL   r   r   r   r   ?  s        GH%"%x0%x0 (+ (+gFQJ'

	? 	? 	?	? 	? 	? 	? 	?r   r   c           	         t          | dddt          t          t          z  d          }|t          k    rt                      t          |t          dd          }t          |          }t          |t          t                              }|j        }|j        t          k    st          d|j        z            t!          t#          |                     |                                S )zsReturn a string representing the path to which the symbolic link points.

        readlink(link) -> target
        r   Ni (  z+Expected IO_REPARSE_TAG_SYMLINK, but got %d)
CreateFileOPEN_EXISTINGFILE_FLAG_OPEN_REPARSE_POINTFILE_FLAG_BACKUP_SEMANTICSr   rP   reparse_DeviceIoControlFSCTL_GET_REPARSE_POINTr   r)   r%   r   r?   r   r}   r   rR   CloseHandler   )r   r   r   rd   p_rdbrdbs         r   r   r   X  s    
 (+EE
 
 )))))O%f.EtUSS$S))UG$78899nw000JSWTUUU{622333&&(((r   c           
         |t          d          t          |t                    rt          |          }|t	          |          nd}t	          |          }t          |t
                    sJ t          j                    }t          | |||||||          }t          |           t          |           |d |j
                 S )Nz$overlapped handles not yet supportedr   )NotImplementedError
isinstanceintr   lenr   r   rF   DeviceIoControlrR   rX   )	deviceio_control_code	in_buffer
out_buffer
overlappedin_buffer_sizeout_buffer_sizereturned_bytesr   s	            r   r   r     s     !%&LMMMj#&& 	:-j99J+4+@Yaj//*e,,,,,!))	
 	
 	s###~...0N0011r   r   )i__doc__sysloggingr   osr   r   os.pathr   r   r   	os_islinkr   
os_lexistscommon.compatr
   
exceptionsr   r   __all__rC   logimplementationnamePYPYr   	os_lchmodImportErrorr   r   ctypesr   r   rV   CreateHardLinkWr   BOOLrestypeLPCWSTRr   argtypesCreateSymbolicLinkWr#   rF   AttributeErrorr!   r$   r   r   r   r%   r&   r'   r(   r)   r*   r+   rI   r}   r   r   NULLr   r3   LPWIN32_FIND_DATAFindFirstFileWr   rU   HANDLEFindNextFileWr   r   rX   r   GetFileAttributesWr   rR   rf   rh   r   r   r   r.   r   r-   r   r   r   r   LPDWORDLPOVERLAPPEDr   LPSECURITY_ATTRIBUTESCreateFileWr   r   r   r   r   r   r   r   r   r   r   rL   r   r   <module>r      s*    


                   " " " " " " " " ' ' ' ' ' ' ) ) ) ) ) ) # # # # # # 2 2 2 2 2 2 2 2
Hi
&(
!&&&&&&FF ! ! !! ! ! ! !!  $        DGG ('''''''_4N%]N'/1A8?SN	"#_@%-]"N'
##
  " " "!"V V V
V V V DG 	 P24 P2FGHHH OOONNNJJJRRRRRRRRRRRRRRRRRR; ; ;   H'(#( DJ J J J J) J J J   00O2M&o/@AM$OM?0L%_.?@L#+L*8?2..4: ("*/!3  ! ! !FQ Q Q Q Qx, Q Q Q0? ? ?      	* 	* 	*< < <* * *<	
 	
 	
 M#- !*%ghn%%G?L
 
 
 
 
i 
 
 
 $G$788,JJ "J/-K$O-K"*KUUUUUUUUUUUUUUUU? ? ? ? ?i ? ? ?2) ) ): o5O	 O 'mO DH2 2 2 2 2 2s$   A A'&A'31C% %C/.C/