
    bEf}.                     d    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          Z
dS )    N)quote)request)BadCredentialsException)*c                       e Zd ZdZddZedefd            Zd Ze	d             Z
d Zd	 Zd
 Z	 	 ddededej        dej        def
dZed             ZddZddZed             Zd Z	 ddZddZdS )Driveru   
    Важно не спамить API запросами, т.к. есть ограничения.
    Кешируем всё что можно.
    Nc                 N    ddl m}  ||          | _        i | _        d | _        d S )Nr   )Github)githubr
   api_repos_user)selftokenr
   s      ./modules/git/github.py__init__zDriver.__init__   s5    !!!!!!6%==


    sc                     | oTt           j                             |                     dd                                        t           j        j                  S )NZz+00:00)datetimefromisoformatreplace
astimezonetimezoneutc)r   s    r   _parse_datetimezDriver._parse_datetime   sC     pX&44QYYsH5M5MNNYYZbZkZopppr   c                    t          j        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                             i d|d         dt          |d                   d|d         d|d         d         d|d         d         d         d|d         d         d|d          d         d!|d          d         d         d"|d          d         d#|                    d$          o|d$         d%         d&|                    d$          o|d$         d         d'|d(         d)|d*         d+k    rd+n|d,         rd,nd-d.|d.         d,|d,         d/|d0         d1| 	                    |d1                   |                    d2          o|d2         d%         |                    d2          o|d2         d         |d         |d3         |d4         |d5         d6           |                    d          |                    d7          |                    d8          }}
}	|	rn|
rl|rj|	
                    d9          rU|	                    d9dd:          }	|d;                             |	||d<k    |d          d=t          |	d>           d?           |                    d5g           }|D ]}|d5                             |d         |d         |d@         |dA         | 	                    |dB                   |dC         d         |dC                             dD          |dC         dE         dF           |S )GNz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%   )responserepobranchescommitsmerge_requestspull_requestr.   r'   titler(   numberhead_branch_nameheadref	head_repor+   head_shashabase_branch_namebase	base_repobase_shaauthor_loginuserloginauthor_ext_idtextbodystatusstateopenmergedclosed	mergeable	merge_shamerge_commit_sha	merged_at	merged_by	additions	deletionsr-   )merged_by_loginmerged_by_ext_idr)   rL   rM   r-   beforeafterzrefs/heads/   r,   (0000000000000000000000000000000000000000/tree/safe)r'   r7   deletedr)   r)   message	timestampauthorusernameemail)r'   r7   r)   r@   dateauthor_namer<   author_email)jsonloadsr   dataheadersprintstrgetappendr   
startswithr   r   )r   	hook_dataeventhook_idtarget_type	target_id	repo_dataresultpr_datar4   rP   rQ   r-   commit_datas                 r   process_webhook_requestzDriver.process_webhook_request   s   Jw|,,	 01/"45o&NOO$JK	l+	3G 3 3k 3 3T] 3 3hm 3 3#K03 3	4 	4 	4
 !+.#io:N:NW`akWl"+--0@$"G"GI I  
 
 --// 	#$++ -(-#gdm,,- '(+- #GFOE$:	-
 WV_V4[A- GFOE2- #GFOE$:- WV_V4[A- GFOE2- F 3 3 P8P-  V!4!4!N9N- - GG$4$>$>&&PWX`PaDoHHgo-  W[1!-" '(+#-$ W%78%-& T11'+2FGG'-* $+;;{#;#;#]@TU\@]$+KK$<$<$[AUVZA[z*$[1$[1"9-7- - -   D ']]5119==3J3JIMMZaLbLbUV 	O6 	Oe 	O}(E(E 	O++mR33C:%%Ee?i6i#J/LLuSr7J7J7JLL'N 'N O O O --	2.." 	 	K9$$#D)+d2CKX]L^#I.8L8L[YdMe8f8f*84V< +H 5 9 9* E E +H 5g >& &     r   c                 Z    | j         s| j                                        | _         | j         S N)r   r   get_user)r   s    r   r=   zDriver.userg   s)    z 	-**,,DJzr   c                     t          |          }|| j        vr"| j                            |          | j        |<   | j        |         S rt   )intr   r   get_repo)r   r(   s     r   rx   zDriver.get_repom   sC    V$$"&("3"3F";";DK{6""r   c                 2   g }	 | j                                         D ]V}|| j        |j        <   |                    |j        t          |j                  |j        t          |dd           d           Wn"# t          $ r}t          d          |d }~ww xY w|S )Nr%   r&   uS   Ошибка аутентификации на стороне сервера github)r=   	get_reposr   r#   rg   r!   re   r$   getattrr   CmfAuthError)r   ro   r+   es       r   available_reposzDriver.available_reposs   s    	}	++-- N N'+DG$ Nc$'ll4=&-d4Dd&K&KM M N N N NN
 ' 	} 	} 	}tuu{||	} s   A0A5 5
B?BBc                 n    |                      |          fd                                D             S )Nc           
      v    g | ]5}|j         |j        j        j         d t	          |j         d           d6S )rT   r"   rU   )r'   r7   r)   )r'   commitr7   r$   r   ).0branchr+   s     r   
<listcomp>z'Driver.get_branches.<locals>.<listcomp>   sb     / / /  FM,=-LLuV[r/J/J/JLLN N/ / /r   )rx   get_branches)r   r(   r+   s     @r   r   zDriver.get_branches   sM    }}V$$/ / / / ++--	/ / / 	/r   r7   pathsinceuntilrZ   c              #   >  	K   t                      		fddD             } |                     |          j        di |D ]}|j        |j        |j        |j        j        |j        j        j        |j        r|j        j	        p|j        j        j	        |j        o|j        j
        |j        r|j        j        p|j        j        j        |j        ot          |j        j                  d |j        D             |j        j        |j        j        |j        j        dV  d S )Nc                 2    i | ]}|         
||         S  r   )r   plocals_s     r   
<dictcomp>z'Driver.iter_commits.<locals>.<dictcomp>   s9       qzwqz  r   )r7   r   r   r   rZ   c                     g | ]	}|j         
S r   )r7   )r   r   s     r   r   z'Driver.iter_commits.<locals>.<listcomp>   s    :::aAE:::r   )r'   r7   r)   r@   r]   r^   r<   r_   r?   parentsrL   rM   totalr   )localsrx   get_commitsr7   r$   r   rX   rZ   r]   r'   r>   r\   re   r#   r   statsrL   rM   r   )
r   r(   r7   r   r   r   rZ   get_commits_kwargsr   r   s
            @r   iter_commitszDriver.iter_commits   sF      ((   @  
 8dmmF++7MM:LMM 		w 		wF
6:fo-v}7K7P%}C1C`v}G[G` & E&-2E & E&-2E cI]Ic!'!H3v}7G3H3H::6>:::#\3&,BXcicocuw w w w w w		w 		wr   c                    i d| j         dt          | j                  d| j        d| j        j        d| j        j        j        d| j        j        d| j	        j        d| j	        j        j        d	| j	        j        d
| j
        o| j
        j        d| j
        o| j
        j        d| j
        o| j
        j        d| j
        o| j
        j        d| j        d| j        dk    rdn
| j        rdndd| j        d| 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'   r(   r1   r2   r5   r6   r8   r:   r;   r^   r<   r_   r?   r@   rB   rD   rE   rF   rG   )
rH   rJ   merged_by_namerN   merged_by_emailrO   r)   rL   rM   r-   )r0   re   r#   r1   r3   r4   r+   r!   r7   r9   r=   r'   r>   r\   rA   rC   rE   rG   rI   rJ   rK   r$   rL   rM   r-   )mrs    r   _mr2dictzDriver._mr2dict   s   
BH
c"%jj
 bi
 	

 /
 
 
 /
 
 273rw|
 BG5
 BG5
 RW3
 BG
 F 2 2ffBI8[S[
  !
" bi#
$ , l@r|/@!|B0B!|B0B " @;z9
 
 
 	
r   c                     ddl m} |                     |          }	 |                    |          }n# |$ r Y d S w xY w|                     |          S )Nr   )UnknownObjectException)r   r   rx   get_pullr   )r   r(   r1   r   r+   r   s         r   get_merge_requestzDriver.get_merge_request   sq    111111}}V$$	v&&BB% 	 	 	44	}}R   s   3 <<Tc                 ~                           |          }|rdnd} fd|                    |          D             S )NrD   allc                 :    g | ]}                     |          S r   )r   )r   r   r   s     r   r   z-Driver.get_merge_requests.<locals>.<listcomp>   s%    HHHbb!!HHHr   )rC   )rx   	get_pulls)r   r(   	only_openr+   rC   s   `    r   get_merge_requestszDriver.get_merge_requests   sJ    }}V$$#.HHHHDNNN,G,GHHHHr   c                 F    dt           j                            |            S )Nz&git_webhook_name=)urllibparser   )webhook_names    r   _webhook_name_url_tagzDriver._webhook_name_url_tag   s     FFL$6$6|$D$DFFFr   c                     |                      |          }|                     |          }|                                D ]}||j        d         v r|c S d S )Nr)   )r   rx   	get_hooksconfig)r   r(   r   tagr+   hooks         r   _get_webhook_by_namezDriver._get_webhook_by_name   sk     ((66}}V$$NN$$ 	 	Ddk%((( )	 	r   Fc           
         |                      |          }|                     ||          }	g d}
||                     |          z  }t          |d|rdnd          }|	rn|	j        |k    s%t          |	j                  t          |
          k    r=t          d|	j         d|	j         d| d|
            |	                    d	||

           n,t          d| d|
            |	                    d	||
          }	t          |	j                  S )N)pushr/   createdeleter   r`   10)r)   content_typeinsecure_sslz-github driver: webhook config differ github: , z	 != eva: web)eventszgithub: create webhook )rx   r   r   dictr   setr   rd   editcreate_hookre   r#   )r   r(   webhook_urlr   r   secretwebhook_ext_id_kwargsr+   r   webhook_eventswebhook_configs               r   setup_webhookzDriver.setup_webhook   sZ   " }}V$$((>>SSSt11,???+FXdQmQTQTjmnnn 	K{n,,DK0@0@CDWDW0W0W`` `'+{` `=K` `O]` `a a a 		%	GGGNNNNnNNOOO##E>>JJD47||r   c                     |                      ||          }|r=t          d|j         d|j         d|j                    |                                 d S d S )Nzgithub: delete webhook(z) r   )r   rd   r#   r   r   r   )r   r(   r   r   r   r   s         r   cleanup_webhookzDriver.cleanup_webhook   sg    ((>> 	SDGSSt{SSdkSSTTTKKMMMMM	 	r   rt   )NNNNN)T)FNN)NN)__name__
__module____qualname____doc__r   staticmethodre   r   rr   propertyr=   rx   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r      s            q3 q q q \qJ J JX   X
# # #  / / / 8<\`w w"w14w$w4<4EwVYw w w w* 
 
 \
@	! 	! 	! 	!I I I I
 G G \G   fj! ! ! !F     r   r   )r   r`   r   urllib.parser   flaskr   r   r   cmf.includer   r   r   r   <module>r      s                   * * * * * *    w w w w w w w w w wr   