
    $TXgN                       d 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mZ ddl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" e	rddlm#Z# ddlm$Z$  ee%      Z& G d de'      Z( G d de(      Z) G d de)      Z*d Z+d Z,d Z-d Z.d Z/d Z0d"dZ1d#dZ2d  Z3d$d!Z4 ejj                  e)jl                         y)%zDefines Channel and MultiChannel objects and other channel-related functions.

Object inheritance:

.. autoapi-inheritance-diagram:: Channel MultiChannel
   :top-classes: conda.models.channel.Channel
   :parts: 1
    )annotations)copy)chain)	getLogger)TYPE_CHECKING)
IndexedSet   )DEFAULTS_CHANNEL_NAMEMAX_CHANNEL_PRIORITYUNKNOWN_CHANNEL)context)ensure_text_type
isiterable)is_package_fileis_pathwin_path_backout)	Url
has_schemeis_urljoin_urlpath_to_urlsplit_conda_url_easy_partssplit_platformsplit_scheme_auth_tokenurlparse)Self)Contextc                  "     e Zd ZdZ fdZ xZS )ChannelTypezn
    This metaclass does basic caching and enables static constructor method usage with a
    single arg.
    c                d    t        |      dk(  rh|sf|d   }t        |t              r|S |t        j                  v rt        j                  |   S t        j	                  |      x}t        j                  |<   |S d|v r&t         fd|d   D              }t        |d   |      S t            |i |S )N   r   channelsc              3  .   K   | ]  } di |  y w)N r$   ).0_kwargsclss     4lib/python3.12/site-packages/conda/models/channel.py	<genexpr>z'ChannelType.__call__.<locals>.<genexpr>D   s     N;MS^7^;Ms   name)	len
isinstanceChannel_cache_
from_valuetupleMultiChannelsuper__call__)r'   argskwargsvaluecr"   	__class__s   `     r(   r3   zChannelType.__call__8   s    t9>&GE%)'//)u---4-?-?-FFGOOE*6!N6*;MNNHv997#T4V44    )__name__
__module____qualname____doc__r3   __classcell__)r8   s   @r(   r   r   2   s    
5 5r9   r   c                  >   e Zd ZdZi Zed        Z	 	 	 	 	 	 	 ddZed        Z	ed        Z
ed        Zed        Zed	        Zedd
       Zedd       Zed        ZddZddZed        Zed        Zed        Zd Zd Zd Zd Zd Zd Zd Zed        Zd Zy) r-   z
    Channel:
    scheme <> auth <> location <> token <> channel <> subchannel <> platform <> package_filename

    Package Spec:
    channel <> subchannel <> namespace <> package_name

    c                     i t         _        y N)r-   r.   r$   r9   r(   _reset_statezChannel._reset_stateV   s	    r9   Nc                n    || _         || _        || _        || _        |xs d| _        || _        || _        y )N schemeauthlocationtokenr*   platformpackage_filename)selfrF   rG   rH   rI   r*   rJ   rK   s           r(   __init__zChannel.__init__Z   s:     	 
JB	  0r9   c                    | j                   S rA   rH   rL   s    r(   channel_locationzChannel.channel_locationl       }}r9   c                    | j                   S rA   r*   rP   s    r(   channel_namezChannel.channel_namep       yyr9   c                    | j                   S rA   rJ   rP   s    r(   subdirzChannel.subdirt   rR   r9   c                    t        |       S rA   )parse_conda_channel_urlurls    r(   from_urlzChannel.from_urlx   s    &s++r9   c                    t        |       S rA   )_get_channel_for_name)rU   s    r(   from_channel_namezChannel.from_channel_name|   s    $\22r9   c                F   | dv rt        t              S t        |       } t        |       r1| j	                  d      rt        |       } t         j                  |       S t        |       rt         j                  t        |             S t        |       r1| j	                  d      rt        |       } t         j                  |       S t        t        j                  |       \  }}|t        j                  v rt        |t        j                  |   |      S t         j                  |       S )a  Construct a new :class:`Channel` from a single value.

        Args:
          value: Anyone of the following forms:

            `None`, or one of the special strings "<unknown>", "None:///<unknown>", or "None":
                represents the unknown channel, used for packages with unknown origin.

            A URL including a scheme like ``file://`` or ``https://``:
                represents a channel URL.

            A local directory path:
                represents a local channel; relative paths must start with ``./``.

            A package file (i.e. the path to a file ending in ``.conda`` or ``.tar.bz2``):
                represents a channel for a single package

            A known channel name:
                represents a known channel, e.g. from the users ``.condarc`` file or
                the global configuration.

        Returns:
          A channel object.
        )Nz	<unknown>zNone:///<unknown>NonerT   zfile:)r-   r   r   r   
startswithr   r^   r   r   r   r   r   known_subdirscustom_multichannelsr1   ra   )r6   	_strippedrJ   s      r(   r/   zChannel.from_value   s    4 DD00 'e((/##E**U^##K$677U#((/##E** #11F1F"NIxG888#w;;IF  0077r9   c           	        | }t        |      \  }}}}|r!|rt        |||||j                  d            S |r|j                  rE|j	                  |j                        r*|j                  |j                  |j                  dd      }}nEt        |      }	t        t        |	j                  |	j                              }|	j                  xs d}t        |||||j                  d            S t        |j                  |j                  |j                  |j                  |xr |j                  d      xs |j                  d            S )N/)rF   rG   rH   rI   r*   rD   r!   hostnameport)r   r-   striprH   rd   replacer   strr   rk   rl   pathrF   rG   rI   )
channel_aliaschannel_urlr*   catest_urlrF   rG   rI   rH   	url_partss
             r(   make_simple_channelzChannel.make_simple_channel   s#   (?(L%&$F!ZZ_  {{x222;;?!#h.>.>r{{BPQ.R$$X.	sI,>,>Y^^TU ~~+!ZZ_  yyWWhh-djjoG1B1B31G r9   c                J    	  j                   S # t        $ r Y nw xY wt        j                  j	                         D ]4  \  }}|D ]*  } j
                  |j
                  k(  s|x} _         |c c S  6 t        j                  D ]Z  } j
                  st         j
                  j                  d      |j                  d            sE j
                  x} _         |c S  t         fdt        j                  gt        j                  D              r j
                  x} _         |S  j                  r8 j                   dt         j                   j
                         x} _         |S t         j                   j
                        j                  d      x} _         |S )Nri   c              3  P   K   | ]  }|j                   j                   k(    y wrA   rO   )r%   aliasrL   s     r(   r)   z)Channel.canonical_name.<locals>.<genexpr>   s*      
 NNdmm+s   #&://)_Channel__canonical_nameAttributeErrorr   rf   itemsr*   custom_channelstokenized_startswithsplitanyrq   migrated_channel_aliasesrF   r   rH   lstrip)rL   	multinamer"   channelcn	that_names   `     r(   canonical_namezChannel.canonical_name   s|   	((( 		 $+#?#?#E#E#GIx#99,1::B.I $ $H !00Iyy1		$iooc&: .2YY6T*	 1  
 %%11
 
 *.2B&I ;;;;-s8DMM499#E"FGB& I)1$--)K)R)RSV)WWB&Is    	c                \    t         j                  t              sJ         j                  t        k(  rt        t              j                  |      S  j                  g|r) j                  rj                  d j                  g       j                   j                         t          fd}fd |       D        }|r8 j                  r,|D cg c]   } j                   d j                   d| " c}S |D cg c]  } j                   d|  c}S c c}w c c}w )Ntc               3     K    j                   r# j                     j                   dk7  rd y y E d {    y 7 w)NnoarchrX   )rL   subdirss   r(   
_platformsz Channel.urls.<locals>._platforms  s9     }}mm#==H,"N - #""s   5A >A c              3  6   K   | ]  }t        |        y wrA   )r   )r%   pbases     r(   r)   zChannel.urls.<locals>.<genexpr>  s     9Lq$"Ls   rz   @)r   r   r   r   r   r-   r
   urlsrH   rI   extendappendr*   r   rG   rF   )rL   with_credentialsr   r   basesbr   s   ` `   @r(   r   zChannel.urls   s   ?ooG'"+G+"/101667GQQ

KKdjj)*DII	# :JL9		@EF1t{{m3tyyk1#6FF49:Eqt{{m3qc*E:: G:s   %D$	D)c                \   | j                   t        k(  ry | j                  g}|r)| j                  r|j	                  d| j                  g       |j                  | j                         | j                  rC|j                  | j                         | j                  rN|j                  | j                         n2t        d t        j                  D        d      }|j                  |       t        | }|r*| j                  r| j                   d| j                   d| S | j                   d| S )Nr   c              3  ,   K   | ]  }|d k7  s	|  yw)r   Nr$   )r%   ss     r(   r)   zChannel.url.<locals>.<genexpr>)  s     =OqqH}Os   
r   rz   r   )r   r   rH   rI   r   r   r*   rJ   rK   nextr   r   r   rG   rF   )rL   r   r   first_non_noarchs       r(   r]   zChannel.url  s    /1

KKdjj)*DII==KK&$$D112#=GOO=x  KK()		kk]#dii[$88kk]#dV,,r9   c                    | j                   t        k(  ry | j                   dt        | j                  | j
                         S )Nrz   )r   r   rF   r   rH   r*   rP   s    r(   base_urlzChannel.base_url4  s8    /1++c(4==$))"D!EFFr9   c                    | j                   fS rA   r   rP   s    r(   	base_urlszChannel.base_urls:  s    r9   c                n    | j                  d      }| j                  r|r|j                  dd      d   }|S )NTri   r!   r   )r]   rK   rsplit)rL   r]   s     r(   
subdir_urlzChannel.subdir_url>  s4    hhtn  S**S!$Q'C
r9   c                ~    | j                   xs | j                  }| j                  rt        || j                        S |S rA   )r   r*   rY   r   )rL   r   s     r(   __str__zChannel.__str__E  s1    }})		;;D$++..Kr9   c                |    d| j                   r"t        | j                  | j                         z  S | j                  z  S )NzChannel("%s"))rY   r   r*   rP   s    r(   __repr__zChannel.__repr__L  s8    04HTYY,
 	
AE
 	
r9   c                b   t        |t              r4| j                  |j                  k(  xr | j                  |j                  k(  S 	 t        |      }| j                  |j                  k(  xr | j                  |j                  k(  S # t        $ r }t
        j                  d|       Y d }~yd }~ww xY w)Nz%rF)r,   r-   rH   r*   	Exceptionlogdebug)rL   other_otheres       r(   __eq__zChannel.__eq__Q  s    eW%==ENN2NtyyEJJ7NN }}7TDII<TT 		$"s   >B 	B.B))B.c                D    t        | j                  | j                  f      S rA   )hashrH   r*   rP   s    r(   __hash__zChannel.__hash__\  s    T]]DII.//r9   c                D    t        | j                  | j                  f      S rA   )r   rH   r*   rP   s    r(   __nonzero__zChannel.__nonzero___  s    DMM499-..r9   c                "    | j                         S rA   )r   rP   s    r(   __bool__zChannel.__bool__b  s    !!r9   c                    | j                   S rA   )__dict__rP   s    r(   __json__zChannel.__json__e  s    }}r9   c                2    | j                   | j                  fS rA   )r   r   rP   s    r(   url_channel_wtfzChannel.url_channel_wtfh  s    }}d1111r9   c                    | j                   | j                  | j                  | j                  | j                  | j
                  | j                  dS )NrE   rE   rP   s    r(   dumpzChannel.dumpl  s?    kkIIZZII $ 5 5
 	
r9   )NNNNNNN)r6   z
str | Nonereturnr   rA   FNF)r:   r;   r<   r=   r.   staticmethodrB   rM   propertyrQ   rU   rY   r^   ra   r/   rv   r   r   r]   r   r   r   r   r   r   r   r   r   r   r   r   r$   r9   r(   r-   r-   J   sc    G 
 1$       , , 3 3 /8 /8b    D & &P;:-2 G G
      

	0/" 2 2	
r9   r-   )	metaclassc                  j    e Zd Zd
dZed        Zed        ZddZed        Zed        Z	ddZ
d	 Zy)r1   Nc                    || _         d | _        rt        fd|D              | _        n|| _        d | _        d | _        d | _        | _        d | _        y )Nc              3  \   K   | ]#  }t        di i |j                         d i % yw)rJ   Nr$   )r-   r   )r%   r   rJ   s     r(   r)   z(MultiChannel.__init__.<locals>.<genexpr>~  s4      #'G CBW\\^BZBC's   ),)	r*   rH   r0   	_channelsrF   rG   rI   rJ   rK   )rL   r*   r"   rJ   s      `r(   rM   zMultiChannel.__init__y  sZ    	" #'# DN
 &DN	
  $r9   c                    | j                   S rA   rO   rP   s    r(   rQ   zMultiChannel.channel_location  rR   r9   c                    | j                   S rA   rT   rP   s    r(   r   zMultiChannel.canonical_name  rV   r9   c                n    | j                   }t        t        j                  fd|D                    S )Nc              3  B   K   | ]  }|j                          y wrA   )r   )r%   r7   r   r   s     r(   r)   z$MultiChannel.urls.<locals>.<genexpr>  s     U9a'7 A9s   )r   listr   from_iterable)rL   r   r   r   s    `` r(   r   zMultiChannel.urls  s-    NN	U9UU
 	
r9   c                     y rA   r$   rP   s    r(   r   zMultiChannel.base_url  s    r9   c                :    t        d | j                  D              S )Nc              3  4   K   | ]  }|j                     y wrA   r   r%   r7   s     r(   r)   z)MultiChannel.base_urls.<locals>.<genexpr>  s     8AQZZs   )r0   r   rP   s    r(   r   zMultiChannel.base_urls  s    8888r9   c                     y rA   r$   )rL   r   s     r(   r]   zMultiChannel.url  s    r9   c                T    | j                   t        d | j                  D              dS )Nc              3  <   K   | ]  }|j                           y wrA   )r   r   s     r(   r)   z$MultiChannel.dump.<locals>.<genexpr>  s     4V~!QVVX~s   )r*   r"   )r*   r0   r   rP   s    r(   r   zMultiChannel.dump  s     		u4Vt~~4V/VWWr9   rA   r   r   )r:   r;   r<   rM   r   rQ   r   r   r   r   r]   r   r$   r9   r(   r1   r1   x  sg    %$    
   9 9Xr9   r1   c                :    t        d t        | |      D              S )Nc              3  ,   K   | ]  \  }}||k(    y wrA   r$   )r%   r   sws      r(   r)   z'tokenized_startswith.<locals>.<genexpr>  s     L$K51bqBw$Ks   )allzip)test_iterablestartswith_iterables     r(   r   r     s    LC7J$KLLLr9   c                   t        |       t        |      }} | j                  |j                  k7  s| j                  |j                  k7  ryd }t         ||       j	                  d       ||      j	                  d            S )NFc                @    | j                   j                  d      xs dS )Nri   )rp   rm   r\   s    r(   <lambda>z0tokenized_conda_url_startswith.<locals>.<lambda>  s    s 3 :s :r9   ri   )r   rk   rl   r   r   )rt   startswith_urlnorm_url_paths      r(   tokenized_conda_url_startswithr     sv    '18N3KnH^444==N///:Mh%%c*M.,I,O,OPS,T r9   c                (   fdt        t        j                  |       \  }} |      }|t        |      }||_        |r||_        |S t        j                  }t        |j                  |j                  |j                  |j                  ||      S )Nc                    | t         j                  v rt         j                  |    S | j                  dd      d   }|| k(  ry  |      S )Nri   r!   r   )r   r~   r   )r*   	test_name_get_channel_for_name_helpers     r(   r   z;_get_channel_for_name.<locals>._get_channel_for_name_helper  sM    7*****400C+A.ID /	::r9   )rF   rG   rH   rI   r*   rJ   )r   r   re   r   r*   rJ   rq   r-   rF   rG   rH   rI   )rU   rg   rJ   r   rs   r   s        @r(   r`   r`     s    ; ))>)>MIx*95G w- 'G""99[[((
 	
r9   c                   |xr |j                  d      }t        t        |||            }|s.t        t        ||            j                  d      d | xs d d d fS t        t        j
                  j                         dd       D ]  \  }}t        |      \  }}}}	t        |t        ||            s-|j                  t        ||      dd      j                  d      }
t        ||
      }t        |      }|j                  ||j                  |j                  |j                   fc S  t        j"                  D ]  }|j%                  |j                        s|j                  |j                  dd      j                  d      }t        j&                  }|j                  ||j                  |j                  |j                   fc S  t        t        j(                  j                         dd	       D ]  \  }}t        |j                  |j*                        }t-        |j/                  d      |j/                  d            sQ|j                  |dd      j                  d      }
|j                  t        |j*                  |
      | |j                  |j                   fc S  t        j&                  }|j                  rt-        |j/                  d      |j                  j/                  d            rU|j                  |j                  dd      j                  d      xs d }|j                  || |j                  |j                   fS |*|J |j1                  dd      \  }}|sd}d
\  }}}	|||||	fS d }|j                  d      j/                  d      }|r|d   dk(  rddj3                  |dd        }}t        t        |||            j                  d      |j                  d      xs d | xs d d d fS )Nri   )rk   rl   rp   rj   Tc                    t        | d         S Nr   r+   xs    r(   r   z-_read_channel_configuration.<locals>.<lambda>  s    cRSTURVir9   )reversekeyrD   r!   c                    t        | d         S r   r   r   s    r(   r   z-_read_channel_configuration.<locals>.<lambda>  s    S1Yr9   )fileNNr   conda)rstripro   r   sortedr   migrated_custom_channelsr}   r   r   r   rn   rm   r`   rH   rF   rG   rI   r   rd   rq   r~   r*   r   r   r   join)rF   hostrl   rp   rt   r*   rH   _scheme_auth_tokensubnamerU   r   migrated_aliasrs   that_test_urlbump
path_partss                     r(   _read_channel_configurationr     s    $DKK$D34d;<H T-.55c:Nd
 	
 !((..0$DWh ,C8+L('5&)(HXt4LM&&x$'?QGMMcRG#D'2L+L9G   $ "::~667##N$;$;RCII#ND&&B;;bii"((BB	 ;  %%';Ng !!1!17<<@s 3]5H5H5MN&&}b!<BB3GG  w/  
		B	{{+sR[[..s3 R399#>F${{D&"''288;; |||!a0$H!3wv55
 DC&&s+Jjmw.chhz!"~6dCDt45<<SA

34$ r9   c           	         t        t        j                  |       \	  }}}}}}}}}	t        ||||      \  }
}}}}|
|J t	        |xs d|xs ||
|xs ||||      S )Nhttps)r   r   re   r   r-   )r]   rF   rG   rI   rJ   rK   r   rl   rp   queryrQ   rU   configured_schemeconfigured_authconfigured_tokens                  r(   r[   r[   4  s     	#7#8#8#>
 	$FD$=
 '<+CCC$W!! r9   c                 $    t         j                  fS rA   )r   local_build_rootr$   r9   r(   get_conda_build_local_urlr	  Z  s    $$&&r9   Nc                   t        j                  d d | D        D              } i }t        |       D ]N  \  }}t        |      }|j	                  ||      D ])  }||v r|j
                  t        |t        dz
        f||<   + P |S )Nc              3  h   K   | ]*  }t        |t              rd  |j                  D        n|f , yw)c              3  2   K   | ]  }t        |        y wrA   r-   )r%   ccs     r(   r)   z0prioritize_channels.<locals>.<genexpr>.<genexpr>d  s     +{{   N)r,   r1   r   r   s     r(   r)   z&prioritize_channels.<locals>.<genexpr>c  s4      #/A 0:!\/J+q{{+QRPTT/s   02c              3  2   K   | ]  }t        |        y wrA   r  r   s     r(   r)   z&prioritize_channels.<locals>.<genexpr>e  s     /h'!*hr  r!   )r   r   	enumerater-   r   r   minr   )r"   r   r   resultpriority_counterchnr   r]   s           r(   prioritize_channelsr  ^  s    
 "" #/h/# H F!*8!4##,<< 0':Cf}&&$&:Q&>?F3K ; "5 Mr9   c                    t               }| D ].  }t        |      }|j                  |j                  ||             0 |S rA   )r   r-   updater   )r"   r   r   r  r  r   s         r(   all_channel_urlsr  t  s;    \F#,gll#3W=>  Mr9   c                f    t         j                   xs t        |        xs | j                  d      S )Nzfile:/)r   offliner   rd   r\   s    r(   offline_keepr  |  s(    MfSk/MS^^H5MMr9   c                :    t        d | j                  D              S )z*Return current channels as Channel objectsc              3  2   K   | ]  }t        |        y wrA   r  )r%   r  s     r(   r)   z#get_channel_objs.<locals>.<genexpr>  s     6#r  )r0   r"   )ctxs    r(   get_channel_objsr     s    6666r9   )TN)NT)r  r   )7r=   
__future__r   r   	itertoolsr   loggingr   typingr   boltons.setutilsr   base.constantsr
   r   r   base.contextr   common.compatr   r   common.pathr   r   r   
common.urlr   r   r   r   r   r   r   r   r   r   r   r:   r   typer   r-   r1   r   r   r`   r   r[   r	  r  r  r  r   register_reset_callabackrB   r$   r9   r(   <module>r-     s    #      ' 
 # 8 D D
 
 
 & 5$ 50k
 k
\	-X7 -X`M

BWt"L',N7
 !    !5!5 6r9   