
    hV3                    $   % S r SSKJr  SSKrSSKJr  SSKJr  SSKJ	r	  SSK
Jr  SS	KJr  SS
KJrJrJr  SSKJrJr  SSKJrJr  SSKJr  \(       a  SSKJrJr  SSKJr  SrS\S'   Sr S\S'   Sr!S\S'   Sr"S\S'   S'S jr#S'S jr$\$" 5       r%S\S'   \RL                  " S5      =(       a    \RL                  " S5      r'S\S'   S(S jr(        S)S  jr)      S*S! jr*        S+S" jr+        S+S# jr,        S,S$ jr-S-S% jr.S.S& jr/g)/zKHigh-level API functions for interacting with a channel's Terms of Service.    )annotationsN)Path)TYPE_CHECKING)boolify)Channel   )CondaToSMissingError)get_local_metadataget_local_metadataswrite_metadata)	LocalPair
RemotePair)get_all_channel_pathsget_cache_paths)get_remote_metadata)IterableIterator)Final)APPVEYOR
BITRISE_IOBUDDY	BUILDKITECICIRCLECI	CIRRUS_CICONCOURSE_CIDRONEGITHUB_ACTIONS	GITLAB_CISAIL_CI	SEMAPHORETF_BUILDTRAVISWERCKERWOODPECKER_CIr   CI_BOOLEAN_VARS)BAMBOO_BUILDKEYCODEBUILD_BUILD_IDHEROKU_TEST_RUN_IDJENKINS_URLTEAMCITY_VERSIONCI_PRESENCE_VARS)
containerddockerkubepodslxcpodmanCONTAINER_INDICATORS)AZURE_HTTP_USER_AGENTBUILD_IDBUILD_NUMBER	BUILD_URLBUILDKITE_BUILD_IDCIRCLE_BUILD_NUMCIRCLE_PROJECT_REPONAME
GITHUB_JOBGITHUB_REPOSITORYGITHUB_WORKFLOWGITLAB_PROJECT_IDGITLAB_USER_IDJOB_NAMERUNNER_ARCH	RUNNER_OS	WORKSPACEPARTIAL_CI_VARSc                   ^ [         R                  " 5       S:H  [        [         R                  R	                  S5      5      /n  [        S5      R                  5        nUR                  5       m[        U4S j[         5       5      (       a  U R                  S5        SSS5        [        U 5      =(       a    [        S [         5       5      $ ! , (       d  f       N6= f! [         a     NEf = f)a  Detect if running in a containerized CI environment.

This function combines container detection with partial CI environment variables
to address cases where CI systems run jobs in containers but don't set complete
CI environment variables (see GitHub issue #232). This is a workaround for
https://github.com/anaconda/conda-anaconda-tos/issues/232.

Returns:
    bool: True if both container indicators and partial CI variables are present

r   	CONTAINERz/proc/self/cgroupc              3  ,   >#    U  H	  oT;   v   M     g 7fN ).0	indicatorcgroup_contents     6lib/python3.13/site-packages/conda_anaconda_tos/api.py	<genexpr>#_in_ci_container.<locals>.<genexpr>y   s     U@T9.@Ts   TNc              3  N   #    U  H  n[         R                  " U5      v   M     g 7frG   osgetenvrI   vars     rL   rM   rN      s     (S?C3?   #%)rQ   getpidboolenvirongetr   openreadanyr2   appendOSErrorrC   )container_checksfrK   s     @rL   _in_ci_containerra   \   s     			qRZZ^^K()%&++-VVXN U@TUUU ''- .   SS(S?(S%SS! .-  s1   C A CC 
CC C 
C*)C*c                 >   [        [        R                  [        5       H  n U (       d  M  [	        U 5      (       a  M    g   [        [        R                  [        5       H  n [	        U 5      (       d  M    g   [        S [         5       5      =(       d
    [        5       $ )a  Determine if running in a CI environment.

This function uses a multi-layered approach to detect CI environments:
1. First checks if any CI variables are explicitly set to false
   (respects user override)
2. Then checks boolean CI variables for true values
3. Finally checks presence-based variables and container environments

Returns:
    bool: True if running in a detected CI environment

FTc              3  N   #    U  H  n[         R                  " U5      v   M     g 7frG   rP   rS   s     rL   rM   _is_ci.<locals>.<genexpr>   s     :)9#ryy~~)9rU   )maprQ   rR   r&   r   r\   r,   ra   )	var_values    rL   _is_cirg      sm     O4	9WY// 5
 O4	9 5
 :)9::P>N>PP    r   JPY_SESSION_NAMEJPY_PARENT_PIDJUPYTERc               '     #    [        5       n[        [        U 5       HY  n[        [        UR                  5       5       H4  n[        UR                  5      nX1;  d  M  Uv   UR                  U5        M6     M[     g7f)z2Yield all unique channels from the given channels.N)setre   r   urlsbase_urladd)channelsseenmultichannelchannels       rL   get_channelsru      s`      DGX.7L$5$5$78Gg../G"!	 9 /s   AA;A;c               &   S=p4 [        XS9n [        X/S9nU(       a  UR                  U:  a  U$ [	        UR                  UR
                  US9$ ! [         a  nUn SnANTSnAff = f! [         a  nU(       a  XEe[        US9s SnA$ SnAff = f)z8Get the Terms of Service metadata for the given channel.Ncache_timeoutextend_search_pathmetadatapathremote)r|   )r   r	   r
   r|   r   r}   r   )rt   tos_rootrx   remote_metadata
remote_excexc
local_pairs          rL   get_one_tosr      s     $('O-gS
'JO
 *"5"5"H(("
 	
#   
   4%?334s4   	A 
A* 
A'A""A'*
B4BBBc              #     #    [        U /S9 HI  u  p# [        X!S9nUR                  U:  a  X#4v   M&  U[	        UR                  UR
                  US94v   MK     g! [         a     M[  f = f7f)z.Yield metadata of all stored Terms of Service.ry   rw   r{   N)r   r   r	   r|   r   r}   )r   rx   rt   r   r   s        rL   get_stored_tosr      s       3xjQ	1'WO /1%% '00#*   R $ 		s'   A,	A?A,
A)%A,(A))A,c               l    [        U UUS9nUR                  =(       d    UR                  n[        XUSS9$ )z2Accept the Terms of Service for the given channel.r   rx   Ttos_acceptedr   r~   r|   r   rt   r   rx   pairr|   s        rL   
accept_tosr      s:     #D
 {{+dmmH(XDIIrh   c               l    [        U UUS9nUR                  =(       d    UR                  n[        XUSS9$ )z2Reject the Terms of Service for the given channel.r   Fr   r   r   s        rL   
reject_tosr     s:     #D
 {{+dmmH(XEJJrh   c              '  
  #    [        5       n[        U6  H#  n U[        X@US94v   UR	                  U5        M%     [        U US9 H"  u  pEXC;  d  M  XE4v   UR	                  U5        M$     g! [         a	    US4v    NXf = f7f)zHList all channels and whether their Terms of Service have been accepted.r   N)rm   ru   r   r	   rp   r   )r   rx   rq   rr   rt   metadata_pairs         rL   get_all_tosr     s      D*	 GmT  	 + #1## ((HHW# $ 	 4-	 s-   BA-'BB-B =B?B  Bc               #     #    [        5        H  n  U R                  5         U v   M     g! [        [        [        4 a     M5  f = f7f)zClean all metadata cache files.N)r   unlinkPermissionErrorFileNotFoundErrorIsADirectoryError)r}   s    rL   clean_cacher   .  sE     !	KKM J "  !24EF 	 		$   A*	AAAAAc              #     #    [        U /S9 H  n UR                  5         Uv   M     g! [        [        [        4 a     M5  f = f7f)zClean all metadata directories.ry   N)r   r   r   r   r   )r   r}   s     rL   	clean_tosr   <  sJ     %(D	KKM J E  !24EF 	 		r   )returnrW   )rq   str | Channelr   zIterable[Channel])rt   r   r   str | os.PathLike[str] | Pathrx   int | float | Noner   zLocalPair | RemotePair)r   r   rx   r   r   z#Iterator[tuple[Channel, LocalPair]])rt   r   r   r   rx   r   r   r   )rq   r   r   zstr | os.PathLike | Pathrx   r   r   z7Iterator[tuple[Channel, LocalPair | RemotePair | None]])r   Iterator[Path])r   r   r   r   )0__doc__
__future__r   rQ   pathlibr   typingr   conda.auxlib.type_coercionr   conda.models.channelr   
exceptionsr	   localr
   r   r   modelsr   r   r}   r   r   r~   r   collections.abcr   r   r   r&   __annotations__r,   r2   rC   ra   rg   r   rR   rk   ru   r   r   r   r   r   r   r   rH   rh   rL   <module>r      s   R " 	    . ( , J J ) 8 '2
 , %  e  (%TPQ: HE  -.N299=M3N N
" 
 
 , 
 &	 

  
F+ & )	6JJ ,J &	J
 J KK ,K &	K
 K & & =	8rh   