diff --git a/.gitlab/ci/database.gitlab-ci.yml b/.gitlab/ci/database.gitlab-ci.yml index 3102b863c16..b151655ea51 100644 --- a/.gitlab/ci/database.gitlab-ci.yml +++ b/.gitlab/ci/database.gitlab-ci.yml @@ -58,6 +58,12 @@ db:migrate:multi-version-upgrade: - psql --output /dev/null -v "ON_ERROR_STOP=1" -h postgres -U postgres -d gitlabhq_test < gitlabhq_production - bundle exec rake gitlab:db:configure +# Validate minimum PG version supported by GitLab +db:migrate:multi-version-upgrade-pg13: + extends: + - db:migrate:multi-version-upgrade + - .use-pg13 + db:migrate:reset: extends: .db-job-base script: diff --git a/app/assets/javascripts/merge_requests/components/reviewers/reviewer_drawer.vue b/app/assets/javascripts/merge_requests/components/reviewers/reviewer_drawer.vue index 9b93d8e2953..46be0b5d21f 100644 --- a/app/assets/javascripts/merge_requests/components/reviewers/reviewer_drawer.vue +++ b/app/assets/javascripts/merge_requests/components/reviewers/reviewer_drawer.vue @@ -6,6 +6,8 @@ import { getContentWrapperHeight } from '~/lib/utils/dom_utils'; export default { components: { GlDrawer, + ApprovalSummary: () => + import('ee_component/merge_requests/components/reviewers/approval_summary.vue'), }, props: { open: { @@ -33,5 +35,8 @@ export default { + diff --git a/app/assets/javascripts/releases/components/releases_empty_state.vue b/app/assets/javascripts/releases/components/releases_empty_state.vue index 2893a42c73b..6f5abf99515 100644 --- a/app/assets/javascripts/releases/components/releases_empty_state.vue +++ b/app/assets/javascripts/releases/components/releases_empty_state.vue @@ -25,7 +25,6 @@ export default { :title="$options.i18n.emptyStateTitle" :description="$options.i18n.emptyStateText" :svg-path="illustrationPath" - :svg-height="null" :primary-button-link="newReleasePath" :primary-button-text="$options.i18n.newRelease" :secondary-button-link="documentationPath" diff --git a/app/assets/javascripts/sidebar/components/reviewers/reviewer_title.vue b/app/assets/javascripts/sidebar/components/reviewers/reviewer_title.vue index af9a77f27b9..1ce5baca8c5 100644 --- a/app/assets/javascripts/sidebar/components/reviewers/reviewer_title.vue +++ b/app/assets/javascripts/sidebar/components/reviewers/reviewer_title.vue @@ -59,18 +59,6 @@ export default { {{ reviewerTitle }} diff --git a/app/assets/javascripts/sidebar/mount_sidebar.js b/app/assets/javascripts/sidebar/mount_sidebar.js index c7af7398eff..e196fb8a60b 100644 --- a/app/assets/javascripts/sidebar/mount_sidebar.js +++ b/app/assets/javascripts/sidebar/mount_sidebar.js @@ -187,12 +187,18 @@ function mountSidebarReviewers(mediator) { return; } - const { iid, fullPath } = getSidebarOptions(); + const { id, iid, fullPath, multipleApprovalRulesAvailable = false } = getSidebarOptions(); // eslint-disable-next-line no-new new Vue({ el, name: 'SidebarReviewersRoot', apolloProvider, + provide: { + issuableIid: String(iid), + issuableId: String(id), + projectPath: fullPath, + multipleApprovalRulesAvailable: parseBoolean(multipleApprovalRulesAvailable), + }, render: (createElement) => createElement(SidebarReviewers, { props: { diff --git a/app/graphql/resolvers/concerns/project_search_arguments.rb b/app/graphql/resolvers/concerns/project_search_arguments.rb index faf3b85fc14..560b75baa36 100644 --- a/app/graphql/resolvers/concerns/project_search_arguments.rb +++ b/app/graphql/resolvers/concerns/project_search_arguments.rb @@ -19,6 +19,10 @@ module ProjectSearchArguments argument :topics, type: [GraphQL::Types::String], required: false, description: 'Filter projects by topics.' + + argument :personal, GraphQL::Types::Boolean, + required: false, + description: 'Return only personal projects.' end private @@ -29,7 +33,8 @@ module ProjectSearchArguments search: params[:search], search_namespaces: params[:search_namespaces], sort: params[:sort], - topic: params[:topics] + topic: params[:topics], + personal: params[:personal] }.compact end end diff --git a/app/helpers/markup_helper.rb b/app/helpers/markup_helper.rb index 1bd5cc41961..3a97c3206d5 100644 --- a/app/helpers/markup_helper.rb +++ b/app/helpers/markup_helper.rb @@ -74,7 +74,7 @@ module MarkupHelper tags: tags, attributes: Rails::Html::WhiteListSanitizer.allowed_attributes + %w[ - style data-src data-name data-unicode-version data-html + style data-src data-name data-unicode-version data-html data-fallback-src data-reference-type data-project-path data-iid data-mr-title data-user ] diff --git a/app/helpers/releases_helper.rb b/app/helpers/releases_helper.rb index e0db40ebaee..98f1ca51db2 100644 --- a/app/helpers/releases_helper.rb +++ b/app/helpers/releases_helper.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true module ReleasesHelper - IMAGE_PATH = 'illustrations/releases.svg' + IMAGE_PATH = 'illustrations/rocket-launch-md.svg' DOCUMENTATION_PATH = 'user/project/releases/index' # This needs to be kept in sync with the constant in diff --git a/app/serializers/merge_request_sidebar_basic_entity.rb b/app/serializers/merge_request_sidebar_basic_entity.rb index a0832655563..2dd6e1997cc 100644 --- a/app/serializers/merge_request_sidebar_basic_entity.rb +++ b/app/serializers/merge_request_sidebar_basic_entity.rb @@ -11,3 +11,5 @@ class MergeRequestSidebarBasicEntity < IssuableSidebarBasicEntity end end end + +MergeRequestSidebarBasicEntity.prepend_mod_with('MergeRequestSidebarBasicEntity') diff --git a/config/click_house.yml.example b/config/click_house.yml.example index 9c602eb2762..0c25d9b2e58 100644 --- a/config/click_house.yml.example +++ b/config/click_house.yml.example @@ -10,3 +10,6 @@ test: url: 'http://localhost:8123' username: clickhouse password: clickhouse + variables: + # execute mutations (updates, deletes) synchronously to avoid flaky tests + mutations_sync: 1 diff --git a/db/docs/boards.yml b/db/docs/boards.yml index db177f7a562..b13d43e9938 100644 --- a/db/docs/boards.yml +++ b/db/docs/boards.yml @@ -4,7 +4,17 @@ classes: - Board feature_categories: - team_planning -description: Configuration information for issue boards, including default scope and visibility of open and closed lists +description: Configuration information for issue boards, including default scope and + visibility of open and closed lists introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/611dab2e522e5e59cf09cd459a31686e65616863 milestone: '8.11' -gitlab_schema: gitlab_main +gitlab_schema: gitlab_main_cell +allow_cross_joins: +- gitlab_main_clusterwide +allow_cross_transactions: +- gitlab_main_clusterwide +allow_cross_foreign_keys: +- gitlab_main_clusterwide +sharding_key: + group_id: namespaces + project_id: projects diff --git a/db/docs/milestones.yml b/db/docs/milestones.yml index 8ba4f3a4de0..c4b5933569c 100644 --- a/db/docs/milestones.yml +++ b/db/docs/milestones.yml @@ -4,7 +4,17 @@ classes: - Milestone feature_categories: - team_planning -description: Information related to milestones, used by team planning features to timebox work +description: Information related to milestones, used by team planning features to + timebox work introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/23d950855d6d2524d00b1f0618c008e2529f06a4 milestone: "<6.0" -gitlab_schema: gitlab_main +gitlab_schema: gitlab_main_cell +allow_cross_joins: +- gitlab_main_clusterwide +allow_cross_transactions: +- gitlab_main_clusterwide +allow_cross_foreign_keys: +- gitlab_main_clusterwide +sharding_key: + project_id: projects + group_id: namespaces diff --git a/db/docs/sprints.yml b/db/docs/sprints.yml index cee20a3bcb5..fa8d31ccf7a 100644 --- a/db/docs/sprints.yml +++ b/db/docs/sprints.yml @@ -4,7 +4,16 @@ classes: - Iteration feature_categories: - team_planning -description: Also called iterations, timeboxes to which issues can be assigned. Used to plan and track work. +description: Also called iterations, timeboxes to which issues can be assigned. Used + to plan and track work. introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/30125 milestone: '13.0' -gitlab_schema: gitlab_main +gitlab_schema: gitlab_main_cell +allow_cross_joins: +- gitlab_main_clusterwide +allow_cross_transactions: +- gitlab_main_clusterwide +allow_cross_foreign_keys: +- gitlab_main_clusterwide +sharding_key: + group_id: namespaces diff --git a/db/docs/todos.yml b/db/docs/todos.yml index d7328af05b9..fc3e4e56ce3 100644 --- a/db/docs/todos.yml +++ b/db/docs/todos.yml @@ -4,7 +4,17 @@ classes: - Todo feature_categories: - team_planning -description: An action required or notification of action taken for a user on a target object, generated by various actions within the GitLab application +description: An action required or notification of action taken for a user on a target + object, generated by various actions within the GitLab application introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/3d52e139b13ad077286f2f9f46b7e98f43ad9564 milestone: '8.5' -gitlab_schema: gitlab_main +gitlab_schema: gitlab_main_cell +allow_cross_joins: +- gitlab_main_clusterwide +allow_cross_transactions: +- gitlab_main_clusterwide +allow_cross_foreign_keys: +- gitlab_main_clusterwide +sharding_key: + project_id: projects + group_id: namespaces diff --git a/db/post_migrate/20240402102315_validate_check_null_constraint_for_vulnerability_reads_traversal_ids.rb b/db/post_migrate/20240402102315_validate_check_null_constraint_for_vulnerability_reads_traversal_ids.rb new file mode 100644 index 00000000000..cc96471e0d3 --- /dev/null +++ b/db/post_migrate/20240402102315_validate_check_null_constraint_for_vulnerability_reads_traversal_ids.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true + +class ValidateCheckNullConstraintForVulnerabilityReadsTraversalIds < Gitlab::Database::Migration[2.2] + milestone '16.11' + + def up + validate_not_null_constraint :vulnerability_reads, :traversal_ids + end + + def down + # no-op + end +end diff --git a/db/schema_migrations/20240402102315 b/db/schema_migrations/20240402102315 new file mode 100644 index 00000000000..57b49bb48b4 --- /dev/null +++ b/db/schema_migrations/20240402102315 @@ -0,0 +1 @@ +6224ead5a2eeafdd064a4de7e2946cefba86cbb03a099e4d047960f7361e5c2d \ No newline at end of file diff --git a/db/structure.sql b/db/structure.sql index b0f1b9b905c..fdde49d90db 100644 --- a/db/structure.sql +++ b/db/structure.sql @@ -17595,7 +17595,8 @@ CREATE TABLE vulnerability_reads ( archived boolean DEFAULT false NOT NULL, CONSTRAINT check_380451bdbe CHECK ((char_length(location_image) <= 2048)), CONSTRAINT check_4b1a1bf5ea CHECK ((has_merge_request IS NOT NULL)), - CONSTRAINT check_a105eb825a CHECK ((char_length(cluster_agent_id) <= 10)) + CONSTRAINT check_a105eb825a CHECK ((char_length(cluster_agent_id) <= 10)), + CONSTRAINT check_f5ba7c2496 CHECK ((traversal_ids IS NOT NULL)) ); CREATE SEQUENCE vulnerability_reads_id_seq @@ -20705,9 +20706,6 @@ ALTER TABLE sprints ALTER TABLE web_hook_logs ADD CONSTRAINT check_df72cb58f5 CHECK ((char_length(url_hash) <= 44)) NOT VALID; -ALTER TABLE vulnerability_reads - ADD CONSTRAINT check_f5ba7c2496 CHECK ((traversal_ids IS NOT NULL)) NOT VALID; - ALTER TABLE projects ADD CONSTRAINT check_fa75869cb1 CHECK ((project_namespace_id IS NOT NULL)) NOT VALID; diff --git a/doc/api/graphql/reference/index.md b/doc/api/graphql/reference/index.md index 6126299c1bb..53d7c081ad8 100644 --- a/doc/api/graphql/reference/index.md +++ b/doc/api/graphql/reference/index.md @@ -769,6 +769,7 @@ four standard [pagination arguments](#pagination-arguments): | `fullPaths` | [`[String!]`](#string) | Filter projects by full paths. You cannot provide more than 50 full paths. | | `ids` | [`[ID!]`](#id) | Filter projects by IDs. | | `membership` | [`Boolean`](#boolean) | Return only projects that the current user is a member of. | +| `personal` | [`Boolean`](#boolean) | Return only personal projects. | | `search` | [`String`](#string) | Search query, which can be for the project name, a path, or a description. | | `searchNamespaces` | [`Boolean`](#boolean) | Include namespace in project search. | | `sort` | [`String`](#string) | Sort order of results. Format: `_`, for example: `id_desc` or `name_asc`. | @@ -16833,6 +16834,7 @@ four standard [pagination arguments](#pagination-arguments): | Name | Type | Description | | ---- | ---- | ----------- | | `membership` | [`Boolean`](#boolean) | Return only projects that the current user is a member of. | +| `personal` | [`Boolean`](#boolean) | Return only personal projects. | | `search` | [`String`](#string) | Search query, which can be for the project name, a path, or a description. | | `searchNamespaces` | [`Boolean`](#boolean) | Include namespace in project search. | | `sort` **{warning-solid}** | [`String`](#string) | **Deprecated** in GitLab 15.4. Default sort order will change in GitLab 17.0. Specify `"id_asc"` if you require the query results to be ordered by ascending IDs. | @@ -24721,6 +24723,7 @@ four standard [pagination arguments](#pagination-arguments): | `fullPaths` | [`[String!]`](#string) | Filter projects by full paths. You cannot provide more than 50 full paths. | | `ids` | [`[ID!]`](#id) | Filter projects by IDs. | | `membership` | [`Boolean`](#boolean) | Return only projects that the current user is a member of. | +| `personal` | [`Boolean`](#boolean) | Return only personal projects. | | `search` | [`String`](#string) | Search query, which can be for the project name, a path, or a description. | | `searchNamespaces` | [`Boolean`](#boolean) | Include namespace in project search. | | `sort` | [`String`](#string) | Sort order of results. Format: `_`, for example: `id_desc` or `name_asc`. | diff --git a/doc/ci/runners/configure_runners.md b/doc/ci/runners/configure_runners.md index 11fe03bb224..92d80f2f45e 100644 --- a/doc/ci/runners/configure_runners.md +++ b/doc/ci/runners/configure_runners.md @@ -405,7 +405,7 @@ You can use tags to run different jobs on different platforms. For example, if you have an OS X runner with tag `osx` and a Windows runner with tag `windows`, you can run a job on each platform. -Update the `tags` field in the `config.toml`: +Update the `tags` field in the `.gitlab-ci.yml`: ```yaml windows job: diff --git a/doc/ci/runners/new_creation_workflow.md b/doc/ci/runners/new_creation_workflow.md index 12002ce2f2d..5316bbd939b 100644 --- a/doc/ci/runners/new_creation_workflow.md +++ b/doc/ci/runners/new_creation_workflow.md @@ -33,7 +33,7 @@ you can let us know in the [feedback issue](https://gitlab.com/gitlab-org/gitlab For the new runner registration workflow, you: -1. [Create a runner](runners_scope.md) directly in the GitLab UI. +1. [Create a runner](runners_scope.md) directly in the GitLab UI or [programmatically](#creating-runners-programmatically). 1. Receive a runner authentication token. 1. Use the runner authentication token instead of the registration token when you register a runner with this configuration. Runner managers registered in multiple hosts appear diff --git a/doc/development/internal_analytics/service_ping/index.md b/doc/development/internal_analytics/service_ping/index.md index 787803cb7cb..886cf9e33fe 100644 --- a/doc/development/internal_analytics/service_ping/index.md +++ b/doc/development/internal_analytics/service_ping/index.md @@ -387,7 +387,7 @@ We return fallback values in these cases: ## Monitoring -Service Ping reporting process state is monitored with [internal SiSense dashboard](https://app.periscopedata.com/app/gitlab/968489/Product-Intelligence---Service-Ping-Health). +Service Ping reporting process state is monitored with [Tableau dashboard](https://10az.online.tableau.com/#/site/gitlab/workbooks/2327447/views). ## Related topics diff --git a/doc/subscriptions/self_managed/index.md b/doc/subscriptions/self_managed/index.md index 68268414aa7..30451d79e07 100644 --- a/doc/subscriptions/self_managed/index.md +++ b/doc/subscriptions/self_managed/index.md @@ -126,15 +126,13 @@ GitLab has several features which can help you manage the number of users: option. - Enable `block_auto_created_users` for new sign-ups via [LDAP](../../administration/auth/ldap/index.md#basic-configuration-settings) or [OmniAuth](../../integration/omniauth.md#configure-common-settings). - Enable the [User cap](../../administration/settings/sign_up_restrictions.md#user-cap) - option. **Available in GitLab 13.7 and later**. + option. - [Disable new sign-ups](../../administration/settings/sign_up_restrictions.md), and instead manage new users manually. - View a breakdown of users by role in the [Users statistics](../../administration/admin_area.md#users-statistics) page. ## Subscription data synchronization -> - Introduced in GitLab 14.1. - Subscription data can be automatically synchronized between your self-managed instance and GitLab. To enable subscription data synchronization you must have: @@ -255,8 +253,6 @@ It also displays the following information: ## Export your license usage -> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/66826) in GitLab 14.2. - If you are an administrator, you can export your license usage into a CSV: 1. On the left sidebar, at the bottom, select **Admin Area**. diff --git a/spec/frontend/merge_requests/components/reviewers/reviewer_drawer_spec.js b/spec/frontend/merge_requests/components/reviewers/reviewer_drawer_spec.js index f8a5d639aa8..f22b8cfca3b 100644 --- a/spec/frontend/merge_requests/components/reviewers/reviewer_drawer_spec.js +++ b/spec/frontend/merge_requests/components/reviewers/reviewer_drawer_spec.js @@ -10,6 +10,12 @@ let wrapper; function createComponent(propsData = {}) { wrapper = shallowMount(ReviewerDrawer, { propsData, + provide: { + projectPath: 'gitlab-org/gitlab', + issuableId: '1', + issuableIid: '1', + multipleApprovalRulesAvailable: false, + }, }); } diff --git a/spec/frontend/sidebar/components/reviewers/reviewer_title_spec.js b/spec/frontend/sidebar/components/reviewers/reviewer_title_spec.js index 94509b974db..4d1879a6765 100644 --- a/spec/frontend/sidebar/components/reviewers/reviewer_title_spec.js +++ b/spec/frontend/sidebar/components/reviewers/reviewer_title_spec.js @@ -16,6 +16,10 @@ describe('ReviewerTitle component', () => { ...props, }, provide: { + projectPath: 'gitlab-org/gitlab', + issuableId: '1', + issuableIid: '1', + multipleApprovalRulesAvailable: false, glFeatures: { reviewerAssignDrawer, }, diff --git a/spec/graphql/resolvers/projects_resolver_spec.rb b/spec/graphql/resolvers/projects_resolver_spec.rb index d9c1527af86..2fc42e2ee93 100644 --- a/spec/graphql/resolvers/projects_resolver_spec.rb +++ b/spec/graphql/resolvers/projects_resolver_spec.rb @@ -8,6 +8,7 @@ RSpec.describe Resolvers::ProjectsResolver, feature_category: :source_code_manag describe '#resolve' do subject { resolve(described_class, obj: nil, args: filters, ctx: { current_user: current_user }).items } + let_it_be(:user) { create(:user, :with_namespace) } let_it_be(:group) { create(:group, name: 'public-group') } let_it_be(:private_group) { create(:group, name: 'private-group') } let_it_be(:project) { create(:project, :public, topic_list: %w[ruby javascript]) } @@ -16,8 +17,7 @@ RSpec.describe Resolvers::ProjectsResolver, feature_category: :source_code_manag let_it_be(:private_project) { create(:project, :private) } let_it_be(:other_private_project) { create(:project, :private) } let_it_be(:private_group_project) { create(:project, :private, group: private_group) } - - let_it_be(:user) { create(:user) } + let_it_be(:private_personal_project) { create(:project, :private, namespace: user.namespace) } let(:filters) { {} } @@ -74,16 +74,26 @@ RSpec.describe Resolvers::ProjectsResolver, feature_category: :source_code_manag is_expected.to contain_exactly(project) end end + + context 'when personal filter is provided' do + let(:filters) { { personal: true } } + + it 'returns all public projects' do + is_expected.to contain_exactly(project, other_project, group_project) + end + end end end context 'when user is logged in' do let(:current_user) { user } - let(:visible_projecs) { [project, other_project, group_project, private_project, private_group_project] } + let(:visible_projects) do + [project, other_project, group_project, private_project, private_group_project, private_personal_project] + end context 'when no filters are applied' do it 'returns all visible projects for the user' do - is_expected.to contain_exactly(project, other_project, group_project, private_project, private_group_project) + is_expected.to match_array(visible_projects) end context 'when search filter is provided' do @@ -98,7 +108,7 @@ RSpec.describe Resolvers::ProjectsResolver, feature_category: :source_code_manag let(:filters) { { membership: true } } it 'returns projects that user is member of' do - is_expected.to contain_exactly(project, private_project, private_group_project) + is_expected.to contain_exactly(project, private_project, private_group_project, private_personal_project) end end @@ -142,7 +152,7 @@ RSpec.describe Resolvers::ProjectsResolver, feature_category: :source_code_manag context 'when no sort is provided' do it 'returns projects in descending order by id' do - is_expected.to match_array((visible_projecs + named_projects).sort_by { |p| p[:id] }.reverse) + is_expected.to match_array((visible_projects + named_projects).sort_by { |p| p[:id] }.reverse) end end end @@ -154,6 +164,14 @@ RSpec.describe Resolvers::ProjectsResolver, feature_category: :source_code_manag is_expected.to contain_exactly(project) end end + + context 'when personal filter is provided' do + let(:filters) { { personal: true } } + + it 'returns matching project' do + is_expected.to contain_exactly(private_personal_project) + end + end end end end diff --git a/spec/helpers/markup_helper_spec.rb b/spec/helpers/markup_helper_spec.rb index c43cc78f4ea..84d19d3982f 100644 --- a/spec/helpers/markup_helper_spec.rb +++ b/spec/helpers/markup_helper_spec.rb @@ -491,6 +491,19 @@ RSpec.describe MarkupHelper, feature_category: :team_planning do expect(text).not_to match('

" + + expect(helper.first_line_in_markdown(object, attribute, 150, project: project)).to eq(expected) + end + end + context 'labels formatting' do let(:label_title) { 'this should be ~label_1' } diff --git a/spec/helpers/releases_helper_spec.rb b/spec/helpers/releases_helper_spec.rb index daf034edbb1..e52e69deb83 100644 --- a/spec/helpers/releases_helper_spec.rb +++ b/spec/helpers/releases_helper_spec.rb @@ -5,7 +5,7 @@ require 'spec_helper' RSpec.describe ReleasesHelper do describe '#illustration' do it 'returns the correct image path' do - expect(helper.illustration).to match(%r{illustrations/releases-(\w+)\.svg}) + expect(helper.illustration).to match(%r{illustrations/rocket-launch-md-(\w+)\.svg}) end end diff --git a/spec/lib/gitlab/database/sharding_key_spec.rb b/spec/lib/gitlab/database/sharding_key_spec.rb index dc899a2e33f..e0f26d571f3 100644 --- a/spec/lib/gitlab/database/sharding_key_spec.rb +++ b/spec/lib/gitlab/database/sharding_key_spec.rb @@ -23,16 +23,18 @@ RSpec.describe 'new tables missing sharding_key', feature_category: :cell do let(:allowed_to_be_missing_not_null) do [ *tables_with_alternative_not_null_constraint, - 'internal_ids.project_id', # https://gitlab.com/gitlab-org/gitlab/-/issues/451900 - 'internal_ids.namespace_id', # https://gitlab.com/gitlab-org/gitlab/-/issues/451900 - 'labels.project_id', # https://gitlab.com/gitlab-org/gitlab/-/issues/434356 - 'labels.group_id', # https://gitlab.com/gitlab-org/gitlab/-/issues/434356 + *['boards.project_id', 'boards.group_id'], + *['internal_ids.project_id', 'internal_ids.namespace_id'], # https://gitlab.com/gitlab-org/gitlab/-/issues/451900 + *['labels.project_id', 'labels.group_id'], # https://gitlab.com/gitlab-org/gitlab/-/issues/434356 'member_roles.namespace_id', # https://gitlab.com/gitlab-org/gitlab/-/issues/444161 + *['milestones.project_id', 'milestones.group_id'], 'pages_domains.project_id', # https://gitlab.com/gitlab-org/gitlab/-/issues/442178, 'path_locks.project_id', # https://gitlab.com/gitlab-org/gitlab/-/issues/444643 'remote_mirrors.project_id', # https://gitlab.com/gitlab-org/gitlab/-/issues/444643 + 'sprints.group_id', 'subscription_add_on_purchases.namespace_id', # https://gitlab.com/gitlab-org/gitlab/-/issues/444338 - 'temp_notes_backup.project_id' # https://gitlab.com/gitlab-org/gitlab/-/issues/443667' + 'temp_notes_backup.project_id', # https://gitlab.com/gitlab-org/gitlab/-/issues/443667' + *['todos.project_id', 'todos.group_id'] ] end