
    wBf3                       d Z ddlmZ ddl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 ddlmZ dd	lmZ dd
lmZmZmZ ddlmZmZ ddlmZmZ ddlmZ  ee      ZdZ erdndZ!dZ" G d de#      Z$ddZ%eejL                  ejN                  fdZ(	 d	 	 	 	 	 	 	 	 	 	 	 ddZ)	 	 d	 	 	 	 	 	 	 	 	 	 	 d dZ*d Z+d Z,d Z-d!dZ.y)"zTools for cross-OS portability.    )annotationsN)	getLogger)basenamerealpath   )dals)PREFIX_PLACEHOLDER)context)on_linuxon_macon_win)BinaryPrefixReplacementErrorCondaIOError)CancelOperationupdate_file_in_place_as_binary)FileModes(   ^(#!(?:[ ]*)(/(?:\\ |[^ \n\r\t])*)(.*))$   i   )utf-8z	utf-16-lez	utf-16-bez	utf-32-lez	utf-32-bec                      e Zd Zy)_PaddingErrorN)__name__
__module____qualname__     6lib/python3.12/site-packages/conda/core/portability.pyr   r   0   s    r   r   c                f    d| v r(| j                         j                  dd      \  }}|dk(  S t        S )N-   win)lowersplitr   )subdiros_s      r   _subdir_is_winr&   4   s6    
f}$$S!,AU{ r   c           	     <    t              r%t        j                  k(  rj                  dd       fd}t	        t               |      }|rGt        j                  k(  r3dk(  r-t        r&t        j                  ddddt               gd	
       y y y y y )N\/c           	        t        |       }t              st        |      }|| k(  r
t               t        j
                  k(  r8t        |      t        |       k7  r!t        t        |       t        |            |S )N)replace_prefixr&   replace_long_shebangr   r   binarylenr   )original_datadatamode
new_prefixpathplaceholderr#   s     r   _update_prefixz%update_prefix.<locals>._update_prefixI   s    dM;
FS f%'d3D = !## 8??"s4yC4F'F.k:s=/A3t9  r   z	osx-arm64z/usr/bin/codesignz-sr   z-fT)capture_output)
r&   r   textreplacer   r   r-   r   
subprocessrun)r3   r2   r4   r1   r#   r5   updateds   `````  r   update_prefixr<   =   s     f$(--"7  ''c2
 , -Xd^^LG48??*v/D $T8D>BSW	
 JP/D*wr   c                B   t         D ]  }| t        j                  k(  rt        |      ss|j	                  d      }|dkD  r]|d| ||d }}d| j                  |      }	|	|v r;d| j                  dd      j                  |      }
|j                  |	|
      }||z   }|j                  |j                  |      |j                  |            }| t        j                  k(  r0t        ||j                  |      |j                  |      ||      }	t        d| z         |S )	a$  
    Replaces `placeholder` text with the `new_prefix` provided. The `mode` provided can
    either be text or binary.

    We use the `POPULAR_ENCODINGS` module level constant defined above to make several
    passes at replacing the placeholder. We do this to account for as many encodings as
    possible. If this causes any performance problems in the future, it could potentially
    be removed (i.e. just using the most popular "utf-8" encoding").

    More information/discussion available here: https://github.com/conda/conda/pull/9946
       
N#! \ )encodingr#   zInvalid mode: %r)
POPULAR_ENCODINGSr   r7   r&   findencoder8   r-   binary_replacer   )r1   r0   r4   r2   r#   rC   newline_posshebang_linerest_of_datashebang_placeholderescaped_shebangs              r   r+   r+   h   sA   $ & :8== !&) #ii.#15l{1CT+,EW,L,.{m*<*C*CH*M'*l:,.zl*;*C*CC*O*V*V$+ (4';';/(  ,l:<<""8,j.?.?.ID X__$!""8,!!(+!D 1D899?:@ Kr   c                D   dj                  |      }t        |      rt        |       rt        |       S | S fd}t	        |       }t        j                  t        j                        dz   |z   dz   |z         }|j                  ||       } t	        |       |k(  sJ | S )a
  
    Perform a binary replacement of `data`, where the placeholder `search` is
    replaced with `replacement` and the remaining string is padded with null characters.
    All input arguments are expected to be bytes objects.

    Parameters
    ----------
    data:
        The bytes object that will be searched and replaced
    search:
        The bytes object to find
    replacement:
        The bytes object that will replace `search`
    encoding: str
        The encoding of the expected string in the binary.
     c                    | j                         j                        }t              t              z
  |z  }|dk  rt        | j                         j	                        d|z  z   S )Nr       )groupcountr.   r   r8   )matchoccurrencespaddingreplacementsearchs      r   r8   zbinary_replace.<locals>.replace   s`    kkm))&1v;[!11[@Q;{{}$$V[9EGOKKr   s	   (?:(?!(?:s   )).)*)	rF   r&   has_pyzzer_entry_point"replace_pyzzer_entry_point_shebangr.   recompileescapesub)	r0   rW   rV   rC   r#   zerosr8   original_data_lenpats	    ``      r   rG   rG      s    . KK!Ef "$'5dFKPPKL D	
**RYYv&5=H5P
QC777D!Dt9))))Kr   c                .    | j                  d      }|dk\  S )N   PKr   )rfind)r0   poss     r   rX   rX      s    
**]
#C!8Or   c                   dx}}| j                  d      }|dk\  r| |dz   |dz    }t        j                  d|      \  }}||z
  |z
  }	| |	d }
|	dkD  r'| j                  dd|	      }|dk\  r| ||	 }|dkD  r| d| }|
rd|rb|r`t        |d      r|j	                  d	      }t        |d      r|j	                  d	      }|j                  ||      }d
j                  |||
g      } | S )a  Code adapted from pyzzer.  This is meant to deal with entry point exe's created by distlib,
    which consist of a launcher, then a shebang, then a zip archive of the entry point code to run.
    We need to change the shebang.
    https://bitbucket.org/vinay.sajip/pyzzer/src/5d5740cb04308f067d5844a56fbe91e7a27efccc/pyzzer/__init__.py?at=default&fileviewer=file-view-default#__init__.py-112  # NOQA
    Nrb   r         z<LLs   #!rF   r   r   )rc   structunpackhasattrrF   r8   join)all_datar4   r2   launchershebangrd   end_cdrcdr_size
cdr_offsetarc_posr0   s              r   rY   rY      s	   2 Hw
..
'C
ax38cBh/%}}UG<*.:-!Q;..73Cax"3w/7'~HG{H-)009z8,'..w7
ook:>Gxx7D 9:HOr   c                   | t         j                  k(  rt        |t              s	 t        |d      }t        j                  t        |t
        j                        }|r|j                         \  }}}|j                  d      j                  dd      \  }}t        |      t        kD  sd|v r7d| |j                  d       }|j                  ||j	                  d            }|S 	 |S #  |j	                  d      }Y xY w)Nr   )rC   r)   r   rB   #!/usr/bin/env )r   r7   
isinstancebytesrF   rZ   rS   SHEBANG_REGEX	MULTILINEgroupsdecodersplitr.   MAX_SHEBANG_LENGTHr8   )	r1   r0   shebang_matchwhole_shebang
executableoptionsprefixexecutable_namenew_shebangs	            r   r,   r,     s    x}}$&,TG4 bllC1>1E1E1G.M:w&0&7&7&@&G&GQ&O#FO=!$66%6/%o%6w~~g7N6OP  ||M;3E3Eg3NO
 K 	K!,{{7+s   C' 'C<c                    d|  d}t         j                  j                  d      dk(  rd| v r|S t        |      t        kD  sd| v r"|rdt        |        d}|S t        d|  d	      }|S )
z
    This function can be used to generate a shebang line for Python entry points.

    Use cases:
    - At install/link time, to generate the `noarch: python` entry points.
    - conda init uses it to create its own entry point during conda-build
    r@   
CONDA_BUILD1z/_h_env_placeholdrA   rt   z5
                #!/bin/sh
                '''exec' "z!" "$0" "$@" #'''
                )r$   environgetr.   r|   r   r   )r   with_usr_bin_envrn   s      r    generate_shebang_for_entry_pointr     s     :,b!G	zz~~m$+0Cz0Q
 
 7|((C:,= ((<'=R@G( N %, 'G Nr   )r#   strreturnbool)noarch)r1   r   r0   rv   r4   r   r2   r   r#   r   r   rv   )r   r   )r0   rv   rW   rv   rV   rv   rC   r   r#   r   r   rv   )F)/__doc__
__future__r   r$   rZ   rh   r9   loggingr   os.pathr   r   
auxlib.ishr   base.constantsr	   base.contextr
   common.compatr   r   r   
exceptionsr   r   gateways.disk.updater   r   models.enumsr   r   logrw   r|   rD   	Exceptionr   r&   r7   r#   r<   r+   rG   rX   rY   r,   r   r   r   r   <module>r      s'   & " 	 	    &  / " 4 4 C R #
  %S# 
 	I 	 #	>>(
` 2
2
2 2 	2
 2 2r ,
,, , 	,
 , ,^
.b2,r   