Skip to content
Snippets Groups Projects
common.py 2.82 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 (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")
Tim Jaacks's avatar
Tim Jaacks committed
    return project


def get_latest_commit(project, branch_name):
Tim Jaacks's avatar
Tim Jaacks committed
    """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)
        )
Tim Jaacks's avatar
Tim Jaacks committed
    return branch.commit


def rebase_merge_request(project, merge_request):
Tim Jaacks's avatar
Tim Jaacks committed
    """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)
Tim Jaacks's avatar
Tim Jaacks committed
        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
Tim Jaacks's avatar
Tim Jaacks committed
            return merge_request
        rebase_in_progress = updated_merge_request.rebase_in_progress
Tim Jaacks's avatar
Tim Jaacks committed
    return updated_merge_request