1
1
import atexit
2
2
import json
3
3
import os
4
+ import re
4
5
import traceback
5
6
from datetime import datetime
6
7
from multiprocessing import Process
@@ -120,16 +121,16 @@ def handle_webhook():
120
121
if not gitlab_url :
121
122
repository = data .get ('repository' )
122
123
if not repository :
123
- return jsonify ({'message' : 'Missing GitLab URL' }), 400
124
+ return jsonify ({'message' : 'Missing GitLab URL' }), 400
124
125
homepage = repository .get ("homepage" )
125
126
if not homepage :
126
- return jsonify ({'message' : 'Missing GitLab URL' }), 400
127
+ return jsonify ({'message' : 'Missing GitLab URL' }), 400
127
128
try :
128
129
parsed_url = urlparse (homepage )
129
130
gitlab_url = f"{ parsed_url .scheme } ://{ parsed_url .netloc } /"
130
131
except Exception as e :
131
132
return jsonify ({"error" : f"Failed to parse homepage URL: { str (e )} " }), 400
132
-
133
+
133
134
# 优先从环境变量获取,如果没有,则从请求头获取
134
135
gitlab_token = os .getenv ('GITLAB_ACCESS_TOKEN' ) or request .headers .get ('X-Gitlab-Token' )
135
136
# 如果gitlab_token为空,返回错误
@@ -160,20 +161,24 @@ def handle_webhook():
160
161
else :
161
162
return jsonify ({'message' : _ ('Invalid data format' )}), 400
162
163
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
+
177
182
178
183
def __handle_push_event (webhook_data : dict , gitlab_token : str , gitlab_url : str ):
179
184
try :
@@ -203,7 +208,6 @@ def __handle_push_event(webhook_data: dict, gitlab_token: str, gitlab_url: str):
203
208
# 将review结果提交到Gitlab的 notes
204
209
handler .add_push_notes (_ ('Auto Review Result: \n {}' ).format (review_result ))
205
210
206
- url_base = transform_gitlab_url (gitlab_url )
207
211
208
212
event_manager ['push_reviewed' ].send (PushReviewEntity (
209
213
project_name = webhook_data ['project' ]['name' ],
@@ -213,7 +217,7 @@ def __handle_push_event(webhook_data: dict, gitlab_token: str, gitlab_url: str):
213
217
commits = commits ,
214
218
score = score ,
215
219
review_result = review_result ,
216
- gitlab_url = url_base ,
220
+ gitlab_url_slug = slugify_url ( gitlab_url ) ,
217
221
))
218
222
219
223
except Exception as e :
@@ -261,7 +265,6 @@ def __handle_merge_request_event(webhook_data: dict, gitlab_token: str, gitlab_u
261
265
# 将review结果提交到Gitlab的 notes
262
266
handler .add_merge_request_notes (_ ('Auto Review Result: \n {}' ).format (review_result ))
263
267
264
- url_base = transform_gitlab_url (gitlab_url )
265
268
# dispatch merge_request_reviewed event
266
269
event_manager ['merge_request_reviewed' ].send (
267
270
MergeRequestReviewEntity (
@@ -274,7 +277,7 @@ def __handle_merge_request_event(webhook_data: dict, gitlab_token: str, gitlab_u
274
277
score = CodeReviewer .parse_review_score (review_text = review_result ),
275
278
url = webhook_data ['object_attributes' ]['url' ],
276
279
review_result = review_result ,
277
- gitlab_url = url_base ,
280
+ gitlab_url_slug = slugify_url ( gitlab_url ) ,
278
281
)
279
282
)
280
283
@@ -287,6 +290,7 @@ def __handle_merge_request_event(webhook_data: dict, gitlab_token: str, gitlab_u
287
290
logger .error (_ ('出现未知错误: {}' ).format (error_message ))
288
291
289
292
293
+
290
294
def filter_changes (changes : list ):
291
295
'''
292
296
过滤数据,只保留支持的文件类型以及必要的字段信息
0 commit comments