B
    nb\                 @   s  d Z ddlmZ ddlZddl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 dd	ed
dgfddgffd
dgfddgffddddedejdkrdndgffdg ffddgZG dd deZdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& ZdS )'z%Utilities for version control systems    )print_functionN)running_under_pytest)programs)	abspardir)PY3Z	Mercurialz.hgZthgcommitZhgtklog)r   Zbrowse)namerootdiractionsZGitz.gitgitntZguiZcolaZgitkc               @   s   e Zd ZdZdd ZdS )ActionToolNotFoundziException to transmit information about supported tools for
       failed attempt to execute given actionc             C   s    t |  || _|| _|| _d S )N)RuntimeError__init__vcsnameactiontools)selfr   r   r    r   /lib/python3.7/site-packages/spyder/utils/vcs.pyr   -   s    
zActionToolNotFound.__init__N)__name__
__module____qualname____doc__r   r   r   r   r   r   )   s   r   c             C   s0   x*t D ]"}t| |d }t|r|S qW dS )z4Return support status dict if path is under VCS rootr
   N)	SUPPORTEDospjoinisdir)pathinfoZvcs_pathr   r   r   get_vcs_info4   s    

r!   c             C   s8   | }x(t | dkr,t| } | |kr&dS | }qW t| S )z_Return VCS root directory path
    Return None if path is not within a supported VCS repositoryN)r!   r   r   abspath)r   Zprevious_pathr   r   r   get_vcs_root<   s    r#   c             C   s   t | dk	S )z1Return True if path is a supported VCS repositoryN)r#   )r   r   r   r   is_vcs_repositoryI   s    r$   c             C   sv   t t| }|d | }xX|D ]2\}}t|rt sHtj||| d ndS dS qW dd |D }t|d ||dS )zIf path is a valid VCS repository, run the corresponding VCS tool
    Supported VCS actions: 'commit', 'browse'
    Return False if the VCS tool is not installedr   )cwdTNc             S   s   g | ]\}}|qS r   r   ).0r	   argsr   r   r   
<listcomp>\   s    z run_vcs_tool.<locals>.<listcomp>r	   )r!   r#   r   find_programr   run_programr   )r   r   r    r   Ztoolr'   Zcmdnamesr   r   r   run_vcs_toolN   s    
r+   c               C   s   t ddk	S )z%Return True if Mercurial is installedhgN)r   r)   r   r   r   r   is_hg_installed_   s    r-   c          
   C   sn   yLt t | dsttddd| g}| \}}t| 	 
ddS  tjttfk
rh   dS X dS )zReturn Mercurial revision for the repository located at repopath
       Result is a tuple (global, local, branch), with None values on error
       For example:
           >>> get_hg_revision(".")
           ('eba7273c69df+', '2015+', 'default')
    z.hgr,   idz-nibN   )NNN)r   r   r   AssertionErrorr   r*   communicatetupledecodestripsplit
subprocessCalledProcessErrorAttributeError)repopathprocoutputZ_errr   r   r   get_hg_revisiond   s    r<   c          
   C   s   yt d}|dk	r&tt| ds*tt j|dddg| d }|d  }t	rb|
t }t j|d	g| d }|d }t	r|
t }|d
}dd |D }t|dkrd}n|d ddd }||fS  tjttfk
r   dS X dS )z
    Return Git revision for the repository located at repopath
    
    Result is a tuple (latest commit hash, branch), with None values on
    error
    r   Nz.gitz	rev-parsez--shortZHEAD)r%   r   branch
c             S   s   g | ]}| d r|qS )*)
startswith)r&   br   r   r   r(      s    z$get_git_revision.<locals>.<listcomp>   )NN)r   r)   r   r   r   r0   r*   r1   r4   r   r3   sysgetdefaultencodingr5   lenr6   r7   r8   )r9   r   r   ZbranchesZactive_branchr=   r   r   r   get_git_revisionv   s*    


rF   )r   Z
__future__r   osos.pathr   r   r6   rC   Zspyder.config.baser   Zspyder.utilsr   Zspyder.utils.miscr   Zspyder.py3compatr   dictr	   r   r   r   r!   r#   r$   r+   r-   r<   rF   r   r   r   r   <module>   s:   
