U
    b-                     @   s  d dl mZmZmZ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mZmZmZmZmZmZ d dlZd dlZd dlmZ ddlmZ d	d
lmZ d	dlmZmZ d dlm Z  e	e!Z"dZ#dd Z$dd Z%dd Z&edddd Z'dd Z(dd Z)dd Z*dLddZ+d d! Z,d"d# Z-d$d% Z.dMd&d'Z/d(d) Z0e1d*Z2dNd,d-Z3d.d/ Z4d0d1 Z5d2d3 Z6d4d5 Z7dOd7d8Z8d9d: Z9d;d< Z:d=d> Z;d?d@ Z<dAdB Z=dPdDdEZ>dFdG Z?dHdI Z@dJdK ZAdS )Q    )absolute_importdivisionprint_functionunicode_literals)	lru_cachereduce)	getLoggerN)abspathbasename
expanduser
expandvarsjoinnormcasesplitsplitext)urlsplit   on_win   )
CondaError)
accumulateconcatfind_executablez#\./|\.\.|~|/|[a-zA-Z]:[/\\]|\\\\|//c                 C   s   d| krdS t t| S )N://F)rematchPATH_MATCH_REGEX)value r    0lib/python3.8/site-packages/conda/common/path.pyis_path!   s    r"   c                 C   s   t tt| S N)r	   r   r   pathr    r    r!   expand'   s    r&   c                 C   s0   t rtt| tt|kS t| t|kS dS )zR
    Examples:
        >>> paths_equal('/a/b/c', '/a/b/c/d/..')
        True

    N)r   r   r	   )Zpath1Zpath2r    r    r!   paths_equal+   s    r'   )maxsizec                 C   s   t | r| S | ds"td|  t| \}}}}}ddlm} ||}|dkrd|dsd| }n,d}td	|tjr|d d
 |dd  }|| S )zlConvert a file:// URL to a path.

    Relative file URLs (i.e. `file:relative/path`) are not supported.
    zfile://z9You can only turn absolute file: urls into paths (not %s)r   )percent_decode) Z	localhostz	127.0.0.1z::1\\//r*   z^/([a-z])[:|]:   N)	r"   
startswithr   r   urlr)   r   r   I)r0   _Znetlocr%   r)   r    r    r!   url_to_path8   s    


r3   c                 C   s   t dd t| |D S )Nc                 s   s   | ]\}}||kV  qd S r#   r    ).0tswr    r    r!   	<genexpr>R   s     z'tokenized_startswith.<locals>.<genexpr>)allzip)Ztest_iterableZstartswith_iterabler    r    r!   tokenized_startswithQ   s    r:   c                 C   s   t tdd | D dh S )Nc                 s   s$   | ]}t |d dd V  qdS )/N)tupler   r4   fr    r    r!   r7   V   s     z&get_all_directories.<locals>.<genexpr>r    )sortedsetfilesr    r    r!   get_all_directoriesU   s    rD   c                    sh   t | }|sdS g   fdd}t||} s> |d  nt| d sV | tdd  D S )Nr    c                    s   t || s |  |S r#   )r:   append)xyZleavesr    r!   _processc   s    

z&get_leaf_directories.<locals>._processr<   c                 s   s   | ]}d  |V  qdS )r;   N)r   )r4   Zleafr    r    r!   r7   n   s     z'get_leaf_directories.<locals>.<genexpr>)rD   r   rE   r:   r=   )rC   ZdirectoriesrI   Zlastr    rH   r!   get_leaf_directoriesY   s    

rJ   Fc                    s&    fddt tfdd| D S )Nc                    s    r| S |  dS )Nr;   r   )rF   )already_splitr    r!   <lambda>t       z%explode_directories.<locals>.<lambda>c                 3   s    | ]}|rt t |V  qd S r#   )r   r   )r4   	directory)maybe_splitr    r!   r7   u   s    z&explode_directories.<locals>.<genexpr>)rA   r   )Zchild_directoriesrL   r    )rL   rP   r!   explode_directoriesq   s    rQ   c                 C   sb   | dd}|dr| d S t| \}}t|\}}dd|||f  }|rZd|d|f S |S d	S )
a	  
    This must not return backslashes on Windows as that will break
    tests and leads to an eventual need to make url_to_path return
    backslashes too and that may end up changing files on disc or
    to the result of comparisons with the contents of them.
    .r*   2cz__pycache__/z%s.cpython-%s%sc%s%s%sr;   N)replacer/   r   r   )Zpy_pathpython_major_minor_versionZpyver_stringrO   py_fileZbasename_root	extensionZpyc_filer    r    r!   pyc_pathy   s    
  rZ   c                    s:   dd  D }fdd|D }t  fdd|D }|S )Nc                 s   s   | ]}| d r|V  qdS )z.pyN)endswithr>   r    r    r!   r7      s     
 z$missing_pyc_files.<locals>.<genexpr>c                 3   s   | ]}|t | fV  qd S r#   )rZ   )r4   rX   )rW   r    r!   r7      s   c                 3   s   | ]}|d   kr|V  qdS )r   Nr    )r4   r   rB   r    r!   r7      s      )r=   )rW   rC   Zpy_filesZpyc_matchesresultr    )rC   rW   r!   missing_pyc_files   s    
r]   c                 C   sF   |  dd\}}| dd\}}| | |   }}}|||fS )Nr-   r   =)rsplitstrip)Zep_definitionZcmd_modfuncZcommandmoduler    r    r!   parse_entry_point_def   s    rc   c                 C   s0   t rdS | rd| krd| } tdd| p*d S )Nz
python.exerR   binzpython%sr*   )r   r   )python_versionr    r    r!   get_python_short_path   s
    
rf   c                 C   s(   | d krd S t rdS t| }d| S d S )NzLib/site-packageszlib/python%s/site-packages)r   get_major_minor_version)re   Zpy_verr    r    r!   #get_python_site_packages_short_path   s    rh   z[0-9]+\.[0-9]+Tc                 C   sB  t | tst| dr\| dd }td}t||d k rBd S || ||d d  f}n| dr| dd }td}t||d k rd S ||d  dkst|| ||d d  f}njt| }|r|d	d}|d	 |d f}n:d
	dd | D }t|dk rd S |d	 |dd  f}|r8d	|S d
	|S )Nz
lib/pythonr;   r   Zpythonr   z
bin/pythonr.   rR   r   r*   c                 S   s   g | ]}|  r|qS r    )isdigit)r4   rT   r    r    r!   
<listcomp>   s      z+get_major_minor_version.<locals>.<listcomp>)

isinstancestrAssertionErrorr/   r   len_VERSION_REGEXr   groupr   )stringZwith_dotZ	pythonstrstartZmaj_minr   versionZdigitsr    r    r!   rg      s.    


rg   c                   C   s   t rdS dS )NZScriptsrd   r   r    r    r    r!   get_bin_directory_short_path   s    rt   c                 C   s   t r| ddS | S )Nr;   \r   rV   r$   r    r    r!   win_path_ok   s    rw   c                 C   s   t r| ddS | S )Nru   r+   rv   r$   r    r    r!   win_path_double_escape   s    rx   c                 C   s   t dd| ddS )Nz	(\\(?! ))r;   z:////r   )r   subrV   r$   r    r    r!   win_path_backout   s    rz   r2   c                 C   s:   | r$| d | d   kr |kr(n n| S d|| |f S dS )z

    Examples:
        >>> ensure_pad('conda')
        '_conda_'
        >>> ensure_pad('_conda')
        '__conda_'
        >>> ensure_pad('')
        ''

    r   r<   rU   Nr    )nameZpadr    r    r!   
ensure_pad   s    $r|   c                 C   s$   | o"| d | d   kodkS   S )z

    Examples:
        >>> is_private_env_name("_conda")
        False
        >>> is_private_env_name("_conda_")
        True

    r   r<   r2   r    )env_namer    r    r!   is_private_env_name   s    
r~   c                 C   s0   | dk	r,t | \}}t|dkr$dS t|S dS )z

    Examples:
        >>> is_private_env_path('/some/path/to/envs/_conda_')
        True
        >>> is_private_env_path('/not/an/envs_dir/_conda_')
        False

    NZenvsF)r   r
   r~   )Zenv_pathZenvs_directoryr}   r    r    r!   is_private_env_path  s    
r   c                 C   s   |  tjr| S | tj S r#   )r[   ossepr$   r    r    r!   right_pad_os_sep  s    r   c                 C   s(   t | \}}d|kr |pd |fS | d fS )NrR   rK   )Zpath_or_urlZdnfnr    r    r!   split_filename  s    r   c                 C   sB   |  dr|}| d|dS |  dr:t }| d|dS | S d S )Nzsite-packages/zsite-packagesr   zpython-scripts/zpython-scripts)r/   rV   rt   )Zsource_short_pathZtarget_site_packages_short_pathZsp_dirZbin_dirr    r    r!   get_python_noarch_target_path   s    

r   r*   c              
      s   | sdS t d}|r6tjdtjtj|d}ntjdd}z$t|d| g	d
dd } W nZ tk
r } z<tjd	| d
d  fdd}d}t||| dd} W 5 d }~X Y nX | S )Nr*   bashZCYGPATHzcygpath.exez-upascii
r   z%rT)exc_infoc                    s.   |  ddddddd} d | S )Nr   ru   r;   r-   r*   r,   )rp   rV   )Z
found_pathfoundroot_prefixr    r!   _translation>  s    "z&win_path_to_unix.<locals>._translationzT(?<![:/^a-zA-Z])([a-zA-Z]:[/\\]+(?:[^:*?"<>|]+[/\\]+)*[^:*?"<>|;/\\]+?(?![a-zA-Z]:))z;/z:/)whichr   environgetr%   r   dirname
subprocessZcheck_outputdecoder   	Exceptionlogdebugr   ry   rV   )r%   r   r   Zcygpather   Zpath_rer    r   r!   win_path_to_unix+  s    "$(r   c                 C   s   t | S r#   r   )
executabler    r    r!   r   F  s    r   c                 C   sl   | dd dkr | dd dfS | dd dkr@| dd dfS | dd dkr`| dd dfS | dfS dS )af  
    Examples:
        >>> strip_pkg_extension("/path/_license-1.1-py27_1.tar.bz2")
        ('/path/_license-1.1-py27_1', '.tar.bz2')
        >>> strip_pkg_extension("/path/_license-1.1-py27_1.conda")
        ('/path/_license-1.1-py27_1', '.conda')
        >>> strip_pkg_extension("/path/_license-1.1-py27_1")
        ('/path/_license-1.1-py27_1', None)
    N.conda.tar.bz2z.jsonr    r$   r    r    r!   strip_pkg_extensionJ  s    r   c                 C   s    | dd dkp| dd dkS )z
    Examples:
        >>> is_package_file("/path/_license-1.1-py27_1.tar.bz2")
        True
        >>> is_package_file("/path/_license-1.1-py27_1.conda")
        True
        >>> is_package_file("/path/_license-1.1-py27_1")
        False
    r   Nr   r   r   r    r$   r    r    r!   is_package_file`  s    r   )F)N)T)r2   )r*   )BZ
__future__r   r   r   r   	functoolsr   r   Zloggingr   r   os.pathr	   r
   r   r   r   r   r   r   r   r   Zurllib.parser   compatr   r*   r   Z_vendor.toolzr   r   Zdistutils.spawnr   __name__r   r   r"   r&   r'   r3   r:   rD   rJ   rQ   rZ   r]   rc   rf   rh   compilero   rg   rt   rw   rx   rz   r|   r~   r   r   r   r   r   r   r   r   r    r    r    r!   <module>   sX   (

	



$

