Commit 969e9ec0 authored by Adrian DC's avatar Adrian DC
Browse files

feat(cli, gtlab): implement '--set-merge-method' for merge requests

Signed-off-by: default avatarAdrian DC <radian.dc@gmail.com>
parent 1b84f368
Loading
Loading
Loading
Loading
+4 −1
Changes for README.md: 4 added lines, 1 removed line.
Original line number Diff line number Diff line
@@ -57,7 +57,7 @@ usage: gitlab-projects-settings [-h] [--version] [--update-check] [--settings] [
                                [--set-avatar FILE] [--set-description TEXT] [--update-description]
                                [--run-housekeeping] [--prune-unreachable-objects]
                                [--archive-project | --unarchive-project] [--delete-group] [--delete-project]
                                [--protect-branches] [--protect-tags [LEVEL]]
                                [--protect-branches] [--protect-tags [LEVEL]] [--set-merge-method [METHOD]]
                                [--erase-jobs-artifacts | --erase-jobs-contents]
                                [--get-group-labels | --set-group-labels JSON]
                                [--get-project-labels | --set-project-labels JSON] [--]
@@ -107,6 +107,9 @@ repository settings arguments:
  --protect-branches                # Protect branches with default master/main, develop and staging
  --protect-tags [LEVEL]            # Protect tags at level [no-one,admins,maintainers,developers] (default: no-one)

merge requests settings arguments:
  --set-merge-method [METHOD]       # Set project merge requests method (Merge, Semi-linear, Fast-forward, default: Fast-forward)

ci/cd settings arguments:
  --erase-jobs-artifacts            # Erase all CI/CD jobs artifacts
  --erase-jobs-contents             # Erase all CI/CD jobs artifacts and traces
+16 −1
Changes for src/cli/entrypoint.py: 16 added lines, 1 removed line.
Original line number Diff line number Diff line
@@ -23,7 +23,10 @@ from ..prints.colors import Colors
from ..prints.themes import Themes
from ..system.platform import Platform
from ..types.environments import Environments
from ..types.gitlab import ProjectFeatures
from ..types.gitlab import (
    MergeRequestsMethod,
    ProjectFeatures,
)
from ..types.namespaces import Namespaces

# Entrypoint class, pylint: disable=too-few-public-methods
@@ -596,6 +599,18 @@ class Entrypoint:
                      f'{Colors.RESET}')
                Platform.flush()

        # Set project merge method
        if options.set_merge_method is not None:
            gitlab.project_set_attribute(
                criteria,
                MergeRequestsMethod.ATTRIBUTE,
                MergeRequestsMethod.VALUES[options.set_merge_method],
            )
            print(f'{Colors.BOLD}   - Set merge method: '
                  f'{Colors.CYAN}{options.set_merge_method}'
                  f'{Colors.RESET}')
            Platform.flush()

        # Erase project jobs artifacts and traces
        if options.erase_jobs_contents:
            gitlab.project_erase_jobs_contents(criteria)
+31 −1
Changes for src/cli/main.py: 31 added lines, 1 removed line.
Original line number Diff line number Diff line
@@ -19,12 +19,23 @@ from ..package.version import Version
from ..prints.colors import Colors
from ..system.platform import Platform
from ..types.environments import Environments
from ..types.gitlab import ProtectionLevels
from ..types.gitlab import (
    MergeRequestsMethod,
    MergeRequestsPipelines,
    MergeRequestsResolved,
    MergeRequestsSkipped,
    MergeRequestsSquash,
    ProtectionLevels,
)
from .entrypoint import Entrypoint

# Constants
HELP_POSITION: int = 36

# Exception
def exception(error: BaseException) -> None:
    raise error

# Main, pylint: disable=too-many-branches,too-many-statements
def main() -> None:

@@ -268,6 +279,25 @@ def main() -> None:
        ' (default: %(const)s)',
    )

    # Arguments merge requests settings definitions
    group = parser.add_argument_group('merge requests settings arguments')
    group.add_argument(
        '--set-merge-method',
        dest='set_merge_method',
        metavar='METHOD',
        nargs='?',
        type=lambda value: (
            value if value in MergeRequestsMethod.VALUES # Keys
            else
            [key for key, _val in MergeRequestsMethod.VALUES.items() if _val == value][0]
            if value in MergeRequestsMethod.VALUES.values() # Values
            else exception(ValueError(value)) # Unknown
        ),
        const=MergeRequestsMethod.DEFAULT,
        help='Set project merge requests method'
        f' ({", ".join(MergeRequestsMethod.VALUES.keys())}, default: %(const)s)',
    )

    # Arguments CI/CD settings definitions
    group = parser.add_argument_group('ci/cd settings arguments')
    subgroup = group.add_mutually_exclusive_group()
+16 −0
Changes for src/features/gitlab.py: 16 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -562,6 +562,22 @@ class GitLabFeature:
        elif not self.__dry_run:
            project.unarchive()

    # Project set attribute
    def project_set_attribute(
        self,
        criteria: str,
        name: str,
        value: Union[bool, str],
    ) -> None:

        # Set project attribute
        project = self.project(criteria)
        if not self.__dry_run:
            setattr(project, name, value)

            # Save project
            project.save()

    # Project set avatar
    def project_set_avatar(self, criteria: str, file: str) -> None:

+10 −0
Changes for src/types/gitlab.py: 10 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -14,6 +14,16 @@ class AccessLevels:
    PRIVATE: str = 'private'
    ENABLED: str = 'enabled'

# MergeRequestsMethod class
class MergeRequestsMethod:
    ATTRIBUTE: str = 'merge_method'
    DEFAULT: str = 'Fast-forward'
    VALUES: Dict[str, str] = {
        'Merge': 'merge',
        'Semi-linear': 'rebase_merge',
        'Fast-forward': 'ff',
    }

# ProtectionLevels class
class ProtectionLevels:
    NO_ONE: str = 'no-one'