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.
Files changed (275) hide show
  1. {gitlabform-6.0.0 → gitlabform-6.2.0}/.github/ISSUE_TEMPLATE/bug_report.md +11 -0
  2. {gitlabform-6.0.0 → gitlabform-6.2.0}/.github/workflows/_releases.yml +5 -5
  3. {gitlabform-6.0.0 → gitlabform-6.2.0}/.github/workflows/build.yml +5 -5
  4. gitlabform-6.2.0/.github/workflows/codecov-upload.yml +104 -0
  5. {gitlabform-6.0.0 → gitlabform-6.2.0}/.github/workflows/pr-ci-workflow.yml +1 -35
  6. gitlabform-6.2.0/.github/workflows/prs-entrypoint-forks.yml +26 -0
  7. {gitlabform-6.0.0 → gitlabform-6.2.0}/.github/workflows/prs-entrypoint-main.yml +0 -8
  8. {gitlabform-6.0.0 → gitlabform-6.2.0}/.github/workflows/static-analysis.yml +2 -2
  9. {gitlabform-6.0.0 → gitlabform-6.2.0}/.github/workflows/tests-acceptance.yml +32 -23
  10. {gitlabform-6.0.0 → gitlabform-6.2.0}/.github/workflows/tests-unit.yml +15 -14
  11. {gitlabform-6.0.0 → gitlabform-6.2.0}/PKG-INFO +2 -2
  12. {gitlabform-6.0.0 → gitlabform-6.2.0}/dev/gitlab/gitlab.rb +4 -1
  13. {gitlabform-6.0.0 → gitlabform-6.2.0}/docs/changelog.md +40 -0
  14. {gitlabform-6.0.0 → gitlabform-6.2.0}/docs/contrib/workflows.md +8 -2
  15. {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/configuration/core.py +26 -0
  16. {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/configuration/groups.py +19 -33
  17. {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/configuration/projects.py +25 -4
  18. {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/gitlab/__init__.py +1 -0
  19. {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/gitlab/core.py +4 -1
  20. {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/lists/projects.py +43 -0
  21. {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/processors/group/group_members_processor.py +4 -11
  22. gitlabform-6.2.0/gitlabform/processors/group/group_saml_links_processor.py +61 -0
  23. {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/processors/project/files_processor.py +13 -0
  24. {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/processors/project/members_processor.py +3 -2
  25. {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/util.py +7 -0
  26. {gitlabform-6.0.0 → gitlabform-6.2.0}/pyproject.toml +12 -12
  27. {gitlabform-6.0.0 → gitlabform-6.2.0}/tbump.toml +1 -1
  28. {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/premium/test_group_saml_links.py +32 -0
  29. {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_remote_mirrors.py +85 -70
  30. gitlabform-6.2.0/tests/acceptance/standard/test_wildcard_patterns.py +68 -0
  31. {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/unit/configuration/test_inheritance_break_subgroups.py +27 -0
  32. gitlabform-6.2.0/tests/unit/configuration/test_wildcard_patterns.py +202 -0
  33. {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/unit/configuration/transform/test_access_level_transformer.py +31 -0
  34. {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/unit/gitlab/test_core.py +71 -0
  35. {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/unit/processors/test_files_processor.py +15 -0
  36. gitlabform-6.2.0/tests/unit/processors/test_group_members_processor.py +54 -0
  37. gitlabform-6.2.0/tests/unit/processors/test_group_saml_links_processor.py +93 -0
  38. {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/unit/test_utils.py +13 -1
  39. {gitlabform-6.0.0 → gitlabform-6.2.0}/uv.lock +268 -277
  40. gitlabform-6.0.0/.github/workflows/prs-entrypoint-forks.yml +0 -34
  41. gitlabform-6.0.0/gitlabform/processors/group/group_saml_links_processor.py +0 -65
  42. {gitlabform-6.0.0 → gitlabform-6.2.0}/.coveragerc +0 -0
  43. {gitlabform-6.0.0 → gitlabform-6.2.0}/.dockerignore +0 -0
  44. {gitlabform-6.0.0 → gitlabform-6.2.0}/.git-blame-ignore-revs +0 -0
  45. {gitlabform-6.0.0 → gitlabform-6.2.0}/.github/CODEOWNERS +0 -0
  46. {gitlabform-6.0.0 → gitlabform-6.2.0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  47. {gitlabform-6.0.0 → gitlabform-6.2.0}/.github/ISSUE_TEMPLATE/question-or-other-issue.md +0 -0
  48. {gitlabform-6.0.0 → gitlabform-6.2.0}/.github/actions/setup-uv-local/README.md +0 -0
  49. {gitlabform-6.0.0 → gitlabform-6.2.0}/.github/actions/setup-uv-local/action.yml +0 -0
  50. {gitlabform-6.0.0 → gitlabform-6.2.0}/.github/dependabot.yml +0 -0
  51. {gitlabform-6.0.0 → gitlabform-6.2.0}/.github/workflows/_main.yml +0 -0
  52. {gitlabform-6.0.0 → gitlabform-6.2.0}/.gitignore +0 -0
  53. {gitlabform-6.0.0 → gitlabform-6.2.0}/.lgtm.yml +0 -0
  54. {gitlabform-6.0.0 → gitlabform-6.2.0}/.mypy.ini +0 -0
  55. {gitlabform-6.0.0 → gitlabform-6.2.0}/.overrides/gitlabform-logo-favicon.png +0 -0
  56. {gitlabform-6.0.0 → gitlabform-6.2.0}/.overrides/gitlabform-logo-favicon.svg +0 -0
  57. {gitlabform-6.0.0 → gitlabform-6.2.0}/.python-version +0 -0
  58. {gitlabform-6.0.0 → gitlabform-6.2.0}/CONTRIBUTING.md +0 -0
  59. {gitlabform-6.0.0 → gitlabform-6.2.0}/Dockerfile +0 -0
  60. {gitlabform-6.0.0 → gitlabform-6.2.0}/LICENSE +0 -0
  61. {gitlabform-6.0.0 → gitlabform-6.2.0}/README.md +0 -0
  62. {gitlabform-6.0.0 → gitlabform-6.2.0}/codecov.yml +0 -0
  63. {gitlabform-6.0.0 → gitlabform-6.2.0}/dev/__init__.py +0 -0
  64. {gitlabform-6.0.0 → gitlabform-6.2.0}/dev/common.py +0 -0
  65. {gitlabform-6.0.0 → gitlabform-6.2.0}/dev/docker.py +0 -0
  66. {gitlabform-6.0.0 → gitlabform-6.2.0}/dev/docs.py +0 -0
  67. {gitlabform-6.0.0 → gitlabform-6.2.0}/dev/env.py +0 -0
  68. {gitlabform-6.0.0 → gitlabform-6.2.0}/dev/gitlab/await-healthy.sh +0 -0
  69. {gitlabform-6.0.0 → gitlabform-6.2.0}/dev/gitlab/healthcheck-and-setup.sh +0 -0
  70. {gitlabform-6.0.0 → gitlabform-6.2.0}/dev/gitlab/run_gitlab_in_docker.sh +0 -0
  71. {gitlabform-6.0.0 → gitlabform-6.2.0}/dev/gitlab/tests.Dockerfile +0 -0
  72. {gitlabform-6.0.0 → gitlabform-6.2.0}/dev/infra.py +0 -0
  73. {gitlabform-6.0.0 → gitlabform-6.2.0}/dev/main.py +0 -0
  74. {gitlabform-6.0.0 → gitlabform-6.2.0}/dev/package.py +0 -0
  75. {gitlabform-6.0.0 → gitlabform-6.2.0}/dev/qa.py +0 -0
  76. {gitlabform-6.0.0 → gitlabform-6.2.0}/dev/release.py +0 -0
  77. {gitlabform-6.0.0 → gitlabform-6.2.0}/docs/automation.md +0 -0
  78. {gitlabform-6.0.0 → gitlabform-6.2.0}/docs/contrib/coding_guidelines.md +0 -0
  79. {gitlabform-6.0.0 → gitlabform-6.2.0}/docs/contrib/implementation_design.md +0 -0
  80. {gitlabform-6.0.0 → gitlabform-6.2.0}/docs/contrib/index.md +0 -0
  81. {gitlabform-6.0.0 → gitlabform-6.2.0}/docs/contrib/local_development.md +0 -0
  82. {gitlabform-6.0.0 → gitlabform-6.2.0}/docs/contrib/releases.md +0 -0
  83. {gitlabform-6.0.0 → gitlabform-6.2.0}/docs/features.md +0 -0
  84. {gitlabform-6.0.0 → gitlabform-6.2.0}/docs/images/Opencast-logo.png +0 -0
  85. {gitlabform-6.0.0 → gitlabform-6.2.0}/docs/images/egnyte-logo.svg +0 -0
  86. {gitlabform-6.0.0 → gitlabform-6.2.0}/docs/images/elastic-path-logo.svg +0 -0
  87. {gitlabform-6.0.0 → gitlabform-6.2.0}/docs/images/gitlabform-logo-square.png +0 -0
  88. {gitlabform-6.0.0 → gitlabform-6.2.0}/docs/images/gitlabform-logo.png +0 -0
  89. {gitlabform-6.0.0 → gitlabform-6.2.0}/docs/images/gitlabform-logo.svg +0 -0
  90. {gitlabform-6.0.0 → gitlabform-6.2.0}/docs/images/group-ldap-links-provider.png +0 -0
  91. {gitlabform-6.0.0 → gitlabform-6.2.0}/docs/images/liquidlight-logo.svg +0 -0
  92. {gitlabform-6.0.0 → gitlabform-6.2.0}/docs/images/roche-logo.png +0 -0
  93. {gitlabform-6.0.0 → gitlabform-6.2.0}/docs/images/stroeer-online-marketing-logo.svg +0 -0
  94. {gitlabform-6.0.0 → gitlabform-6.2.0}/docs/index.md +0 -0
  95. {gitlabform-6.0.0 → gitlabform-6.2.0}/docs/installation.md +0 -0
  96. {gitlabform-6.0.0 → gitlabform-6.2.0}/docs/reference/archive_unarchive.md +0 -0
  97. {gitlabform-6.0.0 → gitlabform-6.2.0}/docs/reference/avatar.md +0 -0
  98. {gitlabform-6.0.0 → gitlabform-6.2.0}/docs/reference/badges.md +0 -0
  99. {gitlabform-6.0.0 → gitlabform-6.2.0}/docs/reference/ci_cd_variables.md +0 -0
  100. {gitlabform-6.0.0 → gitlabform-6.2.0}/docs/reference/deploy_keys.md +0 -0
  101. {gitlabform-6.0.0 → gitlabform-6.2.0}/docs/reference/files.md +0 -0
  102. {gitlabform-6.0.0 → gitlabform-6.2.0}/docs/reference/group_ldap_links.md +0 -0
  103. {gitlabform-6.0.0 → gitlabform-6.2.0}/docs/reference/group_saml_links.md +0 -0
  104. {gitlabform-6.0.0 → gitlabform-6.2.0}/docs/reference/index.md +0 -0
  105. {gitlabform-6.0.0 → gitlabform-6.2.0}/docs/reference/integrations.md +0 -0
  106. {gitlabform-6.0.0 → gitlabform-6.2.0}/docs/reference/job_token_scope.md +0 -0
  107. {gitlabform-6.0.0 → gitlabform-6.2.0}/docs/reference/labels.md +0 -0
  108. {gitlabform-6.0.0 → gitlabform-6.2.0}/docs/reference/members.md +0 -0
  109. {gitlabform-6.0.0 → gitlabform-6.2.0}/docs/reference/merge_requests.md +0 -0
  110. {gitlabform-6.0.0 → gitlabform-6.2.0}/docs/reference/pipeline_schedules.md +0 -0
  111. {gitlabform-6.0.0 → gitlabform-6.2.0}/docs/reference/project_security_settings.md +0 -0
  112. {gitlabform-6.0.0 → gitlabform-6.2.0}/docs/reference/project_transfer.md +0 -0
  113. {gitlabform-6.0.0 → gitlabform-6.2.0}/docs/reference/protected_branches.md +0 -0
  114. {gitlabform-6.0.0 → gitlabform-6.2.0}/docs/reference/protected_environments.md +0 -0
  115. {gitlabform-6.0.0 → gitlabform-6.2.0}/docs/reference/push_mirrors.md +0 -0
  116. {gitlabform-6.0.0 → gitlabform-6.2.0}/docs/reference/push_rules.md +0 -0
  117. {gitlabform-6.0.0 → gitlabform-6.2.0}/docs/reference/resource_groups.md +0 -0
  118. {gitlabform-6.0.0 → gitlabform-6.2.0}/docs/reference/settings.md +0 -0
  119. {gitlabform-6.0.0 → gitlabform-6.2.0}/docs/reference/tags_protection.md +0 -0
  120. {gitlabform-6.0.0 → gitlabform-6.2.0}/docs/reference/webhooks.md +0 -0
  121. {gitlabform-6.0.0 → gitlabform-6.2.0}/docs/requirements.md +0 -0
  122. {gitlabform-6.0.0 → gitlabform-6.2.0}/docs/running.md +0 -0
  123. {gitlabform-6.0.0 → gitlabform-6.2.0}/docs/similar_apps.md +0 -0
  124. {gitlabform-6.0.0 → gitlabform-6.2.0}/docs/upgrade.md +0 -0
  125. {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlab-config/config.yml +0 -0
  126. {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlab-config/gitlab-config.md +0 -0
  127. {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/__init__.py +0 -0
  128. {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/configuration/__init__.py +0 -0
  129. {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/configuration/common.py +0 -0
  130. {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/configuration/transform.py +0 -0
  131. {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/constants.py +0 -0
  132. {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/gitlab/commits.py +0 -0
  133. {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/gitlab/group_badges.py +0 -0
  134. {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/gitlab/group_ldap_links.py +0 -0
  135. {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/gitlab/groups.py +0 -0
  136. {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/gitlab/merge_requests.py +0 -0
  137. {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/gitlab/pipelines.py +0 -0
  138. {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/gitlab/project_badges.py +0 -0
  139. {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/gitlab/project_deploy_keys.py +0 -0
  140. {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/gitlab/project_merge_requests_approvals.py +0 -0
  141. {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/gitlab/project_protected_environments.py +0 -0
  142. {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/gitlab/projects.py +0 -0
  143. {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/gitlab/python_gitlab.py +0 -0
  144. {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/gitlab/variables.py +0 -0
  145. {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/lists/__init__.py +0 -0
  146. {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/lists/filter.py +0 -0
  147. {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/lists/groups.py +0 -0
  148. {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/output.py +0 -0
  149. {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/processors/__init__.py +0 -0
  150. {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/processors/abstract_processor.py +0 -0
  151. {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/processors/application/__init__.py +0 -0
  152. {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/processors/application/application_settings_processor.py +0 -0
  153. {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/processors/defining_keys.py +0 -0
  154. {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/processors/group/__init__.py +0 -0
  155. {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/processors/group/group_badges_processor.py +0 -0
  156. {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/processors/group/group_hooks_processor.py +0 -0
  157. {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/processors/group/group_labels_processor.py +0 -0
  158. {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/processors/group/group_ldap_links_processor.py +0 -0
  159. {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/processors/group/group_protected_branches_processor.py +0 -0
  160. {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/processors/group/group_push_rules_processor.py +0 -0
  161. {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/processors/group/group_settings_processor.py +0 -0
  162. {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/processors/group/group_variables_processor.py +0 -0
  163. {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/processors/multiple_entities_processor.py +0 -0
  164. {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/processors/project/__init__.py +0 -0
  165. {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/processors/project/badges_processor.py +0 -0
  166. {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/processors/project/branches_processor.py +0 -0
  167. {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/processors/project/deploy_keys_processor.py +0 -0
  168. {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/processors/project/hooks_processor.py +0 -0
  169. {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/processors/project/integrations_processor.py +0 -0
  170. {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/processors/project/job_token_scope_processor.py +0 -0
  171. {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/processors/project/merge_requests_approval_rules.py +0 -0
  172. {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/processors/project/merge_requests_approvals.py +0 -0
  173. {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/processors/project/project_labels_processor.py +0 -0
  174. {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/processors/project/project_processor.py +0 -0
  175. {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/processors/project/project_push_rules_processor.py +0 -0
  176. {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/processors/project/project_security_settings.py +0 -0
  177. {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/processors/project/project_settings_processor.py +0 -0
  178. {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/processors/project/project_variables_processor.py +0 -0
  179. {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/processors/project/remote_mirrors_processor.py +0 -0
  180. {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/processors/project/resource_groups_processor.py +0 -0
  181. {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/processors/project/schedules_processor.py +0 -0
  182. {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/processors/project/tags_processor.py +0 -0
  183. {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/processors/shared/__init__.py +0 -0
  184. {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/processors/shared/protected_environments_processor.py +0 -0
  185. {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/processors/util/__init__.py +0 -0
  186. {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/processors/util/branch_protection.py +0 -0
  187. {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/processors/util/decorators.py +0 -0
  188. {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/processors/util/difference_logger.py +0 -0
  189. {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/processors/util/labels_processor.py +0 -0
  190. {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/processors/util/variables_processor.py +0 -0
  191. {gitlabform-6.0.0 → gitlabform-6.2.0}/gitlabform/run.py +0 -0
  192. {gitlabform-6.0.0 → gitlabform-6.2.0}/mkdocs.yml +0 -0
  193. {gitlabform-6.0.0 → gitlabform-6.2.0}/prek.toml +0 -0
  194. {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/__init__.py +0 -0
  195. {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/__init__.py +0 -0
  196. {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/conftest.py +0 -0
  197. {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/premium/test_branches.py +0 -0
  198. {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/premium/test_branches_users_case_insensitive.py +0 -0
  199. {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/premium/test_group_ldap_links.py +0 -0
  200. {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/premium/test_group_protected_branches.py +0 -0
  201. {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/premium/test_group_push_rules.py +0 -0
  202. {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/premium/test_group_settings.py +0 -0
  203. {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/premium/test_group_variables.py +0 -0
  204. {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/premium/test_merge_request_approval_rules.py +0 -0
  205. {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/premium/test_merge_request_approvals_settings.py +0 -0
  206. {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/premium/test_protected_environments.py +0 -0
  207. {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/premium/test_push_rules.py +0 -0
  208. {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/premium/test_tags.py +0 -0
  209. {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/standard/__init__.py +0 -0
  210. {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_application_settings.py +0 -0
  211. {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_archive_project.py +0 -0
  212. {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_badges.py +0 -0
  213. {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_branches.py +0 -0
  214. {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_deploy_keys.py +0 -0
  215. {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_deploy_keys_all_projects.py +0 -0
  216. {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_files.py +0 -0
  217. {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_files_templates.py +0 -0
  218. {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_group_avatar.py +0 -0
  219. {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_group_badges.py +0 -0
  220. {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_group_hooks.py +0 -0
  221. {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_group_labels.py +0 -0
  222. {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_group_members_case_insensitive.py +0 -0
  223. {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_group_members_groups.py +0 -0
  224. {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_group_members_users.py +0 -0
  225. {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_group_settings.py +0 -0
  226. {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_group_variables.py +0 -0
  227. {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_hooks.py +0 -0
  228. {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_integrations.py +0 -0
  229. {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_job_token_scope.py +0 -0
  230. {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_members.py +0 -0
  231. {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_members_add_group.py +0 -0
  232. {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_members_enforce.py +0 -0
  233. {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_project_avatar.py +0 -0
  234. {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_project_group_members_case_insensitive.py +0 -0
  235. {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_project_labels.py +0 -0
  236. {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_project_members_case_insensitve.py +0 -0
  237. {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_project_settings.py +0 -0
  238. {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_project_variables.py +0 -0
  239. {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_resource_groups.py +0 -0
  240. {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_running.py +0 -0
  241. {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_scheduled_for_deletion_project.py +0 -0
  242. {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_schedules.py +0 -0
  243. {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_tags.py +0 -0
  244. {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_token_from_config.py +0 -0
  245. {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/standard/test_transfer_project.py +0 -0
  246. {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/ultimate/test_group_members.py +0 -0
  247. {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/ultimate/test_group_settings.py +0 -0
  248. {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/ultimate/test_members.py +0 -0
  249. {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/ultimate/test_project_security_settings.py +0 -0
  250. {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/acceptance/ultimate/test_project_settings.py +0 -0
  251. {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/unit/__init__.py +0 -0
  252. {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/unit/configuration/__init__.py +0 -0
  253. {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/unit/configuration/test_case_sensitivity.py +0 -0
  254. {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/unit/configuration/test_inheritance_break_projects_and_groups.py +0 -0
  255. {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/unit/configuration/test_inheritance_break_validation.py +0 -0
  256. {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/unit/configuration/test_projects_and_groups.py +0 -0
  257. {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/unit/configuration/test_skip_groups_skip_projects.py +0 -0
  258. {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/unit/configuration/test_subgroups.py +0 -0
  259. {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/unit/configuration/test_yaml_version.py +0 -0
  260. {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/unit/configuration/transform/test_group_transformer.py +0 -0
  261. {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/unit/configuration/transform/test_implicit_name_transformer.py +0 -0
  262. {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/unit/configuration/transform/test_user_and_group_transformers.py +0 -0
  263. {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/unit/configuration/transform/test_user_transformer.py +0 -0
  264. {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/unit/gitlab/test_python_gitlab.py +0 -0
  265. {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/unit/processors/__init__.py +0 -0
  266. {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/unit/processors/test_abstract_processor.py +0 -0
  267. {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/unit/processors/test_abstract_processors.py +0 -0
  268. {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/unit/processors/test_branches_processor.py +0 -0
  269. {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/unit/processors/test_difference_logger.py +0 -0
  270. {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/unit/processors/test_group_protected_branches_processor.py +0 -0
  271. {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/unit/processors/test_schedules_processor_extended_cron_pattern.py +0 -0
  272. {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/unit/test_access_levels.py +0 -0
  273. {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/unit/test_non_empty_configs_provider.py +0 -0
  274. {gitlabform-6.0.0 → gitlabform-6.2.0}/tests/unit/test_parse_args.py +0 -0
  275. {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@v4
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@v6
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@v4
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@v6
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@v6
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@v6
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@v4
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@v6
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@v4
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@v6
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@v6
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@v6
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@v6
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@v6
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: Upload coverage
48
- uses: Wandalen/wretry.action@v3
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
- action: codecov/codecov-action@v3
51
- with: |
52
- name: codecov-acceptance-test-standard-${{ matrix.flavor }}
53
- flags: integration
54
- token: ${{ secrets.CODECOV_TOKEN }}
55
- attempt_limit: 5
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@v6
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: Upload coverage
83
- uses: Wandalen/wretry.action@v3
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
- action: codecov/codecov-action@v3
86
- with: |
87
- name: codecov-acceptance-test-${{ matrix.tier }}
88
- flags: integration
89
- token: ${{ secrets.CODECOV_TOKEN }}
90
- attempt_limit: 5
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@v6
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: Upload coverage to Codecov
40
- uses: Wandalen/wretry.action@v3
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
- action: codecov/codecov-action@v3
43
- with: |
44
- name: unit-tests-${{ matrix.python-version }}
45
- flags: unittests
46
- fail_ci_if_error: true
47
- token: ${{ secrets.CODECOV_TOKEN }}
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.0.0
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.5.20
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/contributor-success/community-contributors-workflows/#contributing-to-the-gitlab-enterprise-edition-ee).
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
- As a Maintainer, when you receive a new license key, please add/update it to the GitHub Repository Secrets.
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):