B
    lz]+                 @   s  d dl mZmZmZmZ d dl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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! yd dl"m#Z#m$Z$ W n, e%k
r   d dl&m#Z# d dl'm$Z$ Y nX ee(Z)dZ*dd Z+dd Z,dd Z-edd Z.dd Z/dd Z0dd Z1dMd d!Z2d"d# Z3d$d% Z4d&d' Z5dNd(d)Z6d*d+ Z7dOd-d.Z8d/d0 Z9d1d2 Z:d3d4 Z;d5d6 Z<dPd8d9Z=d:d; Z>d<d= Z?d>d? Z@d@dA ZAdBdC ZBdQdEdFZCdGdH ZDdIdJ ZEdKdL ZFdS )R    )absolute_importdivisionprint_functionunicode_literals)reduce)	getLoggerN)abspathbasename
expanduser
expandvarsjoinnormcasesplitsplitext   )on_winstring_types   )
CondaError)memoize)
accumulateconcattake)find_executable)unquoteurlsplit)r   )r   z#\./|\.\.|~|/|[a-zA-Z]:[/\\]|\\\\|//c             C   s   d| krdS t t| S )Nz://F)rematchPATH_MATCH_REGEX)value r    0lib/python3.7/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_equal4   s    r%   c             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::1z\\z//r'   z^/([a-z])[:|]:   N)	r"   
startswithr   r   urlr&   r   r   I)r+   _Znetlocr#   r&   r    r    r!   url_to_path@   s    


r.   c             C   s   t dd t| |D S )Nc             s   s   | ]\}}||kV  qd S )Nr    ).0tswr    r    r!   	<genexpr>Z   s    z'tokenized_startswith.<locals>.<genexpr>)allzip)Ztest_iterableZstartswith_iterabler    r    r!   tokenized_startswithY   s    r5   c             C   s   t tdd | D dh S )Nc             s   s$   | ]}t |d dd V  qdS )/N)tupler   )r/   fr    r    r!   r2   ^   s    z&get_all_directories.<locals>.<genexpr>r    )sortedset)filesr    r    r!   get_all_directories]   s    r=   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 )N)r5   append)xy)leavesr    r!   _processk   s    

z&get_leaf_directories.<locals>._processr7   c             s   s   | ]}d  |V  qdS )r6   N)r   )r/   Zleafr    r    r!   r2   v   s    z'get_leaf_directories.<locals>.<genexpr>)r=   r   r>   r5   r8   )r<   ZdirectoriesrB   Zlastr    )rA   r!   get_leaf_directoriesa   s    

rC   Fc                s&    fddt tfdd| D S )Nc                s    r| S |  dS )Nr6   )r   )r?   )already_splitr    r!   <lambda>|       z%explode_directories.<locals>.<lambda>c             3   s    | ]}|rt t |V  qd S )N)r   r   )r/   	directory)maybe_splitr    r!   r2   }   s   z&explode_directories.<locals>.<genexpr>)r;   r   )Zchild_directoriesrD   r    )rD   rH   r!   explode_directoriesy   s    rI   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%scz%s%s%sr6   N)replacer*   r   r   )Zpy_pathpython_major_minor_versionZpyver_stringrG   py_fileZbasename_root	extensionZpyc_filer    r    r!   pyc_path   s    
rQ   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)endswith)r/   r9   r    r    r!   r2      s    z$missing_pyc_files.<locals>.<genexpr>c             3   s   | ]}|t | fV  qd S )N)rQ   )r/   rO   )rN   r    r!   r2      s   c             3   s   | ]}|d   kr|V  qdS )r   Nr    )r/   r   )r<   r    r!   r2      s    )r8   )rN   r<   Zpy_filesZpyc_matchesresultr    )r<   rN   r!   missing_pyc_files   s
    
rT   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    rZ   c             C   s0   t rdS | rd| krd| } tdd| p*d S )Nz
python.exerJ   binzpython%sr'   )r   r   )python_versionr    r    r!   get_python_short_path   s
    
r]   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)r\   Zpy_verr    r    r!   #get_python_site_packages_short_path   s    r_   Tc             C   sN   t | tstttddd | D }t|dkrJ|r@d|S d|S d S )Nr   c             s   s   | ]}|  r|V  qd S )N)isdigit)r/   rL   r    r    r!   r2      s    z*get_major_minor_version.<locals>.<genexpr>rJ   r'   )
isinstancer   AssertionErrorr8   r   lenr   )stringZwith_dotZdigitsr    r    r!   r^      s
    r^   c               C   s   t rdS dS )NZScriptsr[   )r   r    r    r    r!   get_bin_directory_short_path   s    re   c             C   s   t r| ddS | S )Nr6   \)r   rM   )r#   r    r    r!   win_path_ok   s    rg   c             C   s   t r| ddS | S )Nrf   z\\)r   rM   )r#   r    r    r!   win_path_double_escape   s    rh   c             C   s   t dd| ddS )Nz	(\\(?! ))r6   z:////z://)r   subrM   )r#   r    r    r!   win_path_backout   s    rj   r-   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   r7   z%s%s%sNr    )nameZpadr    r    r!   
ensure_pad   s    $rl   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   r7   r-   r    )env_namer    r    r!   is_private_env_name   s    
rn   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	   rn   )Zenv_pathZenvs_directoryrm   r    r    r!   is_private_env_path   s    
ro   c             C   s   |  tjr| S | tj S )N)rR   ossep)r#   r    r    r!   right_pad_os_sep  s    rr   c             C   s(   t | \}}d|kr |pd |fS | d fS )NrJ   )r   )Zpath_or_urlZdnfnr    r    r!   split_filename  s    rt   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*   rM   re   )Zsource_short_pathZtarget_site_packages_short_pathZsp_dirZbin_dirr    r    r!   get_python_noarch_target_path  s    

ru   r'   c          
      s   | sdS t d}|r6tjdtjtj|d}ntjdd}y$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 d 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   rf   r6   r(   r'   z//)grouprM   )Z
found_pathfound)root_prefixr    r!   _translation/  s    "z&win_path_to_unix.<locals>._translationzW(?<![:/^a-zA-Z])([a-zA-Z]:[\/\\]+(?:[^:*?"<>|]+[\/\\]+)*[^:*?"<>|;\/\\]+?(?![a-zA-Z]:))z;/z:/)whichrp   environgetr#   r   dirname
subprocessZcheck_outputdecoder   	Exceptionlogdebugr   ri   rM   )r#   r|   rv   Zcygpather}   Zpath_rer    )r|   r!   win_path_to_unix  s    "$(r   c             C   s   t | S )N)r   )
executabler    r    r!   r~   7  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)
    iNz.condaiz.tar.bz2z.jsonr    )r#   r    r    r!   strip_pkg_extension;  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
    iNz.condaiz.tar.bz2r    )r#   r    r    r!   is_package_fileQ  s    r   )F)N)T)r-   )r'   )GZ
__future__r   r   r   r   	functoolsr   Zloggingr   rp   os.pathr   r	   r
   r   r   r   r   r   r   r   compatr   r   r'   r   Z_vendor.auxlib.decoratorsr   Z_vendor.toolzr   r   r   Zdistutils.spawnr   Zurllib.parser   r   ImportErrorZurllibZurlparse__name__r   r   r"   r$   r%   r.   r5   r=   rC   rI   rQ   rT   rZ   r]   r_   r^   re   rg   rh   rj   rl   rn   ro   rr   rt   ru   r   r~   r   r   r    r    r    r!   <module>   s\   (

	




