B
    bEf}.                 @   sV   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	T G dd dZ
dS )    N)quote)request)BadCredentialsException)*c               @   s   e Zd ZdZd%ddZeedddZdd	 Ze	d
d Z
dd Zdd Zdd Zd&eeejejedddZedd Zd'ddZd(ddZedd Zdd Zd)d!d"Zd*d#d$ZdS )+Driveru   
    Важно не спамить API запросами, т.к. есть ограничения.
    Кешируем всё что можно.
    Nc             C   s&   ddl m} ||| _i | _d | _d S )Nr   )Github)githubr   api_repos_user)selftokenr    r   ./modules/git/github.py__init__   s    
zDriver.__init__)sc             C   s"   | o t j | ddt jjS )NZz+00:00)datetimeZfromisoformatreplaceZ
astimezoneZtimezoneZutc)r   r   r   r   _parse_datetime   s    zDriver._parse_datetimec             C   s  t tj}tjd }tjd }tjd }tjd }|d }td| d| d| d	| d
|d  
 d|d t|d |d |dd dg g g d}|d}|r|d |d t|d |d |d d |d d d |d d |d d |d d d |d d |do |d d |do6|d d |d |d dkrNdn|d  r\d nd!|d" |d  |d# | 	|d$ |d%o|d% d |d%o|d% d |d |d& |d' |d( d) |d|d*|d+  }	}
}|	rH|
rH|rH|	
d,rH|	d,dd-}	|d. |	||d/k|d  d0t|	dd1 d2 |d(g }xb|D ]Z}|d( |d |d |d3 |d4 | 	|d5 |d6 d7 |d6 d8|d6 d9 d: qZW |S );NzX-Github-EventzX-Github-Hook-Idz&X-Github-Hook-Installation-Target-Typez$X-Github-Hook-Installation-Target-Id
repositoryz%Github.process_webhook_request: hook=z	, target=(z	), event=z, repo_name=	full_name idhtml_urldefault_branch)nameext_idurlr   )Zresponserepobranchescommitsmerge_requestspull_requestr#   titlenumberheadrefr    shabaseuserloginbodystateopenmergedclosed	mergeablemerge_commit_sha	merged_at	merged_by	additions	deletionsr"   )r   r   r&   head_branch_name	head_repohead_shabase_branch_name	base_repobase_shaauthor_loginauthor_ext_idtextstatusr2   r0   	merge_shar4   merged_by_loginmerged_by_ext_idr   r6   r7   r"   beforeafterzrefs/heads/   r!   Z(0000000000000000000000000000000000000000z/tree/)safe)r   r)   Zdeletedr   r   messageZ	timestampauthorr   Zusernameemail)r   r)   r   r@   dateauthor_namer>   author_email)jsonloadsr   dataZheadersprintstrgetappendr   
startswithr   r   )r   Z	hook_dataZeventZhook_idZtarget_typeZ	target_idZ	repo_dataresultZpr_datar(   rE   rF   r"   Zcommit_datar   r   r   process_webhook_request   sn    



(





""
 

zDriver.process_webhook_requestc             C   s   | j s| j | _ | j S )N)r   r	   Zget_user)r   r   r   r   r+   g   s    zDriver.userc             C   s.   t |}|| jkr$| j|| j|< | j| S )N)intr
   r	   get_repo)r   r   r   r   r   rZ   m   s    
zDriver.get_repoc          
   C   s   g }yJxD| j  D ]6}|| j|j< ||jt|j|jt|dd d qW W n, t	k
rz } zt
d|W d d }~X Y nX |S )Nr   )r   r   r   r   uS   Ошибка аутентификации на стороне сервера github)r+   Z	get_reposr
   r   rU   r   rS   r   getattrr   ZCmfAuthError)r   rW   r    er   r   r   available_reposs   s    zDriver.available_reposc                s    |  |  fdd  D S )Nc          
      s4   g | ],}|j |jj j d t|j dd dqS )z/tree/r   )rH   )r   r)   r   )r   commitr)   r   r   ).0branch)r    r   r   
<listcomp>   s   z'Driver.get_branches.<locals>.<listcomp>)rZ   get_branches)r   r   r   )r    r   rb      s    

zDriver.get_branches)r)   pathsinceuntilrJ   c       	      #   s   t    fdddD }x| |jf |D ]}|j|j|j|jj|jjj|jrX|jj	p`|jjj	|jol|jj
|jrz|jjp|jjj|jot|jjdd |jD |jj|jj|jjdV  q,W d S )Nc                s   i | ]} | r | |qS r   r   )r_   p)locals_r   r   
<dictcomp>   s   z'Driver.iter_commits.<locals>.<dictcomp>)r)   rc   rd   re   rJ   c             S   s   g | ]
}|j qS r   )r)   )r_   rf   r   r   r   ra      s    z'Driver.iter_commits.<locals>.<listcomp>)r   r)   r   r@   rL   rM   r>   rN   r?   parentsr6   r7   total)localsrZ   Zget_commitsr)   r   r^   rI   rJ   rL   r   r,   rK   rS   r   ri   Zstatsr6   r7   rj   )	r   r   r)   rc   rd   re   rJ   Zget_commits_kwargsr^   r   )rg   r   iter_commits   s    
zDriver.iter_commitsc             C   s   | j t| j| j| jj| jjj| jj| j	j| j	jj| j	j| j
oD| j
j| j
oP| j
j| j
o\| j
j| j
oh| j
j| j| jdkrzdn| jrdnd| j| j| j| j| jo| jj| jo| jj| jo| jj| jo| jj| j| j| j| jdS )Nr/   r0   r1   )r   r   r&   r8   r9   r:   r;   r<   r=   rM   r>   rN   r?   r@   rA   r2   r0   rB   r4   Zmerged_by_namerC   Zmerged_by_emailrD   r   r6   r7   r"   )r%   rS   r   r&   r'   r(   r    r   r)   r*   r+   r   r,   rK   r-   r.   r0   r2   r3   r4   r5   r   r6   r7   r"   )mrr   r   r   _mr2dict   s6    zDriver._mr2dictc             C   sD   ddl m} | |}y||}W n |k
r8   d S X | |S )Nr   )UnknownObjectException)r   ro   rZ   Zget_pullrn   )r   r   r&   ro   r    rm   r   r   r   get_merge_request   s    
zDriver.get_merge_requestTc                s0     |}|rdnd} fdd|j|dD S )Nr/   allc                s   g | ]}  |qS r   )rn   )r_   rm   )r   r   r   ra      s    z-Driver.get_merge_requests.<locals>.<listcomp>)r.   )rZ   Z	get_pulls)r   r   Z	only_openr    r.   r   )r   r   get_merge_requests   s    
zDriver.get_merge_requestsc             C   s   dt j|  S )Nz&git_webhook_name=)urllibparser   )webhook_namer   r   r   _webhook_name_url_tag   s    zDriver._webhook_name_url_tagc             C   s<   |  |}| |}x"| D ]}||jd kr|S qW d S )Nr   )rv   rZ   Z	get_hooksconfig)r   r   ru   tagr    hookr   r   r   _get_webhook_by_name   s
    

zDriver._get_webhook_by_nameFc          	   K   s   |  |}| ||}	dddddg}
|| |7 }t|d|r@dndd	}|	r|	j|ksht|	jt|
krtd
|	j d|	j d| d|
  |	jd||
d n"td| d|
  |	d||
}	t
|	jS )Npushr$   Zcreatedeleter   rO   10)r   Zcontent_typeinsecure_sslz-github driver: webhook config differ github: z, z	 != eva: Zweb)eventszgithub: create webhook )rZ   rz   rv   dictrw   setr   rR   ZeditZcreate_hookrS   r   )r   r   Zwebhook_urlru   r   Zsecretwebhook_ext_id_kwargsr    ry   Zwebhook_eventsZwebhook_configr   r   r   setup_webhook   s    
"zDriver.setup_webhookc             K   s<   |  ||}|r8td|j d|j d|j  |  d S )Nzgithub: delete webhook(z) z, )rz   rR   r   rw   r   r|   )r   r   ru   r   r   ry   r   r   r   cleanup_webhook   s     zDriver.cleanup_webhook)N)NNNNN)N)T)FNN)NN)__name__
__module____qualname____doc__r   staticmethodrS   r   rX   propertyr+   rZ   r]   rb   r   rl   rn   rp   rr   rv   rz   r   r   r   r   r   r   r      s$   
L	 !



"r   )r   rO   rs   Zurllib.parser   Zflaskr   r   r   Zcmf.includer   r   r   r   r   <module>   s   