11import atexit
22import json
33import os
4+ import re
45import traceback
56from datetime import datetime
67from multiprocessing import Process
@@ -117,16 +118,16 @@ def handle_webhook():
117118 if not gitlab_url :
118119 repository = data .get ('repository' )
119120 if not repository :
120- return jsonify ({'message' : 'Missing GitLab URL' }), 400
121+ return jsonify ({'message' : 'Missing GitLab URL' }), 400
121122 homepage = repository .get ("homepage" )
122123 if not homepage :
123- return jsonify ({'message' : 'Missing GitLab URL' }), 400
124+ return jsonify ({'message' : 'Missing GitLab URL' }), 400
124125 try :
125126 parsed_url = urlparse (homepage )
126127 gitlab_url = f"{ parsed_url .scheme } ://{ parsed_url .netloc } /"
127128 except Exception as e :
128129 return jsonify ({"error" : f"Failed to parse homepage URL: { str (e )} " }), 400
129-
130+
130131 # 优先从环境变量获取,如果没有,则从请求头获取
131132 gitlab_token = os .getenv ('GITLAB_ACCESS_TOKEN' ) or request .headers .get ('X-Gitlab-Token' )
132133 # 如果gitlab_token为空,返回错误
@@ -143,34 +144,40 @@ def handle_webhook():
143144 process = Process (target = __handle_merge_request_event , args = (data , gitlab_token , gitlab_url ))
144145 process .start ()
145146 # 立马返回响应
146- return jsonify ({'message' : f'Request received(object_kind={ object_kind } ), will process asynchronously.' }), 200
147+ return jsonify (
148+ {'message' : f'Request received(object_kind={ object_kind } ), will process asynchronously.' }), 200
147149 elif object_kind == "push" :
148150 # 创建一个新进程进行异步处理
149151 process = Process (target = __handle_push_event , args = (data , gitlab_token , gitlab_url ))
150152 process .start ()
151153 # 立马返回响应
152- return jsonify ({'message' : f'Request received(object_kind={ object_kind } ), will process asynchronously.' }), 200
154+ return jsonify (
155+ {'message' : f'Request received(object_kind={ object_kind } ), will process asynchronously.' }), 200
153156 else :
154157 error_message = f'Only merge_request and push events are supported (both Webhook and System Hook), but received: { object_kind } .'
155158 logger .error (error_message )
156159 return jsonify (error_message ), 400
157160 else :
158161 return jsonify ({'message' : 'Invalid data format' }), 400
159162
160- def transform_gitlab_url (url ):
161- # 去掉 http:// 或 https://
162- if url .startswith ("http://" ):
163- url = url [len ("http://" ):]
164- elif url .startswith ("https://" ):
165- url = url [len ("https://" ):]
166-
167- if url .endswith ('/' ):
168- url = url [:- 1 ]
169-
170- # 替换 . 和 / 为 _
171- transformed_url = url .replace ('.' , '_' ).replace ('/' , '_' )
172-
173- return transformed_url
163+
164+ def slugify_url (original_url : str ) -> str :
165+ """
166+ 将原始URL转换为适合作为文件名的字符串,其中非字母或数字的字符会被替换为下划线,举例:
167+ slugify_url("http://example.com/path/to/repo/") => example_com_path_to_repo
168+ slugify_url("https://gitlab.com/user/repo.git") => gitlab_com_user_repo_git
169+ """
170+ # Remove URL scheme (http, https, etc.) if present
171+ original_url = re .sub (r'^https?://' , '' , original_url )
172+
173+ # Replace non-alphanumeric characters (except underscore) with underscores
174+ target = re .sub (r'[^a-zA-Z0-9]' , '_' , original_url )
175+
176+ # Remove trailing underscore if present
177+ target = target .rstrip ('_' )
178+
179+ return target
180+
174181
175182def __handle_push_event (webhook_data : dict , gitlab_token : str , gitlab_url : str ):
176183 try :
@@ -200,7 +207,6 @@ def __handle_push_event(webhook_data: dict, gitlab_token: str, gitlab_url: str):
200207 # 将review结果提交到Gitlab的 notes
201208 handler .add_push_notes (f'Auto Review Result: \n { review_result } ' )
202209
203- url_base = transform_gitlab_url (gitlab_url )
204210
205211 event_manager ['push_reviewed' ].send (PushReviewEntity (
206212 project_name = webhook_data ['project' ]['name' ],
@@ -210,7 +216,7 @@ def __handle_push_event(webhook_data: dict, gitlab_token: str, gitlab_url: str):
210216 commits = commits ,
211217 score = score ,
212218 review_result = review_result ,
213- gitlab_url = url_base ,
219+ gitlab_url_slug = slugify_url ( gitlab_url ) ,
214220 ))
215221
216222 except Exception as e :
@@ -258,7 +264,6 @@ def __handle_merge_request_event(webhook_data: dict, gitlab_token: str, gitlab_u
258264 # 将review结果提交到Gitlab的 notes
259265 handler .add_merge_request_notes (f'Auto Review Result: \n { review_result } ' )
260266
261- url_base = transform_gitlab_url (gitlab_url )
262267 # dispatch merge_request_reviewed event
263268 event_manager ['merge_request_reviewed' ].send (
264269 MergeRequestReviewEntity (
@@ -271,7 +276,7 @@ def __handle_merge_request_event(webhook_data: dict, gitlab_token: str, gitlab_u
271276 score = CodeReviewer .parse_review_score (review_text = review_result ),
272277 url = webhook_data ['object_attributes' ]['url' ],
273278 review_result = review_result ,
274- gitlab_url = url_base ,
279+ gitlab_url_slug = slugify_url ( gitlab_url ) ,
275280 )
276281 )
277282
@@ -283,6 +288,7 @@ def __handle_merge_request_event(webhook_data: dict, gitlab_token: str, gitlab_u
283288 im_notifier .send_notification (content = error_message )
284289 logger .error ('出现未知错误: %s' , error_message )
285290
291+
286292def filter_changes (changes : list ):
287293 '''
288294 过滤数据,只保留支持的文件类型以及必要的字段信息
0 commit comments