#!/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)""" project = None try: # 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") return project def get_latest_commit(project, branch_name): """Get latest commit on a given project branch""" 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) ) return branch.commit 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) try: 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 return merge_request rebase_in_progress = updated_merge_request.rebase_in_progress return updated_merge_request