blob: d395160ea6d5ae2a2d52a1cd460d00b57dc783f4 (
plain)
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
|
"""
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
log = logging.getLogger(__name__)
stable_branch = "main"
staging_branch = "staging"
merge_label = "Release"
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 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 != 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}` 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": stable_branch
}):
if merge_data["state"] == "opened":
merge_exists = True
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": stable_branch,
"title": f"[stable] Merge `{branch}` into `{stable_branch}`",
"description": f"Related to #{issue_id} \n \nStaging Merges: \n{merge_string}"
})
def setup(bot) -> None:
bot.register_issue_hook(issue_update_hook)
|