
    <e}.                     ^    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	  G d d      Z
y)    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y)Driveru   
    Важно не спамить API запросами, т.к. есть ограничения.
    Кешируем всё что можно.
    Nc                 F    ddl m}  ||      | _        i | _        d | _        y )Nr   )Github)githubr
   api_repos_user)selftokenr
   s      ./modules/git/github.py__init__zDriver.__init__   s    !%=
    sc                     | xrV t         j                   j                  | j                  dd            j                  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4QYYsH5MNYYZbZkZkZoZo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   |j                  dd       dg g g d}|j                  d      }|r+|d   j                  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#|j                  d$      xr |d$   d%   d&|j                  d$      xr |d$   d   d'|d(   d)|d*   d+k(  rd+n|d,   rd,nd-d.|d.   d,|d,   d/|d0   d1| j                  |d1         |j                  d2      xr |d2   d%   |j                  d2      xr |d2   d   |d   |d3   |d4   |d5   d6       |j                  d      |j                  d7      |j                  d8      }}
}	|	rW|
rU|rS|	j                  d9      rB|	j                  d9dd:      }	|d;   j                  |	||d<k(  |d    d=t        |	d>       d?       |j                  d5g       }|D ][  }|d5   j                  |d   |d   |d@   |dA   | j                  |dB         |dC   d   |dC   j                  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#   JJw||,	 01//"45oo&NOOO$JK	l+	3G9Ik]RST]S^^ghmgn o#K013	4
 !+.#io:NW`akWl"+--0@$"GI  
 --/#$++ -(-#gdm,- '(+- #GFOE$:	-
 WV_V4[A- GFOE2- #GFOE$:- WV_V4[A- GFOE2- F 3 P8P-  V!4!N9N- - GG$4$>&PWX`PaHgo-  W[1!-" '(+#-$ W%78%-& T11'+2FG'-* $+;;{#;#]@TU\@]$+KK$<$[AUVZA[z*$[1$[1"9-7- D ']]519==3JIMMZaLbUV6e}(E++mR3C:%%Ee?i6i#J/0uSr7J6KL'N O --	2." 	K9$$#D)+d2CKX]L^#I.8L8L[YdMe8f*84V< +H 5 9 9* E +H 5g >& 	 r   c                 p    | j                   s| j                  j                         | _         | j                   S N)r   r   get_user)r   s    r   r=   zDriver.userg   s'    zz**,DJzzr   c                     t        |      }|| j                  vr(| j                  j                  |      | j                  |<   | j                  |   S rt   )intr   r   get_repo)r   r(   s     r   rx   zDriver.get_repom   sC    V$"&(("3"3F";DKK{{6""r   c                 H   g }	 | j                   j                         D ]c  }|| j                  |j                  <   |j	                  |j
                  t        |j                        |j                  t        |dd       d       e 	 |S # t        $ r}t        d      |d }~ww xY w)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'+DGG$ NNc$''l4==&-d4Dd&KM NN  ' 	}tu{||	}s   B B 	B!BB!c                     | j                  |      }|j                         D cg c]J  }|j                  |j                  j                  |j
                   dt        |j                  d       dL c}S c c}w )NrT   r"   rU   )r'   r7   r)   )rx   get_branchesr'   commitr7   r$   r   )r   r(   r+   branchs       r   r   zDriver.get_branches   sq    }}V$
 ++-	/  FMM,=,=--uV[[r/J.KLN/ 	/ /s   AA6r7   pathsinceuntilrZ   c              #     K   t               }dD ci c]  }||   r|||    }	} | j                  |      j                  di |	D ]  }
|
j                  |
j                  |
j                  |
j
                  j                  |
j
                  j                  j                  |
j                  xr |
j                  j                  xs  |
j
                  j                  j                  |
j                  xr |
j                  j                  |
j                  xr |
j                  j                  xs  |
j
                  j                  j                  |
j                  xr t        |
j                  j                        |
j                  D cg c]  }|j                   c}|
j                  j                   |
j                  j"                  |
j                  j$                  d  y c c}w c c}w w)N)r7   r   r   r   rZ   )r'   r7   r)   r@   r]   r^   r<   r_   r?   parentsrL   rM   total )localsrx   get_commitsr7   r$   r   rX   rZ   r]   r'   r>   r\   re   r#   r   statsrL   rM   r   )r   r(   r7   r   r   r   rZ   locals_pget_commits_kwargsr   s              r   iter_commitszDriver.iter_commits   sy     ( Aqz wqzM 
 8dmmF+77M:LM 		wF

6::foo--v}}7K7K7P7P%}}C1C1C`v}}G[G[G`G` & E&--2E2E & E&--2E2E cI]I]IcIc!'!H3v}}7G7G3H+1>>:aAEE:#\\33&,,BXBXcicococucuw w		w ;s   G-G#E#G-G(AG-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                  xr | j                  j                  d| j                  xr | j                  j                  d| j                  xr | j                  j                  d| j                  xr | j                  j                  d| j                  d| j                  dk(  rdn| j                   rdndd| j"                  d| j                   | j$                  | j&                  | j(                  xr | j(                  j                  | j(                  xr | j(                  j                  | j(                  xr | j(                  j                  | j(                  xr | j(                  j                  | j*                  | j,                  | j.                  | j0                  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   
BHH
c"%%j
 bii
 	

 //
 
 
 //
 
 2773rww||
 BGG5
 BGG5
 RWW3
 BGG
 F 2fBIIS[
  !
" bii#
$ ,, ll@r||/@/@!||B0B0B!||B0B0B " @;;zz9
 	
r   c                     ddl m} | j                  |      }	 |j                  |      }| j	                  |      S # |$ r Y y w xY w)Nr   )UnknownObjectException)r   r   rx   get_pullr   )r   r(   r1   r   r+   r   s         r   get_merge_requestzDriver.get_merge_request   sK    1}}V$	v&B }}R   & 		s   ; AAc                     | j                  |      }|rdnd}|j                  |      D cg c]  }| j                  |       c}S c c}w )NrD   all)rC   )rx   	get_pullsr   )r   r(   	only_openr+   rC   r   s         r   get_merge_requestszDriver.get_merge_requests   sA    }}V$#,0NNN,GHbb!HHHs   Ac                 F    dt         j                  j                  |        S )Nz&git_webhook_name=)urllibparser   )webhook_names    r   _webhook_name_url_tagzDriver._webhook_name_url_tag   s    #FLL$6$6|$D#EFFr   c                     | j                  |      }| j                  |      }|j                         D ]  }||j                  d   v s|c S  y )Nr)   )r   rx   	get_hooksconfig)r   r(   r   tagr+   hooks         r   _get_webhook_by_namezDriver._get_webhook_by_name   sN     ((6}}V$NN$ 	Ddkk%((	r   c           
         | j                  |      }| j                  ||      }	g d}
|| j                  |      z  }t        |d|rdnd      }|	rp|	j                  |k7  s!t        |	j                        t        |
      k7  rdt        d|	j                   d|	j                   d| d|
        |	j                  d	||

       n$t        d| d|
        |j                  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   s    " }}V$((>St11,??+FXdQTjmn{{n,DKK0@CDW0W}Bt{{m9^<LB~N^`a 		%	G+N+;2n=MNO##E>>JD477|r   c                     | j                  ||      }|rCt        d|j                   d|j                   d|j                          |j                          y y )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   sM    ((>+DGG9Bt{{m2dkk]STKKM 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JX  
#/ 8<\`w"w14w$$w4<4E4EwVYw* 
 
@	!I
 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r   