From e378f4477f462b7a13b258e00a2e7a1c159a2d27 Mon Sep 17 00:00:00 2001 From: Douglas Raillard Date: Thu, 15 Feb 2024 11:16:50 +0000 Subject: [PATCH 1/2] tools/batch-rebase: Allow any branch name FIX Allow branch names like refs/merge-requests/1234/head --- tools/batch-rebase/src/batch_rebase/main.py | 25 ++++++++++++++++----- 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/tools/batch-rebase/src/batch_rebase/main.py b/tools/batch-rebase/src/batch_rebase/main.py index 51e08d043..3eaa6c007 100755 --- a/tools/batch-rebase/src/batch_rebase/main.py +++ b/tools/batch-rebase/src/batch_rebase/main.py @@ -41,6 +41,10 @@ def info(msg): def warn(msg): logging.warning(msg) +def error(msg): + logging.error(msg) + + def get_nested_key(conf, key): for k in key: conf = conf[k] @@ -225,7 +229,10 @@ def do_create(conf_folder, repo, temp_repo, new_branch, conf, persistent_tags, t # Create the new branch at the beginning of the cherry picking session base = conf['base'] - git(['fetch', '--', base['remote'], base['ref']]) + base_ref = base['ref'] + remote = base['remote'] + remote_base = remote_tracking(remote, base_ref) + git(['fetch', '--', remote, f'{base_ref}:{remote_base}']) git(['checkout', '-b', new_branch, 'FETCH_HEAD']) # Start cherry picking topics @@ -273,6 +280,10 @@ def do_cherry_pick(repo, temp_repo, conf, persistent_tags, tags_suffix, branch, return (not has_conflict, 1 if has_conflict else 0) +def remote_tracking(remote, tip): + return f'refs/remotes/{remote}/batch-rebase-tips/{tip}' + + def _do_cherry_pick(repo, conf, persistent_tags, tags_suffix): git = make_git_func(repo) @@ -367,18 +378,20 @@ def _do_cherry_pick(repo, conf, persistent_tags, tags_suffix): nr_commits = topic.get('nr-commits') # Fetch the topic base and tip - git(['fetch', '--', remote, tip]) + remote_tip = remote_tracking(remote, tip) + git(['fetch', '--', remote, f'{tip}:{remote_tip}']) + tip = remote_tip if base is not None: - git(['fetch', '--', remote, base]) + remote_base = remote_tracking(remote, base) + git(['fetch', '--', remote, f'{base}:{remote_base}']) + base = remote_base elif nr_commits is not None: base = f'{tip}~{nr_commits}' else: raise ValueError(f'base or nr-commits need to be set on topic "{name}"') - range_base = f'refs/remotes/{remote}/{base}' - range_tip = f'refs/remotes/{remote}/{tip}' - range_ref = f'{range_base}..{range_tip}' + range_ref = f'{base}..{tip}' range_sha1s = list(reversed(git(['rev-list', range_ref], capture=True).splitlines())) nr_commits = len(range_sha1s) -- GitLab From 8950f6b4d0e59fcdb1fd3b4b3027edeb0db15e36 Mon Sep 17 00:00:00 2001 From: Douglas Raillard Date: Thu, 15 Feb 2024 11:17:55 +0000 Subject: [PATCH 2/2] tools/lisa-combine-gitlab-mr: Use merge request reference FIX Use merge request reference instead of the branch on the fork as the fork might not be accessible (private fork) even if the merge request reference can be fetched. --- .../src/lisa_combine_gitlab_mr/main.py | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/tools/lisa-combine-gitlab-mr/src/lisa_combine_gitlab_mr/main.py b/tools/lisa-combine-gitlab-mr/src/lisa_combine_gitlab_mr/main.py index 8ba752b7a..933ea6ffa 100755 --- a/tools/lisa-combine-gitlab-mr/src/lisa_combine_gitlab_mr/main.py +++ b/tools/lisa-combine-gitlab-mr/src/lisa_combine_gitlab_mr/main.py @@ -47,24 +47,26 @@ def get_gitlab_mrs(api_url, project_id, api_token=None, state="opened", scope="a r.raise_for_status() return r + # Get the clone URL of the original repo + clone_url = call_gitlab_api( + f"projects/{project_id}" + ).json()['http_url_to_repo'] + def get_mr(mr): - # populate commits count - use another api + iid = mr['iid'] mr_commit_response = call_gitlab_api( - f"projects/{project_id}/merge_requests/{mr['iid']}/commits" + f"projects/{project_id}/merge_requests/{iid}/commits" ) mr_commit_response = mr_commit_response.json() assert isinstance(mr_commit_response, list) commits_count = len(mr_commit_response) - # mr could be from a fork - use another api - project_response = call_gitlab_api( - f"projects/{mr['source_project_id']}" - ) - clone_url = project_response.json()['http_url_to_repo'] - return dict( sha=mr['sha'], - source_branch=mr['source_branch'], + # We use the magic branch associated with the merge-request instead + # of the "real" source branch and its associated repo, as the + # latter could be a private fork we don't have direct access to. + source_branch=f'refs/merge-requests/{iid}/head', commits_count=commits_count, clone_url=clone_url, ) -- GitLab