Loading README.md +6 −5 Changes for README.md: 6 added lines, 5 removed lines. Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 Loading src/cli/entrypoint.py +6 −2 Changes for src/cli/entrypoint.py: 6 added lines, 2 removed lines. Original line number Diff line number Diff line Loading @@ -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}' Loading src/cli/main.py +7 −3 Changes for src/cli/main.py: 7 added lines, 3 removed lines. Original line number Diff line number Diff line Loading @@ -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, Loading Loading @@ -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', Loading src/features/gitlab.py +58 −26 Changes for src/features/gitlab.py: 58 added lines, 26 removed lines. Original line number Diff line number Diff line Loading @@ -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] Loading @@ -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] Loading @@ -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] Loading @@ -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 Loading @@ -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] Loading @@ -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] Loading Loading
README.md +6 −5 Changes for README.md: 6 added lines, 5 removed lines. Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 Loading
src/cli/entrypoint.py +6 −2 Changes for src/cli/entrypoint.py: 6 added lines, 2 removed lines. Original line number Diff line number Diff line Loading @@ -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}' Loading
src/cli/main.py +7 −3 Changes for src/cli/main.py: 7 added lines, 3 removed lines. Original line number Diff line number Diff line Loading @@ -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, Loading Loading @@ -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', Loading
src/features/gitlab.py +58 −26 Changes for src/features/gitlab.py: 58 added lines, 26 removed lines. Original line number Diff line number Diff line Loading @@ -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] Loading @@ -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] Loading @@ -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] Loading @@ -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 Loading @@ -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] Loading @@ -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] Loading