Skip to content

Commit 7fab448

Browse files
committed
fix(reply): handle non-MR requests without error
1 parent e0a9919 commit 7fab448

File tree

7 files changed

+62
-27
lines changed

7 files changed

+62
-27
lines changed

gitlab_integration/webhook_listener.py

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,28 @@ def handle_webhook(self):
2828
return self.call_handle(gitlab_payload, event_type)
2929

3030
def call_handle(self, gitlab_payload, event_type):
31-
reply = Reply(gitlab_payload.get('project')['id'], gitlab_payload.get("object_attributes")["iid"])
3231
if event_type == 'merge_request':
32+
config = {
33+
'type': 'merge_request',
34+
'project_id': gitlab_payload.get('project')['id'],
35+
'merge_request_iid': gitlab_payload.get('object_attributes')['iid']
36+
}
37+
reply = Reply(config)
3338
return self.handle_merge_request(gitlab_payload, reply)
3439
elif event_type == 'push':
40+
config = {
41+
'type': 'push',
42+
'project_id': gitlab_payload.get('project')['id']
43+
}
44+
reply = Reply(config)
45+
3546
return self.handle_push(gitlab_payload, reply)
3647
else:
48+
config = {
49+
'type': 'other',
50+
'project_id': gitlab_payload.get('project')['id']
51+
}
52+
reply = Reply(config)
3753
return self.handle_other(gitlab_payload, reply)
3854

3955
def handle_merge_request(self, gitlab_payload, reply):

reply_module/reply.py

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,14 @@
44

55

66
class Reply:
7-
def __init__(self, project_id, merge_request_iid):
7+
def __init__(self, config):
8+
if not isinstance(config, dict):
9+
raise Exception('Reply config should be a dict.')
10+
if 'type' not in config:
11+
raise Exception('Reply config should contain a type field.')
12+
self.config = config
813
self.replies = []
914
self.lock = threading.Lock()
10-
self.project_id = project_id
11-
self.merge_request_iid = merge_request_iid
1215

1316
def add_reply(self, reply_msg):
1417
# reply 格式检查:title, content 必选
@@ -40,7 +43,7 @@ def send(self):
4043
self.__parse_msg(main_msg, msg_list)
4144
ret = True
4245
for target, msg in msg_list.items():
43-
reply_target = ReplyFactory.get_reply_instance(target, self.project_id, self.merge_request_iid)
46+
reply_target = ReplyFactory.get_reply_instance(target, self.config)
4447
ret &= reply_target.send(msg)
4548
return ret
4649

@@ -53,7 +56,7 @@ def send_single_message(self, reply):
5356
targets = ReplyFactory.get_all_targets()
5457
ret = True
5558
for target in targets:
56-
reply_target = ReplyFactory.get_reply_instance(target, self.project_id, self.merge_request_iid)
59+
reply_target = ReplyFactory.get_reply_instance(target, self.config)
5760
# 如果title不为__IGNORE__ or __MAIN_REVIEW__, 则发送带有标题的消息
5861
if 'title' not in reply or reply['title'] not in ['__IGNORE__', '__MAIN_REVIEW__']:
5962
ret &= reply_target.send(f"## {reply['title']}\n\n{reply['content']}\n\n")
@@ -75,7 +78,9 @@ def __parse_msg(self, msg, msg_list):
7578

7679

7780
if __name__ == '__main__':
78-
reply = Reply(9885, 18)
81+
reply = Reply({'type': 'merge_request',
82+
'project_id': 9885,
83+
'merge_request_iid': 18})
7984
threads = []
8085
for i in range(10):
8186
threads.append(threading.Thread(target=reply.add_reply, args=(

reply_module/reply_target/abstract_reply.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,8 @@
22

33
class AbstractReply(ABC):
44
@abstractmethod
5-
def __init__(self, project_id, merge_request_id):
6-
self.project_id = project_id
7-
self.merge_request_id = merge_request_id
5+
def __init__(self, config):
6+
self.config = config
87

98
@abstractmethod
109
def send(self, message):

reply_module/reply_target/dingtalk_reply.py

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,18 @@
1111

1212

1313
class DingtalkReply(AbstractReply):
14-
def __init__(self, project_id, merge_request_id):
15-
super().__init__(project_id, merge_request_id)
14+
def __init__(self, config):
15+
super().__init__(config)
16+
self.type = config['type']
17+
if self.type == 'merge_request':
18+
self.project_id = config['project_id']
19+
self.merge_request_id = config['merge_request_iid']
1620

1721
def send(self, message):
18-
return self.send_dingtalk_message_by_sign(message)
22+
if self.type == 'merge_request':
23+
return self.send_dingtalk_message_by_sign(message)
24+
else:
25+
return False
1926

2027
def send_dingtalk_message_by_sign(self, message_text):
2128
"""

reply_module/reply_target/gitlab_reply.py

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,21 @@
66

77
# 继承AbstractReply类,实现send方法
88
class GitlabReply(AbstractReply):
9-
def __init__(self, project_id, merge_request_id):
10-
super().__init__(project_id, merge_request_id)
9+
def __init__(self, config):
10+
super().__init__(config)
11+
self.type = config['type']
12+
if self.type == 'merge_request':
13+
self.project_id = config['project_id']
14+
self.merge_request_id = config['merge_request_iid']
1115

12-
@retry(stop_max_attempt_number=3, wait_fixed=2000)
1316
def send(self, message):
17+
if self.type == 'merge_request':
18+
return self.send_merge(message)
19+
else:
20+
return False
21+
22+
@retry(stop_max_attempt_number=3, wait_fixed=2000)
23+
def send_merge(self, message):
1424
headers = {
1525
"Private-Token": gitlab_private_token,
1626
"Content-Type": "application/json"
@@ -30,8 +40,4 @@ def send(self, message):
3040
else:
3141
log.error(
3242
f"评论信息发送成功:project_id:{project_id} merge_request_id:{merge_request_id} response:{response}")
33-
return False
34-
35-
if __name__ == '__main__':
36-
gitlab_reply = GitlabReply(9885, 18)
37-
gitlab_reply.send("test")
43+
return False

reply_module/reply_target/reply_factory.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,14 @@ def register_target(cls, target, target_class):
99
cls._registry[target] = target_class
1010

1111
@classmethod
12-
def get_reply_instance(cls, target, project_id, merge_request_id):
12+
def get_reply_instance(cls, target, config):
1313
if target not in cls._registry:
1414
raise ValueError(f"Unknown target: {target}")
15-
return cls._registry[target](project_id, merge_request_id)
15+
return cls._registry[target](config)
1616

1717
@classmethod
18-
def get_all_reply_instance(cls, project_id, merge_request_id):
19-
return [target_class(project_id, merge_request_id) for target_class in cls._registry.values()]
18+
def get_all_reply_instance(cls, config):
19+
return [target_class(config) for target_class in cls._registry.values()]
2020

2121
@classmethod
2222
def get_all_targets(cls):

review_engine/handler/default_handler.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from retrying import retry
55

66
from config.config import api_config, gpt_message
7-
from load_api import create_llm_api_instance
7+
from llm_api.load_api import create_llm_api_instance
88
from review_engine.handler.abstract_handler import ReviewHandle
99
from utils.gitlab_parser import filter_diff_content
1010
from utils.logger import log
@@ -147,7 +147,9 @@ def default_handle(self, changes, merge_info, hook_info, reply):
147147
fetcher = GitlabMergeRequestFetcher(9885, 18)
148148
changes = fetcher.get_changes()
149149
info = fetcher.get_info()
150-
reply = Reply(9885, 18)
150+
reply = Reply({'type': 'merge_request',
151+
'project_id': 9885,
152+
'merge_request_iid': 18})
151153
hook_info = {
152154
"object_kind": "merge_request",
153155
"event_type": "merge_request",

0 commit comments

Comments
 (0)