Skip to content

Commit 5f74c4f

Browse files
committed
fix: 修复合并插件配置后没有删除对应分支和关闭议题的问题
1 parent 102d3aa commit 5f74c4f

File tree

8 files changed

+303
-93
lines changed

8 files changed

+303
-93
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/lang/zh-CN/
77

88
## [Unreleased]
99

10+
### Fixed
11+
12+
- 修复合并插件配置后没有删除对应分支和关闭议题的问题
13+
1014
## [4.1.2] - 2024-12-02
1115

1216
### Fixed

src/plugins/github/depends/__init__.py

Lines changed: 53 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
)
1111
from nonebot.params import Depends
1212

13-
from src.plugins.github.constants import REMOVE_LABEL
13+
from src.plugins.github.constants import CONFIG_LABEL, REMOVE_LABEL
1414
from src.plugins.github.models import GithubHandler, IssueHandler, RepoInfo
1515
from src.plugins.github.typing import IssuesEvent, LabelsItems, PullRequestEvent
1616
from src.plugins.github.utils import run_shell_command
@@ -19,18 +19,18 @@
1919
from .utils import extract_issue_number_from_ref
2020

2121

22-
def bypass_git():
22+
async def bypass_git():
2323
"""绕过检查"""
2424
# https://github.blog/2022-04-18-highlights-from-git-2-36/#stricter-repository-ownership-checks
2525
run_shell_command(["git", "config", "--global", "safe.directory", "*"])
2626

2727

28-
def install_pre_commit_hooks():
28+
async def install_pre_commit_hooks():
2929
"""安装 pre-commit 钩子"""
3030
run_shell_command(["pre-commit", "install", "--install-hooks"])
3131

3232

33-
def get_labels(event: PullRequestEvent | IssuesEvent):
33+
async def get_labels(event: PullRequestEvent | IssuesEvent):
3434
"""获取议题或拉取请求的标签"""
3535
if isinstance(event, PullRequestClosed | PullRequestReviewSubmitted):
3636
labels = event.payload.pull_request.labels
@@ -39,7 +39,7 @@ def get_labels(event: PullRequestEvent | IssuesEvent):
3939
return labels
4040

4141

42-
def get_labels_name(labels: LabelsItems = Depends(get_labels)) -> list[str]:
42+
async def get_labels_name(labels: LabelsItems = Depends(get_labels)) -> list[str]:
4343
"""通过标签获取名称"""
4444
label_names: list[str] = []
4545
if not labels:
@@ -51,12 +51,12 @@ def get_labels_name(labels: LabelsItems = Depends(get_labels)) -> list[str]:
5151
return label_names
5252

5353

54-
def get_issue_title(event: IssuesEvent):
54+
async def get_issue_title(event: IssuesEvent):
5555
"""获取议题标题"""
5656
return event.payload.issue.title
5757

5858

59-
def get_repo_info(event: PullRequestEvent | IssuesEvent) -> RepoInfo:
59+
async def get_repo_info(event: PullRequestEvent | IssuesEvent) -> RepoInfo:
6060
"""获取仓库信息"""
6161
repo = event.payload.repository
6262
return RepoInfo(owner=repo.owner.login, repo=repo.name)
@@ -72,19 +72,19 @@ async def get_installation_id(
7272
return installation.id
7373

7474

75-
def get_issue_number(event: IssuesEvent) -> int:
75+
async def get_issue_number(event: IssuesEvent) -> int:
7676
"""获取议题编号"""
7777
return event.payload.issue.number
7878

7979

80-
def get_related_issue_number(event: PullRequestClosed) -> int | None:
80+
async def get_related_issue_number(event: PullRequestClosed) -> int | None:
8181
"""获取 PR 相关联的议题号"""
8282
ref = event.payload.pull_request.head.ref
8383
related_issue_number = extract_issue_number_from_ref(ref)
8484
return related_issue_number
8585

8686

87-
def is_bot_triggered_workflow(event: IssuesEvent):
87+
async def is_bot_triggered_workflow(event: IssuesEvent):
8888
"""是否是机器人触发的工作流"""
8989
if (
9090
isinstance(event, IssueCommentCreated)
@@ -102,7 +102,9 @@ def is_bot_triggered_workflow(event: IssuesEvent):
102102
return False
103103

104104

105-
def get_github_handler(bot: GitHubBot, repo_info: RepoInfo = Depends(get_repo_info)):
105+
async def get_github_handler(
106+
bot: GitHubBot, repo_info: RepoInfo = Depends(get_repo_info)
107+
):
106108
"""获取 GitHub 处理器"""
107109
return GithubHandler(bot=bot, repo_info=repo_info)
108110

@@ -136,7 +138,7 @@ async def get_related_issue_handler(
136138
)
137139

138140

139-
def get_type_by_labels_name(
141+
async def get_type_by_labels_name(
140142
labels: list[str] = Depends(get_labels_name),
141143
) -> PublishType | None:
142144
"""通过标签的名称获取类型"""
@@ -146,6 +148,44 @@ def get_type_by_labels_name(
146148
return None
147149

148150

149-
def is_remove_workflow(labels: list[str] = Depends(get_labels_name)) -> bool:
151+
async def is_publish_workflow(
152+
labels: list[str] = Depends(get_labels_name),
153+
publish_type: PublishType | None = Depends(get_type_by_labels_name),
154+
) -> bool:
155+
"""是否是发布工作流
156+
157+
通过标签判断
158+
仅包含发布相关标签,不包含 remove/config 标签
159+
"""
160+
if publish_type is None or REMOVE_LABEL in labels or CONFIG_LABEL in labels:
161+
logger.debug("与发布无关,已跳过")
162+
return False
163+
164+
return True
165+
166+
167+
async def is_remove_workflow(
168+
labels: list[str] = Depends(get_labels_name),
169+
publish_type: PublishType | None = Depends(get_type_by_labels_name),
170+
) -> bool:
150171
"""是否是 Remove 工作流"""
172+
if publish_type is None:
173+
logger.debug("与发布无关,已跳过")
174+
return False
175+
151176
return REMOVE_LABEL in labels
177+
178+
179+
async def is_config_workflow(
180+
labels: list[str] = Depends(get_labels_name),
181+
publish_type: PublishType | None = Depends(get_type_by_labels_name),
182+
) -> bool:
183+
"""是否是 Config 工作流
184+
185+
仅支持插件发布
186+
"""
187+
if publish_type != PublishType.PLUGIN:
188+
logger.debug("与插件无关,已跳过")
189+
return False
190+
191+
return CONFIG_LABEL in labels

src/plugins/github/depends/utils.py

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import re
22

3-
from src.plugins.github.constants import REMOVE_LABEL
43
from src.plugins.github.typing import PullRequestLabels
54
from src.providers.validation.models import PublishType
65

@@ -21,13 +20,3 @@ def get_type_by_labels(labels: PullRequestLabels) -> PublishType | None:
2120
if label.name == type.value:
2221
return type
2322
return None
24-
25-
26-
def is_remove_by_pull_request_labels(labels: PullRequestLabels) -> bool:
27-
"""通过拉取请求的标签确认是否是删除类型"""
28-
for label in labels:
29-
if isinstance(label, str):
30-
continue
31-
if label.name == REMOVE_LABEL:
32-
return True
33-
return False

src/plugins/github/plugins/config/__init__.py

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@
1616
get_github_handler,
1717
get_installation_id,
1818
get_issue_handler,
19-
get_type_by_labels_name,
2019
is_bot_triggered_workflow,
20+
is_config_workflow,
2121
)
2222
from src.plugins.github.models import IssueHandler
2323
from src.plugins.github.models.github import GithubHandler
@@ -26,9 +26,7 @@
2626
ensure_issue_plugin_test_button,
2727
ensure_issue_plugin_test_button_in_progress,
2828
)
29-
from src.plugins.github.plugins.remove.depends import check_labels
3029
from src.plugins.github.typing import IssuesEvent
31-
from src.providers.validation.models import PublishType
3230

3331
from .constants import BRANCH_NAME_PREFIX, COMMIT_MESSAGE_PREFIX, RESULTS_BRANCH
3432
from .utils import (
@@ -39,20 +37,16 @@
3937

4038
async def check_rule(
4139
event: IssuesEvent,
42-
is_config: bool = check_labels(CONFIG_LABEL),
4340
is_bot: bool = Depends(is_bot_triggered_workflow),
44-
publish_type: PublishType = Depends(get_type_by_labels_name),
41+
is_config: bool = Depends(is_config_workflow),
4542
) -> bool:
4643
if is_bot:
4744
logger.info("机器人触发的工作流,已跳过")
4845
return False
49-
if publish_type != PublishType.PLUGIN:
50-
logger.info("与插件无关,已跳过")
51-
return False
5246
if event.payload.issue.pull_request:
5347
logger.info("评论在拉取请求下,已跳过")
5448
return False
55-
if is_config is False:
49+
if not is_config:
5650
logger.info("非配置工作流,已跳过")
5751
return False
5852
return True
@@ -131,7 +125,7 @@ async def handle_remove_check(
131125

132126
async def review_submitted_rule(
133127
event: PullRequestReviewSubmitted,
134-
is_config: bool = check_labels(CONFIG_LABEL),
128+
is_config: bool = Depends(is_config_workflow),
135129
) -> bool:
136130
if not is_config:
137131
logger.info("拉取请求与配置无关,已跳过")

src/plugins/github/plugins/publish/__init__.py

Lines changed: 10 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -16,20 +16,18 @@
1616

1717
from src.plugins.github.constants import (
1818
BRANCH_NAME_PREFIX,
19-
CONFIG_LABEL,
20-
REMOVE_LABEL,
2119
TITLE_MAX_LENGTH,
2220
)
2321
from src.plugins.github.depends import (
2422
bypass_git,
2523
get_github_handler,
2624
get_installation_id,
2725
get_issue_handler,
28-
get_labels_name,
2926
get_related_issue_handler,
3027
get_related_issue_number,
3128
install_pre_commit_hooks,
3229
is_bot_triggered_workflow,
30+
is_publish_workflow,
3331
)
3432
from src.plugins.github.models import GithubHandler, IssueHandler
3533
from src.providers.validation.models import PublishType, ValidationDict
@@ -52,35 +50,18 @@
5250
)
5351

5452

55-
async def publish_related_rule(
56-
labels: list[str] = Depends(get_labels_name),
57-
publish_type: PublishType = Depends(get_type_by_labels_name),
58-
) -> bool:
59-
"""确保与发布相关
60-
61-
通过标签判断
62-
仅包含发布相关标签,不包含 remove/config 标签
63-
"""
64-
for label in labels:
65-
if label == REMOVE_LABEL:
66-
return False
67-
if label == CONFIG_LABEL:
68-
return False
69-
return True
70-
71-
7253
async def check_rule(
7354
event: IssuesOpened | IssuesReopened | IssuesEdited | IssueCommentCreated,
74-
publish_type: PublishType | None = Depends(get_type_by_labels_name),
7555
is_bot: bool = Depends(is_bot_triggered_workflow),
56+
is_publish: bool = Depends(is_publish_workflow),
7657
) -> bool:
7758
if is_bot:
7859
logger.info("机器人触发的工作流,已跳过")
7960
return False
8061
if event.payload.issue.pull_request:
8162
logger.info("评论在拉取请求下,已跳过")
8263
return False
83-
if not publish_type:
64+
if not is_publish:
8465
logger.info("议题与发布无关,已跳过")
8566
return False
8667

@@ -89,7 +70,7 @@ async def check_rule(
8970

9071
publish_check_matcher = on_type(
9172
(IssuesOpened, IssuesReopened, IssuesEdited, IssueCommentCreated),
92-
rule=Rule(check_rule, publish_related_rule),
73+
rule=Rule(check_rule),
9374
)
9475

9576

@@ -201,10 +182,10 @@ async def handle_pull_request_and_update_issue(
201182

202183

203184
async def pr_close_rule(
204-
publish_type: PublishType | None = Depends(get_type_by_labels_name),
185+
is_publish: bool = Depends(is_publish_workflow),
205186
related_issue_number: int | None = Depends(get_related_issue_number),
206187
) -> bool:
207-
if publish_type is None:
188+
if not is_publish:
208189
logger.info("拉取请求与发布无关,已跳过")
209190
return False
210191

@@ -215,9 +196,7 @@ async def pr_close_rule(
215196
return True
216197

217198

218-
pr_close_matcher = on_type(
219-
PullRequestClosed, rule=Rule(pr_close_rule, publish_related_rule)
220-
)
199+
pr_close_matcher = on_type(PullRequestClosed, rule=Rule(pr_close_rule))
221200

222201

223202
@pr_close_matcher.handle(
@@ -240,9 +219,9 @@ async def handle_pr_close(
240219

241220
async def review_submitted_rule(
242221
event: PullRequestReviewSubmitted,
243-
publish_type: PublishType | None = Depends(get_type_by_labels_name),
222+
is_publish: bool = Depends(is_publish_workflow),
244223
) -> bool:
245-
if publish_type is None:
224+
if not is_publish:
246225
logger.info("拉取请求与发布无关,已跳过")
247226
return False
248227
if event.payload.review.author_association not in ["OWNER", "MEMBER"]:
@@ -256,7 +235,7 @@ async def review_submitted_rule(
256235

257236

258237
auto_merge_matcher = on_type(
259-
PullRequestReviewSubmitted, rule=Rule(review_submitted_rule, publish_related_rule)
238+
PullRequestReviewSubmitted, rule=Rule(review_submitted_rule)
260239
)
261240

262241

src/plugins/github/plugins/remove/__init__.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,21 +21,21 @@
2121
get_type_by_labels_name,
2222
install_pre_commit_hooks,
2323
is_bot_triggered_workflow,
24+
is_remove_workflow,
2425
)
2526
from src.plugins.github.models import IssueHandler
2627
from src.plugins.github.models.github import GithubHandler
2728
from src.plugins.github.typing import IssuesEvent
2829
from src.providers.validation.models import PublishType
2930

30-
from .constants import BRANCH_NAME_PREFIX, REMOVE_LABEL
31-
from .depends import check_labels
31+
from .constants import BRANCH_NAME_PREFIX
3232
from .render import render_comment, render_error
3333
from .utils import process_pull_reqeusts
3434
from .validation import validate_author_info
3535

3636

3737
async def pr_close_rule(
38-
is_remove: bool = check_labels(REMOVE_LABEL),
38+
is_remove: bool = Depends(is_remove_workflow),
3939
related_issue_number: int | None = Depends(get_related_issue_number),
4040
) -> bool:
4141
if not is_remove:
@@ -51,7 +51,7 @@ async def pr_close_rule(
5151

5252
async def check_rule(
5353
event: IssuesEvent,
54-
is_remove: bool = check_labels(REMOVE_LABEL),
54+
is_remove: bool = Depends(is_remove_workflow),
5555
is_bot: bool = Depends(is_bot_triggered_workflow),
5656
) -> bool:
5757
if is_bot:
@@ -60,7 +60,7 @@ async def check_rule(
6060
if event.payload.issue.pull_request:
6161
logger.info("评论在拉取请求下,已跳过")
6262
return False
63-
if is_remove is False:
63+
if not is_remove:
6464
logger.info("非删除工作流,已跳过")
6565
return False
6666
return True
@@ -122,7 +122,7 @@ async def handle_remove_check(
122122

123123
async def review_submitted_rule(
124124
event: PullRequestReviewSubmitted,
125-
is_remove: bool = check_labels(REMOVE_LABEL),
125+
is_remove: bool = Depends(is_remove_workflow),
126126
) -> bool:
127127
if not is_remove:
128128
logger.info("拉取请求与删除无关,已跳过")

0 commit comments

Comments
 (0)