1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
|
"""
once an issue is assigned a specific label
create merge requests for each branch related to that issue
branch relation is figured out by looking at related merge requests
"""
import logging
from labbot.config import Config
log = logging.getLogger(__name__)
config = Config()
config.set_global_data(
stable_branch = "main",
staging_branch = "staging",
merge_label = "Release",
)
@config.config_decorator()
async def issue_update_hook(event, gl, *args, **kwargs):
issue_id = event.object_attributes["iid"]
issue_url = f"/projects/{event.project_id}/issues/{issue_id}"
issue_data = await gl.getitem(issue_url)
branches = {}
if config["merge_label"] in issue_data["labels"]:
async for merge_data in gl.getiter(f"{issue_url}/related_merge_requests"):
source_branch = merge_data["source_branch"]
target_branch = merge_data["target_branch"]
merge_id = merge_data["iid"]
# we only want staging merges
if target_branch != config["staging_branch"]:
continue
if not source_branch in branches:
branches[source_branch] = []
branches[source_branch].append(f"!{merge_id}")
if branches:
branch_str = ", ".join(branches.keys())
log.debug(f"`{branch_str}`({event.project_id}) are ready to be merged into stable")
merge_url = f"/projects/{event.project_id}/merge_requests"
for branch, merge in branches.items():
merge_exists = False
async for merge_data in gl.getiter(merge_url, params={
"source_branch": branch,
"target_branch": config["stable_branch"]
}):
# We have found a merge request, we cannot sanely re-merge again.
merge_exists = True
break
if merge_exists:
log.debug(f"merge for `{branch}` already exists")
else:
merge_string = ", ".join(merge)
await gl.post(merge_url, data={
"source_branch": branch,
"target_branch": config["stable_branch"],
"title": f"[stable] Merge `{branch}` into `{config['stable_branch']}`",
"description": f"Related to #{issue_id} \n \nStaging Merges: \n{merge_string}"
})
def setup(bot) -> None:
config.setup(__name__, bot.name)
bot.register_issue_hook(issue_update_hook)
|