Newer
Older
#!/usr/bin/env python3
import requests
import sys
import time
from gitlab import GitlabAuthenticationError, GitlabGetError, GitlabMRRebaseError
manifest_file = "default.xml"
pending_states = ["created", "waiting_for_resource", "preparing", "pending", "running"]
def integration_branch_name(project_name, branch_name):
"""Get integration branch name"""
return "integrate/" + project_name + "/" + branch_name
def get_project(gitlab, project_name):
"""Get a GitLab project by its name (including or excluding namespace)"""
# First try direct access, assuming name contains full path including namespace
try:
project = gitlab.projects.get(project_name, retry_transient_errors=True)
except GitlabGetError:
pass
# If not found, try searching for project, assuming only name given
if not project:
for p in gitlab.projects.list(
search=project_name, retry_transient_errors=True
):
if p.name == project_name:
project = p
if not project:
sys.exit("ERROR: project '%s' not found" % project_name)
except requests.ConnectionError:
sys.exit("ERROR: could not connect to GitLab server")
except GitlabAuthenticationError:
sys.exit("ERROR: authentication failed")
def get_latest_commit(project, branch_name):
try:
branch = project.branches.get(branch_name)
except GitlabGetError as e:
sys.exit(
"ERROR: could not get branch '%s' for project '%s': %s"
% (branch_name, project.name, e)
)
if not branch:
sys.exit(
"ERROR: branch '%s' not found in project %s" % (branch_name, project.name)
)
def rebase_merge_request(project, merge_request):
"""Attempt to rebase a merge request and return the updated merge request object"""
# Rebasing takes more than one API call, see:
# https://docs.gitlab.com/ce/api/merge_requests.html#rebase-a-merge-request
try:
merge_request.rebase()
except GitlabMRRebaseError as e:
merge_request.merge_error = "Could not rebase merge request: %s" % e
return merge_request
rebase_in_progress = True
while rebase_in_progress:
time.sleep(1)
updated_merge_request = project.mergerequests.get(
id=merge_request.iid,
query_parameters={"include_rebase_in_progress": "True"},
)
except GitlabGetError as e:
merge_request.merge_error = "Could not get updated merge request: %s" % e
rebase_in_progress = updated_merge_request.rebase_in_progress