3
_Afa&                 @   s  d dl mZ d dlZd dl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Zd dlmZmZmZ d dlmZ dZd%Zd&ZdZdadadadag ad'ddZdd Zdd Zdd Zdd Z da!G dd de"Z#e# Z$dd Z%G dd de"Z&e& Z'd(d!d"Z(G d#d$ d$e"Z)dS ))    )print_functionN)SIGTERM)GitError)HEAD)
REPO_TRACEIsTraceTrace)Wrappergit   	         GIT_DIRTc             C   sD   t d kr@| sd S d}tjj|s(tj }tjjtjdd|da t S )Nz/tmp zssh-zmaster-%r@%h:%p)_ssh_sock_pathospathexiststempfile
gettempdirjoinmkdtemp)createZtmp_dir r   =/home/qytech/356xLinux510-101server/.repo/repo/git_command.pyssh_sock4   s    r   c               C   s"   t d krtjjtjjtda t S )NZgit_ssh)_ssh_proxy_pathr   r   r   dirname__file__r   r   r   r   
_ssh_proxyB   s
    
r    c             C   s   t j|  d S )N)_ssh_clientsappend)pr   r   r   _add_ssh_clientK   s    r$   c             C   s(   yt j|  W n tk
r"   Y nX d S )N)r!   remove
ValueError)r#   r   r   r   _remove_ssh_clientO   s    r'   c              C   sF   x<t D ]4} ytj| jt | j  W q tk
r8   Y qX qW g a d S )N)r!   r   killpidr   waitOSError)r#   r   r   r   terminate_ssh_clientsV   s    

r,   c               @   s   e Zd Zdd Zdd ZdS )_GitCallc             C   s6   t d kr2t j a t d kr2tdtjd tjd t S )Nz#fatal: unable to detect git version)filer   )_git_versionr	   ZParseGitVersionprintsysstderrexit)selfr   r   r   version_tuplee   s    

z_GitCall.version_tuplec                s    j dd  fdd}|S )N_-c                 s"    g}|j |  td |j dkS )Nr   )extend
GitCommandWait)cmdvcommand)namer   r   funq   s    
z!_GitCall.__getattr__.<locals>.fun)replace)r4   r=   r>   r   )r=   r   __getattr__n   s    z_GitCall.__getattr__N)__name__
__module____qualname__r5   r@   r   r   r   r   r-   d   s   	r-   c              C   s   t tdd} | dkrtj }tjjtjjt}tjj	|d|t
< tjtdtgtj|d}|j dkr|jj j jd} | jdr| d	d } nd
} ttd|  | S )z(Return the version of the repo.git tree.versionNz.gitZdescribe)stdoutenvr   zutf-8vr   unknown)getattrRepoSourceVersionr9   _GetBasicEnvr   r   r   abspathr   r   r   
subprocessPopenGITr   PIPEr*   rE   readstripdecode
startswithsetattr)verrF   Zprojr#   r   r   r   rJ   {   s    
rJ   c               @   s@   e Zd ZdZdZdZdZedd Zedd Z	edd Z
dS )		UserAgentzMange User-Agent settings when talking to external services

  We follow the style as documented here:
  https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/User-Agent
  Nc             C   sX   | j dkrRtj}|j jdr$d}n(|dkr2d}n|dkr@d}n|dkrLd	}|| _ | j S )
zThe operating system name.NlinuxLinuxwin32ZWin32cygwinZCygwindarwinZDarwin)_osr1   platformlowerrT   )r4   os_namer   r   r   r      s    
zUserAgent.osc             C   s<   | j dkr6tj}dt | jtj j|j|j	|j
f | _ | j S )z*The UA when connecting directly from repo.Nz'git-repo/%s (%s) git/%s Python/%d.%d.%d)_repo_uar1   version_inforJ   r   r
   r5   fullmajorminormicro)r4   
py_versionr   r   r   repo   s    
zUserAgent.repoc             C   s*   | j dkr$dtj j| jt f | _ | j S )zThe UA when running git.Nzgit/%s (%s) git-repo/%s)_git_uar
   r5   rc   r   rJ   )r4   r   r   r   r
      s    
zUserAgent.git)rA   rB   rC   __doc__r]   ra   ri   propertyr   rh   r
   r   r   r   r   rW      s   rW   Fr   c             C   sX   t j }| |krdS |rTdjtt| }|r4d| }td||f tjd tjd dS )NT.z for z!fatal: git %s or later required%s)r.   r   F)	r
   r5   r   mapstrr0   r1   r2   r3   )Zmin_versionfailmsgZgit_versionZneedr   r   r   git_require   s    
rq   c            	   @   s2   e Zd ZdddZedd Zdd Zd	d
 ZdS )r9   FNc             C   s  | j  }| | d| _|r$d|d< |	rDt |d< t |d< d|d< d|krd	tjkrd
|d f }|jd}|d k	r|d | }||d< d|krd|d< tj|d< |r|
s|j	}
|s|j
}tg}|r|r||t< d }
|j|d  tjj r|d d"krd|krd|kr|jd |j|dd   |r<tj}nd }tj}|rRtjntj}t rNd}|
rt|
krtstr|d7 }|d|
 7 }|
at|krt|t krtstr|d7 }|d|t  7 }|t a|d7 }|dj|7 }|tjkr|d7 }|tjkr|d7 }|tjkr0|d7 }n|tjkrD|d7 }td| ytj||
||||d }W n8 tk
r } ztd!|d |f W Y d d }~X nX |	rt| || _|j| _d S )#N)rE   r2   :Z
GIT_EDITORZREPO_SSH_SOCKZGIT_SSHZsshZGIT_SSH_VARIANT
http_proxyr\   z'http.proxy=%s'ZGIT_CONFIG_PARAMETERS ZGIT_ALLOW_PROTOCOLz@file:git:http:https:ssh:persistent-http:persistent-https:sso:rpcZGIT_HTTP_USER_AGENTr   fetchclonez
--progressz--quietr   r   
z: cd %s
z: export GIT_DIR=%s
z: z 0<|z 1>|z 2>|z 2>&1z%s)cwdrF   stdinrE   r2   z%s: %s)ru   rv   )rK   teer   r    r1   r^   get
user_agentr
   ZworktreegitdirrO   r   r"   r2   isattyr8   rM   rP   STDOUTr   LAST_CWDLAST_GITDIRr   r   rN   	Exceptionr   r$   processry   )r4   projectr;   ZbareZprovide_stdinZcapture_stdoutZcapture_stderrZmerge_outputZdisable_editorZ	ssh_proxyrx   r}   rF   sr#   r<   ry   rE   r2   Zdbger   r   r   __init__   s    






&zGitCommand.__init__c              C   s6   t jj } x&ttdddddfD ]}| j|d qW | S )z^Return a basic env for running git under.

    This is guaranteed to be side-effect free.
    Z GIT_ALTERNATE_OBJECT_DIRECTORIESZGIT_OBJECT_DIRECTORYZGIT_WORK_TREEZGIT_GRAFT_FILEZGIT_INDEX_FILEN)r   environcopyr   r   pop)rF   keyr   r   r   rK   E  s    

zGitCommand._GetBasicEnvc             C   s"   z| j }| j }W d t| X |S )N)r   _CaptureOutputr'   )r4   r#   rcr   r   r   r:   V  s
    
zGitCommand.Waitc             C   s   | j }tjj }|j|jtjd |jd k	r>|j|jtjd d| _d| _x|js|j	 }x|D ]x}|j
 }|s||j| q`t|ds|j }|jdkr|  j|7  _n|  j|7  _| j|j r`|jj| |jj  q`W qLW |j S )NrE   r2   r   encode)r   platform_utilsFileDescriptorStreamsr   addrE   r1   r2   is_doneselectrQ   r%   hasattrrS   std_namerz   destwriteflushr*   )r4   r#   Zs_inZin_readyr   bufr   r   r   r   ^  s.    





zGitCommand._CaptureOutput)	FFFFFFFNN)rA   rB   rC   r   staticmethodrK   r:   r   r   r   r   r   r9      s           
`r9   )r   r   r   )r   r   r   )T)Fr   )*
__future__r   r   r1   rM   r   signalr   errorr   Zgit_refsr   r   
repo_tracer   r   r   wrapperr	   rO   ZMIN_GIT_VERSION_SOFTZMIN_GIT_VERSION_HARDr   r   r   r   r   r!   r   r    r$   r'   r,   r/   objectr-   r
   rJ   rW   r|   rq   r9   r   r   r   r   <module>   s@   

	5
