Skip to content

Commit 0662698

Browse files
committed
feat: change review module interface name for enhance review module's flexibility.
1 parent b3ff35c commit 0662698

File tree

5 files changed

+95
-75
lines changed

5 files changed

+95
-75
lines changed

review_engine/abstract_handler.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,5 @@ class ReviewHandle(object):
77
def __init__(self):
88
pass
99

10-
def merge_handle(self, changes, merge_info, hook_info, reply, model):
10+
def merge_handle(self, gitlabMergeRequestFetcher, gitlabRepoManager, hook_info, reply, model):
1111
pass

review_engine/handler/default_handler.py

Lines changed: 7 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,14 @@
99
from utils.logger import log
1010

1111

12-
def chat_review(changes, model):
12+
def chat_review(changes, generate_review, *args, **kwargs):
1313
log.info('开始code review')
1414
with concurrent.futures.ThreadPoolExecutor() as executor:
1515
review_results = []
1616
result_lock = threading.Lock()
1717

1818
def process_change(change):
19-
result = generate_review_note(change, model)
19+
result = generate_review(change, *args, **kwargs)
2020
with result_lock:
2121
review_results.append(result)
2222

@@ -68,14 +68,16 @@ def generate_review_note(change, model):
6868

6969

7070
class MainReviewHandle(ReviewHandle):
71-
def merge_handle(self, changes, merge_info, hook_info, reply, model):
71+
def merge_handle(self, gitlabMergeRequestFetcher, gitlabRepoManager, hook_info, reply, model):
72+
changes = gitlabMergeRequestFetcher.get_changes()
73+
merge_info = gitlabMergeRequestFetcher.get_info()
7274
self.default_handle(changes, merge_info, hook_info, reply, model)
7375

7476
def default_handle(self, changes, merge_info, hook_info, reply, model):
7577
maximum_files = 50
7678
if changes and len(changes) <= maximum_files:
7779
# Code Review 信息
78-
review_info = chat_review(changes, model)
80+
review_info = chat_review(changes, generate_review_note, model)
7981
if review_info:
8082
reply.add_reply({
8183
'content': review_info,
@@ -136,64 +138,4 @@ def default_handle(self, changes, merge_info, hook_info, reply, model):
136138
log.error(f"获取merge_request信息失败,project_id: {hook_info['project']['id']} |"
137139
f" merge_iid: {hook_info['object_attributes']['iid']}")
138140

139-
if __name__ == '__main__':
140-
main_handle = MainReviewHandle()
141-
from gitlab_integration.gitlab_fetcher import GitlabMergeRequestFetcher
142-
from reply_module.reply import Reply
143-
fetcher = GitlabMergeRequestFetcher(9885, 18)
144-
changes = fetcher.get_changes()
145-
info = fetcher.get_info()
146-
reply = Reply({'type': 'merge_request',
147-
'project_id': 9885,
148-
'merge_request_iid': 18})
149-
from large_model.llm_generator import LLMGenerator
150-
model = LLMGenerator.new_model()
151-
hook_info = {
152-
"object_kind": "merge_request",
153-
"event_type": "merge_request",
154-
"user": {
155-
"id": 1,
156-
"name": "John Doe",
157-
"username": "johndoe",
158-
"avatar_url": "https://example.com/uploads/user/avatar/1/index.jpg"
159-
},
160-
"project": {
161-
"id": 15,
162-
"name": "Example Project",
163-
"description": "An example project",
164-
"web_url": "https://example.com/example/project",
165-
"avatar_url": None,
166-
"git_ssh_url": "[email protected]:example/project.git",
167-
"git_http_url": "https://example.com/example/project.git",
168-
"namespace": "Example",
169-
"visibility_level": 20,
170-
"path_with_namespace": "example/project",
171-
"default_branch": "main",
172-
"homepage": "https://example.com/example/project",
173-
"url": "https://example.com/example/project.git",
174-
"ssh_url": "[email protected]:example/project.git",
175-
"http_url": "https://example.com/example/project.git"
176-
},
177-
"object_attributes": {
178-
"id": 99,
179-
"iid": 1,
180-
"target_branch": "main",
181-
"source_branch": "feature-branch",
182-
"source_project_id": 15,
183-
"target_project_id": 15,
184-
"title": "Merge feature-branch into main",
185-
"state": "opened",
186-
"merge_status": "can_be_merged",
187-
"url": "https://example.com/example/project/-/merge_requests/1",
188-
"created_at": "2025-02-10T12:34:56Z",
189-
"updated_at": "2025-02-10T12:34:56Z"
190-
},
191-
"changes": {
192-
"total_changes": 51,
193-
"files": [
194-
{"old_path": "file1.txt", "new_path": "file1.txt", "a_mode": "100644", "b_mode": "100644", "diff": "diff content"},
195-
# ... 50 more file changes ...
196-
]
197-
}
198-
}
199-
main_handle.merge_handle(changes, info, hook_info, reply, model)
141+

review_engine/review_engine.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,14 @@ def __init__(self, reply):
1414
for handle in ReviewHandle.__subclasses__():
1515
self.handles.append(handle())
1616

17-
def handle_merge(self, changes, merge_info, webhook_info):
17+
def handle_merge(self, gitlabMergeRequestFetcher, gitlabRepoManager, webhook_info):
1818
# 多线程处理
19-
threads = [threading.Thread(target=handle.merge_handle, args=(changes, merge_info, webhook_info,
20-
self.reply, LLMGenerator.new_model()))
21-
for handle in self.handles]
19+
threads = [threading.Thread(target=handle.merge_handle,
20+
args=(gitlabMergeRequestFetcher, gitlabRepoManager, webhook_info, self.reply,
21+
LLMGenerator.new_model())) for handle in self.handles]
2222
for thread in threads:
2323
thread.start()
2424
for thread in threads:
2525
thread.join()
26+
gitlabRepoManager.delete_repo()
2627
self.reply.send()

utils/gitlab_parser.py

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,27 @@ def filter_diff_content(diff_content):
66
filtered_content = re.sub(r'(^-.*\n)|(^@@.*\n)', '', diff_content, flags=re.MULTILINE)
77
# 处理代码,去掉以 + 开头的行的第一个字符
88
processed_code = '\n'.join([line[1:] if line.startswith('+') else line for line in filtered_content.split('\n')])
9-
return processed_code
9+
return processed_code
10+
11+
def filter_diff_new_line(diff_content):
12+
# 获取diff中的行号
13+
line_numbers = []
14+
current_line_num = None
15+
16+
for line in diff_content.split('\n'):
17+
if line.startswith('@@'):
18+
# 提取新的行号
19+
match = re.match(r'@@ -\d+(,\d+)? \+(\d+)(,\d+)? @@', line)
20+
if match:
21+
current_line_num = int(match.group(2))
22+
line_numbers.append(current_line_num)
23+
if match.group(3):
24+
# 去除match.group(3)的,然后转成int
25+
current_line_num += int(match.group(3)[1:]) - 1
26+
line_numbers.append(current_line_num)
27+
28+
return line_numbers
29+
30+
if __name__ == "__main__":
31+
diff_content = "@@ -3 +1,5 @@\n-hello\n+hello world\n"
32+
print(filter_diff_new_line(diff_content))

utils/tools.py

Lines changed: 58 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
import importlib
22
import os
33
import pkgutil
4+
import subprocess
45
import sys
56

7+
from utils.logger import log
8+
69

710
def import_submodules(package_name):
811
# 确保正确的工作目录
@@ -14,9 +17,60 @@ def import_submodules(package_name):
1417
for _, module_name, _ in pkgutil.iter_modules(package.__path__):
1518
importlib.import_module(f"{package_name}.{module_name}")
1619

20+
def run_command(command):
21+
process = subprocess.Popen(
22+
command,
23+
stdout=subprocess.PIPE,
24+
stderr=subprocess.PIPE,
25+
text=True
26+
)
27+
28+
while True:
29+
output = process.stdout.readline()
30+
if output == '' and process.poll() is not None:
31+
break
32+
if output:
33+
log.info(output.strip())
34+
35+
process.wait()
36+
out = process.communicate()
37+
out_len = len(out)
38+
# 获取是否有[1]
39+
if out_len > 1:
40+
stdout_output = out[1]
41+
if stdout_output:
42+
log.info(stdout_output.strip())
43+
if out_len > 2:
44+
stderr_output = out[2]
45+
if stderr_output:
46+
log.error(stderr_output.strip())
47+
return process.returncode
1748

1849
if __name__ == "__main__":
19-
from review_engine.review_engine import ReviewEngine
20-
from reply_module.reply import Reply
21-
re = ReviewEngine(Reply(9885, 18))
22-
re.handle_merge("changes", "info")
50+
from config.config import *
51+
def _build_authenticated_url(repo_url):
52+
# 如果 URL 使用 https
53+
token = gitlab_private_token
54+
if repo_url.startswith("https://"):
55+
return f"https://oauth2:{token}@{repo_url[8:]}"
56+
# 如果 URL 使用 http
57+
elif repo_url.startswith("http://"):
58+
return f"http://oauth2:{token}@{repo_url[7:]}"
59+
else:
60+
raise ValueError("Unsupported URL scheme")
61+
authenticated_url = _build_authenticated_url(gitlab_server_url)
62+
63+
# Build the Git command
64+
branch_name = "test3"
65+
repo_path = "./repo"
66+
command = ["git", "clone", "--depth", "1"]
67+
if branch_name:
68+
command.extend(["--branch", branch_name])
69+
command.extend([authenticated_url, repo_path + "/" + str(branch_name)])
70+
else:
71+
command.extend([authenticated_url, repo_path + "/default"])
72+
# command 打印为字符串
73+
print(" ".join(command))
74+
# command 添加clone到的位置:
75+
if run_command(command) != 0:
76+
log.error("Failed to clone the repository")

0 commit comments

Comments
 (0)