U
    b)H                     @   sx  d dl mZmZmZ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mZ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 ddlm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z( e	e)Z*G dd de+Z,G dd de,dZ-G dd de-Z.dd Z/dd Z0dd Z1dd Z2dd Z3dd Z4d+d"d#Z5d,d$d%Z6d&d' Z7ed(d)d*Z8e9e-j: d!S )-    )absolute_importdivisionprint_functionunicode_literals)copy)chain)	getLogger   )
IndexedSet)concatconcatvdrop)DEFAULTS_CHANNEL_NAMEMAX_CHANNEL_PRIORITYUNKNOWN_CHANNEL)contextContext)ensure_text_type
isiterableodict)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urlparsec                       s    e Zd ZdZ fddZ  ZS )ChannelTypezn
    This metaclass does basic caching and enables static constructor method usage with a
    single arg.
    c                    s   t |dkrT|sT|d }t|tr&|S |tjkr:tj| S t| }tj|< |S nHd|kr|d }t fdd|d D }t||S tt j	||S d S )N   r   channelsnamec                 3   s    | ]}t tjf |V  qd S N)superr"   __call__).0Z_kwargs)	__class__cls 3lib/python3.8/site-packages/conda/models/channel.py	<genexpr>+   s   z'ChannelType.__call__.<locals>.<genexpr>)
len
isinstanceChannel_cache_
from_valuetupleMultiChannelr'   r"   r(   )r+   argskwargsvaluecr%   r$   r*   )r+   r-   r(      s    



zChannelType.__call__)__name__
__module____qualname____doc__r(   __classcell__r,   r,   r:   r-   r"      s   r"   c                   @   s  e Zd ZdZi Zedd Zd4ddZedd Z	ed	d
 Z
edd Zedd Zedd Zedd Zed5ddZedd Zd6ddZd7ddZedd Zedd Zed d! Zd"d# Zd$d% Zd&d' Zd(d) Zd*d+ Zd,d- Zd.d/ Zed0d1 Zd2d3 ZdS )8r1   z
    Channel:
    scheme <> auth <> location <> token <> channel <> subchannel <> platform <> package_filename

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

    c                   C   s
   i t _d S r&   )r1   r2   r,   r,   r,   r-   _reset_state=   s    zChannel._reset_stateNc                 C   s2   || _ || _|| _|| _|pd| _|| _|| _d S )N schemeauthlocationtokenr%   platformpackage_filename)selfrC   rD   rE   rF   r%   rG   rH   r,   r,   r-   __init__A   s    
zChannel.__init__c                 C   s   | j S r&   rE   rI   r,   r,   r-   channel_locationK   s    zChannel.channel_locationc                 C   s   | j S r&   r%   rL   r,   r,   r-   channel_nameO   s    zChannel.channel_namec                 C   s   | j S r&   rG   rL   r,   r,   r-   subdirS   s    zChannel.subdirc                 C   s   t | S r&   )parse_conda_channel_urlurlr,   r,   r-   from_urlW   s    zChannel.from_urlc                 C   s   t | S r&   )_get_channel_for_name)rO   r,   r,   r-   from_channel_name[   s    zChannel.from_channel_namec                 C   s   | dkrt tdS t| } t| r>| dr4t| } t | S t| rTt t| S t	| rx| drnt| } t | S t
tj| \}}|tjkrt|tj| |S t | S d S )N)Nz	<unknown>zNone:///<unknown>NonerN   zfile:)r1   r   r   r   
startswithr   rU   r   r   r   r   r   known_subdirscustom_multichannelsr5   rW   )r8   	_strippedrG   r,   r,   r-   r3   _   s"    





zChannel.from_valuec           
      C   s   | }t |\}}}}|r4|r4t|||||ddS |r|jrd||jrd|j||jdd }}n&t|}	tt|	j	|	j
d}|	jpd}t|||||ddS t|j|j|j|j|r|dp|ddS d S )N/)rC   rD   rE   rF   r%   rA   r#   hostnameport)r    r1   striprE   rY   replacer!   strr   r_   r`   pathrC   rD   rF   )
channel_aliasZchannel_urlr%   catest_urlrC   rD   rF   rE   Z	url_partsr,   r,   r-   make_simple_channelw   s$    


zChannel.make_simple_channelc                    s  z j W S  tk
r   Y nX tj D ]4\}}|D ]&} j|jkr4| } _ |    S q4q(tjD ]6} jrdt jd|drd j } _ |  S qdt	 fddt
tjftjD rΈ j } _ |S  jrd jt j jf  } _ |S t j jd } _ |S d S )Nr]   c                 3   s   | ]}|j  j kV  qd S r&   rK   r)   r9   rL   r,   r-   r.      s     z)Channel.canonical_name.<locals>.<genexpr>%s://%s)Z_Channel__canonical_nameAttributeErrorr   r[   itemsr%   custom_channelstokenized_startswithsplitanyr   re   migrated_channel_aliasesrC   r   rE   lstrip)rI   Z	multinamer$   channelZcnZ	that_namer,   rL   r-   canonical_name   s4    



zChannel.canonical_nameFc                    s   d krt jtstjtkr8tt|S j	g |rZj
rZ dj
g  j t   fdd} fdd| D }|rjrfdd|D S fdd|D S d S )	Ntc                  3   s4    j r  j V   j dkr0dV  nD ]
} | V  q$d S )NnoarchrP   )rQ   )rI   subdirsr,   r-   
_platforms   s    
z Channel.urls.<locals>._platformsc                 3   s   | ]}t  |V  qd S r&   )r   )r)   p)baser,   r-   r.      s     zChannel.urls.<locals>.<genexpr>c                    s   g | ]}d  j  j|f qS )
%s://%s@%s)rC   rD   r)   brL   r,   r-   
<listcomp>   s     z Channel.urls.<locals>.<listcomp>c                    s   g | ]}d  j |f qS )rj   )rC   r|   rL   r,   r-   r~      s     )r   rw   r   AssertionErrorrt   r   r1   r   urlsrE   rF   extendappendr%   r   rD   )rI   with_credentialsrw   rx   basesr,   )rz   rI   rw   r-   r      s    

	
zChannel.urlsc                 C   s   | j tkrd S | jg}|r0| jr0|d| jg || j | jrb|| j | jr|| j n t	dd t
jD d}|| t| }|r| jrd| j| j|f S d| j|f S d S )Nru   c                 s   s   | ]}|d kr|V  qdS )rv   Nr,   )r)   sr,   r,   r-   r.      s      zChannel.url.<locals>.<genexpr>rv   r{   rj   )rt   r   rE   rF   r   r   r%   rG   rH   nextr   rw   r   rD   rC   )rI   r   rz   Zfirst_non_noarchr,   r,   r-   rT      s     



zChannel.urlc                 C   s&   | j tkrd S d| jt| j| jf S )Nrj   )rt   r   rC   r   rE   r%   rL   r,   r,   r-   base_url   s    
zChannel.base_urlc                 C   s   | j fS r&   r   rL   r,   r,   r-   	base_urls   s    zChannel.base_urlsc                 C   s(   |  d}| jr$|r$|ddd }|S )NTr]   r#   r   )rT   rH   rsplit)rI   rT   r,   r,   r-   
subdir_url   s    

zChannel.subdir_urlc                 C   s&   | j p
| j}| jrt|| jS |S d S r&   )r   r%   rQ   r   )rI   rz   r,   r,   r-   __str__   s    zChannel.__str__c                 C   s   d| j rt| j| j n| j S )NzChannel("%s"))rQ   r   r%   rL   r,   r,   r-   __repr__   s    zChannel.__repr__c              
   C   s~   t |tr"| j|jko | j|jkS z"t|}| j|jkoB| j|jkW S  tk
rx } ztd| W Y dS d }~X Y nX d S )Nz%rF)r0   r1   rE   r%   	Exceptionlogdebug)rI   otherZ_otherer,   r,   r-   __eq__   s    
zChannel.__eq__c                 C   s   t | j| jfS r&   )hashrE   r%   rL   r,   r,   r-   __hash__	  s    zChannel.__hash__c                 C   s   t | j| jfS r&   )rp   rE   r%   rL   r,   r,   r-   __nonzero__  s    zChannel.__nonzero__c                 C   s   |   S r&   )r   rL   r,   r,   r-   __bool__  s    zChannel.__bool__c                 C   s   | j S r&   )__dict__rL   r,   r,   r-   __json__  s    zChannel.__json__c                 C   s   | j | jfS r&   )r   rt   rL   r,   r,   r-   url_channel_wtf  s    zChannel.url_channel_wtfc                 C   s"   | j | j| j| j| j| j| jdS )NrB   rB   rL   r,   r,   r-   dump  s    zChannel.dump)NNNNNNN)N)FN)F)r;   r<   r=   r>   r2   staticmethodr@   rJ   propertyrM   rO   rQ   rU   rW   r3   rh   rt   r   rT   r   r   r   r   r   r   r   r   r   r   r   r   r,   r,   r,   r-   r1   2   sT   
    








"





r1   )	metaclassc                   @   sb   e Zd ZdddZedd Zedd Zdd	d
Zedd Zedd Z	dddZ
dd ZdS )r5   Nc                    sv   || _ d | _ rNtdd |D }t fdd|D  tdd |D | _n|| _d | _d | _d | _ | _d | _	d S )Nc                 s   s   | ]}|  V  qd S r&   r   ri   r,   r,   r-   r.   ,  s     z(MultiChannel.__init__.<locals>.<genexpr>c                 3   s   | ]}|j  d V  qdS )rP   N)updater)   ZcdrP   r,   r-   r.   -  s     c                 s   s   | ]}t f |V  qd S r&   r1   r   r,   r,   r-   r.   .  s     )
r%   rE   r4   rp   	_channelsrC   rD   rF   rG   rH   )rI   r%   r$   rG   Zc_dictsr,   rP   r-   rJ   '  s    zMultiChannel.__init__c                 C   s   | j S r&   rK   rL   r,   r,   r-   rM   8  s    zMultiChannel.channel_locationc                 C   s   | j S r&   rN   rL   r,   r,   r-   rt   <  s    zMultiChannel.canonical_nameFc                    s$   | j }tt fdd|D S )Nc                 3   s   | ]}|  V  qd S r&   )r   ri   rw   r   r,   r-   r.   B  s     z$MultiChannel.urls.<locals>.<genexpr>)r   listr   from_iterable)rI   r   rw   r   r,   r   r-   r   @  s    zMultiChannel.urlsc                 C   s   d S r&   r,   rL   r,   r,   r-   r   D  s    zMultiChannel.base_urlc                 C   s   t dd | jD S )Nc                 s   s   | ]}|j V  qd S r&   r   ri   r,   r,   r-   r.   J  s     z)MultiChannel.base_urls.<locals>.<genexpr>)r4   r   rL   r,   r,   r-   r   H  s    zMultiChannel.base_urlsc                 C   s   d S r&   r,   )rI   r   r,   r,   r-   rT   L  s    zMultiChannel.urlc                 C   s   | j tdd | jD dS )Nc                 s   s   | ]}|  V  qd S r&   r   ri   r,   r,   r-   r.   R  s     z$MultiChannel.dump.<locals>.<genexpr>)r%   r$   )r%   r4   r   rL   r,   r,   r-   r   O  s    zMultiChannel.dump)N)FN)F)r;   r<   r=   rJ   r   rM   rt   r   r   r   rT   r   r,   r,   r,   r-   r5   %  s   






r5   c                 C   s   t dd t| |D S )Nc                 s   s   | ]\}}||kV  qd S r&   r,   )r)   ru   swr,   r,   r-   r.   W  s     z'tokenized_startswith.<locals>.<genexpr>)allzip)Ztest_iterableZstartswith_iterabler,   r,   r-   rn   V  s    rn   c                 C   sT   t | t | } }| j|jks*| j|jkr.dS dd }t|| d||dS )NFc                 S   s   | j dpdS )Nr]   )rd   ra   rS   r,   r,   r-   <lambda>^      z0tokenized_conda_url_startswith.<locals>.<lambda>r]   )r!   r_   r`   rn   ro   )rg   Zstartswith_urlZnorm_url_pathr,   r,   r-   tokenized_conda_url_startswithZ  s    r   c                    sn    fdd t tj| \}} |}|d k	rHt|}||_|rD||_|S tj}t|j|j	|j
|j||dS d S )Nc                    s<   | t jkrt j|  S | ddd }|| kr0d S  |S d S )Nr]   r#   r   )r   rm   r   )r%   Z	test_name_get_channel_for_name_helperr,   r-   r   d  s    

z;_get_channel_for_name.<locals>._get_channel_for_name_helper)rC   rD   rE   rF   r%   rG   )r   r   rZ   r   r%   rG   re   r1   rC   rD   rE   rF   )rO   r\   rG   rs   rf   r,   r   r-   rV   c  s    	 rV   c                 C   s  |o| d}tt|||d}|sHtt||d dd | p@d d d fS ttj ddd dD ]n\}}t|\}}}}	t|t	||r`|
t	||dd	d}
t	||
}t|}|j||j|j|jf  S q`tjD ]F}||jr|
|jdd	d}tj}|j||j|j|jf  S qttj dd
d dD ]d\}}t	|j|j}t|d|dr6|
|dd	d}
|jt	|j|
| |j|jf  S q6tj}|jrt|d|jdr|
|jdd	dpd }|j|| |j|jfS |d kr>|d kst|dd	\}}|s&d}d\}}}	|||||	fS d }|dd}|r||d dkr|ddtd	| }}tt|||d d|dpd | pd d d fS )Nr]   )r_   r`   rd   r^   Tc                 S   s   t | d S Nr   r/   xr,   r,   r-   r     r   z-_read_channel_configuration.<locals>.<lambda>)reversekeyrA   r#   c                 S   s   t | d S r   r   r   r,   r,   r-   r     r   )fileNNr   Zconda)rstriprc   r   sortedr   Zmigrated_custom_channelsrl   r    r   r   rb   ra   rV   rE   rC   rD   rF   rq   rY   re   rm   r%   rn   ro   r   r   joinr   )rC   hostr`   rd   rg   r%   rE   Z_schemeZ_authZ_tokensubnamerO   rs   Zmigrated_aliasrf   Zthat_test_urlZbump
path_partsr,   r,   r-   _read_channel_configuration~  sb    $

 "

r   c              	   C   sj   t tj| \	}}}}}}}}}	t||||\}
}}}}|
d k	sJ|d k	sJtt|pRd|pX||
|p`||||S )NZhttps)r   r   rZ   r   r   r1   )rT   rC   rD   rF   rG   rH   r   r`   rd   ZqueryrM   rO   Zconfigured_schemeZconfigured_authZconfigured_tokenr,   r,   r-   rR     s$    
   
rR   c                   C   s   t jfS r&   )r   Zlocal_build_rootr,   r,   r,   r-   get_conda_build_local_url  s    r   TNc                 C   st   t dd dd | D D } t }t| D ]D\}}t|}|||D ]&}||krTqF|jt|td f||< qFq*|S )Nc                 s   s.   | ]&}t |tr d d |jD n|fV  qdS )c                 s   s   | ]}t |V  qd S r&   r   )r)   Zccr,   r,   r-   r.     s     z0prioritize_channels.<locals>.<genexpr>.<genexpr>N)r0   r5   r   ri   r,   r,   r-   r.     s   z&prioritize_channels.<locals>.<genexpr>c                 s   s   | ]}t |V  qd S r&   r   ri   r,   r,   r-   r.     s     r#   )r   r   	enumerater1   r   rt   minr   )r$   r   rw   resultZpriority_counterchnrs   rT   r,   r,   r-   prioritize_channels  s    r   c                 C   s.   t  }| D ]}t|}|||| q
|S r&   )r
   r1   r   r   )r$   rw   r   r   r   rs   r,   r,   r-   all_channel_urls  s
    r   c                 C   s   t j pt|  p| dS )Nzfile:/)r   Zoffliner   rY   rS   r,   r,   r-   offline_keep  s    r   Zctxc                 C   s   t dd | jD S )z*Return current channels as Channel objectsc                 s   s   | ]}t |V  qd S r&   r   )r)   r   r,   r,   r-   r.     s     z#get_channel_objs.<locals>.<genexpr>)r4   r$   r   r,   r,   r-   get_channel_objs  s    r   )TN)NT);Z
__future__r   r   r   r   r   	itertoolsr   Zloggingr   Z_vendor.boltons.setutilsr
   Z_vendor.toolzr   r   r   Zbase.constantsr   r   r   Zbase.contextr   r   Zcommon.compatr   r   r   Zcommon.pathr   r   r   Z
common.urlr   r   r   r   r   r   r   r    r!   r;   r   typer"   r1   r5   rn   r   rV   r   rR   r   r   r   r   r   Zregister_reset_callabackr@   r,   r,   r,   r-   <module>   s4   , t1	E

