
    SIg;                     D    d dl Z d dlZd dlmZ d dlT  G d d          ZdS )    N)quote)*c                       e Zd ZdZ	 	 ddZedefd            Z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 запросами, т.к. есть ограничения.
    Кешируем всё что можно.
    N   c                     ddl m}  |||||||          | _        i | _        |r| j                                         d S d S )Nr   )Gitlab)urlprivate_token
ssl_verifytimeouthttp_usernamehttp_password)gitlabr	   api_reposenable_debug)	selfr
   tokenr   r   r   r   debugr	   s	            ./modules/git/gitlab.py__init__zDriver.__init__   sv     	"!!!!! 65Z'}F F F  	$H!!#####	$ 	$    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                 6   t          t          j                   t          t          j                   t                              t          j                  }t          j        d         }t          j                            dd          }|d         }t          d| d| d|d                     d	|d         t          |d
                   |d         |                    dd          dg g g d}|                    d          dk    o|                    d          }|rC|d         t          |d
                   |d         |d         |d         d         |d         |d         d         |d         |d         |d         dk    rdn|d         |d         dk    |d         d k    |                    d!          |                     |                    d"                    |d#         d$}|d         |d%         d
         k    rH|d%         d&         |d'<   |d%         d(         |d)<   |d%                             d*          }|r	d+|v r||d,<   |d-         	                    |           |                    d.          |                    d/          |                    d0          }}
}	|	rn|
rl|rj|	
                    d1          rU|	                    d1d	d2          }	|d3         	                    |	||d4k    |d          d5t          |	d	6           d7           |                    d8g           }|D ]n}|d8         	                    |d
         |d
         |d#         |d9         |                     |d:                   |d;         d&         |d;         d*         d<           o|S )=aO  
        https://docs.gitlab.com/ee/user/project/integrations/webhooks.html

        default gitlab.com webhook timeout - 10 sek
        gitlab use retries
        return 4xx - lead to automatically disable hook
        return 5xx - lead to temporarily disable hook
        gitlab store response headers and body for debug
        If a webhook fails repeatedly, it may be disabled automatically.

        Webhooks that return response codes in the 5xx range are understood to be failing intermittently and are
        temporarily disabled. These webhooks are initially disabled for 1 minute, which is extended on each retry
        up to a maximum of 24 hours.

        Webhooks that return response codes in the 4xx range are understood to be misconfigured and are permanently
        disabled until you manually re-enable them yourself.
        zX-Gitlab-EventzX-Gitlab-Instancedefaultprojectz'Gitlab.process_webhook_request: gitlab=z, event=z, repo_name=path_with_namespace idweb_urldefault_branchNnameext_idr
   r+   )responserepobranchescommitsmerge_requests
event_typemerge_requestobject_attributestitleiidsource_branchsourcetarget_branchtarget	author_iddescriptionstateopenedopendetailed_merge_status	mergeablemergedmerge_commit_sha	merged_atr
   )r-   r.   numberhead_branch_name	head_repobase_branch_name	base_repoauthor_ext_idtextstatusrC   rD   	merge_sharF   r
   userr-   author_nameusernameauthor_loginemail@author_emailr3   refbeforeafterzrefs/heads/   r1   (0000000000000000000000000000000000000000z/-/tree/)safe)r-   shadeletedr
   r2   message	timestampauthor)r-   r]   r
   rM   daterQ   rV   )printrequestheadersdatajsonloadsgetstrr#   append
startswithr   r   )r   	hook_dataeventgitlab_server_url	repo_dataresultpr_datamrrT   rW   rX   rY   r2   commit_datas                 r   process_webhook_requestzDriver.process_webhook_request    s   $ 	goglJJw|,,	  01#O//0CYOOi(	=6G = =QV = =#$9:= =	> 	> 	>
 !"78C	RVDXDXajktau"+--0@$"G"GI I  
 
 ----@gY]]SfEgEg +	0  (gdm,,!%.$+O$<$X./DE$+O$<$X./DE!(!5.$+G$4$@$@&&ggFV$%<=L!'*h6$[[);<<!11'++k2J2JKK u~7 B: {#y'8'>>>$-f$5f$==!%.v%6z%B>"!&)--g66 /SE\\).B~&#$++B/// ']]5119==3J3JIMMZaLbLbUV 	P6 	Pe 	P}(E(E 	P++mR33C:%%Ee?i6i#I.MMc8K8K8KMM'O 'O P P P --	2.." 	 	K9$$#D)+d2CKX]L^#I.8L8L[YdMe8f8f*84V< +H 5g >	& &     r   c                     t          |          }|| j        vr'| j        j                            |          | j        |<   | j        |         S N)intr   r   projectsri   )r   r.   s     r   get_repozDriver.get_repo   sF    V$$"&("3"7"7"?"?DK{6""r   c                 D   ddl m} g }	 | j        j                            dd          D ]V}|| j        |j        <   |                    |j        t          |j                  |j
        t          |dd           d           Wn# |$ r}t          d          |d }~ww xY w|S )Nr   )GitlabAuthenticationErrorT)
membershipiteratorr+   r,   uS   Ошибка аутентификации на стороне сервера gitlab)r   r|   r   ry   listr   r)   rk   r'   rj   r*   getattrCmfAuthError)r   r|   rq   r0   es        r   available_reposzDriver.available_repos   s    444444	})..$.NN N N'+DG$ 4DGUYUa&-d4Dd&K&KM M N N N NN
 ) 	} 	} 	}tuu{||	} s   A8B BBBc                 x    |                      |          }d |j                            dd          D             S )Nc                 D    g | ]}|j         |j        d          |j        dS )r)   )r-   r]   r
   )r-   commitr*   ).0branchs     r   
<listcomp>z'Driver.get_branches.<locals>.<listcomp>   sJ     K K K  FM$,?~' 'K K Kr   T)get_allr~   )rz   r1   r   )r   r.   r0   s      r   get_brancheszDriver.get_branches   sQ    }}V$$K K -,,TD,II	K K K 	Kr   r]   pathsinceuntilra   c              #     
K   |}t                      

fddD             } |                     |          j        j        d	i |dddD ]}	|	j        |	j        |	j        |	j        |                     |	j                  |	j	        |	j
        t          |	j                  |	j                            d          |	j                            d          |	j                            d          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   )ref_namer   r   r   ra   T)
with_statsr~   	additions	deletionstotal)r-   r]   r
   rM   rb   rQ   rV   parentsr   r   r   r   )localsrz   r2   r   r)   r*   r_   r#   authored_daterQ   rV   
parent_idsstatsri   )r   r.   r]   r   r   r   ra   r   get_commits_kwargsr   r   s             @r   iter_commitszDriver.iter_commits   s"      ((   E  
 9dmmF++38nn;MnZ^imnnnn 	4 	4F	&)FN0D0DVEY0Z0Z%16CV 122#\--k::IYIYZeIfIf))'224 4 4 4 4 4	4 	4r   c                    t          |d          r|j        n|j        p|j        }t          |d          r|j        dk    }n|j        dk    }i d|j        dt          |j                  d|j	        d|j
        d	|j        d
|j        d|j        d|j        d|j                            d          d|j                            d          d|j                            d          d|j        d|j        dk    rdn|j        d|d|j        dk    d|j        d|                     |j                  |o|                    d          |o|                    d          |o|                    d          |j        dS )N
merge_userrB   rC   can_be_mergedr-   r.   rG   rH   rI   head_sharJ   rK   rQ   rS   rR   rL   r)   rM   rN   r@   rA   rD   rO   rF   )merged_by_namemerged_by_loginmerged_by_ext_idr
   )hasattrr   	merged_by	closed_byrB   merge_statusr7   rj   r)   r8   r9   source_project_idr]   r;   target_project_idra   ri   r>   r?   rE   r#   rF   r*   )clsrs   r   rC   s       r   _mr2dictzDriver._mr2dict   s    (/r<'@'@RbmmblcWYWc
2.// 	;0K?II?:I0
BH0
c"%jj0
 bf0
  0	0

 -0
 0
  00
 -0
 29==000
 BIMM*550
 RY]]4000
 BN0
 H 4 4ff"(0
F G0
H bh(*I0
J ,K0
L ,,R\::M0
N )CZ^^F-C-C)DjnnV.D.D * Cz~~d/C/C:Y0
 0
 0
 0	
r   c                     ddl m} |                     |          }	 |j                            |          }n# |$ r Y d S w xY w|                     |          S )Nr   )UnknownObjectException)githubr   rz   mergerequestsri   r   )r   r.   rG   r   r0   rs   s         r   get_merge_requestzDriver.get_merge_request   sv    111111}}V$$	#''//BB% 	 	 	44	}}R   s   8 A ATc                                            |          }|rdnd} fd|j                            |d          D             S )Nr@   allc                 :    g | ]}                     |          S r   )r   )r   rs   r   s     r   r   z-Driver.get_merge_requests.<locals>.<listcomp>  s%    ___bb!!___r   T)r?   r   )rz   r   r   )r   r.   	only_openr0   r?   s   `    r   get_merge_requestszDriver.get_merge_requests  sS    }}V$$%05____D,>,C,C%Y],C,^,^____r   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                     |                      |          }|                     |          }|j                            d          D ]}||j        v r|c S d S )NT)r   )r   rz   hooksr   r
   )r   r.   r   tagr0   hooks         r   _get_webhook_by_namezDriver._get_webhook_by_name  sj     ((66}}V$$JOODO11 	 	Ddh 	 	r   Fc                    |                      |          }|                     ||          }	||                     |          z  }t          ||           }
dD ]}d|
|<   |	rd}|	                                                                D ]Y\  }}||
v r&||
|         k    rt          |	||
|                    d}/|                    d          r|rt          |	|d           d}Z|s;t          d|	                                 d|
            |		                                 n,t          d|
            |j
                            |
          }	t          |	j                  S )	N)r
   enable_ssl_verification)merge_requests_eventspush_eventsTF_eventsz-gitlab driver: webhook config differ gitlab: z	 != eva: zgitlab: create webhook )rz   r   r   dictasdictitemssetattrendswithrc   saver   createrj   r)   )r   r.   webhook_urlr   insecure_sslsecretwebhook_ext_id_kwargsr0   r   webhook_configrn   equalkeyvalues                  r   setup_webhookzDriver.setup_webhook  s    }}V$$((>>t11,???+<GWXXX= 	) 	)E$(N5!! 	5E"kkmm1133 " "
U.((s 333c>#+>??? %\\),, " "D#u---!E ndkkmmnn^lnnooo		<N<<===:$$^44D47||r   c                     |                      ||          }|r;t          d|                                 d           |                                 d S d S )Nzgitlab: delete webhook())r   rc   r   delete)r   r.   r   r   r   r   s         r   cleanup_webhookzDriver.cleanup_webhook:  s\    ((>> 	<DKKMM<<<===KKMMMMM	 	r   )NNNr   NNN)NNNNNrw   )T)FNN)NN)__name__
__module____qualname____doc__r   staticmethodrj   r#   ru   rz   r   r   r   r   classmethodr   r   r   r   r   r   r   r   r   r   r   r      s        
 BD:>$ $ $ $ q3 q q q \qj j jX# # #   K K K 8<\`4 4"4144$44<4E4VY4 4 4 4( 9
 9
 [9
v	! 	! 	! 	!` ` ` `
 G G \G   fj! ! ! !F     r   r   )r   r   urllib.parser   cmf.includer   r   r   r   <module>r      sq               v v v v v v v v v vr   