
    0](                        d dl Z d dlZd dlmZmZmZmZmZmZm	Z	 d dl
mZmZmZmZmZmZmZmZmZmZmZ d dlmZ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# d dl$Z%d dl&m'Z'm(Z( 	 d d	l)m*Z* n# e+$ r	 d d	l,m*Z* Y nw xY w e*d
          d             Z-d Z. e j/        d          Z0d Z1d Z2d Z3	 d dl4m5Z5 d Z6n# e+$ r d Z6Y nw xY wd Z7d Z8d Z9d%dZ:d Z;d&dZ< G d de!          Z=d Z>d Z?d  Z@d! ZAd'd$ZBdS )(    N)environgetcwdlistdirmakedirsrenamermdirunlink)abspathbasenamedirnameexistsisdirisfilejoinnormpathsplitislinklexists)check_outputCalledProcessErrorSTDOUT)string_types)FutureExecutor)Lock)MAGIC_HEADERS	DLL_TYPES)	lru_cache    )maxsizec                 6    t          j        |           }|i }|S N)yamlload)dataress     6lib/python3.11/site-packages/conda_verify/utilities.pyyamlizer(      s    
)D//C
{J    c           
         d                     | d         | d         f          }t          d                     | d                             d                              }t          d                     | d                             d                              }t          d7i dd	d
d	d|                    d          dt          |dk              dt          |dk              dt          |dk              dt          |dk              dt          |dk              d|                    d          d|                    d          d|                    d          dt          |dk              dt          |dk              d |                    d!          d"|                    d#          d$|d%t          d&|cxk    od'k     nc           d(t          d)|cxk    od&k     nc           d*t          |d+k              d,t          |d-k              d.t          |d/k              d0t          |d1k              d2t          |d3k              d4t          |d5k              d6|S )8N-platformarch python.numpynomklFdebuglinuxlinux-linux32linux-32linux64linux-64armv7lzlinux-armv7larmppc64lezlinux-ppc64leosxosx-unix)r5   r>   winzwin-win32win-32win64win-64x86)z-32-64x86_64rF   pypy3k   (   py2k   py26   py27   py33!   py34"   py35#   py36$   np )r   intr   dict
startswithboolendswith)cfgplatrH   rZ   s       r'   ns_cfgrc   !   s   88S_c&k233D	RWWS]((--..	/	/B	RWWS\'',,--	.	.B   ee ooh''' TZ'(((	
 TZ'((( DN*+++ '((( T_,--- OOF### __/000 OOF### 48#$$$ 48#$$$ MM.))) }}U###  2!" "----R----   #$ "----R----   %& "(^^^'( "(^^^)* "(^^^+, "(^^^-. "(^^^/0 "(^^^12 23 r)   z(.+?)\s*\[(.+)\]$c                    g }|                                  D ]}|                                }t                              |          }|rO|                    d          }t          ||i           r(|                    |                    d                     |                    |           d                    |          dz   S )N      
)
splitlinesrstripsel_patmatchgroupevalappendr   )r%   	namespacelineslinemconds         r'   select_linesrt   F   s    E!!  {{}}MM$ 	771::DD)R(( )QWWQZZ(((T99Ud""r)   c                 x    |t          | t          |                    } t          t          |                     S r"   )rt   rc   r]   r(   )r%   ra   s     r'   parserv   T   s0    
D&++..r)   c                     t          j        |           g}t          j        t          j        |                    }|                    d          }|                    |          S )N)loaderz	meta.yaml)environment)jinja2FileSystemLoaderEnvironmentChoiceLoaderget_or_select_templaterender)
recipe_dirloadersenvtemplates       r'   render_jinja2r   [   sZ    &z223G

F$7$@$@
A
A
AC))+66H??s?+++r)   )apic                 t    t          j        | fddd|r|ni d         d         }|                                S )NFT)finalizebypass_env_checkr   )r   r   get_rendered_recipe_text)r   ra   rr   s      r'   render_metadatar   g   s[    J
!&
 
ILBT##RT
 

 ))+++r)   c                 @    t          |           }t          ||          S r"   )r   rv   )r   ra   r%   s      r'   r   r   p   s    Z((T3r)   c               #   x   K   dD ]4} dD ]/}|                     d          \  }}t          ||| d          V  05d S )N)273435)r9   r7   zosx-64rB   rD   r+   z1.11)r,   r-   r/   r1   )r   r]   )rH   rb   r,   r-   s       r'   	iter_cfgsr   u   sm       N NH 	N 	ND!ZZ__NHdtBfMMMMMMM	NN Nr)   c                    | d d         }|t           vrd S t          j        |          }|dk    rm|                     d          }|dk     rdS t          j                            |           } | |dz            d| |dz            z  z   }dt          j        |          z   S |                    d	          r|S |d
k    r!d
ddd                    | d                   z   S d S )N   DLLs   PE  r   z<no PE header found>      zDLL MachOELF3264))r   getfindfuturebuiltinsbytesr   r^   )r%   headlookupposis        r'   get_object_typer   |   s    8D=  tt$$Fii	""77))$$T**qMC$sQw-//	a((((			7	#	# A	5d3377Q@@@@ 
r)   c                      dD ]
}|| v r|c S d S )N)z--z-.z-_z.-z..z._z_-z_.r[   )sseqs     r'   get_bad_seqr      s-    ?  !88JJJ 4r)   Fc                     dg}|r|                     d           | D ]?}t          j        d         dk    rt          |          n|}||v sd|cxk    rdk     sn  dS @dS )	N
      r   re   r      FT)rn   sysversion_infoord)r%   allow_CRnewlinecns        r'   	all_asciir      s    dG r  &q)Q..CFFFAWa#554r)   c                     t          | t                    r| S t          | t                    r|                     d          S | gS )N,)
isinstancelistr   r   )arguments    r'   ensure_listr      sE    (D!! #	Hl	+	+ #~~c""":r)   c                 <    t          j        d| z   dz   ||          S )zbEmulate python-3.4 re.fullmatch().

    Credit: https://stackoverflow.com/questions/30212413/
    z(?:z)\Z)flags)rerk   )regexstringr   s      r'   	fullmatchr      s$    
 8EEMF*F%@@@@r)   c                   "    e Zd Zd Zd ZddZdS )DummyExecutorc                 :    d| _         t                      | _        d S )NF)	_shutdownr   _shutdownLock)selfs    r'   __init__zDummyExecutor.__init__   s    !VVr)   c                 &   | j         5  | j        rt          d          t                      }	  ||i |}|                    |           n,# t
          $ r}|                    |           Y d }~nd }~ww xY w|cd d d            S # 1 swxY w Y   d S )Nz*cannot schedule new futures after shutdown)r   r   RuntimeErrorr   
set_resultBaseExceptionset_exception)r   fnargskwargsfresultes          r'   submitzDummyExecutor.submit   s	    	 	~ Q"#OPPPA%T,V,, V$$$$ ! # # #""""""""#
 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s9   %BAB
A5A0+B0A55BB
B
Tc                 T    | j         5  d| _        d d d            d S # 1 swxY w Y   d S )NT)r   r   )r   waits     r'   shutdownzDummyExecutor.shutdown   sv     	" 	"!DN	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	"s   !!N)T)__name__
__module____qualname__r   r   r   r[   r)   r'   r   r      sF        $ $ $  " " " " " "r)   r   c                 $    ddl m}  ||           S )Nr   )find_executable)distutils.spawnr   )
executabler   s     r'   whichr      s$    //////?:&&&r)   c           	         t          |           } t          j        dk    r	 t          d                    |           dt
                    }n#  	 d }ddlm} ddlm	}  |dd	d
          5 }|
                    d                     || g                               |
                    d           |
                    d                     || g                               |
                    d           |j        }d d d            n# 1 swxY w Y   t          |d          5 }|                                }	| |	v sJ 	 d d d            n# 1 swxY w Y   t          d         }
d}t          |
dd|gd
d d d |          }n# t          $ r
}Y d }~nd }~ww xY wY nxY w	 t!          d           n#  Y nxY wt#          d          }|rpt%          d          ra	 t          |ddt'          t)                      d          dz   | dz   gt
                    }n# t          $ r Y nw xY wt+          j        d           t+          j        |            d S )NrA   zRD /S /Q "{}" > NUL 2> NULT)shellstderrr   )Utf8NamedTemporaryFile)quote_for_shellwz.batF)modesuffixdeletez	RD /S {}
zchcp 65001
zEXIT 0
rCOMSPECi   z/dz/c)r   stdoutr   stdincreationflagsz.emptyrsyncz-az--delete/)r   )r   r   r,   r   formatr   conda._vendor.auxlib.compatr   conda.utilsr   writenameopenreadr   r   r   r   r   r   r   shutilrmtree)pathr   r   outr   r   r   
batch_filecontentscontentcomspecCREATE_NO_WINDOWr   r   s                 r'   r   r      s=   D>>D
|w(	 ;BB4HHPT&,. . .CC	NNNNNN777777++VERRR +V`$$\%8%8$9P9P%Q%QRRR$$^444$$\%8%8$9P9P%Q%QRRR$$Z000%?D+ + + + + + + + + + + + + + + $__ +&mmooG7?????+ + + + + + + + + + + + + + + "),#-  #GT4#>e*.t41AC C C &   	X	D g 	$U8__ 	$"D*d688X.F.F.LdUXjY!# # # &   M(###
M$s   *A FF-BDFD	FD	F*EFE	FE	+FF
FFFF#F3 3F7;H 
H$#H$c                     	 t          |            dS # t          $ r* 	 t          | | dz              Y dS # t          $ r Y Y dS w xY ww xY w)zIf files are in use, especially on windows, we can't remove them.
    The fallback path is to rename them (but keep their folder the same),
    which maintains the file handle validity.  See comments at:
    https://serverfault.com/a/503769
    z.conda_trashN)r	   EnvironmentErrorr   )r   s    r'   unlink_or_rename_to_trashr    sx    t   	4.////// 	 	 	DDD	s#    
A4
AAAAc                     t          |           }t          |          rMt          |          sBt          |           t          |          }t          |          rt          |          <d S d S d S d S r"   )r   r   r   r   )r   parent_paths     r'   remove_empty_parent_pathsr  !  s    $--K


 +W[%9%9 +kk** 

 +W[%9%9 + + + + + + + + +r)   r   Tc                 8   	 t          |           } t          |           rt          |           st          |            nt	          |           rt          |            t	          |           rdS n# t	          |           r Y dS w xY w|rt          |            dS dS )z
    Completely delete path
    max_retries is the number of times to retry on failure. The default is 5. This only applies
    to deleting a directory.
    If removing path fails and trash is True, files will be moved to the trash directory.
    FTN)r
   r   r   r   r   r  r  )r   max_retriestrashclean_empty_parentsr   kws         r'   rm_rfr  )  s    t}};; 	,vd|| 	,4LLLLT]] 	,%d+++4== 	5	74== 	5555555 !$'''t s   AA/ /BB)F)r   )r   TF)Cr   r   osr   r   r   r   r   r   r	   os.pathr
   r   r   r   r   r   r   r   r   r   r   
subprocessr   r   r   r   rz   r#   sixr   concurrent.futuresr   r   	threadingr   future.builtinsr   conda_verify.constantsr   r   	functoolsr   ImportErrorbackports.functools_lru_cacher(   rc   compilerj   rt   rv   r   conda_buildr   r   r   r   r   r   r   r   r   r   r   r  r  r  r[   r)   r'   <module>r     sQ   				 



 H H H H H H H H H H H H H H H H H H m m m m m m m m m m m m m m m m m m m m m m m m m m ? ? ? ? ? ? ? ? ? ?          / / / / / / / /           ; ; ; ; ; ; ; ;8####### 8 8 8777777778 2    D "*)
*
*# # #  , , ,   , , , ,                 N N NA A A$       A A A A" " " " "H " " "6' ' '
> > >B  + + +     s$   ,A3 3B B6	C   C
C