diff --git a/tools/batch-rebase/src/batch_rebase/main.py b/tools/batch-rebase/src/batch_rebase/main.py index 51e08d0437ef114216ae32d172d96b880ad2e9da..3eaa6c007613f6e2e4e11955f1e3545fe8c7a721 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) 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 8ba752b7a2b768d8f29f9b2b9b40ddad974d2bc0..933ea6ffa5c10cf6395e93e1bed136dfa0227f04 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, )