ó
‹²,]c           @  s  d  Z  d d l m Z d d l Z d d l j 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 i d d	 6d
 d 6e d d d g f d d g f f d d d g f d d g f f ƒ d 6i d d	 6d d 6e d d e j d k rd n d g f f d d g  f f ƒ d 6g Z d e f d „  ƒ  YZ d „  Z d „  Z d „  Z d „  Z d „  Z d  „  Z d! „  Z d S("   s%   Utilities for version control systemsiÿÿÿÿ(   t   print_functionN(   t   running_under_pytest(   t   programs(   t	   abspardir(   t   PY3t	   Mercurialt   names   .hgt   rootdirt   committ   thgt   hgtkt   browset   logt   actionst   Gits   .gitt   gitt   ntt   guit   colat   gitkt   ActionToolNotFoundc           B  s   e  Z d  Z d „  Z RS(   si   Exception to transmit information about supported tools for
       failed attempt to execute given actionc         C  s,   t  j |  ƒ | |  _ | |  _ | |  _ d  S(   N(   t   RuntimeErrort   __init__t   vcsnamet   actiont   tools(   t   selfR   R   R   (    (    s/   lib/python2.7/site-packages/spyder/utils/vcs.pyR   -   s    		(   t   __name__t
   __module__t   __doc__R   (    (    (    s/   lib/python2.7/site-packages/spyder/utils/vcs.pyR   )   s   c         C  s>   x7 t  D]/ } t j |  | d ƒ } t j | ƒ r | Sq Wd S(   s4   Return support status dict if path is under VCS rootR   N(   t	   SUPPORTEDt   ospt   joint   isdir(   t   patht   infot   vcs_path(    (    s/   lib/python2.7/site-packages/spyder/utils/vcs.pyt   get_vcs_info4   s    c         C  sN   |  } x8 t  |  ƒ d k r@ t |  ƒ }  |  | k r7 d S|  } q	 Wt j |  ƒ S(   s_   Return VCS root directory path
    Return None if path is not within a supported VCS repositoryN(   R%   t   NoneR   R   t   abspath(   R"   t   previous_path(    (    s/   lib/python2.7/site-packages/spyder/utils/vcs.pyt   get_vcs_root<   s    
c         C  s   t  |  ƒ d k	 S(   s1   Return True if path is a supported VCS repositoryN(   R)   R&   (   R"   (    (    s/   lib/python2.7/site-packages/spyder/utils/vcs.pyt   is_vcs_repositoryI   s    c         C  s©   t  t |  ƒ ƒ } | d | } x‚ | D]E \ } } t j | ƒ r' t ƒ  sd t j | | d |  ƒn t Sd Sq' Wg  | D] \ } } | ^ qw } t | d | | ƒ ‚ d S(   s¡   If 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   t   cwdNR   (   R%   R)   R   t   find_programR   t   run_programt   TrueR   (   R"   R   R#   R   t   toolt   argsR   t   cmdnames(    (    s/   lib/python2.7/site-packages/spyder/utils/vcs.pyt   run_vcs_toolN   s    	c           C  s   t  j d ƒ d k	 S(   s%   Return True if Mercurial is installedt   hgN(   R   R,   R&   (    (    (    s/   lib/python2.7/site-packages/spyder/utils/vcs.pyt   is_hg_installed_   s    c         C  s™   yt t  j t  j |  d ƒ ƒ s$ t ‚ t j d d d |  g ƒ } | j ƒ  \ } } t | j ƒ  j	 ƒ  j
 d d ƒ ƒ SWn t j t t f k
 r” d SXd S(   sú   Return 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')
    s   .hgR3   t   ids   -nibi   N(   NNN(   R   R!   R    t   AssertionErrorR   R-   t   communicatet   tuplet   decodet   stript   splitR&   t
   subprocesst   CalledProcessErrort   AttributeError(   t   repopatht   proct   outputt   _err(    (    s/   lib/python2.7/site-packages/spyder/utils/vcs.pyt   get_hg_revisiond   s    !&c         C  sy  yTt  j d ƒ } | d k	 r9 t j t j |  d ƒ ƒ s? t ‚ t  j | d d d g d |  ƒj ƒ  } | d j	 ƒ  } t
 r” | j t j ƒ  ƒ } n  t  j | d g d |  ƒj ƒ  } | d } t
 rÝ | j t j ƒ  ƒ } n  | j d	 ƒ } g  | D] } | j d
 ƒ ró | ^ qó } t | ƒ d k r/d } n | d j d d ƒ d } | | f SWn t j t t f k
 rtd SXd S(   s›   
    Return Git revision for the repository located at repopath
    
    Result is a tuple (latest commit hash, branch), with None values on
    error
    R   s   .gits	   rev-parses   --shortt   HEADR+   i    t   branchs   
t   *i   N(   NN(   R   R,   R&   R   R!   R    R6   R-   R7   R:   R   R9   t   syst   getdefaultencodingR;   t
   startswitht   lenR<   R=   R>   (   R?   R   R   t   branchest   bt   active_branchRE   (    (    s/   lib/python2.7/site-packages/spyder/utils/vcs.pyt   get_git_revisionv   s*    -
(	(   R   t
   __future__R    t   ost   os.pathR"   R   R<   RG   t   spyder.config.baseR   t   spyder.utilsR   t   spyder.utils.miscR   t   spyder.py3compatR   t   dictR   R   R   R   R%   R)   R*   R2   R4   RC   RN   (    (    (    s/   lib/python2.7/site-packages/spyder/utils/vcs.pyt   <module>   s>   '						