From 63d1651a8e34876c2569c2d1babd54a44a01cd7d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Dylan=20A=C3=AFssi?= <dylan.aissi@collabora.com>
Date: Thu, 17 Oct 2024 12:26:58 +0200
Subject: [PATCH] apertis-pkg-merge-upstream-to-downstreams: ensure merge
 request is created against the right project
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

In case of a forked project, like we are doing with the test of the rebase,
the GitLab API creates by default the MR against the original project
instead of the forked project.
To ensure the merge request is created against the forked project, we use
the push option merge_request.target_project to overwrite the default
behavior and to create the merge request against the forked project.

See:
https://docs.gitlab.com/ee/topics/git/commit.html#push-options-for-merge-requests

Signed-off-by: Dylan Aïssi <dylan.aissi@collabora.com>
---
 .../apertis-pkg-merge-upstream-to-downstreams | 33 ++++++++++++++++++-
 1 file changed, 32 insertions(+), 1 deletion(-)

diff --git a/tools/apertis-pkg-merge-upstream-to-downstreams b/tools/apertis-pkg-merge-upstream-to-downstreams
index d265bed..fdc31a0 100755
--- a/tools/apertis-pkg-merge-upstream-to-downstreams
+++ b/tools/apertis-pkg-merge-upstream-to-downstreams
@@ -183,6 +183,32 @@ def ensure_downstream_branch(project_url, downstream, dry_run):
         raise
 
 
+def get_path_with_namespace(project_url):
+    url = urllib.parse.urlsplit(project_url)
+    project_id = urllib.parse.quote(removesuffix(url.path.strip("/"), ".git"), safe="")
+    # drop the inline auth data as urllib does not like it
+    auth, netloc_no_auth = url.netloc.split("@", 1)
+    token = auth.split(":", 1)[-1]
+    url = url._replace(
+        path=f"/api/v4/projects/{project_id}",
+        netloc=netloc_no_auth,
+    )
+    project_metadata = url.geturl()
+    req_project_metadata = urllib.request.Request(
+        url=project_metadata,
+        headers={"PRIVATE-TOKEN": token},
+    )
+    try:
+        res = urllib.request.urlopen(req_project_metadata)
+        json_res = json.load(res)
+        path_with_namespace = json_res["path_with_namespace"]
+    except urllib.error.HTTPError as e:
+        print("ERROR:", e.read().decode())
+        raise
+
+    return path_with_namespace
+
+
 def push_merge_request(
     project_url, proposed_branch, upstream, downstream, auto_merge="", dry_run=False
 ):
@@ -213,8 +239,11 @@ def push_merge_request(
 
     ensure_downstream_branch(project_url, downstream, dry_run)
 
+    project_path = get_path_with_namespace(project_url)
+
     print(
-        f"Create merge request from '{proposed_branch}' to '{downstream}'", flush=True
+        f"Create merge request from '{proposed_branch}' to '{project_path}/{downstream}'",
+        flush=True,
     )
     git_push_custom(
         "-o",
@@ -224,6 +253,8 @@ def push_merge_request(
         "-o",
         f"merge_request.target={downstream}",
         "-o",
+        f"merge_request.target_project={project_path}",
+        "-o",
         f"merge_request.title={title}",
         project_url,
         f"{proposed_branch}:{proposed_branch}",
-- 
GitLab