11import atexit
22import json
33import os
4+ import re
45import traceback
56from datetime import datetime
67from multiprocessing import Process
@@ -120,16 +121,16 @@ def handle_webhook():
120121 if not gitlab_url :
121122 repository = data .get ('repository' )
122123 if not repository :
123- return jsonify ({'message' : 'Missing GitLab URL' }), 400
124+ return jsonify ({'message' : 'Missing GitLab URL' }), 400
124125 homepage = repository .get ("homepage" )
125126 if not homepage :
126- return jsonify ({'message' : 'Missing GitLab URL' }), 400
127+ return jsonify ({'message' : 'Missing GitLab URL' }), 400
127128 try :
128129 parsed_url = urlparse (homepage )
129130 gitlab_url = f"{ parsed_url .scheme } ://{ parsed_url .netloc } /"
130131 except Exception as e :
131132 return jsonify ({"error" : f"Failed to parse homepage URL: { str (e )} " }), 400
132-
133+
133134 # 优先从环境变量获取,如果没有,则从请求头获取
134135 gitlab_token = os .getenv ('GITLAB_ACCESS_TOKEN' ) or request .headers .get ('X-Gitlab-Token' )
135136 # 如果gitlab_token为空,返回错误
@@ -160,20 +161,24 @@ def handle_webhook():
160161 else :
161162 return jsonify ({'message' : _ ('Invalid data format' )}), 400
162163
163- def transform_gitlab_url (url ):
164- # 去掉 http:// 或 https://
165- if url .startswith ("http://" ):
166- url = url [len ("http://" ):]
167- elif url .startswith ("https://" ):
168- url = url [len ("https://" ):]
169-
170- if url .endswith ('/' ):
171- url = url [:- 1 ]
172-
173- # 替换 . 和 / 为 _
174- transformed_url = url .replace ('.' , '_' ).replace ('/' , '_' )
175-
176- return transformed_url
164+
165+ def slugify_url (original_url : str ) -> str :
166+ """
167+ 将原始URL转换为适合作为文件名的字符串,其中非字母或数字的字符会被替换为下划线,举例:
168+ slugify_url("http://example.com/path/to/repo/") => example_com_path_to_repo
169+ slugify_url("https://gitlab.com/user/repo.git") => gitlab_com_user_repo_git
170+ """
171+ # Remove URL scheme (http, https, etc.) if present
172+ original_url = re .sub (r'^https?://' , '' , original_url )
173+
174+ # Replace non-alphanumeric characters (except underscore) with underscores
175+ target = re .sub (r'[^a-zA-Z0-9]' , '_' , original_url )
176+
177+ # Remove trailing underscore if present
178+ target = target .rstrip ('_' )
179+
180+ return target
181+
177182
178183def __handle_push_event (webhook_data : dict , gitlab_token : str , gitlab_url : str ):
179184 try :
@@ -203,7 +208,6 @@ def __handle_push_event(webhook_data: dict, gitlab_token: str, gitlab_url: str):
203208 # 将review结果提交到Gitlab的 notes
204209 handler .add_push_notes (_ ('Auto Review Result: \n {}' ).format (review_result ))
205210
206- url_base = transform_gitlab_url (gitlab_url )
207211
208212 event_manager ['push_reviewed' ].send (PushReviewEntity (
209213 project_name = webhook_data ['project' ]['name' ],
@@ -213,7 +217,7 @@ def __handle_push_event(webhook_data: dict, gitlab_token: str, gitlab_url: str):
213217 commits = commits ,
214218 score = score ,
215219 review_result = review_result ,
216- gitlab_url = url_base ,
220+ gitlab_url_slug = slugify_url ( gitlab_url ) ,
217221 ))
218222
219223 except Exception as e :
@@ -261,7 +265,6 @@ def __handle_merge_request_event(webhook_data: dict, gitlab_token: str, gitlab_u
261265 # 将review结果提交到Gitlab的 notes
262266 handler .add_merge_request_notes (_ ('Auto Review Result: \n {}' ).format (review_result ))
263267
264- url_base = transform_gitlab_url (gitlab_url )
265268 # dispatch merge_request_reviewed event
266269 event_manager ['merge_request_reviewed' ].send (
267270 MergeRequestReviewEntity (
@@ -274,7 +277,7 @@ def __handle_merge_request_event(webhook_data: dict, gitlab_token: str, gitlab_u
274277 score = CodeReviewer .parse_review_score (review_text = review_result ),
275278 url = webhook_data ['object_attributes' ]['url' ],
276279 review_result = review_result ,
277- gitlab_url = url_base ,
280+ gitlab_url_slug = slugify_url ( gitlab_url ) ,
278281 )
279282 )
280283
@@ -287,6 +290,7 @@ def __handle_merge_request_event(webhook_data: dict, gitlab_token: str, gitlab_u
287290 logger .error (_ ('出现未知错误: {}' ).format (error_message ))
288291
289292
293+
290294def filter_changes (changes : list ):
291295 '''
292296 过滤数据,只保留支持的文件类型以及必要的字段信息
0 commit comments