
    Je                     *   d 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 edd	gfd
d	gffddgfd
dgff      ddd edej                  dk(  rdndgffdg ff      dgZ G d de      Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd  Zy)!z%Utilities for version control systems    N)running_under_pytest)programs)	abspardir	Mercurial.hgthgcommithgtklog)r	   browse)namerootdiractionsGit.gitgitntguicolagitkc                       e Zd ZdZd Zy)ActionToolNotFoundziException to transmit information about supported tools for
       failed attempt to execute given actionc                 X    t         j                  |        || _        || _        || _        y )N)RuntimeError__init__vcsnameactiontools)selfr   r   r   s       2/usr/lib/python3/dist-packages/spyder/utils/vcs.pyr   zActionToolNotFound.__init__*   s%    d#
    N)__name__
__module____qualname____doc__r    r!   r    r   r   &   s    1r!   r   c                 ~    t         D ]4  }t        j                  | |d         }t        j                  |      s2|c S  y)z4Return support status dict if path is under VCS rootr   N)	SUPPORTEDospjoinisdir)pathinfovcs_paths      r    get_vcs_infor/   1   s6     88D$y/299XKr!   c                     | }t        |       t        |       } | |k(  ry| }t        |       t        j                  |       S )z_Return VCS root directory path
    Return None if path is not within a supported VCS repositoryN)r/   r   r)   abspath)r,   previous_paths     r    get_vcs_rootr3   9   sK     M
t

$=  M t

$ ;;tr!   c                     t        |       duS )z1Return True if path is a supported VCS repositoryN)r3   )r,   s    r    is_vcs_repositoryr5   F   s    T))r!   c                    t        t        |             }|d   |   }|D ]@  \  }}t        j                  |      st	               st        j
                  |||         y y |D cg c]  \  }}|	 }}}t        |d   ||      c c}}w )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   cwdTNr   )r/   r3   r   find_programr   run_programr   )r,   r   r-   r   toolargsr   cmdnamess           r    run_vcs_toolr>   K   s     T*+DOF#E 	A
d  &')$$T4T:  	A ,11ZT4D11 fvx@@ 2s   'Bc                  0    t        j                  d      duS )z%Return True if Mercurial is installedhgN)r   r9   r&   r!   r    is_hg_installedrA   \   s      &d22r!   c                 r   	 t        j                  t        j                  | d            sJ t        j                  ddd| g      }|j                         \  }}t        |j                         j                         j                  dd            S # t        j                  t        t        t        f$ r Y yw xY w)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')
    r   r@   idz-nibN   )NNN)r)   r+   r*   r   r:   communicatetupledecodestripsplit
subprocessCalledProcessErrorAssertionErrorAttributeErrorOSError)repopathprocoutput_errs       r    get_hg_revisionrS   a   s    	"yy(E2333##D4*BC'') V]]_**,224;<<))>> "!"s   BB #B65B6c                    	 t        j                         }|)t        j                  t        j                  | d            sJ t        j
                  |g d|       j                         }|d   j                         }|j                  t        j                               }t        j
                  |dg|       j                         }|d   }|j                  t        j                               }|j                  d      }|D cg c]  }|j                  d      s| }}t        |      d	k7  rd}n|d   j                  dd	      d	   }||fS c c}w # t        j                  t         t"        t$        f$ r Y y
w xY w)z
    Return Git revision for the repository located at repopath

    Result is a tuple (latest commit hash, branch), with None values on
    error
    Nr   )z	rev-parsez--shortHEADr7   r   branch
*   )NN)r   find_gitr)   r+   r*   r:   rE   rH   rG   sysgetdefaultencodingrI   
startswithlenrJ   rK   rL   rM   rN   )rO   r   r	   branchesbactive_branchrV   s          r    get_git_revisionrb   t   sT   !399SXXh-G#HHH%%c+K*244?KM 	"s5578 ''hZ,466Akm 	A;??3#9#9#;<>>$'$,BqS0ABB}"F"1%++D!4Q7Fv~ C ))>> s*   DE EE .E E #E:9E:c                    g }g }d}g }t         j                  j                  |       rt         j                  j                  |       } t	        j
                         }|r	 t	        j                  |ddg|       j                         \  }}|j                  t        j                               }|j                  d      D cg c]  }|s|j                          }}t	        j                  |dg|       j                         \  }}|j                  t        j                               }|j                  d      D cg c]  }|s|j                          }}t	        j                  |ddg|       j                         \  }}|j                  t        j                               }|j                  d      D cg c]  }|s|j                          }	}|	D ]F  }|j                  d	      r"|j                  d	d      j                         }|}|j                  |       H 	 ||z   ||fS c c}w c c}w c c}w # t         j"                  t$        t&        f$ r Y 7w xY w)
z@
    Return Git active branch, state, branches (plus tags).
     statusz-sr7   rW   tagrV   z-arX   )osr,   isfiledirnamer   rZ   r:   rE   rG   r[   r\   rI   rH   r]   replaceappendrJ   rK   rM   rN   )
rO   tagsr_   rV   files_modifedr   outerrlineliness
             r    get_git_refsrr      s    DHFM	ww~~h77??8,



C
$	++h% km C
 **S3356C69iioNdTZZ\NMN  ++eW km C
 **S3356C-0YYt_ETDJJLEDE  ++h% km C
 **S3356C.1iioFdTZZ\FEF &??3'<<R0668D!F%& d?FM11= O F G --~wG 		sR   A!H8  H)H)A"H8 <H.H.A#H8 9H3H3AH8 )H8 8IIc                    i }t        j                  dddgt        j                  |             j	                         \  }}|j                  t        j                               }|j                  d      D cg c]  }|s|j                          }}|D ]0  }|s|j                  d      \  }}|j                  d      d   ||<   2 |S c c}w )	z%Return git remotes for repo on fpath.r   remotez-vr7   rW   	 r   )
r   r:   r)   ri   rE   rG   r[   r\   rI   rH   )fpathremote_datadata__rp   rq   rt   values           r    get_git_remotesr|      s    K##	4KK km	 D" ;;s--/0D&*jj&6?d$TZZ\?E? 6 JJt,MFE"'++c"21"5K6
  @s   7C
?C
c                     d}| j                  d      r;| j                  dd      }|j                  dd      }d|j                  dd      z   }|S | j                  dd      }|S )zConvert a git remote to a url.rd   zgit@:/zhttps://r   )r]   rj   )rt   urls     r    remote_to_urlr      sh    
C nnVR(kk#s#3;;vr22 J nnVR(Jr!   )r%   rg   os.pathr,   r)   rJ   r[   spyder.config.baser   spyder.utilsr   spyder.utils.miscr   dictr   r(   r   r   r/   r3   r5   r>   rA   rS   rb   rr   r|   r   r&   r!   r    <module>r      s    , 	   
 4 ! '
 ($8*%(%!5'"%& 277d?%?@C" "	$ 
*
A"3
"&B52p(
r!   