Skip to content
Snippets Groups Projects
common.py 2.72 KiB
Newer Older
Tim Jaacks's avatar
Tim Jaacks committed
#!/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"""
    with gitlab:
        project = None
        try:
            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(gitlab, project, branch_name):
    """Get latest commit on a given project branch"""
    with gitlab:
        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(gitlab, 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
    with gitlab:
        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