gitlabform 6.0.0__tar.gz → 6.2.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {gitlabform-6.0.0 → gitlabform-6.2.0}/.github/ISSUE_TEMPLATE/bug_report.md +11 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/.github/workflows/_releases.yml +5 -5
- {gitlabform-6.0.0 → gitlabform-6.2.0}/.github/workflows/build.yml +5 -5
- gitlabform-6.2.0/.github/workflows/codecov-upload.yml +104 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/.github/workflows/pr-ci-workflow.yml +1 -35
- gitlabform-6.2.0/.github/workflows/prs-entrypoint-forks.yml +26 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/.github/workflows/prs-entrypoint-main.yml +0 -8
- {gitlabform-6.0.0 → gitlabform-6.2.0}/.github/workflows/static-analysis.yml +2 -2
- {gitlabform-6.0.0 → gitlabform-6.2.0}/.github/workflows/tests-acceptance.yml +32 -23
- {gitlabform-6.0.0 → gitlabform-6.2.0}/.github/workflows/tests-unit.yml +15 -14
- {gitlabform-6.0.0 → gitlabform-6.2.0}/PKG-INFO +2 -2
- {gitlabform-6.0.0 → gitlabform-6.2.0}/dev/gitlab/gitlab.rb +4 -1
- {gitlabform-6.0.0 → gitlabform-6.2.0}/docs/changelog.md +40 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/docs/contrib/workflows.md +8 -2
- {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/configuration/core.py +26 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/configuration/groups.py +19 -33
- {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/configuration/projects.py +25 -4
- {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/gitlab/__init__.py +1 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/gitlab/core.py +4 -1
- {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/lists/projects.py +43 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/processors/group/group_members_processor.py +4 -11
- gitlabform-6.2.0/gitlabform/processors/group/group_saml_links_processor.py +61 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/processors/project/files_processor.py +13 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/processors/project/members_processor.py +3 -2
- {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/util.py +7 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/pyproject.toml +12 -12
- {gitlabform-6.0.0 → gitlabform-6.2.0}/tbump.toml +1 -1
- {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/premium/test_group_saml_links.py +32 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_remote_mirrors.py +85 -70
- gitlabform-6.2.0/tests/acceptance/standard/test_wildcard_patterns.py +68 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/unit/configuration/test_inheritance_break_subgroups.py +27 -0
- gitlabform-6.2.0/tests/unit/configuration/test_wildcard_patterns.py +202 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/unit/configuration/transform/test_access_level_transformer.py +31 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/unit/gitlab/test_core.py +71 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/unit/processors/test_files_processor.py +15 -0
- gitlabform-6.2.0/tests/unit/processors/test_group_members_processor.py +54 -0
- gitlabform-6.2.0/tests/unit/processors/test_group_saml_links_processor.py +93 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/unit/test_utils.py +13 -1
- {gitlabform-6.0.0 → gitlabform-6.2.0}/uv.lock +268 -277
- gitlabform-6.0.0/.github/workflows/prs-entrypoint-forks.yml +0 -34
- gitlabform-6.0.0/gitlabform/processors/group/group_saml_links_processor.py +0 -65
- {gitlabform-6.0.0 → gitlabform-6.2.0}/.coveragerc +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/.dockerignore +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/.git-blame-ignore-revs +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/.github/CODEOWNERS +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/.github/ISSUE_TEMPLATE/question-or-other-issue.md +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/.github/actions/setup-uv-local/README.md +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/.github/actions/setup-uv-local/action.yml +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/.github/dependabot.yml +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/.github/workflows/_main.yml +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/.gitignore +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/.lgtm.yml +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/.mypy.ini +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/.overrides/gitlabform-logo-favicon.png +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/.overrides/gitlabform-logo-favicon.svg +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/.python-version +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/CONTRIBUTING.md +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/Dockerfile +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/LICENSE +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/README.md +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/codecov.yml +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/dev/__init__.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/dev/common.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/dev/docker.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/dev/docs.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/dev/env.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/dev/gitlab/await-healthy.sh +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/dev/gitlab/healthcheck-and-setup.sh +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/dev/gitlab/run_gitlab_in_docker.sh +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/dev/gitlab/tests.Dockerfile +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/dev/infra.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/dev/main.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/dev/package.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/dev/qa.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/dev/release.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/docs/automation.md +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/docs/contrib/coding_guidelines.md +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/docs/contrib/implementation_design.md +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/docs/contrib/index.md +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/docs/contrib/local_development.md +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/docs/contrib/releases.md +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/docs/features.md +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/docs/images/Opencast-logo.png +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/docs/images/egnyte-logo.svg +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/docs/images/elastic-path-logo.svg +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/docs/images/gitlabform-logo-square.png +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/docs/images/gitlabform-logo.png +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/docs/images/gitlabform-logo.svg +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/docs/images/group-ldap-links-provider.png +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/docs/images/liquidlight-logo.svg +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/docs/images/roche-logo.png +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/docs/images/stroeer-online-marketing-logo.svg +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/docs/index.md +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/docs/installation.md +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/docs/reference/archive_unarchive.md +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/docs/reference/avatar.md +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/docs/reference/badges.md +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/docs/reference/ci_cd_variables.md +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/docs/reference/deploy_keys.md +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/docs/reference/files.md +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/docs/reference/group_ldap_links.md +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/docs/reference/group_saml_links.md +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/docs/reference/index.md +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/docs/reference/integrations.md +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/docs/reference/job_token_scope.md +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/docs/reference/labels.md +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/docs/reference/members.md +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/docs/reference/merge_requests.md +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/docs/reference/pipeline_schedules.md +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/docs/reference/project_security_settings.md +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/docs/reference/project_transfer.md +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/docs/reference/protected_branches.md +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/docs/reference/protected_environments.md +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/docs/reference/push_mirrors.md +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/docs/reference/push_rules.md +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/docs/reference/resource_groups.md +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/docs/reference/settings.md +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/docs/reference/tags_protection.md +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/docs/reference/webhooks.md +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/docs/requirements.md +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/docs/running.md +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/docs/similar_apps.md +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/docs/upgrade.md +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlab-config/config.yml +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlab-config/gitlab-config.md +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/__init__.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/configuration/__init__.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/configuration/common.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/configuration/transform.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/constants.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/gitlab/commits.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/gitlab/group_badges.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/gitlab/group_ldap_links.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/gitlab/groups.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/gitlab/merge_requests.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/gitlab/pipelines.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/gitlab/project_badges.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/gitlab/project_deploy_keys.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/gitlab/project_merge_requests_approvals.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/gitlab/project_protected_environments.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/gitlab/projects.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/gitlab/python_gitlab.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/gitlab/variables.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/lists/__init__.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/lists/filter.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/lists/groups.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/output.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/processors/__init__.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/processors/abstract_processor.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/processors/application/__init__.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/processors/application/application_settings_processor.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/processors/defining_keys.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/processors/group/__init__.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/processors/group/group_badges_processor.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/processors/group/group_hooks_processor.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/processors/group/group_labels_processor.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/processors/group/group_ldap_links_processor.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/processors/group/group_protected_branches_processor.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/processors/group/group_push_rules_processor.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/processors/group/group_settings_processor.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/processors/group/group_variables_processor.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/processors/multiple_entities_processor.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/processors/project/__init__.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/processors/project/badges_processor.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/processors/project/branches_processor.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/processors/project/deploy_keys_processor.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/processors/project/hooks_processor.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/processors/project/integrations_processor.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/processors/project/job_token_scope_processor.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/processors/project/merge_requests_approval_rules.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/processors/project/merge_requests_approvals.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/processors/project/project_labels_processor.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/processors/project/project_processor.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/processors/project/project_push_rules_processor.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/processors/project/project_security_settings.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/processors/project/project_settings_processor.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/processors/project/project_variables_processor.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/processors/project/remote_mirrors_processor.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/processors/project/resource_groups_processor.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/processors/project/schedules_processor.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/processors/project/tags_processor.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/processors/shared/__init__.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/processors/shared/protected_environments_processor.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/processors/util/__init__.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/processors/util/branch_protection.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/processors/util/decorators.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/processors/util/difference_logger.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/processors/util/labels_processor.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/processors/util/variables_processor.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/run.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/mkdocs.yml +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/prek.toml +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/__init__.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/__init__.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/conftest.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/premium/test_branches.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/premium/test_branches_users_case_insensitive.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/premium/test_group_ldap_links.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/premium/test_group_protected_branches.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/premium/test_group_push_rules.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/premium/test_group_settings.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/premium/test_group_variables.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/premium/test_merge_request_approval_rules.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/premium/test_merge_request_approvals_settings.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/premium/test_protected_environments.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/premium/test_push_rules.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/premium/test_tags.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/standard/__init__.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_application_settings.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_archive_project.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_badges.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_branches.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_deploy_keys.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_deploy_keys_all_projects.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_files.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_files_templates.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_group_avatar.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_group_badges.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_group_hooks.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_group_labels.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_group_members_case_insensitive.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_group_members_groups.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_group_members_users.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_group_settings.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_group_variables.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_hooks.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_integrations.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_job_token_scope.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_members.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_members_add_group.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_members_enforce.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_project_avatar.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_project_group_members_case_insensitive.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_project_labels.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_project_members_case_insensitve.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_project_settings.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_project_variables.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_resource_groups.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_running.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_scheduled_for_deletion_project.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_schedules.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_tags.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_token_from_config.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_transfer_project.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/ultimate/test_group_members.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/ultimate/test_group_settings.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/ultimate/test_members.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/ultimate/test_project_security_settings.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/ultimate/test_project_settings.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/unit/__init__.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/unit/configuration/__init__.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/unit/configuration/test_case_sensitivity.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/unit/configuration/test_inheritance_break_projects_and_groups.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/unit/configuration/test_inheritance_break_validation.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/unit/configuration/test_projects_and_groups.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/unit/configuration/test_skip_groups_skip_projects.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/unit/configuration/test_subgroups.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/unit/configuration/test_yaml_version.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/unit/configuration/transform/test_group_transformer.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/unit/configuration/transform/test_implicit_name_transformer.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/unit/configuration/transform/test_user_and_group_transformers.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/unit/configuration/transform/test_user_transformer.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/unit/gitlab/test_python_gitlab.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/unit/processors/__init__.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/unit/processors/test_abstract_processor.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/unit/processors/test_abstract_processors.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/unit/processors/test_branches_processor.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/unit/processors/test_difference_logger.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/unit/processors/test_group_protected_branches_processor.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/unit/processors/test_schedules_processor_extended_cron_pattern.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/unit/test_access_levels.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/unit/test_non_empty_configs_provider.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/unit/test_parse_args.py +0 -0
- {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/unit/test_projects_provider.py +0 -0
|
@@ -18,3 +18,14 @@ Output of `gitlabform -V`
|
|
|
18
18
|
**GitLab version**
|
|
19
19
|
|
|
20
20
|
F.e. `13.12.4-ee`
|
|
21
|
+
|
|
22
|
+
**GitLabForm configuration**
|
|
23
|
+
|
|
24
|
+
The relevant part of your gitlabform config (optionally anonymized).
|
|
25
|
+
If applicable, share both the before and after config.
|
|
26
|
+
|
|
27
|
+
**Would you be open to contributing a fix?**
|
|
28
|
+
|
|
29
|
+
- [ ] Yes
|
|
30
|
+
- [ ] No
|
|
31
|
+
- [ ] Maybe
|
|
@@ -37,7 +37,7 @@ jobs:
|
|
|
37
37
|
target_run_id: ${{ steps.validate.outputs.run_id }}
|
|
38
38
|
steps:
|
|
39
39
|
- name: Checkout Code
|
|
40
|
-
uses: actions/checkout@
|
|
40
|
+
uses: actions/checkout@v7
|
|
41
41
|
|
|
42
42
|
- name: Configure uv environment
|
|
43
43
|
uses: ./.github/actions/setup-uv-local
|
|
@@ -83,12 +83,12 @@ jobs:
|
|
|
83
83
|
runs-on: ubuntu-latest
|
|
84
84
|
steps:
|
|
85
85
|
- name: Checkout repository
|
|
86
|
-
uses: actions/checkout@
|
|
86
|
+
uses: actions/checkout@v7
|
|
87
87
|
with:
|
|
88
88
|
ref: ${{ needs.prep-release.outputs.semver_tag }}
|
|
89
89
|
fetch-depth: 2
|
|
90
90
|
- name: Download built documentation
|
|
91
|
-
uses: actions/download-artifact@
|
|
91
|
+
uses: actions/download-artifact@v8
|
|
92
92
|
with:
|
|
93
93
|
run-id: ${{ needs.prep-release.outputs.target_run_id }}
|
|
94
94
|
github-token: ${{ secrets.GITHUB_TOKEN }}
|
|
@@ -129,7 +129,7 @@ jobs:
|
|
|
129
129
|
id-token: write # IMPORTANT: this permission is mandatory for trusted publishing
|
|
130
130
|
steps:
|
|
131
131
|
- name: Checkout repository
|
|
132
|
-
uses: actions/checkout@
|
|
132
|
+
uses: actions/checkout@v7
|
|
133
133
|
with:
|
|
134
134
|
ref: ${{ needs.prep-release.outputs.semver_tag }}
|
|
135
135
|
fetch-depth: 2
|
|
@@ -162,7 +162,7 @@ jobs:
|
|
|
162
162
|
# TODO: In a separate PR, optimize docker image build to consume the built package artifact
|
|
163
163
|
# (package-dist) instead of copying and rebuilding from source if applicable.
|
|
164
164
|
- name: Checkout repository
|
|
165
|
-
uses: actions/checkout@
|
|
165
|
+
uses: actions/checkout@v7
|
|
166
166
|
with:
|
|
167
167
|
ref: ${{ needs.prep-release.outputs.semver_tag }}
|
|
168
168
|
- name: Docker metadata
|
|
@@ -16,7 +16,7 @@ jobs:
|
|
|
16
16
|
runs-on: ubuntu-latest
|
|
17
17
|
steps:
|
|
18
18
|
- name: Checkout repository
|
|
19
|
-
uses: actions/checkout@
|
|
19
|
+
uses: actions/checkout@v7
|
|
20
20
|
with:
|
|
21
21
|
ref: ${{ inputs.BRANCH_REF }}
|
|
22
22
|
fetch-depth: 2
|
|
@@ -31,7 +31,7 @@ jobs:
|
|
|
31
31
|
uv run --no-sync package build
|
|
32
32
|
uv run --no-sync package verify
|
|
33
33
|
- name: Upload package distribution
|
|
34
|
-
uses: actions/upload-artifact@
|
|
34
|
+
uses: actions/upload-artifact@v7
|
|
35
35
|
with:
|
|
36
36
|
name: package-dist
|
|
37
37
|
path: dist/*
|
|
@@ -41,7 +41,7 @@ jobs:
|
|
|
41
41
|
runs-on: ubuntu-latest
|
|
42
42
|
steps:
|
|
43
43
|
- name: Checkout repository
|
|
44
|
-
uses: actions/checkout@
|
|
44
|
+
uses: actions/checkout@v7
|
|
45
45
|
with:
|
|
46
46
|
ref: ${{ inputs.BRANCH_REF }}
|
|
47
47
|
fetch-depth: 2
|
|
@@ -54,7 +54,7 @@ jobs:
|
|
|
54
54
|
- name: Build documentation
|
|
55
55
|
run: uv run --no-sync docs build
|
|
56
56
|
- name: Upload docs site
|
|
57
|
-
uses: actions/upload-artifact@
|
|
57
|
+
uses: actions/upload-artifact@v7
|
|
58
58
|
with:
|
|
59
59
|
name: docs-site
|
|
60
60
|
path: site
|
|
@@ -70,7 +70,7 @@ jobs:
|
|
|
70
70
|
runs-on: ${{ matrix.os }}
|
|
71
71
|
steps:
|
|
72
72
|
- name: Checkout repository
|
|
73
|
-
uses: actions/checkout@
|
|
73
|
+
uses: actions/checkout@v7
|
|
74
74
|
with:
|
|
75
75
|
ref: ${{ inputs.BRANCH_REF }}
|
|
76
76
|
fetch-depth: 2
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
name: "Codecov Upload"
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
workflow_run:
|
|
5
|
+
workflows:
|
|
6
|
+
- "CI - PRs"
|
|
7
|
+
- "CI - Acceptance Tests"
|
|
8
|
+
types:
|
|
9
|
+
- completed
|
|
10
|
+
|
|
11
|
+
permissions:
|
|
12
|
+
actions: read
|
|
13
|
+
contents: read
|
|
14
|
+
|
|
15
|
+
jobs:
|
|
16
|
+
upload-unit:
|
|
17
|
+
name: "Upload unit coverage (${{ matrix.python-version }})"
|
|
18
|
+
if: ${{ github.event.workflow_run.name == 'CI - PRs' && github.event.workflow_run.event == 'pull_request' }}
|
|
19
|
+
runs-on: ubuntu-latest
|
|
20
|
+
strategy:
|
|
21
|
+
fail-fast: false
|
|
22
|
+
matrix:
|
|
23
|
+
python-version: ["3.14", "3.12"]
|
|
24
|
+
steps:
|
|
25
|
+
- name: Download coverage artifact
|
|
26
|
+
uses: actions/download-artifact@v8
|
|
27
|
+
with:
|
|
28
|
+
name: coverage-${{ matrix.python-version }}
|
|
29
|
+
run-id: ${{ github.event.workflow_run.id }}
|
|
30
|
+
github-token: ${{ github.token }}
|
|
31
|
+
- name: Read PR metadata
|
|
32
|
+
id: pr
|
|
33
|
+
run: |
|
|
34
|
+
pr=$(jq -r '.pr // empty' pr-info.json)
|
|
35
|
+
sha=$(jq -r '.sha // empty' pr-info.json)
|
|
36
|
+
if [[ "$pr" =~ ^[0-9]+$ ]]; then
|
|
37
|
+
echo "pr=$pr" >> "$GITHUB_OUTPUT"
|
|
38
|
+
fi
|
|
39
|
+
if [[ "$sha" =~ ^[a-f0-9]{40}$ ]]; then
|
|
40
|
+
echo "sha=$sha" >> "$GITHUB_OUTPUT"
|
|
41
|
+
fi
|
|
42
|
+
- name: Upload coverage to Codecov
|
|
43
|
+
uses: Wandalen/wretry.action@v3
|
|
44
|
+
with:
|
|
45
|
+
action: codecov/codecov-action@v3
|
|
46
|
+
with: |
|
|
47
|
+
name: unit-tests-${{ matrix.python-version }}
|
|
48
|
+
flags: unittests
|
|
49
|
+
fail_ci_if_error: true
|
|
50
|
+
token: ${{ secrets.CODECOV_TOKEN }}
|
|
51
|
+
files: coverage.xml
|
|
52
|
+
override_pr: ${{ steps.pr.outputs.pr }}
|
|
53
|
+
override_commit: ${{ steps.pr.outputs.sha }}
|
|
54
|
+
attempt_limit: 5
|
|
55
|
+
attempt_delay: 10000
|
|
56
|
+
|
|
57
|
+
upload-acceptance:
|
|
58
|
+
name: "Upload acceptance coverage (${{ matrix.name }})"
|
|
59
|
+
if: ${{ github.event.workflow_run.name == 'CI - Acceptance Tests' && github.event.workflow_run.event == 'pull_request_target' }}
|
|
60
|
+
runs-on: ubuntu-latest
|
|
61
|
+
strategy:
|
|
62
|
+
fail-fast: false
|
|
63
|
+
matrix:
|
|
64
|
+
include:
|
|
65
|
+
- artifact: coverage-standard-ce
|
|
66
|
+
name: codecov-acceptance-test-standard-ce
|
|
67
|
+
- artifact: coverage-standard-ee
|
|
68
|
+
name: codecov-acceptance-test-standard-ee
|
|
69
|
+
- artifact: coverage-licensed-premium
|
|
70
|
+
name: codecov-acceptance-test-premium
|
|
71
|
+
- artifact: coverage-licensed-ultimate
|
|
72
|
+
name: codecov-acceptance-test-ultimate
|
|
73
|
+
steps:
|
|
74
|
+
- name: Download coverage artifact
|
|
75
|
+
uses: actions/download-artifact@v8
|
|
76
|
+
with:
|
|
77
|
+
name: ${{ matrix.artifact }}
|
|
78
|
+
run-id: ${{ github.event.workflow_run.id }}
|
|
79
|
+
github-token: ${{ github.token }}
|
|
80
|
+
- name: Read PR metadata
|
|
81
|
+
id: pr
|
|
82
|
+
run: |
|
|
83
|
+
pr=$(jq -r '.pr // empty' pr-info.json)
|
|
84
|
+
sha=$(jq -r '.sha // empty' pr-info.json)
|
|
85
|
+
if [[ "$pr" =~ ^[0-9]+$ ]]; then
|
|
86
|
+
echo "pr=$pr" >> "$GITHUB_OUTPUT"
|
|
87
|
+
fi
|
|
88
|
+
if [[ "$sha" =~ ^[a-f0-9]{40}$ ]]; then
|
|
89
|
+
echo "sha=$sha" >> "$GITHUB_OUTPUT"
|
|
90
|
+
fi
|
|
91
|
+
- name: Upload coverage to Codecov
|
|
92
|
+
uses: Wandalen/wretry.action@v3
|
|
93
|
+
with:
|
|
94
|
+
action: codecov/codecov-action@v3
|
|
95
|
+
with: |
|
|
96
|
+
name: ${{ matrix.name }}
|
|
97
|
+
flags: integration
|
|
98
|
+
fail_ci_if_error: true
|
|
99
|
+
token: ${{ secrets.CODECOV_TOKEN }}
|
|
100
|
+
files: coverage.xml
|
|
101
|
+
override_pr: ${{ steps.pr.outputs.pr }}
|
|
102
|
+
override_commit: ${{ steps.pr.outputs.sha }}
|
|
103
|
+
attempt_limit: 5
|
|
104
|
+
attempt_delay: 10000
|
|
@@ -1,12 +1,5 @@
|
|
|
1
1
|
name: "CI - Build · Lint · Tests"
|
|
2
2
|
|
|
3
|
-
# Reusable workflow containing the actual CI jobs for pull request validation.
|
|
4
|
-
# This file is called by prs-entrypoint.yml and is intentionally separated so that
|
|
5
|
-
# event/routing logic stays in the entrypoint while the CI job set remains reusable.
|
|
6
|
-
|
|
7
|
-
# This reusable workflow does not receive secrets automatically from the PR event.
|
|
8
|
-
# The caller workflow (prs-entrypoint.yml) must explicitly pass secrets when calling it.
|
|
9
|
-
|
|
10
3
|
on:
|
|
11
4
|
workflow_call:
|
|
12
5
|
inputs:
|
|
@@ -33,15 +26,6 @@ jobs:
|
|
|
33
26
|
uses: ./.github/workflows/tests-unit.yml
|
|
34
27
|
with:
|
|
35
28
|
BRANCH_REF: ${{ inputs.BRANCH_REF }}
|
|
36
|
-
secrets: inherit
|
|
37
|
-
|
|
38
|
-
tests-acceptance:
|
|
39
|
-
name: Acceptance Tests
|
|
40
|
-
uses: ./.github/workflows/tests-acceptance.yml
|
|
41
|
-
with:
|
|
42
|
-
BRANCH_REF: ${{ inputs.BRANCH_REF }}
|
|
43
|
-
environment: Integrate Pull Request
|
|
44
|
-
secrets: inherit
|
|
45
29
|
|
|
46
30
|
analyze:
|
|
47
31
|
name: Analyze (${{ matrix.language }})
|
|
@@ -82,7 +66,7 @@ jobs:
|
|
|
82
66
|
# your codebase is analyzed, see https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/codeql-code-scanning-for-compiled-languages
|
|
83
67
|
steps:
|
|
84
68
|
- name: Checkout repository
|
|
85
|
-
uses: actions/checkout@
|
|
69
|
+
uses: actions/checkout@v7
|
|
86
70
|
with:
|
|
87
71
|
ref: ${{ inputs.BRANCH_REF }}
|
|
88
72
|
|
|
@@ -92,7 +76,6 @@ jobs:
|
|
|
92
76
|
# - name: Setup runtime (example)
|
|
93
77
|
# uses: actions/setup-example@v1
|
|
94
78
|
|
|
95
|
-
# Initializes the CodeQL tools for scanning.
|
|
96
79
|
- name: Initialize CodeQL
|
|
97
80
|
uses: github/codeql-action/init@v4
|
|
98
81
|
with:
|
|
@@ -105,23 +88,6 @@ jobs:
|
|
|
105
88
|
# For more details on CodeQL's query packs, refer to: https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs
|
|
106
89
|
# queries: security-extended,security-and-quality
|
|
107
90
|
|
|
108
|
-
# If the analyze step fails for one of the languages you are analyzing with
|
|
109
|
-
# "We were unable to automatically build your code", modify the matrix above
|
|
110
|
-
# to set the build mode to "manual" for that language. Then modify this step
|
|
111
|
-
# to build your code.
|
|
112
|
-
# ℹ️ Command-line programs to run using the OS shell.
|
|
113
|
-
# 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun
|
|
114
|
-
- name: Run manual build steps
|
|
115
|
-
if: matrix.build-mode == 'manual'
|
|
116
|
-
shell: bash
|
|
117
|
-
run: |
|
|
118
|
-
echo 'If you are using a "manual" build mode for one or more of the' \
|
|
119
|
-
'languages you are analyzing, replace this with the commands to build' \
|
|
120
|
-
'your code, for example:'
|
|
121
|
-
echo ' make bootstrap'
|
|
122
|
-
echo ' make release'
|
|
123
|
-
exit 1
|
|
124
|
-
|
|
125
91
|
- name: Perform CodeQL Analysis
|
|
126
92
|
uses: github/codeql-action/analyze@v4
|
|
127
93
|
with:
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
name: "CI - Acceptance Tests"
|
|
2
|
+
|
|
3
|
+
permissions:
|
|
4
|
+
actions: read
|
|
5
|
+
contents: read
|
|
6
|
+
concurrency:
|
|
7
|
+
group: ${{ github.workflow }}-${{ github.event.pull_request.number }}
|
|
8
|
+
cancel-in-progress: true
|
|
9
|
+
|
|
10
|
+
on:
|
|
11
|
+
pull_request_target:
|
|
12
|
+
branches:
|
|
13
|
+
- main
|
|
14
|
+
|
|
15
|
+
jobs:
|
|
16
|
+
tests-acceptance:
|
|
17
|
+
name: "Acceptance Tests"
|
|
18
|
+
uses: ./.github/workflows/tests-acceptance.yml
|
|
19
|
+
permissions:
|
|
20
|
+
actions: read
|
|
21
|
+
contents: read
|
|
22
|
+
packages: read
|
|
23
|
+
with:
|
|
24
|
+
BRANCH_REF: ${{ github.event.pull_request.head.sha }}
|
|
25
|
+
environment: Integrate Pull Request
|
|
26
|
+
secrets: inherit
|
|
@@ -1,13 +1,8 @@
|
|
|
1
1
|
name: "CI - PRs"
|
|
2
2
|
|
|
3
|
-
# This workflow is the entrypoint for pull requests opened from host repository.
|
|
4
|
-
# Fork PRs are handled by prs-entrypoint-forks.yml using pull_request_target.
|
|
5
|
-
# It forwards the branch SHA and explicit secrets to the reusable workflow.
|
|
6
|
-
|
|
7
3
|
permissions:
|
|
8
4
|
actions: read
|
|
9
5
|
contents: read
|
|
10
|
-
pull-requests: write
|
|
11
6
|
concurrency:
|
|
12
7
|
group: ${{ github.workflow }}-${{ github.event.pull_request.number }}
|
|
13
8
|
cancel-in-progress: true
|
|
@@ -20,14 +15,11 @@ on:
|
|
|
20
15
|
jobs:
|
|
21
16
|
pr_jobs:
|
|
22
17
|
name: "Pipeline"
|
|
23
|
-
# github.event.pull_request object defined here: https://docs.github.com/en/rest/pulls/pulls?apiVersion=2026-03-10#get-a-pull-request
|
|
24
|
-
if: ${{ github.event.pull_request.head.repo.full_name == github.repository }}
|
|
25
18
|
uses: ./.github/workflows/pr-ci-workflow.yml
|
|
26
19
|
permissions:
|
|
27
20
|
actions: read
|
|
28
21
|
contents: read
|
|
29
22
|
packages: read
|
|
30
|
-
pull-requests: write
|
|
31
23
|
security-events: write
|
|
32
24
|
with:
|
|
33
25
|
BRANCH_REF: ${{ github.event.pull_request.head.sha }}
|
|
@@ -20,7 +20,7 @@ jobs:
|
|
|
20
20
|
runs-on: ubuntu-latest
|
|
21
21
|
steps:
|
|
22
22
|
- name: Checkout repository
|
|
23
|
-
uses: actions/checkout@
|
|
23
|
+
uses: actions/checkout@v7
|
|
24
24
|
with:
|
|
25
25
|
ref: ${{ inputs.BRANCH_REF }}
|
|
26
26
|
- name: Configure uv environment
|
|
@@ -37,7 +37,7 @@ jobs:
|
|
|
37
37
|
check: [black, mypy, bandit]
|
|
38
38
|
steps:
|
|
39
39
|
- name: Checkout repository
|
|
40
|
-
uses: actions/checkout@
|
|
40
|
+
uses: actions/checkout@v7
|
|
41
41
|
with:
|
|
42
42
|
ref: ${{ inputs.BRANCH_REF }}
|
|
43
43
|
fetch-depth: 2
|
|
@@ -15,12 +15,9 @@ on:
|
|
|
15
15
|
required: false
|
|
16
16
|
GITLAB_EE_ULTIMATE_LICENSE:
|
|
17
17
|
required: false
|
|
18
|
-
CODECOV_TOKEN:
|
|
19
|
-
required: true
|
|
20
18
|
|
|
21
19
|
permissions:
|
|
22
20
|
contents: read
|
|
23
|
-
actions: read # Required by codecov/codecov-action
|
|
24
21
|
|
|
25
22
|
jobs:
|
|
26
23
|
acceptance-standard:
|
|
@@ -32,10 +29,11 @@ jobs:
|
|
|
32
29
|
fail-fast: false
|
|
33
30
|
steps:
|
|
34
31
|
- name: Checkout repository
|
|
35
|
-
uses: actions/checkout@
|
|
32
|
+
uses: actions/checkout@v7
|
|
36
33
|
with:
|
|
37
34
|
ref: ${{ inputs.BRANCH_REF }}
|
|
38
35
|
fetch-depth: 2
|
|
36
|
+
allow-unsafe-pr-checkout: true
|
|
39
37
|
- name: Configure uv environment
|
|
40
38
|
uses: ./.github/actions/setup-uv-local
|
|
41
39
|
- name: Install dependencies
|
|
@@ -44,16 +42,21 @@ jobs:
|
|
|
44
42
|
run: uv run --no-sync gitlab-local up --gitlab-flavor ${{ matrix.flavor }}
|
|
45
43
|
- name: Run Standard acceptance tests for ${{ matrix.flavor }} flavor
|
|
46
44
|
run: uv run --no-sync qa test tests/acceptance/standard --cov=. --cov-report=xml --durations=0 --reruns 3 --reruns-delay 10 --log-cli-level=WARNING
|
|
47
|
-
- name:
|
|
48
|
-
|
|
45
|
+
- name: Save PR metadata
|
|
46
|
+
env:
|
|
47
|
+
PR_NUMBER: ${{ github.event.pull_request.number }}
|
|
48
|
+
PR_SHA: ${{ github.event.pull_request.head.sha }}
|
|
49
|
+
run: |
|
|
50
|
+
printf '{"pr": %s, "sha": "%s"}\n' "$PR_NUMBER" "$PR_SHA" > pr-info.json
|
|
51
|
+
- name: Upload coverage artifact
|
|
52
|
+
uses: actions/upload-artifact@v7
|
|
49
53
|
with:
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
attempt_delay: 10000
|
|
54
|
+
name: coverage-standard-${{ matrix.flavor }}
|
|
55
|
+
path: |
|
|
56
|
+
coverage.xml
|
|
57
|
+
pr-info.json
|
|
58
|
+
if-no-files-found: error
|
|
59
|
+
retention-days: 1
|
|
57
60
|
|
|
58
61
|
acceptance-licensed:
|
|
59
62
|
name: "GitLab ${{ matrix.tier == 'premium' && 'Premium' || 'Ultimate' }}"
|
|
@@ -65,10 +68,11 @@ jobs:
|
|
|
65
68
|
fail-fast: false
|
|
66
69
|
steps:
|
|
67
70
|
- name: Checkout repository
|
|
68
|
-
uses: actions/checkout@
|
|
71
|
+
uses: actions/checkout@v7
|
|
69
72
|
with:
|
|
70
73
|
ref: ${{ inputs.BRANCH_REF }}
|
|
71
74
|
fetch-depth: 2
|
|
75
|
+
allow-unsafe-pr-checkout: true
|
|
72
76
|
- name: Configure uv environment
|
|
73
77
|
uses: ./.github/actions/setup-uv-local
|
|
74
78
|
- name: Install dependencies
|
|
@@ -79,13 +83,18 @@ jobs:
|
|
|
79
83
|
run: uv run --no-sync gitlab-local up
|
|
80
84
|
- name: Run acceptance Tests for ${{ matrix.tier }} features
|
|
81
85
|
run: uv run --no-sync qa test tests/acceptance/${{ matrix.tier }} --cov=. --cov-report=xml --durations=0 --reruns 3 --reruns-delay 10 --log-cli-level=WARNING
|
|
82
|
-
- name:
|
|
83
|
-
|
|
86
|
+
- name: Save PR metadata
|
|
87
|
+
env:
|
|
88
|
+
PR_NUMBER: ${{ github.event.pull_request.number }}
|
|
89
|
+
PR_SHA: ${{ github.event.pull_request.head.sha }}
|
|
90
|
+
run: |
|
|
91
|
+
printf '{"pr": %s, "sha": "%s"}\n' "$PR_NUMBER" "$PR_SHA" > pr-info.json
|
|
92
|
+
- name: Upload coverage artifact
|
|
93
|
+
uses: actions/upload-artifact@v7
|
|
84
94
|
with:
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
attempt_delay: 10000
|
|
95
|
+
name: coverage-licensed-${{ matrix.tier }}
|
|
96
|
+
path: |
|
|
97
|
+
coverage.xml
|
|
98
|
+
pr-info.json
|
|
99
|
+
if-no-files-found: error
|
|
100
|
+
retention-days: 1
|
|
@@ -7,9 +7,6 @@ on:
|
|
|
7
7
|
BRANCH_REF:
|
|
8
8
|
type: string
|
|
9
9
|
required: true
|
|
10
|
-
secrets:
|
|
11
|
-
CODECOV_TOKEN:
|
|
12
|
-
required: true
|
|
13
10
|
|
|
14
11
|
permissions:
|
|
15
12
|
contents: read
|
|
@@ -24,7 +21,7 @@ jobs:
|
|
|
24
21
|
python-version: ["3.14", "3.12"]
|
|
25
22
|
steps:
|
|
26
23
|
- name: Checkout repository
|
|
27
|
-
uses: actions/checkout@
|
|
24
|
+
uses: actions/checkout@v7
|
|
28
25
|
with:
|
|
29
26
|
ref: ${{ inputs.BRANCH_REF }}
|
|
30
27
|
fetch-depth: 2
|
|
@@ -36,14 +33,18 @@ jobs:
|
|
|
36
33
|
run: uv sync --frozen --no-dev --group test
|
|
37
34
|
- name: Run unit tests
|
|
38
35
|
run: uv run --no-sync qa test tests/unit --cov=. --cov-report=xml --log-cli-level=WARNING
|
|
39
|
-
- name:
|
|
40
|
-
|
|
36
|
+
- name: Save PR metadata
|
|
37
|
+
env:
|
|
38
|
+
PR_NUMBER: ${{ github.event.pull_request.number }}
|
|
39
|
+
PR_SHA: ${{ github.event.pull_request.head.sha }}
|
|
40
|
+
run: |
|
|
41
|
+
printf '{"pr": %s, "sha": "%s"}\n' "$PR_NUMBER" "$PR_SHA" > pr-info.json
|
|
42
|
+
- name: Upload coverage artifact
|
|
43
|
+
uses: actions/upload-artifact@v7
|
|
41
44
|
with:
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
attempt_limit: 5
|
|
49
|
-
attempt_delay: 10000
|
|
45
|
+
name: coverage-${{ matrix.python-version }}
|
|
46
|
+
path: |
|
|
47
|
+
coverage.xml
|
|
48
|
+
pr-info.json
|
|
49
|
+
if-no-files-found: error
|
|
50
|
+
retention-days: 1
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: gitlabform
|
|
3
|
-
Version: 6.
|
|
3
|
+
Version: 6.2.0
|
|
4
4
|
Summary: 🏗 Specialized configuration as a code tool for GitLab projects, groups and more using hierarchical configuration written in YAML
|
|
5
5
|
Project-URL: Homepage, https://gitlabform.github.io/gitlabform/
|
|
6
6
|
Project-URL: Repository, https://github.com/gitlabform/gitlabform.git
|
|
@@ -19,7 +19,7 @@ Classifier: Operating System :: POSIX :: Linux
|
|
|
19
19
|
Classifier: Programming Language :: Python :: 3.14
|
|
20
20
|
Classifier: Topic :: Software Development :: Version Control :: Git
|
|
21
21
|
Requires-Python: >=3.12.0
|
|
22
|
-
Requires-Dist: certifi==2026.
|
|
22
|
+
Requires-Dist: certifi==2026.6.17
|
|
23
23
|
Requires-Dist: cli-ui==0.19.0
|
|
24
24
|
Requires-Dist: jinja2==3.1.6
|
|
25
25
|
Requires-Dist: luddite==1.0.4
|
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
gitlab_rails['initial_root_password']='mK9JnG7jwYdFcBNoQ3W3'
|
|
2
|
+
# Bind nginx on IPv4 and IPv6 loopback. Without IPv6, Sidekiq's mirror sync
|
|
3
|
+
# fails intermittently with ECONNREFUSED when libcurl resolves localhost to ::1.
|
|
4
|
+
nginx['listen_addresses'] = ['0.0.0.0', '[::]']
|
|
2
5
|
registry['enable']=false
|
|
3
6
|
prometheus_monitoring['enable']=false
|
|
4
7
|
gitlab_rails['initial_license_file']='/etc/gitlab/Gitlab.gitlab-license'
|
|
@@ -38,4 +41,4 @@ gitlab_rails['omniauth_providers'] = [
|
|
|
38
41
|
},
|
|
39
42
|
label: 'SAML Login'
|
|
40
43
|
}
|
|
41
|
-
]
|
|
44
|
+
]
|
|
@@ -6,6 +6,46 @@ For details on how to migrate between major versions, please refer to the [upgra
|
|
|
6
6
|
|
|
7
7
|
---
|
|
8
8
|
|
|
9
|
+
## 6.2.0
|
|
10
|
+
|
|
11
|
+
### Features
|
|
12
|
+
|
|
13
|
+
* Add support for "Security Manager role" [issue: #1329](https://github.com/gitlabform/gitlabform/issues/1329), [#1342](https://github.com/gitlabform/gitlabform/pull/1342). ([rickbrouwer](https://github.com/rickbrouwer))
|
|
14
|
+
|
|
15
|
+
### Bug Fixes
|
|
16
|
+
|
|
17
|
+
* don't re-validate inherited config in subgroup lookup [#1318](https://github.com/gitlabform/gitlabform/pull/1318). ([rickbrouwer](https://github.com/rickbrouwer))
|
|
18
|
+
* format group member expiry dates [#1349](https://github.com/gitlabform/gitlabform/pull/1349). ([w3lld1](https://github.com/w3lld1))
|
|
19
|
+
* escape regex as a raw string to prevent errors in loges [#1351](https://github.com/gitlabform/gitlabform/pull/1351). ([rickbrouwer](https://github.com/rickbrouwer))
|
|
20
|
+
|
|
21
|
+
### Documentation
|
|
22
|
+
|
|
23
|
+
* update license renewal instructions (#1358)[https://github.com/gitlabform/gitlabform/pull/1358]. ([rickbrouwer](https://github.com/rickbrouwer))
|
|
24
|
+
|
|
25
|
+
### Dependencies
|
|
26
|
+
|
|
27
|
+
* Update various dependencies to newer versions.
|
|
28
|
+
|
|
29
|
+
Thanks to all the contributors of this release!
|
|
30
|
+
|
|
31
|
+
## 6.1.0
|
|
32
|
+
|
|
33
|
+
### Features
|
|
34
|
+
|
|
35
|
+
* Add wildcard pattern support for project configuration [#1311](https://github.com/gitlabform/gitlabform/pull/1311). ([nikaro](https://github.com/nikaro))
|
|
36
|
+
|
|
37
|
+
### Bug Fixes
|
|
38
|
+
|
|
39
|
+
* group_saml_links: stop delete-and-recreate churn on unchanged links [#1331](https://github.com/gitlabform/gitlabform/pull/1331). ([rickbrouwer](https://github.com/rickbrouwer))
|
|
40
|
+
* validate key in files config to avoid cryptic KeyError [#1317](https://github.com/gitlabform/gitlabform/pull/1317), resolves [#1312](https://github.com/gitlabform/gitlabform/issues/1312). ([rickbrouwer](https://github.com/rickbrouwer))
|
|
41
|
+
* Normalize GitLab URL while parsing configuration [#1338](https://github.com/gitlabform/gitlabform/pull/1338). ([schurzi](https://github.com/schurzi))
|
|
42
|
+
|
|
43
|
+
### Dependencies
|
|
44
|
+
|
|
45
|
+
* Update various dependencies to newer versions.
|
|
46
|
+
|
|
47
|
+
Thanks to all the contributors of this release!
|
|
48
|
+
|
|
9
49
|
## 6.0.0
|
|
10
50
|
|
|
11
51
|
### Breaking Changes
|
|
@@ -16,6 +16,12 @@ only on the main repository.
|
|
|
16
16
|
|
|
17
17
|
## License management
|
|
18
18
|
|
|
19
|
-
Requesting new Premium/Ultimate Licenses is done via GitLab's Contribution to EE process [here](https://handbook.gitlab.com/handbook/marketing/developer-relations/
|
|
19
|
+
Requesting new Premium/Ultimate Licenses is done via GitLab's Contribution to EE process [here](https://handbook.gitlab.com/handbook/marketing/developer-relations/engineering/community-contributors-workflows/#contributing-to-the-gitlab-enterprise-edition-ee).
|
|
20
20
|
|
|
21
|
-
|
|
21
|
+
To request a license, create an issue via the [Wider Community Contributor License Request](https://gitlab.com/gitlab-org/developer-relations/contributor-success/team-task/-/issues/new?issuable_template=contributor_ee_license_request) template, and select 'New Request'. Use the following text in the request:
|
|
22
|
+
|
|
23
|
+
> As a Maintainer of GitlabForm, I like to requesting new Premium and Ultimate License for https://github.com/gitlabform/gitlabform.
|
|
24
|
+
|
|
25
|
+
Note that the Premium and Ultimate licenses are sent separately, and there may be some time between receiving them.
|
|
26
|
+
|
|
27
|
+
As a Maintainer, when you receive a new license key, please add/update it to the GitHub Repository Secrets.
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import fnmatch
|
|
1
2
|
import sys
|
|
2
3
|
from typing import Any
|
|
3
4
|
|
|
@@ -211,6 +212,26 @@ class ConfigurationCore(ABC):
|
|
|
211
212
|
|
|
212
213
|
return dict(merged_dict)
|
|
213
214
|
|
|
215
|
+
@staticmethod
|
|
216
|
+
def _get_key_type(a_key: str) -> str:
|
|
217
|
+
"""
|
|
218
|
+
Classify a config key used under 'projects_and_groups'.
|
|
219
|
+
"""
|
|
220
|
+
if a_key == "*":
|
|
221
|
+
return "common"
|
|
222
|
+
if a_key.endswith("/*"):
|
|
223
|
+
return "group"
|
|
224
|
+
if "*" in a_key:
|
|
225
|
+
return "project_pattern"
|
|
226
|
+
return "project"
|
|
227
|
+
|
|
228
|
+
@staticmethod
|
|
229
|
+
def _match_pattern(pattern: str, item: str) -> bool:
|
|
230
|
+
"""
|
|
231
|
+
Case-insensitive fnmatch between pattern and item.
|
|
232
|
+
"""
|
|
233
|
+
return fnmatch.fnmatchcase(item.lower(), pattern.lower())
|
|
234
|
+
|
|
214
235
|
@staticmethod
|
|
215
236
|
def _get_case_insensitively(a_dict: dict, a_key: str):
|
|
216
237
|
for dict_key in a_dict.keys():
|
|
@@ -231,6 +252,7 @@ class ConfigurationCore(ABC):
|
|
|
231
252
|
if list_element == item:
|
|
232
253
|
return True
|
|
233
254
|
|
|
255
|
+
# Support for traditional group/* skip pattern
|
|
234
256
|
if (
|
|
235
257
|
list_element.endswith("/*")
|
|
236
258
|
and item.startswith(list_element[:-2])
|
|
@@ -238,6 +260,10 @@ class ConfigurationCore(ABC):
|
|
|
238
260
|
):
|
|
239
261
|
return True
|
|
240
262
|
|
|
263
|
+
# Support for partial wildcard patterns like group/foo-*
|
|
264
|
+
if "*" in list_element and fnmatch.fnmatchcase(item, list_element):
|
|
265
|
+
return True
|
|
266
|
+
|
|
241
267
|
return False
|
|
242
268
|
|
|
243
269
|
def _find_almost_duplicates(self):
|