
    1zhc                         d dl Z d dlZd dlZd dlmZ d dl d dlZ G d dej                  j                  j                  j                        Zy)    N)Response)*c                   n    e Zd Zej                  j
                  j                  j                  j                  ddgz   Zd Z	d Z
d Zd Zd Zd Zd	 Z fd
Z fdZd Zd Zd ZddZedd       Zej3                  dej4                        ZddZe eddd      dd              Zdd fd
Z  xZ!S )CmfPluginGitsyncsync_repo_listc           
         t         j                  }d| dt        j                  j	                  | j
                  j                  j                         dt        j                  j	                  | j                  j                  j                         dt        j                  j	                  | j                  j                         S )Nzhttps://z/pub/webhook?token=z&name=z&plugin=)
configAPP_FQDNurllibparsequoteplugintokenvaluewebhookcode)selfhostnames     &./modules/git/models/cmf_plugin_git.pywebhook_urlzCmfPluginGit.webhook_url   s    ??( $ll(():):)@)@ABV\\''(9(9(?(?@Av||))$))//:;= 	=    c                 .    | j                   j                  S N)idr   r   s    r   webhook_ext_namezCmfPluginGit.webhook_ext_name   s    ww}}r   c                 .   |j                         D ]9  \  }}||j                  v s	 |dk(  r|j                  dd      }t        |||       ; |S # t        $ r<}|dk(  r+dt        |      v rt        ||d        t        |  d|        n|Y d }~~d }~ww xY w)Nauthor_emailz@@@u6   Неправильный формат ввода emailuN   ::sync: author_email. Неправильный формат ввода email: )itemsfieldsreplacesetattrCmfValidationErrorstrprint)r   commitcommit_datakeyr   es         r   _set_commit_datazCmfPluginGit._set_commit_data   s    %++- 	 JCfmm#
 n, %dC 8FC/	   *  n,1impqrms1sT2&tuzt{|} ~ s   $A	B2BBc                 2
   t         j                  |  d       | j                  g d       | j                         }	 |j	                         }|j                  dd      }t        j                  | j                   dd	d
      5  t         j                  |  d|d   d    d|d   d    d       t        j                  j                  | |d   d         }t        j                   j#                  | |ddg      D ci c]  }|j$                  j&                  | }}|j                  dg       D ]  }|d   }	|j                  |	      }|s(t        |  d|	        t        j!                  | ||	      }|j)                         D ]!  \  }
}|
|j*                  v st-        ||
|       # t        j/                         5  |j1                          d d d         i }|j                  d      }|r8|D ]  }t        j2                  j5                  | |d         r nt        j3                  | |      }| j7                  ||      }t        j/                         5  |j1                          d d d        | j9                  |j:                  j&                  dg      D ]n  }|j=                  |j                  j&                  |      }|j>                  jA                  |       t        |  d|jB                  j&                  d d   d!| d"       p  t        |  d#tE        |       d"       |jG                         D ]s  }t        jH                  jK                  |d$d%       t        j/                         5  |j1                  d&       d d d        t        jH                  jK                  |d$d'       u |j                  d(g       D ]  }|d   }t        jL                  j                  | ||g d)*      }|s(t        |  d+|        t        jM                  | ||,      }d-|_'        |j)                         D ]!  \  }
}|
|j*                  v st-        ||
|       # t        j/                         5  |j1                          d d d         	 d d d        |S # t
        $ rA t        d       t        t        j                         t        t        j                  d        w xY wc c}w # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   wxY w# 1 sw Y   OxY w# 1 sw Y   |S xY w).Nz.webhook_call: start)
projectsplugin.ext_tokenplugin.tokenplugin.ext_urlplugin.verify_ssltyper   webhook_ext_idwebhook_insecure_sslwebhook_secretzWebhook error, call params:T)flushresponse ::lock::sync,     timeoutblocking_timeoutz$.webhook_call: update data for repo reponame(ext_id))
git_pluginrC   deletedurlrE   r@   r"   branchesz .webhook_call:   add new Branch rE   r@   rA   commitssharE   rL   rE   r@   git_commitsr"   z.webhook_call:   add bind    z to z new commits.z.webhook_call:   add new updatebefore_save	only_data
after_savemerge_requestsr   head_branchbase_branchauthor	merged_by)rE   r@   rC   r"   z'.webhook_call:   add new Merge Request rE   r@   rC   F)(gdebugload_fields_get_driverprocess_webhook_request	Exceptionr'   requestheadersdatagetcmfutilCmfLockr   models
CmfGitRepoCmfGitBranchlistrA   r   r!   r"   r$   disable_aclsaveCmfGitCommitsgetr,   find_related_taskstext
setdefaultrO   appendrL   lenvaluesCmfAutomationCrudTrigger	crud_hookCmfGitMergeRequestrF   )r   _kwargsdriverrequest_datar8   r@   branchlocal_branchesbranch_datarA   r*   r   task_to_savecommits_datar)   r(   taskmr_datarC   mrs                       r   webhook_callzCmfPluginGit.webhook_call*   s   	4&,-. [ 	\ !!#	!99;L  ##J3 __y5sUW_X @	GG&  (01<3G3Q2RRSUV $$((DfAUV^A_(`D8>8K8K8P8P#$	57I 9Q 9KL.4!!6)LN L  ,//
B? 
""6*'++D1TF"B4&IJ#00DtRV0WF"-"3"3"5 4JCfmm+U34 ((* "KKM" "
"  L'++I6L#/ pK **//4[QVEW/X#00Dt0LF!226;GF ,,. && $ 7 78I8IS`Ra 7 b p+66tww}}dK((//7&@AQAQRTSTAU@VVZ[_Z``mnopp 7L8I7J-XY$++- X//99$-X((* .III-.//99$,WX (++,<bA  *..22#$vU 3 W TF"I&RS22dV\2]B"
")--/ 0JCbii'C/0 ((* GGI g@	B W  	/0'//"',,d+	 L" ""& &. .$ @	B s   R A8T<SA;T#T9S
B	TS%$DT*S2=B?T=#T S?1
TA
STS"T%S/*T2S<7T?T	TTc                 F   t         j                  d| j                   d| j                   dd      }|j                  j                  t         j                  j                                |j                  d      }|j                          || j                  _        | j                  j                          t         j                  | j                  d|| j                   d| j                   d| j                   d| j                   d	
      j                         | _        y )Nu   Интеграция :T)rA   system
user_localF)alert u.   Интеграция с Git сервером (z).)	hook_typer   
token_userrA   rs   )rj   	CmfPersonr3   r   rg_member_ofru   
CmfWebhookwebhook_person_groupgenerate_webhook_tokenro   r   r   r   )r   r   r   s      r   _init_webhookzCmfPluginGit._init_webhook   s   %%(1TYYK@Z^ & `
&&v'8'8'M'M'OP111>! ((iiII;a		{+4bcgclclbmmnosoxoxnyy{2| ) ~ C  C  E 	r   c                     | j                   j                  }|s:t        j                  d| j                  d      }|j                          || _         y y )Ngit  )r3   rA   sync_period)r   r   rj   	CmfPluginrA   ro   r   r   s     r   _calc_pluginzCmfPluginGit._calc_plugin   sD    ""%%5tyyd%SFKKM DK	 r   c                 X    | j                   r| j                  s| j                          y y y r   )is_newr   r   r   s    r   _calc_webhookzCmfPluginGit._calc_webhook   s"    ;;t||   ,;r   c                 *    t         |          g dz   S )N)r   r3   r   r6   )supersave_preload_fields)r   	__class__s    r   r   z CmfPluginGit.save_preload_fields   s    w*,/^^^r   c                     | j                          | j                          | j                  s+dj                  t	        j
                  dd            | _        t        |   di |S )Nr9   >qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890   )k )r   r   r6   joinrandomchoicesr   ro   )r   kwargsr   s     r   ro   zCmfPluginGit.save   s^    """$''&.. 	+ #D
 w|%f%%r   c           
         d }| j                   dk(  rx| j                  j                  st        d|  dd       ddlm} t        j                         5  | j                  j                  j                         }d d d         |      }n| j                   d	k(  r| j                  j                  st        d
|  dd       ddl	m} t        j                         5  | j                  j                  j                         }d d d         || j                  j                  j                  | j                  j                  j                        }n| j                   dk(  rddlm}  |       }|s_t        d| j                   j                   d| j                   j                   ddj!                  | j                   j"                               |S # 1 sw Y   XxY w# 1 sw Y   xY w)Ngithubu.   У плагина интеграции Github uX    не указан токен доступа в конфигурации плагина.Tabortr   )Driver)r   gitlabu.   У плагина интеграции Gitlab )rG   
ssl_verifyr   evagitu#   Не правильно задан rB   u)   ): допустимые значения r9   )r3   r   	ext_token	cmf_alertmodules.git.githubr   rh   rn   decryptmodules.git.gitlabext_urlr   
verify_sslmodules.git.evagitCmfErrorcaptionr   r   )r   r|   r   r   s       r   ra   zCmfPluginGit._get_driver   s   99 ;;((DTF  Kc  d  lpq1$$& 8--5578%(FYY(";;((DTF  Kc  d  lpq1$$& 8--5578KK''--$++:P:P:V:VF YY("1XF5dii6G6G5H$))//IZ [::<''$))BSBS:T9UWX X +8 88 8s   %G%GGG$c                     | j                   j                         j                  }d |_        |j	                          t        | j                  ddi       t        d       y )N	is_manualT)r   u   Синхронизация запущена, она может выполняться длительное время. После завершения вы получите уведомление)r   loadr   sync_last_datetimero   schedule_deferred_jobsync_all_pluginsr   r   s     r   r   zCmfPluginGit.sync   sT    !!#))$(!!!;*=	
 	  X  	Yr   c           	         t        |  d       | j                  g d       | j                         }t        j                  j                  | g d      D ci c]  }|j                  j                  | }}t        |  d       	 |j                         }D ]  }|d
   }|j                  |d       }|s5t        |  d|d           t        j	                  | || j                        }d|_        |j#                         D ]!  \  }}||j$                  v st'        |||       # |j)                          |j*                  s|j-                  || j/                         | j1                         | j2                  j                  | j4                  | j6                  j                          |j9                         D ]@  }|j                   rt        |  d|j:                          d|_        |j)                          B y c c}w # t        $ r3 t        j                  d| j                          t        dd	       Y w xY w)Nz::sync: start)r/   r0   r1   r2   plugin.sync_enabledr.   r3   r   r4   r5   r6   rC   rG   default_branchr   rF   	last_syncr3   rE   r"   z::sync: load reposu&   Ошика синхронизации u   Не удалось подключиться к репозиторию. Проверьте настройки подключения и повторите попытку.Tr   rC   z::sync:   add new Repo rA   )rE   rC   r3   F)r   webhook_namer4   insecure_sslsecretz::sync:   del Repo )r'   r`   ra   rj   rk   rm   rC   r   available_reposCmfAuthErrorlogging	exceptionr   r   popr3   rF   r!   r"   r$   ro   r   setup_webhookr   r   r4   r5   r6   rw   rA   )	r   r|   r@   local_reposavalilable_repos	repo_datarC   r*   r   s	            r   r   zCmfPluginGit.sync_repo_list   sF   m$% g 	h !!# ))..b / 
 KKt#
 
 	()*	J%557
 * 	^Ix(F??640D5i6G5HIJ((Ddii(X DL'oo/ .
U$++%D#u-. IIKyy$$ $ 0 0 2!%!6!6!8I\I\IbIb!%!:!:4CVCVC\C\	 % ^	^2  &&( 	D||TF-dii[9:DLIIK	O
  	J FtwwiPQ } EIJ J	Js   G>H 8H?>H?c                 "
   i }t         j                  j                  | |ddg      D ci c]  }|j                  j                  | }}|j                  |j                  j                        D ]  }|d   }|j                  |d       }|s(t        |  d|        t         j                  | ||      }d|_	        |j                         D ]!  \  }}	||j                  v st        |||	       # |j                  r|j                          t         j                  j!                  | |d   	      rd
}
|j#                  |j                  j                  |      D ]  }t         j                  j!                  | |d   	      r n|
dz  }
t         j                  | |      }| j%                  ||      }|j                          | j'                  |j(                  j                  dg      D ]C  }|j+                  |j,                  j                  |      }|j.                  j1                  |       E  |
st        |  d|
 d|         |j3                         D ]V  }t         j4                  j7                  |dd       |j                  d       t         j4                  j7                  |dd       X |j3                         D ]@  }|j                  rt        |  d|j                          d|_	        |j                          B t         j8                  j                  | |g d      D ci c]  }|j                  j                  | }}|j;                  |j                  j                  d      D ]  }|d   }|j                  |d       }|s(t        |  d|        t         j9                  | ||      }d|_	        |j                         D ]!  \  }}	||j                  v st        |||	       # |j                  s|j                           |j3                         D ]  }|j<                  dk7  r|j?                  |j                  j                  |j@                  j                        }|rVt        |  d|j                          d|_	        |j                         D ]!  \  }}	||j                  v st        |||	       # n!t        |  d |j                          d|_	        |j                  s|j                           y c c}w c c}w )!NrF   rG   rH   rA   z::sync:   add new Branch rJ   FrL   rM   r   )rL      rN   rO   rP   z::sync:   add z new commits from Branch rR   rS   TrT   rV   z::sync:   del Branch rX   )	only_openrC   z ::sync:   add new Merge Request r]   open)numberz::sync:   close Merge Request z::sync:   del Merge Request )!rj   rl   rm   rA   r   get_branchesrC   r   r'   rF   r!   r"   r$   
is_changedro   rp   rq   iter_commitsr,   rr   rs   rt   r   rO   ru   rw   rx   ry   rz   get_merge_requestsstatusget_merge_requestr   )r   r@   r|   r   r~   r   r   rA   r*   r   commits_countr)   r(   r   r   	local_mrsr   rC   s                     r   	sync_repozCmfPluginGit.sync_repo  s    4:4G4G4L4LdIu3E 5M 5GH*0FKKv%H H "..t{{/@/@A %	]Kv&D#''d3F7v>?,,4d,S"FN)//1 0
U&--'FC/0    ""''4[=O'PM%224;;3D3D$2O 4 &&++tUAS+T",,4,H..v{C 33FKK4E4E}o3^ 4D'22477==$GD$$++F344 n]O;TUYTZ[\K%	]P !'') 	TD++55dHmTIII%++55dHlS		T %++- 	F~~TF/}=>!FNKKM	 +1*C*C*H*Hd3m +I +op$&BIIOORp	 p 001B1Bd0S 	GX&Fvt,B>vhGH..$TRX.YBJ%mmo ,
U"))#BU+, }}		 ""$ 	ByyF"..t{{/@/@.YG<T[[MJK"
")--/ 0JCbii'C/0 :4;;-HI!
}}	!	[Hvps   T+Tc                 `    d }|r)t         j                  j                  ddd|gdd|gg      }|S )NORlogin=email)filter)rj   r   rg   )clsrE   git_id	git_login	git_emailgit_namepersons          r   find_personzCmfPluginGit.find_persono  s@    %%))$#y8QT[]`bkSl1m)nFr   z(?P<code>[A-Z\d]+-\d+)c                 Z    t         j                  j                  ||| j                        S )u   
        Нужно в тексте найти все потенциальные коды. Можно просто все слова...
        )r"   r.   )rj   CmfTaskrr   r.   )r   rs   r"   s      r   rr   zCmfPluginGit.find_related_tasksx  s$     ~~00ft}}0]]r   Tz	@minutely)	only_once
system_jobscheduleFc           	      	   dd l }t        j                  j                  g d      D ]  }t        j                  d| t        j                         |j                  s4t        j                  t        j                  j                   d| d       l|j                  j                  }|j                  sL| sJt        j                  d| t        j                         d	|_        |j                          t                |j                  j                  xs d
}|j                   r@|j                   j"                  |k  r't        j                  dt        j                         @t        j                  t        j                  j                   d|        t        j                  | d       	 |j%                          t                |j5                         }d}d }t6        j9                  |j:                   ddd      5  t        j<                  j                  |g d      D ]  }	t        j                  | d|	        |	j>                  st        j                  | d|	 d       E	 t        j                  d|	 t        j                         |jA                  |	|       |	jB                  j-                          |	j                  d        	 d d d        |j                  j                  jD                  rOt        j                  | d       d|j                  _        |j                  j                  j                  d       |s"d |_        |j                   j-                          n9d|_        |j                   j-                          |j                   |_        ||_        |j                          t                 y # t&        $ r}t        j(                  d|       t+                d|_        |j                   j-                          |j                   |_        | d|j1                          |_        |j                          t                Y d }~8d }~ww xY w# t&        $ rB}d}| d|j1                          }t        j(                  d|       t+                Y d }~d }~ww xY w# 1 sw Y   xY w)!Nr   )r   zplugin.*r/   r0   r1   r2   r   r.   r3   r   r4   r5   r6   rP   u   Синхронизируем )levelz!.sync_all_plugins: !!! Skip sync z die no plugin configured.u   Пропускаем disabledr   ue   С последней синхронизации прошло недостаточно времениz.sync_all_plugins: Try sync z::sync_all_plugins: startzsync_repo_list %s errorerror
Fr:   r;      r=   r   r   z::sync: repo z::sync: Skip repo z (sync=False)u;   Синхронизируем гит репозиторий TrT   zSync %s errorz& first sync Success, enable auto sync!success)#	tracebackrj   r   rm   r^   r_   r   INFOr   
class_namer   sync_enabledsync_statusro   commit_with_eventr   r   ager   rc   r   rollback_purge_eventset_nowsync_last_error_datetime
format_excsync_last_error_messagera   rh   ri   r   rk   r   r   r   is_null)
r   r   rE   r   periodr+   r|   
has_errorsr   r@   s
             r   r   zCmfPluginGit.sync_all_plugins~  s    	 !--22 ;k2 l R	 JGG3J<@GU$$**556 7&&0\1KMN &&,,F''9/x8w||L%/"!#''--5F((V-F-F-J-JV-S  IP  IU  IU  VGGv**5566RS]R^_`GGzl";<=))+!#  ++-FJE JMM?,!?_ab %"--22#-j 3  %D :,mD6 BC#yyGGzl2DTF-$XY$%GG&abfag$h*1,, $ 8&00v> NN224 III5%%0   --55:,&LMN15
!!.!!'',,t,<%."))113%,"))113282K2K/16.KKMeR	 4  	!!";VD$&%,"))113282K2K/453b9M9M9O8P1Q.!#	D  ) %)-J'(cI,@,@,B+C$DE#--ovF02$%#% %sQ   2O
A)R5/A&Q'R5
	Q$BQQ$'	R2	07R-	'R5-R2	2R55R?	)forcec                    | j                   j                           | j                   j                  |ddi| t        |   |d|i|S )Nr  T)r   r   deleter   )r   r  argsr   r   s       r   r  zCmfPluginGit.delete  sJ    T888w~t;5;F;;r   r   )NNNNN)F)"__name__
__module____qualname__modulesr   r"   cmf_plugin_gitr   api_methodsr   r   r,   r   r   r   r   r   ro   ra   r   r   r   classmethodr   recompileASCII_TASK_CODE_SEARCH_RErr   staticmethodcmf_deferred_jobr   r  __classcell__)r   s   @r   r   r      s    ++$$33@@LL$P
 
K= VpE !!_	&<Y6paF   ::&?J^ LV  M V p #( < <r   r   )r   urllib.parser   r   flaskr   cmf.include!modules.git.fields.cmf_plugin_gitr  r   r"   r  r   r   r   r   <module>r"     s;         (Q<7;;%%44AA Q<r   