
    G@d                     6   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dS )!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dS )ActionToolNotFoundziException to transmit information about supported tools for
       failed attempt to execute given actionc                 d    t                               |            || _        || _        || _        d S )N)RuntimeError__init__vcsnameactiontools)selfr   r   r   s       0lib/python3.11/site-packages/spyder/utils/vcs.pyr   zActionToolNotFound.__init__*   s/    d###


    N)__name__
__module____qualname____doc__r    r!   r    r   r   &   s-        1 1    r!   r   c                     t           D ]5}t          j        | |d                   }t          j        |          r|c S 6dS )z4Return support status dict if path is under VCS rootr   N)	SUPPORTEDospjoinisdir)pathinfovcs_paths      r    get_vcs_infor/   1   sP      8D$y/229X 	KKK	 r!   c                     | }t          |           (t          |           } | |k    rdS | }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   sY     M
t


$=  F 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 ]E\  }}t          j        |          r,t	                      st          j        |||            n dS  dS Fd |D             }t          |d         ||          )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                     g | ]\  }}|S r&   r&   ).0r   argss      r    
<listcomp>z run_vcs_tool.<locals>.<listcomp>Y   s    111ZT4D111r!   r   )r/   r3   r   find_programr   run_programr   )r,   r   r-   r   toolr;   cmdnamess          r    run_vcs_toolrA   K   s     T**++DOF#E 	A 	A
d && 	')) $T4T:::::ttFF	 215111 fvx@@@r!   c                  .    t          j        d          duS )z%Return True if Mercurial is installedhgN)r   r=   r&   r!   r    is_hg_installedrD   \   s     &&d22r!   c                    	 t          j        t          j        | d                    sJ t          j        ddd| g          }|                                \  }}t          |                                                                	                    dd                    S # t          j        t          t          t          f$ r Y dS 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   rC   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_revisionrV   a   s    	"y(E2233333#D4*BCC'')) V]]__**,,224;;<<<)>> " " "!!!"s   BB! !"CCc                    	 t          j                    }|'t          j        t          j        | d                    sJ t          j        |g d|                                           }|d                                         }|                    t          j
                              }t          j        |dg|                                           }|d         }|                    t          j
                              }|                    d          }d |D             }t          |          d	k    rd}n"|d                             dd	          d	         }||fS # t          j        t          t           t"          f$ r Y d
S 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
c                 <    g | ]}|                     d           |S )*)
startswith)r:   bs     r    r<   z$get_git_revision.<locals>.<listcomp>   s)    BBBqS0A0ABBBBr!      )NN)r   find_gitr)   r+   r*   r>   rH   rK   rJ   sysgetdefaultencodingrL   lenrM   rN   rO   rP   rQ   )rR   r   r	   branchesactive_branchrY   s         r    get_git_revisionrf   t   s   !!39SXh-G-G#H#H%c+K+K+K*24 4 44?KMM 	""s57788 'hZ,46 6 66Akmm 	A;??3#9#;#;<<>>$''BBHBBB}""FF"1%++D!44Q7Fv~)>>   zzs   EE   "FFc                 t   g }g }d}g }t           j                            |           rt           j                            |           } t	          j                    }|r	 t	          j        |ddg|                                           \  }}|                    t          j
                              }d |                    d          D             }t	          j        |dg|                                           \  }}|                    t          j
                              }d |                    d          D             }t	          j        |d	d
g|                                           \  }}|                    t          j
                              }d |                    d          D             }|D ]V}	|	                    d          r*|	                    dd                                          }	|	}|                    |	           Wn"# t           j        t$          t&          f$ r Y nw xY w||z   ||fS )z@
    Return Git active branch, state, branches (plus tags).
     statusz-sr7   c                 :    g | ]}||                                 S r&   rK   r:   lines     r    r<   z get_git_refs.<locals>.<listcomp>   s%    NNNdNTZZ\\NNNr!   rZ   tagc                 :    g | ]}||                                 S r&   rk   rl   s     r    r<   z get_git_refs.<locals>.<listcomp>   s%    EEETEDJJLLEEEr!   rY   z-ac                 :    g | ]}||                                 S r&   rk   rl   s     r    r<   z get_git_refs.<locals>.<listcomp>   s%    FFFdFTZZ\\FFFr!   r\   )osr,   isfiledirnamer   r`   r>   rH   rJ   ra   rb   rL   r]   replacerK   appendrM   rN   rP   rQ   )
rR   tagsrd   rY   files_modifedr   outerrlinesrm   s
             r    get_git_refsr{      sJ    DHFM	w~~h -7??8,,



C
 %$	+h%   kmm C
 **S35566CNNciiooNNNM  +eW   kmm C
 **S35566CEESYYt__EEED  +h%   kmm C
 **S35566CFFciiooFFFE & &??3'' "<<R006688D!F%%%%& -~wG 	 	 	D	 d?FM11s   F1H H/.H/c                    i }t          j        dddgt          j        |                                                     \  }}|                    t          j                              }d |                    d          D             }|D ]:}|r6|                    d          \  }}|                    d          d	         ||<   ;|S )
z%Return git remotes for repo on fpath.r   remotez-vr7   c                 :    g | ]}||                                 S r&   rk   rl   s     r    r<   z#get_git_remotes.<locals>.<listcomp>   s%    ???d$?TZZ\\???r!   rZ   	 r   )	r   r>   r)   rs   rH   rJ   ra   rb   rL   )fpathremote_datadata__rz   rm   r}   values           r    get_git_remotesr      s    K#	4K   kmm	 D" ;;s-//00D??djj&6&6???E 6 6 	6 JJt,,MFE"'++c"2"21"5Kr!   c                     d}|                      d          rF|                     dd          }|                    dd          }d|                    dd          z   }n|                     dd          }|S )zConvert a git remote to a url.rh   zgit@:/zhttps://r   )r]   rt   )r}   urls     r    remote_to_urlr      su    
C   )nnVR((kk#s##3;;vr222nnVR((Jr!   )r%   rq   os.pathr,   r)   rM   ra   spyder.config.baser   spyder.utilsr   spyder.utils.miscr   dictr   r(   r   r   r/   r3   r5   rA   rD   rV   rf   r{   r   r   r&   r!   r    <module>r      s   , + 				           



 4 3 3 3 3 3 ! ! ! ! ! ! ' ' ' ' ' '
 t($8*%(%!5'"%& & &  t27d??%%?@C" " " " 	$         
 
 
* * *
A A A"3 3 3
" " "&  B52 52 52p  (
 
 
 
 
r!   