Commit 592a08c9 authored by Adrian DC's avatar Adrian DC
Browse files

feat(main, gitlab): implement '--reset-features [KEEP_FEATURES]'

Signed-off-by: default avatarAdrian DC <radian.dc@gmail.com>
parent 394f670e
Loading
Loading
Loading
Loading
+6 −5
Changes for README.md: 6 added lines, 5 removed lines.
Original line number Diff line number Diff line
@@ -29,10 +29,10 @@ The following step is required before using the tool:

```yaml
usage: gitlab-projects-settings [-h] [--version] [-t TOKEN] [--dry-run] [--exclude-group] [--exclude-subgroups]
                                [--exclude-projects] [--reset-features] [--reset-members] [--set-avatar FILE]
                                [--set-description TEXT] [--update-description] [--run-housekeeping]
                                [--archive-project | --unarchive-project] [--delete-group] [--delete-project]
                                [--protect-branches] [--protect-tags LEVEL]
                                [--exclude-projects] [--reset-features [KEEP_FEATURES]] [--reset-members]
                                [--set-avatar FILE] [--set-description TEXT] [--update-description]
                                [--run-housekeeping] [--archive-project | --unarchive-project] [--delete-group]
                                [--delete-project] [--protect-branches] [--protect-tags LEVEL]
                                [gitlab] [path]

gitlab-projects-settings: Configure GitLab groups and projects settings automatically
@@ -51,7 +51,8 @@ common settings arguments:
  --exclude-projects                # Exclude children projects settings

general settings arguments:
  --reset-features        # Reset features of GitLab projects based on usage
  --reset-features [KEEP_FEATURES]  # Reset features of GitLab projects based on usage
                                    # (Optionally keep features separated by ",")
  --reset-members                   # Reset members of GitLab projects and groups
  --set-avatar FILE                 # Set avatar of GitLab projects and groups
  --set-description TEXT            # Set description of GitLab projects and groups
+6 −2
Changes for src/cli/entrypoint.py: 6 added lines, 2 removed lines.
Original line number Diff line number Diff line
@@ -324,8 +324,12 @@ class Entrypoint:
                Platform.flush()

        # Reset project features
        if options.reset_features:
            features = ', '.join(gitlab.project_reset_features(criteria))
        if options.reset_features is not None:
            features = ', '.join(
                gitlab.project_reset_features(
                    criteria,
                    options.reset_features.split(',') if options.reset_features else [],
                ))
            if features:
                print(f'{Colors.BOLD}   - Reset features: '
                      f'{Colors.CYAN}{features}'
+7 −3
Changes for src/cli/main.py: 7 added lines, 3 removed lines.
Original line number Diff line number Diff line
@@ -29,7 +29,7 @@ def main() -> None:
        add_help=False,
        formatter_class=lambda prog: RawTextHelpFormatter(
            prog,
            max_help_position=30,
            max_help_position=40,
            width=min(
                120,
                get_terminal_size().columns - 2,
@@ -94,8 +94,12 @@ def main() -> None:
    group.add_argument(
        '--reset-features',
        dest='reset_features',
        action='store_true',
        help='Reset features of GitLab projects based on usage',
        action='store',
        metavar='KEEP_FEATURES',
        nargs='?',
        const='',
        help='Reset features of GitLab projects based on usage\n'
        '(Optionally keep features separated by ",")',
    )
    group.add_argument(
        '--reset-members',
+58 −26
Changes for src/features/gitlab.py: 58 added lines, 26 removed lines.
Original line number Diff line number Diff line
@@ -255,14 +255,20 @@ class GitLabFeature:
        return result

    # Project reset features, pylint: disable=too-many-branches,too-many-statements
    def project_reset_features(self, criteria: str) -> List[str]:
    def project_reset_features(
        self,
        criteria: str,
        keep_features: List[str],
    ) -> List[str]:

        # Variables
        result: List[str] = []
        project = self.__gitlab.projects.get(criteria, statistics=True)

        # Disable unused feature (Issues)
        if project.issues_enabled and not project.issues.list(get_all=False):
        if project.issues_enabled \
                and not project.issues.list(get_all=False) \
                and GitLabFeature.Features.ISSUES not in keep_features:
            project.issues_enabled = False
            result += [GitLabFeature.Features.ISSUES]

@@ -275,18 +281,23 @@ class GitLabFeature:
            else:
                assert False
        except (AssertionError, GitlabListError):
            if project.merge_requests_enabled:
            if project.merge_requests_enabled \
                    and GitLabFeature.Features.MERGE_REQUESTS not in keep_features:
                project.merge_requests_access_level = 'disabled'
                project.merge_requests_enabled = False
                result += [GitLabFeature.Features.MERGE_REQUESTS]

        # Disable unused feature (Forks)
        if project.forking_access_level != 'disabled' and not project.forks.list(
                get_all=False):
        if project.forking_access_level != 'disabled' \
                and not project.forks.list(get_all=False) \
                and GitLabFeature.Features.FORKS not in keep_features:
            project.forking_access_level = 'disabled'
            result += [GitLabFeature.Features.FORKS]

        # Disable unused feature (Git LFS)
        if project.lfs_enabled and project.statistics['lfs_objects_size'] == 0:
        if project.lfs_enabled \
                and project.statistics['lfs_objects_size'] == 0 \
                and GitLabFeature.Features.GIT_LFS not in keep_features:
            project.lfs_enabled = False
            result += [GitLabFeature.Features.GIT_LFS]

@@ -307,7 +318,8 @@ class GitLabFeature:
            else:
                assert False
        except (AssertionError, GitlabGetError, GitlabListError):
            if project.jobs_enabled:
            if project.jobs_enabled \
                    and GitLabFeature.Features.CI_CD not in keep_features:
                project.jobs_enabled = False
                result += [GitLabFeature.Features.CI_CD]

@@ -315,7 +327,8 @@ class GitLabFeature:
        try:
            assert project.commits.list(get_all=False)
        except (AssertionError, GitlabListError):
            if project.repository_access_level != 'disabled':
            if project.repository_access_level != 'disabled' \
                    and GitLabFeature.Features.REPOSITORY not in keep_features:
                project.repository_access_level = 'disabled'
                project.merge_requests_access_level = 'disabled'
                project.merge_requests_enabled = False
@@ -325,53 +338,66 @@ class GitLabFeature:
                result += [GitLabFeature.Features.REPOSITORY]

        # Disable unused feature (Container registry)
        if project.container_registry_enabled and not project.repositories.list(
                get_all=False):
        if project.container_registry_enabled \
                and not project.repositories.list(get_all=False) \
                and GitLabFeature.Features.CONTAINER_REGISTRY not in keep_features:
            project.container_registry_enabled = False
            result += [GitLabFeature.Features.CONTAINER_REGISTRY]

        # Disable unused feature (Analytics)
        if project.analytics_access_level != 'disabled':
        if project.analytics_access_level != 'disabled' \
                and GitLabFeature.Features.ANALYTICS not in keep_features:
            project.analytics_access_level = 'disabled'
            result += [GitLabFeature.Features.ANALYTICS]

        # Disable unused feature (Security and Compliance)
        if project.security_and_compliance_access_level != 'disabled':
        if project.security_and_compliance_access_level != 'disabled' \
                and GitLabFeature.Features.SECURITY_AND_COMPLIANCE not in keep_features:
            project.security_and_compliance_access_level = 'disabled'
            result += [GitLabFeature.Features.SECURITY_AND_COMPLIANCE]

        # Disable unused feature (Wiki)
        if project.wiki_enabled and not project.wikis.list(get_all=False):
        if project.wiki_enabled \
                and not project.wikis.list(get_all=False) \
                and GitLabFeature.Features.WIKI not in keep_features:
            project.wiki_enabled = False
            result += [GitLabFeature.Features.WIKI]

        # Disable unused feature (Snippets)
        if project.snippets_enabled and not project.snippets.list(get_all=False):
        if project.snippets_enabled \
                and not project.snippets.list(get_all=False) \
                and GitLabFeature.Features.SNIPPETS not in keep_features:
            project.snippets_enabled = False
            result += [GitLabFeature.Features.SNIPPETS]

        # Disable unused feature (Package registry)
        if project.packages_enabled and not project.packages.list(get_all=False):
        if project.packages_enabled \
                and not project.packages.list(get_all=False) \
                and GitLabFeature.Features.PACKAGE_REGISTRY not in keep_features:
            project.packages_enabled = False
            result += [GitLabFeature.Features.PACKAGE_REGISTRY]

        # Disable unused feature (Model experiments)
        if project.model_experiments_access_level != 'disabled':
        if project.model_experiments_access_level != 'disabled' \
                and GitLabFeature.Features.MODEL_EXPERIMENTS not in keep_features:
            project.model_experiments_access_level = 'disabled'
            result += [GitLabFeature.Features.MODEL_EXPERIMENTS]

        # Disable unused feature (Model registry)
        if project.model_registry_access_level != 'disabled':
        if project.model_registry_access_level != 'disabled' \
                and GitLabFeature.Features.MODEL_REGISTRY not in keep_features:
            project.model_registry_access_level = 'disabled'
            result += [GitLabFeature.Features.MODEL_REGISTRY]

        # Disable unused feature (Pages)
        if project.pages_access_level != 'disabled':
        if project.pages_access_level != 'disabled' \
                and GitLabFeature.Features.PAGES not in keep_features:
            project.pages_access_level = 'disabled'
            result += [GitLabFeature.Features.PAGES]

        # Disable unused feature (Monitor)
        if project.monitor_access_level != 'disabled':
        if project.monitor_access_level != 'disabled' \
                and GitLabFeature.Features.MONITOR not in keep_features:
            project.monitor_access_level = 'disabled'
            result += [GitLabFeature.Features.MONITOR]

@@ -379,33 +405,39 @@ class GitLabFeature:
        try:
            assert project.environments.list(get_all=False)
        except (AssertionError, GitlabListError):
            if project.environments_access_level != 'disabled':
            if project.environments_access_level != 'disabled' \
                    and GitLabFeature.Features.ENVIRONMENTS not in keep_features:
                project.environments_access_level = 'disabled'
                result += [GitLabFeature.Features.ENVIRONMENTS]

        # Disable unused feature (Feature flags)
        if project.feature_flags_access_level != 'disabled':
        if project.feature_flags_access_level != 'disabled' \
                and GitLabFeature.Features.FEATURE_FLAGS not in keep_features:
            project.feature_flags_access_level = 'disabled'
            result += [GitLabFeature.Features.FEATURE_FLAGS]

        # Disable unused feature (Infrastructure)
        if project.infrastructure_access_level != 'disabled':
        if project.infrastructure_access_level != 'disabled' \
                and GitLabFeature.Features.INFRASTRUCTURE not in keep_features:
            project.infrastructure_access_level = 'disabled'
            result += [GitLabFeature.Features.INFRASTRUCTURE]

        # Disable unused feature (Releases)
        if project.releases_access_level != 'disabled' and not project.releases.list(
                get_all=False):
        if project.releases_access_level != 'disabled' \
                and not project.releases.list(get_all=False) \
                and GitLabFeature.Features.RELEASES not in keep_features:
            project.releases_access_level = 'disabled'
            result += [GitLabFeature.Features.RELEASES]

        # Disable unused feature (Service Desk)
        if project.service_desk_enabled:
        if project.service_desk_enabled \
                and GitLabFeature.Features.SERVICE_DESK not in keep_features:
            project.service_desk_enabled = False
            result += [GitLabFeature.Features.SERVICE_DESK]

        # Disable unused feature (Auto DevOps)
        if project.auto_devops_enabled:
        if project.auto_devops_enabled \
                and GitLabFeature.Features.AUTO_DEVOPS not in keep_features:
            project.auto_devops_enabled = False
            result += [GitLabFeature.Features.AUTO_DEVOPS]