aboutsummaryrefslogtreecommitdiff
path: root/labbot
diff options
context:
space:
mode:
Diffstat (limited to 'labbot')
-rw-r--r--labbot/__main__.py3
-rw-r--r--labbot/addons/merge-stable.py65
2 files changed, 67 insertions, 1 deletions
diff --git a/labbot/__main__.py b/labbot/__main__.py
index f844503..fdd2537 100644
--- a/labbot/__main__.py
+++ b/labbot/__main__.py
@@ -10,7 +10,8 @@ import labbot.logger
DEFAULT_ADDONS = [
"merge-label",
- "approve-merge"
+ "approve-merge",
+ "merge-stable"
]
@click.group()
diff --git a/labbot/addons/merge-stable.py b/labbot/addons/merge-stable.py
new file mode 100644
index 0000000..d395160
--- /dev/null
+++ b/labbot/addons/merge-stable.py
@@ -0,0 +1,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) \ No newline at end of file