Add latest changes from gitlab-org/gitlab@master

This commit is contained in:
GitLab Bot 2024-08-28 12:11:39 +00:00
parent 1df76ff02f
commit 2f9b2f549e
114 changed files with 830 additions and 157 deletions

View File

@ -187,7 +187,7 @@ gem 'carrierwave', '~> 1.3' # rubocop:todo Gemfile/MissingFeatureCategory
gem 'mini_magick', '~> 4.12' # rubocop:todo Gemfile/MissingFeatureCategory
# for backups
gem 'fog-aws', '~> 3.18' # rubocop:todo Gemfile/MissingFeatureCategory
gem 'fog-aws', '~> 3.24', feature_category: :shared
# Locked until fog-google resolves https://github.com/fog/fog-google/issues/421.
# Also see config/initializers/fog_core_patch.rb.
gem 'fog-core', '= 2.1.0' # rubocop:todo Gemfile/MissingFeatureCategory

View File

@ -189,7 +189,7 @@
{"name":"flipper-active_record","version":"0.26.2","platform":"ruby","checksum":"61deaeef8ce2f775e67d7095f40fd95fc2d07241e143dd4436e78c7b26a320bc"},
{"name":"flipper-active_support_cache_store","version":"0.26.2","platform":"ruby","checksum":"c2d3883ad1e5c7de827c37df455ffe6e175bc0be93f2a260c54efdabb313d2b0"},
{"name":"fog-aliyun","version":"0.4.0","platform":"ruby","checksum":"8f2334604beb781eafbb9cd5f50141fbb2c7eb77c7f2b01f45c2e04db0e5cc38"},
{"name":"fog-aws","version":"3.18.0","platform":"ruby","checksum":"f4c5880ecfbc4edbf711dfd41140f9f17dfc68b519546d121448d2d3a5584704"},
{"name":"fog-aws","version":"3.24.0","platform":"ruby","checksum":"b66c3a01bdb15c71e2f654b03e44cb94652f139d36a7b8d11006771360113054"},
{"name":"fog-core","version":"2.1.0","platform":"ruby","checksum":"53e5d793554d7080d015ef13cd44b54027e421d924d9dba4ce3d83f95f37eda9"},
{"name":"fog-google","version":"1.24.1","platform":"ruby","checksum":"dcd64ec5d12ed53f269afd7a88738b453e5150ef72b451900bb7abf3678358e0"},
{"name":"fog-json","version":"1.2.0","platform":"ruby","checksum":"dd4f5ab362dbc72b687240bba9d2dd841d5dfe888a285797533f85c03ea548fe"},

View File

@ -637,7 +637,7 @@ GEM
fog-json
ipaddress (~> 0.8)
xml-simple (~> 1.1)
fog-aws (3.18.0)
fog-aws (3.24.0)
fog-core (~> 2.1)
fog-json (~> 1.1)
fog-xml (~> 0.1)
@ -2036,7 +2036,7 @@ DEPENDENCIES
flipper-active_record (~> 0.26.2)
flipper-active_support_cache_store (~> 0.26.2)
fog-aliyun (~> 0.4)
fog-aws (~> 3.18)
fog-aws (~> 3.24)
fog-core (= 2.1.0)
fog-google (~> 1.24.1)
fog-local (~> 0.8)

View File

@ -190,7 +190,7 @@
{"name":"flipper-active_record","version":"0.26.2","platform":"ruby","checksum":"61deaeef8ce2f775e67d7095f40fd95fc2d07241e143dd4436e78c7b26a320bc"},
{"name":"flipper-active_support_cache_store","version":"0.26.2","platform":"ruby","checksum":"c2d3883ad1e5c7de827c37df455ffe6e175bc0be93f2a260c54efdabb313d2b0"},
{"name":"fog-aliyun","version":"0.4.0","platform":"ruby","checksum":"8f2334604beb781eafbb9cd5f50141fbb2c7eb77c7f2b01f45c2e04db0e5cc38"},
{"name":"fog-aws","version":"3.18.0","platform":"ruby","checksum":"f4c5880ecfbc4edbf711dfd41140f9f17dfc68b519546d121448d2d3a5584704"},
{"name":"fog-aws","version":"3.24.0","platform":"ruby","checksum":"b66c3a01bdb15c71e2f654b03e44cb94652f139d36a7b8d11006771360113054"},
{"name":"fog-core","version":"2.1.0","platform":"ruby","checksum":"53e5d793554d7080d015ef13cd44b54027e421d924d9dba4ce3d83f95f37eda9"},
{"name":"fog-google","version":"1.24.1","platform":"ruby","checksum":"dcd64ec5d12ed53f269afd7a88738b453e5150ef72b451900bb7abf3678358e0"},
{"name":"fog-json","version":"1.2.0","platform":"ruby","checksum":"dd4f5ab362dbc72b687240bba9d2dd841d5dfe888a285797533f85c03ea548fe"},

View File

@ -647,7 +647,7 @@ GEM
fog-json
ipaddress (~> 0.8)
xml-simple (~> 1.1)
fog-aws (3.18.0)
fog-aws (3.24.0)
fog-core (~> 2.1)
fog-json (~> 1.1)
fog-xml (~> 0.1)
@ -2064,7 +2064,7 @@ DEPENDENCIES
flipper-active_record (~> 0.26.2)
flipper-active_support_cache_store (~> 0.26.2)
fog-aliyun (~> 0.4)
fog-aws (~> 3.18)
fog-aws (~> 3.24)
fog-core (= 2.1.0)
fog-google (~> 1.24.1)
fog-local (~> 0.8)

View File

@ -32,6 +32,7 @@ export default function initInviteGroupsModal() {
freeUsersLimit: parseInt(el.dataset.freeUsersLimit, 10),
overageMembersModalAvailable: parseBoolean(el.dataset.overageMembersModalAvailable),
hasGitlabSubscription: parseBoolean(el.dataset.hasGitlabSubscription),
customRoleForGroupLinkEnabled: parseBoolean(el.dataset.customRoleForGroupLinkEnabled),
},
render: (createElement) =>
createElement(InviteGroupsModal, {

View File

@ -0,0 +1,55 @@
<script>
import { GlDisclosureDropdown } from '@gitlab/ui';
import { InternalEvents } from '~/tracking';
import { __ } from '~/locale';
const trackingMixin = InternalEvents.mixin();
export default {
components: {
GlDisclosureDropdown,
},
mixins: [trackingMixin],
inject: {
switchDashboardPath: { default: '' },
dashboardLinkText: { default: __('Switch to old dashboard') },
experimentEnabled: { default: true },
},
computed: {
dropdownItems() {
return [
{ id: 0, href: this.switchDashboardPath, text: this.dashboardLinkText },
{
id: 1,
href: 'https://gitlab.com/gitlab-org/gitlab/-/issues/460910',
text: __('Provide feedback'),
extraAttrs: {
target: '__blank',
rel: 'noopener',
},
},
];
},
},
methods: {
action({ id }) {
if (id === 1) return;
this.trackEvent('toggle_merge_request_redesign', {
value: Number(this.experimentEnabled),
});
},
},
};
</script>
<template>
<gl-disclosure-dropdown
icon="preferences"
:toggle-text="__('Open action menu')"
text-sr-only
placement="bottom-end"
:items="dropdownItems"
@action="action"
/>
</template>

View File

@ -3,6 +3,7 @@ import { GlButton, GlIcon, GlAlert } from '@gitlab/ui';
import MergeRequestsQuery from './merge_requests_query.vue';
import CollapsibleSection from './collapsible_section.vue';
import MergeRequest from './merge_request.vue';
import ActionDropdown from './action_dropdown.vue';
export default {
components: {
@ -12,6 +13,7 @@ export default {
MergeRequestsQuery,
CollapsibleSection,
MergeRequest,
ActionDropdown,
},
props: {
lists: {
@ -25,7 +27,10 @@ export default {
<template>
<div>
<div class="page-title-holder gl-flex">
<h1 class="page-title gl-text-size-h-display">{{ __('Merge requests') }}</h1>
<h1 class="page-title gl-text-size-h-display">{{ __('Merge Requests') }}</h1>
<div class="gl-ml-auto gl-self-center">
<action-dropdown />
</div>
</div>
<merge-requests-query
v-for="(list, i) in lists"

View File

@ -7,7 +7,7 @@ import App from './components/app.vue';
export function initMergeRequestDashboard(el) {
Vue.use(VueApollo);
const { lists } = JSON.parse(el.dataset.initialData);
const { lists, switch_dashboard_path: switchDashboardPath } = JSON.parse(el.dataset.initialData);
return new Vue({
el,
@ -49,6 +49,7 @@ export function initMergeRequestDashboard(el) {
},
),
}),
provide: { switchDashboardPath },
render(createElement) {
return createElement(App, {
props: {

View File

@ -1,3 +1,5 @@
import Vue from 'vue';
import { __ } from '~/locale';
import addExtraTokensForMergeRequests from 'ee_else_ce/filtered_search/add_extra_tokens_for_merge_requests';
import { createFilteredSearchTokenKeys } from '~/filtered_search/issuable_filtered_search_token_keys';
import { FILTERED_SEARCH } from '~/filtered_search/constants';
@ -5,6 +7,7 @@ import initFilteredSearch from '~/pages/search/init_filtered_search';
import { initNewResourceDropdown } from '~/vue_shared/components/new_resource_dropdown/init_new_resource_dropdown';
import { RESOURCE_TYPE_MERGE_REQUEST } from '~/vue_shared/components/new_resource_dropdown/constants';
import searchUserProjectsWithMergeRequestsEnabled from '~/vue_shared/components/new_resource_dropdown/graphql/search_user_projects_with_merge_requests_enabled.query.graphql';
import ActionDropdown from '~/merge_request_dashboard/components/action_dropdown.vue';
const el = document.getElementById('js-merge-request-dashboard');
@ -15,6 +18,23 @@ if (el) {
initMergeRequestDashboard(el);
});
} else {
const actionDropdownEl = document.querySelector('.js-action-dropdown');
if (actionDropdownEl) {
// eslint-disable-next-line no-new
new Vue({
el: actionDropdownEl,
provide: {
switchDashboardPath: actionDropdownEl.dataset.switchdashboardpath,
dashboardLinkText: __('Switch to new dashboard'),
experimentEnabled: false,
},
render(createElement) {
return createElement(ActionDropdown);
},
});
}
const IssuableFilteredSearchTokenKeys = createFilteredSearchTokenKeys({
disableReleaseFilter: true,
});

View File

@ -107,7 +107,10 @@ class GroupMembersFinder < UnionFinder
# with the group or its ancestors because the shared members cannot have access greater than the `group_group_links`
# with itself or its ancestors.
shared_members = GroupMember.non_request.of_groups(shared_from_groups)
.with_group_group_sharing_access(group.self_and_ancestors)
.with_group_group_sharing_access(
group.self_and_ancestors,
custom_role_for_group_link_enabled?(group)
)
# `members` and `shared_members` should have even select values
find_union([members.select(Member.column_names), shared_members], GroupMember)
end
@ -139,6 +142,11 @@ class GroupMembersFinder < UnionFinder
def static_roles_only?
true
end
# overridden in EE
def custom_role_for_group_link_enabled?(_group)
false
end
end
GroupMembersFinder.prepend_mod_with('GroupMembersFinder')

View File

@ -8,13 +8,17 @@ module Resolvers
type Types::LabelType.connection_type, null: true
argument :title, GraphQL::Types::String,
required: false,
description: 'Exact match on title. Cannot be used with `searchTerm`. `searchIn` will be ignored if `title` argument is provided.' # rubocop:disable Layout/LineLength -- This is just a long string
argument :search_term, GraphQL::Types::String,
required: false,
description: 'Search term to find labels with.'
argument :search_in, [Types::Issuables::Labels::SearchFieldListEnum],
default_value: [:title, :description],
description: 'Specify which fields to search in.'
description: 'Specify which fields to search in. Ignored if using `title`.'
argument :include_ancestor_groups, GraphQL::Types::Boolean,
required: false,
@ -25,6 +29,8 @@ module Resolvers
Preloaders::LabelsPreloader.new(nodes, current_user).preload_all
end
validates mutually_exclusive: [:search_term, :title]
def resolve(**args)
return Label.none if parent.nil?
@ -33,6 +39,9 @@ module Resolvers
# LabelsFinder uses `search` param, so we transform `search_term` into `search`
args[:search] = args.delete(:search_term)
# If `title` is used, remove `search_in`
args.delete(:search_in) if args[:title]
# Optimization:
# Rely on the LabelsPreloader rather than the default parent record preloading in the
# finder because LabelsPreloader preloads more associations which are required for the

View File

@ -44,6 +44,11 @@ module InviteMembersHelper
}
end
# Overridden in EE
def invite_group_dataset(source)
{}
end
private
def group_select_data(source)

View File

@ -264,6 +264,10 @@ module MergeRequestsHelper
{ identity_verification_required: 'false' }
end
def merge_request_dashboard_enabled?(current_user)
current_user.merge_request_dashboard_enabled? && !current_page?(merge_requests_search_dashboard_path)
end
private
def review_requested_merge_requests_count
@ -354,12 +358,9 @@ module MergeRequestsHelper
{ new_comment_template_paths: new_comment_template_paths(@project.group, @project).to_json }
end
def merge_request_dashboard_enabled?(current_user)
current_user.merge_request_dashboard_enabled?
end
def merge_request_dashboard_data
def merge_request_dashboard_data(current_user)
{
switch_dashboard_path: merge_request_dashboard_enabled?(current_user) ? merge_requests_search_dashboard_path : merge_requests_dashboard_path,
lists: [
{
title: _('Returned to you'),

View File

@ -414,13 +414,15 @@ class Member < ApplicationRecord
pluck(:user_id)
end
def with_group_group_sharing_access(shared_groups)
def with_group_group_sharing_access(shared_groups, custom_role_for_group_link_enabled)
columns = member_columns_with_group_sharing_access(custom_role_for_group_link_enabled)
joins("LEFT OUTER JOIN group_group_links ON members.source_id = group_group_links.shared_with_group_id")
.select(member_columns_with_group_sharing_access)
.select(columns)
.where(group_group_links: { shared_group_id: shared_groups })
end
def member_columns_with_group_sharing_access
def member_columns_with_group_sharing_access(custom_role_for_group_link_enabled)
group_group_link_table = GroupGroupLink.arel_table
column_names.map do |column_name|
@ -429,7 +431,7 @@ class Member < ApplicationRecord
args = [group_group_link_table[:group_access], arel_table[:access_level]]
smallest_value_arel(args, 'access_level')
when 'member_role_id'
member_role_id(group_group_link_table, arel_table)
member_role_id(group_group_link_table, custom_role_for_group_link_enabled)
else
arel_table[column_name]
end
@ -441,8 +443,8 @@ class Member < ApplicationRecord
end
# overriden in EE
def member_role_id(_group_group_link_table, group_member_table)
group_member_table[:member_role_id]
def member_role_id(_group_link_table, _custom_role_for_group_link_enabled)
arel_table[:member_role_id]
end
end

View File

@ -9,7 +9,7 @@
groups_requiring_saml_reauth: user_groups_requiring_reauth
- if merge_request_dashboard_enabled?(current_user)
#js-merge-request-dashboard{ data: { initial_data: merge_request_dashboard_data.to_json } }
#js-merge-request-dashboard{ data: { initial_data: merge_request_dashboard_data(current_user).to_json } }
= render ::Layouts::PageHeadingComponent.new(_('Merge requests'))
= gl_loading_icon(size: 'lg')
- else
@ -17,6 +17,8 @@
- c.with_actions do
- if current_user
= render 'shared/new_project_item_vue_select'
- if current_user&.merge_request_dashboard_enabled?
.js-action-dropdown{ data: { switchDashboardPath: merge_requests_dashboard_path } }
.top-area
= render 'shared/issuable/nav', type: :merge_requests, display_count: !(@no_filters_set || @search_timeout_occurred)

View File

@ -1,3 +1,3 @@
- return unless can_admin_group_member?(group)
.js-invite-groups-modal{ data: { reload_page_on_submit: local_assigns.fetch(:reload_page_on_submit, false).to_s }.merge(common_invite_group_modal_data(group, GroupMember, 'false')) }
.js-invite-groups-modal{ data: { reload_page_on_submit: local_assigns.fetch(:reload_page_on_submit, false).to_s }.merge(common_invite_group_modal_data(group, GroupMember, 'false').merge(invite_group_dataset(group))) }

View File

@ -1,8 +1,8 @@
.sm:gl-ml-3.dropdown.gl-dropdown
#js-check-out-modal{ data: how_merge_modal_data(@merge_request) }
= render Pajamas::ButtonComponent.new(category: :primary, variant: :confirm, button_text_classes: 'gl-inline-flex gl-justify-between gl-w-full', button_options: { class: 'gl-flex gl-self-start gl-w-full gl-s-w-auto', data: { toggle: 'dropdown', testid: 'mr-code-dropdown' } }) do
= render Pajamas::ButtonComponent.new(category: :primary, variant: :confirm, button_text_classes: 'gl-inline-flex gl-justify-between gl-w-full', button_options: { class: 'gl-flex gl-self-start gl-w-full sm:gl-w-auto !gl-pr-3', data: { toggle: 'dropdown', testid: 'mr-code-dropdown' } }) do
= _('Code')
= sprite_icon "chevron-down", size: 16, css_class: "gl-icon !gl-mr-0"
= sprite_icon "chevron-down", size: 16, css_class: "gl-icon gl-ml-2 !gl-mr-0"
.dropdown-menu.dropdown-menu-right
.gl-dropdown-inner
.gl-dropdown-contents

View File

@ -12,9 +12,9 @@
- c.with_body do
= _('The source project of this merge request has been removed.')
.detail-page-header.border-bottom-0.gl-block.gl-pt-5{ class: "sm:!gl-flex #{'is-merge-request' if !fluid_layout}" }
.detail-page-header.border-bottom-0.gl-block.gl-pt-5.gl-gap-4{ class: "sm:!gl-flex #{'is-merge-request' if !fluid_layout}" }
.detail-page-header-body
%h1.title.gl-heading-1.gl-my-0.gl-block.gl-grow.gl-break-anywhere{ class: '!gl-m-0', data: { testid: 'title-content' } }
%h1.title.gl-heading-1.gl-block.gl-grow.gl-break-anywhere{ class: '!gl-m-0', data: { testid: 'title-content' } }
= markdown_field(@merge_request, :title)
- unless hide_gutter_toggle

View File

@ -0,0 +1,19 @@
---
description: Toggled between old and new merge request dashboard
internal_events: true
action: toggle_merge_request_redesign
identifiers:
- user
product_group: code_review
milestone: '17.3'
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/issues/475243
distributions:
- ce
- ee
tiers:
- free
- premium
- ultimate
additional_properties:
value:
description: indicator for if new dashboard is enabled or disabled

View File

@ -444,6 +444,10 @@ security_scans:
- table: projects
column: project_id
on_delete: async_delete
security_trainings:
- table: projects
column: project_id
on_delete: async_delete
snippets:
- table: organizations
column: organization_id

View File

@ -0,0 +1,24 @@
---
key_path: redis_hll_counters.count_distinct_user_id_from_new_mr_dashboard_to_old_mr_dashboard_monthly
description: Monthly count of unique users who toggled the old dashboard from the new dashboard
product_group: code_review
performance_indicator_type: []
value_type: number
status: active
milestone: '17.3'
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/issues/475243
time_frame: 28d
data_source: internal_events
data_category: optional
distribution:
- ce
- ee
tier:
- free
- premium
- ultimate
events:
- name: toggle_merge_request_redesign
unique: user.id
filter:
value: 1

View File

@ -0,0 +1,24 @@
---
key_path: redis_hll_counters.count_distinct_user_id_from_old_mr_dashboard_to_new_mr_dashboard_monthly
description: Monthly count of unique users who toggle the new dashboard from the old dashboard
product_group: code_review
performance_indicator_type: []
value_type: number
status: active
milestone: '17.3'
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/issues/475243
time_frame: 28d
data_source: internal_events
data_category: optional
distribution:
- ce
- ee
tier:
- free
- premium
- ultimate
events:
- name: toggle_merge_request_redesign
unique: user.id
filter:
value: 0

View File

@ -0,0 +1,24 @@
---
key_path: redis_hll_counters.count_distinct_user_id_from_new_mr_dashboard_to_old_mr_dashboard_weekly
description: Weekly count of unique users who toggled the old dashboard from the new dashboard
product_group: code_review
performance_indicator_type: []
value_type: number
status: active
milestone: '17.3'
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/issues/475243
time_frame: 7d
data_source: internal_events
data_category: optional
distribution:
- ce
- ee
tier:
- free
- premium
- ultimate
events:
- name: toggle_merge_request_redesign
unique: user.id
filter:
value: 1

View File

@ -0,0 +1,24 @@
---
key_path: redis_hll_counters.count_distinct_user_id_from_old_mr_dashboard_to_new_mr_dashboard_weekly
description: Weekly count of unique users who toggle the new dashboard from the old dashboard
product_group: code_review
performance_indicator_type: []
value_type: number
status: active
milestone: '17.3'
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/issues/475243
time_frame: 7d
data_source: internal_events
data_category: optional
distribution:
- ce
- ee
tier:
- free
- premium
- ultimate
events:
- name: toggle_merge_request_redesign
unique: user.id
filter:
value: 0

View File

@ -5,6 +5,7 @@ resource :dashboard, controller: 'dashboard', only: [] do
get :issues
get :merge_requests
get :activity
get 'merge_requests/search', to: 'dashboard#merge_requests'
scope module: :dashboard do
resources :milestones, only: [:index]

View File

@ -0,0 +1,9 @@
---
migration_job_name: BackfillSubscriptionUserAddOnAssignmentsOrganizationId
description: Backfills sharding key `subscription_user_add_on_assignments.organization_id` from `subscription_add_on_purchases`.
feature_category: seat_cost_management
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/163912
milestone: '17.4'
queued_migration_version: 20240826120429
finalize_after: '2024-09-22'
finalized_by: # version of the migration that finalized this BBM

View File

@ -7,7 +7,7 @@ feature_categories:
description: Join table between DAST Scanner Profiles and CI Builds
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/63362
milestone: '14.1'
gitlab_schema: gitlab_main_cell
gitlab_schema: gitlab_sec
allow_cross_foreign_keys:
- gitlab_main_clusterwide
desired_sharding_key:

View File

@ -17,3 +17,4 @@ desired_sharding_key:
table: subscription_add_on_purchases
sharding_key: organization_id
belongs_to: add_on_purchase
desired_sharding_key_migration_job_name: BackfillSubscriptionUserAddOnAssignmentsOrganizationId

View File

@ -0,0 +1,9 @@
# frozen_string_literal: true
class AddOrganizationIdToSubscriptionUserAddOnAssignments < Gitlab::Database::Migration[2.2]
milestone '17.4'
def change
add_column :subscription_user_add_on_assignments, :organization_id, :bigint
end
end

View File

@ -4,18 +4,14 @@ class RevertRemoveProjectsSecurityTrainingsProjectIdFk < Gitlab::Database::Migra
milestone '17.4'
disable_ddl_transaction!
FOREIGN_KEY_NAME = "fk_rails_f80240fae0"
# Migration was set to succesful due to issue with foreign key validation when
# loose foreign key records were unprocessed. Will be reattempted in a new migraiton.
def up
add_concurrent_foreign_key(:security_trainings, :projects,
name: FOREIGN_KEY_NAME, column: :project_id,
target_column: :id, on_delete: :cascade)
# No-op.
end
def down
with_lock_retries do
remove_foreign_key_if_exists(:security_trainings, :projects,
name: FOREIGN_KEY_NAME, reverse_lock_order: true)
end
# No-op
end
end

View File

@ -0,0 +1,16 @@
# frozen_string_literal: true
class IndexSubscriptionUserAddOnAssignmentsOnOrganizationId < Gitlab::Database::Migration[2.2]
milestone '17.4'
disable_ddl_transaction!
INDEX_NAME = 'index_subscription_user_add_on_assignments_on_organization_id'
def up
add_concurrent_index :subscription_user_add_on_assignments, :organization_id, name: INDEX_NAME
end
def down
remove_concurrent_index_by_name :subscription_user_add_on_assignments, INDEX_NAME
end
end

View File

@ -0,0 +1,17 @@
# frozen_string_literal: true
class AddSubscriptionUserAddOnAssignmentsOrganizationIdFk < Gitlab::Database::Migration[2.2]
milestone '17.4'
disable_ddl_transaction!
def up
add_concurrent_foreign_key :subscription_user_add_on_assignments, :organizations, column: :organization_id,
on_delete: :cascade
end
def down
with_lock_retries do
remove_foreign_key :subscription_user_add_on_assignments, column: :organization_id
end
end
end

View File

@ -0,0 +1,25 @@
# frozen_string_literal: true
class AddSubscriptionUserAddOnAssignmentsOrganizationIdTrigger < Gitlab::Database::Migration[2.2]
milestone '17.4'
def up
install_sharding_key_assignment_trigger(
table: :subscription_user_add_on_assignments,
sharding_key: :organization_id,
parent_table: :subscription_add_on_purchases,
parent_sharding_key: :organization_id,
foreign_key: :add_on_purchase_id
)
end
def down
remove_sharding_key_assignment_trigger(
table: :subscription_user_add_on_assignments,
sharding_key: :organization_id,
parent_table: :subscription_add_on_purchases,
parent_sharding_key: :organization_id,
foreign_key: :add_on_purchase_id
)
end
end

View File

@ -0,0 +1,40 @@
# frozen_string_literal: true
class QueueBackfillSubscriptionUserAddOnAssignmentsOrganizationId < Gitlab::Database::Migration[2.2]
milestone '17.4'
restrict_gitlab_migration gitlab_schema: :gitlab_main_cell
MIGRATION = "BackfillSubscriptionUserAddOnAssignmentsOrganizationId"
DELAY_INTERVAL = 2.minutes
BATCH_SIZE = 1000
SUB_BATCH_SIZE = 100
def up
queue_batched_background_migration(
MIGRATION,
:subscription_user_add_on_assignments,
:id,
:organization_id,
:subscription_add_on_purchases,
:organization_id,
:add_on_purchase_id,
job_interval: DELAY_INTERVAL,
batch_size: BATCH_SIZE,
sub_batch_size: SUB_BATCH_SIZE
)
end
def down
delete_batched_background_migration(
MIGRATION,
:subscription_user_add_on_assignments,
:id,
[
:organization_id,
:subscription_add_on_purchases,
:organization_id,
:add_on_purchase_id
]
)
end
end

View File

@ -0,0 +1 @@
dd5436446beef26ff9b5c3ae3bdea11f5215253407b8f6499405c66d20ce6924

View File

@ -0,0 +1 @@
e87a4eae4274701551acd3cafd4cc345562424476b48463876dadac02b0ba140

View File

@ -0,0 +1 @@
a8697ca4a389cc7e5995a87707ba75aad2a1a3261ac7b9672f33a9a42e221149

View File

@ -0,0 +1 @@
11370470201bcc08109ee5ff49613c232e0bb6e106c865bfe972dcc2d87eab6e

View File

@ -0,0 +1 @@
e5f7e898ef7e7535bc485d7ebdbb83ef8ad10c59fc8394ad13b6e1814af23faa

View File

@ -1433,6 +1433,22 @@ RETURN NEW;
END
$$;
CREATE FUNCTION trigger_740afa9807b8() RETURNS trigger
LANGUAGE plpgsql
AS $$
BEGIN
IF NEW."organization_id" IS NULL THEN
SELECT "organization_id"
INTO NEW."organization_id"
FROM "subscription_add_on_purchases"
WHERE "subscription_add_on_purchases"."id" = NEW."add_on_purchase_id";
END IF;
RETURN NEW;
END
$$;
CREATE FUNCTION trigger_77d9fbad5b12() RETURNS trigger
LANGUAGE plpgsql
AS $$
@ -18492,7 +18508,8 @@ CREATE TABLE subscription_user_add_on_assignments (
add_on_purchase_id bigint NOT NULL,
user_id bigint NOT NULL,
created_at timestamp with time zone NOT NULL,
updated_at timestamp with time zone NOT NULL
updated_at timestamp with time zone NOT NULL,
organization_id bigint
);
CREATE SEQUENCE subscription_user_add_on_assignments_id_seq
@ -30092,6 +30109,8 @@ CREATE UNIQUE INDEX index_subscription_add_ons_on_name ON subscription_add_ons U
CREATE INDEX index_subscription_addon_purchases_on_expires_on ON subscription_add_on_purchases USING btree (expires_on);
CREATE INDEX index_subscription_user_add_on_assignments_on_organization_id ON subscription_user_add_on_assignments USING btree (organization_id);
CREATE INDEX index_subscription_user_add_on_assignments_on_user_id ON subscription_user_add_on_assignments USING btree (user_id);
CREATE INDEX index_subscriptions_on_project_id ON subscriptions USING btree (project_id);
@ -32674,6 +32693,8 @@ CREATE TRIGGER trigger_6d6c79ce74e1 BEFORE INSERT OR UPDATE ON protected_environ
CREATE TRIGGER trigger_70d3f0bba1de BEFORE INSERT OR UPDATE ON compliance_framework_security_policies FOR EACH ROW EXECUTE FUNCTION trigger_70d3f0bba1de();
CREATE TRIGGER trigger_740afa9807b8 BEFORE INSERT OR UPDATE ON subscription_user_add_on_assignments FOR EACH ROW EXECUTE FUNCTION trigger_740afa9807b8();
CREATE TRIGGER trigger_77d9fbad5b12 BEFORE INSERT OR UPDATE ON packages_debian_project_distribution_keys FOR EACH ROW EXECUTE FUNCTION trigger_77d9fbad5b12();
CREATE TRIGGER trigger_7a8b08eed782 BEFORE INSERT OR UPDATE ON boards_epic_board_positions FOR EACH ROW EXECUTE FUNCTION trigger_7a8b08eed782();
@ -34057,6 +34078,9 @@ ALTER TABLE ONLY custom_emoji
ALTER TABLE ONLY bulk_import_entities
ADD CONSTRAINT fk_d06d023c30 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
ALTER TABLE ONLY subscription_user_add_on_assignments
ADD CONSTRAINT fk_d1074a6e16 FOREIGN KEY (organization_id) REFERENCES organizations(id) ON DELETE CASCADE;
ALTER TABLE ONLY project_mirror_data
ADD CONSTRAINT fk_d1aad367d7 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
@ -36235,9 +36259,6 @@ ALTER TABLE ONLY internal_ids
ALTER TABLE ONLY issues_self_managed_prometheus_alert_events
ADD CONSTRAINT fk_rails_f7db2d72eb FOREIGN KEY (self_managed_prometheus_alert_event_id) REFERENCES self_managed_prometheus_alert_events(id) ON DELETE CASCADE;
ALTER TABLE ONLY security_trainings
ADD CONSTRAINT fk_rails_f80240fae0 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
ALTER TABLE ONLY merge_requests_closing_issues
ADD CONSTRAINT fk_rails_f8540692be FOREIGN KEY (issue_id) REFERENCES issues(id) ON DELETE CASCADE;

View File

@ -43,6 +43,7 @@ You can use the following environment variables to override certain values:
| `GITLAB_RAILS_CACHE_DEFAULT_TTL_SECONDS` | integer | The default TTL used for entries stored in the Rails-cache. Default is `28800`. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/95042) in 15.3. |
| `GITLAB_CI_CONFIG_FETCH_TIMEOUT_SECONDS` | integer | Timeout for resolving remote includes in CI config in seconds. Must be between `0` and `60`. Default is `30`. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/116383) in 15.11. |
| `GITLAB_DISABLE_TOKEN_EXPIRATION_BANNER` | string | If set to `true`, `1`, or `yes`, the token expiration banner is not shown. Default is `false`. |
| `GITLAB_DISABLE_MARKDOWN_TIMEOUT` | string | If set to `true`, `1`, or `yes`, Markdown rendering on the backend does not time out. Default is `false`. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/163662) in 17.4.|
| `GITLAB_LFS_MAX_OID_TO_FETCH` | integer | Sets the maximum number of LFS objects to link. Default is `100,000`. |
| `SIDEKIQ_SEMI_RELIABLE_FETCH_TIMEOUT` | integer | Sets the timeout for Sidekiq semi-reliable fetch. Default is `5`. [Before GitLab 16.7](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/139583), default was `3`. If you experience high Redis CPU consumption on GitLab 16.6 and earlier, or if you have customized this variable, you should update this variable to `5`. |

View File

@ -24,7 +24,7 @@ External users:
- Can only access public snippets.
Access can be granted by adding the user as member to the project or group.
Like usual users, they receive a role in the project or group with all
Like usual users, they receive a role for the project or group with all
the abilities that are mentioned in the [permissions table](../user/permissions.md#project-members-permissions).
For example, if an external user is added as Guest, and your project is internal or
private, they do not have access to the code; you need to grant the external

View File

@ -14560,6 +14560,30 @@ The edge type for [`Note`](#note).
| <a id="noteedgecursor"></a>`cursor` | [`String!`](#string) | A cursor for use in pagination. |
| <a id="noteedgenode"></a>`node` | [`Note`](#note) | The item at the end of the edge. |
#### `ObservabilityLogConnection`
The connection type for [`ObservabilityLog`](#observabilitylog).
##### Fields
| Name | Type | Description |
| ---- | ---- | ----------- |
| <a id="observabilitylogconnectioncount"></a>`count` | [`Int!`](#int) | Total count of collection. |
| <a id="observabilitylogconnectionedges"></a>`edges` | [`[ObservabilityLogEdge]`](#observabilitylogedge) | A list of edges. |
| <a id="observabilitylogconnectionnodes"></a>`nodes` | [`[ObservabilityLog]`](#observabilitylog) | A list of nodes. |
| <a id="observabilitylogconnectionpageinfo"></a>`pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
#### `ObservabilityLogEdge`
The edge type for [`ObservabilityLog`](#observabilitylog).
##### Fields
| Name | Type | Description |
| ---- | ---- | ----------- |
| <a id="observabilitylogedgecursor"></a>`cursor` | [`String!`](#string) | A cursor for use in pagination. |
| <a id="observabilitylogedgenode"></a>`node` | [`ObservabilityLog`](#observabilitylog) | The item at the end of the edge. |
#### `ObservabilityMetricConnection`
The connection type for [`ObservabilityMetric`](#observabilitymetric).
@ -23499,8 +23523,9 @@ four standard [pagination arguments](#pagination-arguments):
| <a id="grouplabelsincludeancestorgroups"></a>`includeAncestorGroups` | [`Boolean`](#boolean) | Include labels from ancestor groups. |
| <a id="grouplabelsincludedescendantgroups"></a>`includeDescendantGroups` | [`Boolean`](#boolean) | Include labels from descendant groups. |
| <a id="grouplabelsonlygrouplabels"></a>`onlyGroupLabels` | [`Boolean`](#boolean) | Include only group level labels. |
| <a id="grouplabelssearchin"></a>`searchIn` | [`[LabelSearchFieldList!]!`](#labelsearchfieldlist) | Specify which fields to search in. |
| <a id="grouplabelssearchin"></a>`searchIn` | [`[LabelSearchFieldList!]!`](#labelsearchfieldlist) | Specify which fields to search in. Ignored if using `title`. |
| <a id="grouplabelssearchterm"></a>`searchTerm` | [`String`](#string) | Search term to find labels with. |
| <a id="grouplabelstitle"></a>`title` | [`String`](#string) | Exact match on title. Cannot be used with `searchTerm`. `searchIn` will be ignored if `title` argument is provided. |
##### `Group.memberRoles`
@ -27824,6 +27849,21 @@ Nuget metadata.
| <a id="nugetmetadatalicenseurl"></a>`licenseUrl` | [`String`](#string) | License URL of the Nuget package. |
| <a id="nugetmetadataprojecturl"></a>`projectUrl` | [`String`](#string) | Project URL of the Nuget package. |
### `ObservabilityLog`
ObservabilityLog represents a connection between an issue and a log entry.
#### Fields
| Name | Type | Description |
| ---- | ---- | ----------- |
| <a id="observabilitylogfingerprint"></a>`fingerprint` | [`String!`](#string) | Log fingerprint of the log. |
| <a id="observabilitylogissue"></a>`issue` | [`Issue!`](#issue) | Issue associated with the log. |
| <a id="observabilitylogservicename"></a>`serviceName` | [`String!`](#string) | Service name of the log. |
| <a id="observabilitylogseveritynumber"></a>`severityNumber` | [`Int!`](#int) | Severity number of the log. |
| <a id="observabilitylogtimestamp"></a>`timestamp` | [`ISO8601DateTime!`](#iso8601datetime) | Timestamp of the log. |
| <a id="observabilitylogtraceidentifier"></a>`traceIdentifier` | [`String!`](#string) | Trace identifier of the log. |
### `ObservabilityMetric`
ObservabilityMetric represents a connection between an issue and a metric.
@ -29990,8 +30030,9 @@ four standard [pagination arguments](#pagination-arguments):
| Name | Type | Description |
| ---- | ---- | ----------- |
| <a id="projectlabelsincludeancestorgroups"></a>`includeAncestorGroups` | [`Boolean`](#boolean) | Include labels from ancestor groups. |
| <a id="projectlabelssearchin"></a>`searchIn` | [`[LabelSearchFieldList!]!`](#labelsearchfieldlist) | Specify which fields to search in. |
| <a id="projectlabelssearchin"></a>`searchIn` | [`[LabelSearchFieldList!]!`](#labelsearchfieldlist) | Specify which fields to search in. Ignored if using `title`. |
| <a id="projectlabelssearchterm"></a>`searchTerm` | [`String`](#string) | Search term to find labels with. |
| <a id="projectlabelstitle"></a>`title` | [`String`](#string) | Exact match on title. Cannot be used with `searchTerm`. `searchIn` will be ignored if `title` argument is provided. |
##### `Project.memberRoles`
@ -30159,6 +30200,30 @@ four standard [pagination arguments](#pagination-arguments):
| <a id="projectnestedenvironmentsstates"></a>`states` | [`[String!]`](#string) | States of environments that should be included in result. |
| <a id="projectnestedenvironmentstype"></a>`type` | [`String`](#string) | Search query for environment type. |
##### `Project.observabilityLogsLinks`
Logs attached to the project.
DETAILS:
**Introduced** in GitLab 17.4.
**Status**: Experiment.
Returns [`ObservabilityLogConnection`](#observabilitylogconnection).
This field returns a [connection](#connections). It accepts the
four standard [pagination arguments](#pagination-arguments):
`before: String`, `after: String`, `first: Int`, and `last: Int`.
###### Arguments
| Name | Type | Description |
| ---- | ---- | ----------- |
| <a id="projectobservabilitylogslinksfingerprint"></a>`fingerprint` | [`String`](#string) | Fingerprint of the log. |
| <a id="projectobservabilitylogslinksservicename"></a>`serviceName` | [`String`](#string) | Service name of the log. |
| <a id="projectobservabilitylogslinksseveritynumber"></a>`severityNumber` | [`Int`](#int) | Severity number of the log. |
| <a id="projectobservabilitylogslinkstimestamp"></a>`timestamp` | [`ISO8601DateTime`](#iso8601datetime) | Log timestamp of the log. |
| <a id="projectobservabilitylogslinkstraceidentifier"></a>`traceIdentifier` | [`String`](#string) | Trace id of the log. |
##### `Project.observabilityMetricsLinks`
Metrics attached to the project.

View File

@ -132,7 +132,7 @@ Parameters:
## Delete group milestone
Only for users with the Developer role in the group.
Only for users with the Developer role for the group.
```plaintext
DELETE /groups/:id/milestones/:milestone_id

View File

@ -1541,7 +1541,7 @@ by the group or subgroups.
This endpoint is an [experiment](../policy/experiment-beta-support.md) and might be changed or removed without notice.
Requires Owner role in the group.
Requires Owner role for the group.
```plaintext
GET /groups/:id/users
@ -2745,7 +2745,7 @@ details are returned in the response.
The following criteria must be met:
- The group must be a top-level group.
- You must have the Owner role in the group.
- You must have the Owner role for the group.
- The token type is one of:
- Personal access token
- Group access token

View File

@ -296,7 +296,7 @@ Delete artifacts of a job.
Prerequisites:
- Must have at least the maintainer role in the project.
- You must have at least the maintainer role for the project.
```plaintext
DELETE /projects/:id/jobs/:job_id/artifacts

View File

@ -192,7 +192,7 @@ DETAILS:
Prerequisites:
- You must have the Owner role in the group.
- You must have the Owner role for the group.
Use this API to manage group specific member roles. You can only create member roles at the root level of the group.

View File

@ -124,7 +124,7 @@ Parameters:
> - [Changed](https://gitlab.com/gitlab-org/gitlab/-/issues/343889) the minimum user role from Developer to Reporter in GitLab 15.0.
Only for users with at least the Reporter role in the project.
Only for users with at least the Reporter role for the project.
```plaintext
DELETE /projects/:id/milestones/:milestone_id
@ -171,7 +171,7 @@ Parameters:
> - [Changed](https://gitlab.com/gitlab-org/gitlab/-/issues/343889) the minimum user role from Developer to Reporter in GitLab 15.0.
Only for users with at least the Reporter role in the group.
Only for users with at least the Reporter role for the group.
```plaintext
POST /projects/:id/milestones/:milestone_id/promote

View File

@ -2874,10 +2874,10 @@ curl --request DELETE --header "PRIVATE-TOKEN: <your_access_token>" "https://git
Import members from another project.
If the importing member's role in the target project is:
If the importing member's role for the target project is:
- Maintainer, then members with the Owner role in the source project are imported with the Maintainer role.
- Owner, then members with the Owner role in the source project are imported with the Owner role.
- Maintainer, then members with the Owner role for the source project are imported with the Maintainer role.
- Owner, then members with the Owner role for the source project are imported with the Owner role.
```plaintext
POST /projects/:id/import_project_members/:project_id

View File

@ -51,7 +51,7 @@ Get a list of runners available to the user.
Prerequisites:
- You must be an administrator of or have the Owner role in the target namespace or project.
- You must be an administrator of or have the Owner role for the target namespace or project.
- For `instance_type`, you must be an administrator of the GitLab instance.
```plaintext
@ -134,7 +134,7 @@ is restricted to users with administrator access.
Prerequisites:
- You must be an administrator of or have the Owner role in the target namespace or project.
- You must be an administrator of or have the Owner role for the target namespace or project.
- For `instance_type`, you must be an administrator of the GitLab instance.
```plaintext
@ -240,7 +240,7 @@ Instance-level runner details via this endpoint are available to all authenticat
Prerequisites:
- You must at least the Developer role in the target namespace or project.
- You must have at least the Developer role for the target namespace or project.
- An access token with the `manage_runner` scope and the appropriate role.
```plaintext
@ -328,8 +328,8 @@ PUT /runners/:id
Prerequisites:
- For `instance_type`, you must be an administrator of the GitLab instance.
- For `group_type`, you must have the Owner role in the target namespace.
- For `project_type`, you must have at least the Maintainer role in the target project.
- For `group_type`, you must have the Owner role for the target namespace.
- For `project_type`, you must have at least the Maintainer role for the target project.
- An access token with the `manage_runner` scope and the appropriate role.
| Attribute | Type | Required | Description |
@ -412,8 +412,8 @@ Pause a runner.
Prerequisites:
- For `instance_type`, you must be an administrator of the GitLab instance.
- For `group_type`, you must have the Owner role in the target namespace.
- For `project_type`, you must have at least the Maintainer role in the target project.
- For `group_type`, you must have the Owner role for the target namespace.
- For `project_type`, you must have at least the Maintainer role for the target project.
- An access token with the `manage_runner` scope and the appropriate role.
```plaintext
@ -590,7 +590,7 @@ List all runners available in the project, including from ancestor groups and [a
Prerequisites:
- You must be an administrator of or have at least the Maintainer role in the target project.
- You must be an administrator of or have at least the Maintainer role for the target project.
```plaintext
GET /projects/:id/runners
@ -669,8 +669,8 @@ Enable an available project runner in the project.
Prerequisites:
- For `instance_type`, you must be an administrator of the GitLab instance.
- For `group_type`, you must have the Owner role in the target namespace.
- For `project_type`, you must have at least the Maintainer role in the target project.
- For `group_type`, you must have the Owner role for the target namespace.
- For `project_type`, you must have at least the Maintainer role for the target project.
```plaintext
POST /projects/:id/runners
@ -719,8 +719,8 @@ returned. Use the call to [delete a runner](#delete-a-runner) instead.
Prerequisites:
- For `instance_type`, you must be an administrator of the GitLab instance.
- For `group_type`, you must have the Owner role in the target namespace.
- For `project_type`, you must have at least the Maintainer role in the target project.
- For `group_type`, you must have the Owner role for the target namespace.
- For `project_type`, you must have at least the Maintainer role for the target project.
```plaintext
DELETE /projects/:id/runners/:runner_id
@ -890,8 +890,8 @@ To delete the runner by ID, use your access token with the runner's ID:
Prerequisites:
- For `instance_type`, you must be an administrator of the GitLab instance.
- For `group_type`, you must have the Owner role in the target namespace.
- For `project_type`, you must have at least the Maintainer role in the target project.
- For `group_type`, you must have the Owner role for the target namespace.
- For `project_type`, you must have at least the Maintainer role for the target project.
- An access token with the `manage_runner` scope and the appropriate role.
```plaintext
@ -912,7 +912,7 @@ To delete the runner by using its authentication token:
Prerequisites:
- You must be an administrator of or have the Owner role in the target namespace or project.
- You must be an administrator of or have the Owner role for the target namespace or project.
- For `instance_type`, you must be an administrator of the GitLab instance.
```plaintext
@ -1024,8 +1024,8 @@ Reset the runner's authentication token by using its runner ID.
Prerequisites:
- For `instance_type`, you must be an administrator of the GitLab instance.
- For `group_type`, you must have the Owner role in the target namespace.
- For `project_type`, you must have at least the Maintainer role in the target project.
- For `group_type`, you must have the Owner role for the target namespace.
- For `project_type`, you must have at least the Maintainer role for the target project.
- An access token with the `manage_runner` scope and the appropriate role.
```plaintext

View File

@ -563,7 +563,7 @@ in your project, you can select **CI/CD Catalog**.
Visibility of components in the CI/CD catalog follows the component source project's
[visibility setting](../../user/public_access.md). Components with source projects set to:
- Private are visible only to users assigned at least the Guest role in the source component project.
- Private are visible only to users assigned at least the Guest role for the source component project.
- Internal are visible only to users logged into the GitLab instance.
- Public are visible to anyone with access to the GitLab instance.
@ -581,7 +581,7 @@ you must set the project as a catalog project.
Prerequisites:
- You must have the Owner role in the project.
- You must have the Owner role for the project.
To set the project as a catalog project:
@ -603,7 +603,7 @@ However, publishing a component's releases in the catalog makes it discoverable
Prerequisites:
- You must have at least the Maintainer role in the project.
- You must have at least the Maintainer role for the project.
- The project must:
- Be set as a [catalog project](#set-a-component-project-as-a-catalog-project).
- Have a [project description](../../user/project/working_with_projects.md#edit-project-name-description-and-avatar) defined.

View File

@ -106,7 +106,7 @@ Add groups or projects to the allowlist only when cross-project access is needed
Prerequisites:
- You must have at least the Maintainer role in the current project. If the allowed project
- You must have at least the Maintainer role for the current project. If the allowed project
is internal or private, you must have at least the Guest role in that project.
- You must not have more than 200 groups and projects added to the allowlist.

View File

@ -98,7 +98,7 @@ If you set a quota for a subgroup, it is not used.
Prerequisites:
- You must have access to the build to view the total usage and quota summary for a namespace associated with a build.
- Access to **Usage Quotas** page is based on your role in the associated namespace or group.
- Access to **Usage Quotas** page is based on your role for the associated namespace or group.
### View Usage Quota Reports for a group

View File

@ -37,7 +37,7 @@ To use merge request pipelines:
- Your project's `.gitlab-ci.yml` file must be
[configured with jobs that run in merge request pipelines](#add-jobs-to-merge-request-pipelines).
- You must have at least the Developer role in the
- You must have at least the Developer role for the
source project to run a merge request pipeline.
- Your repository must be a GitLab repository, not an [external repository](../ci_cd_for_external_repos/index.md).

View File

@ -791,7 +791,7 @@ To change the setting, use [the projects API](../../api/projects.md#edit-project
to modify `ci_pipeline_variables_minimum_override_role` to one of:
- `owner`: Only users with the Owner role can override variables. You must have the Owner
role in the project to change the setting to this value.
role for the project to change the setting to this value.
- `maintainer`: Only users with at least the Maintainer role can override variables.
Default when not specified.
- `developer`: Only users with at least the Developer role can override variables.

View File

@ -111,13 +111,13 @@ described [above](#verification).
```yaml
verify_image:
image: alpine:3.18
image: alpine:3.20
stage: verify
before_script:
- apk add --update cosign docker
- docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY
script:
- cosign verify "$CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA" --certificate-identity "https://gitlab.com/my-group/my-project//path/to/.gitlab-ci.yml@refs/heads/main" --certificate-oidc-issuer "https://gitlab.com"
- cosign verify "$CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG" --certificate-identity "https://gitlab.com/my-group/my-project//path/to/.gitlab-ci.yml@refs/heads/main" --certificate-oidc-issuer "https://gitlab.com"
```
**Additional details**:

View File

@ -33,7 +33,7 @@ If a component is related to a GitLab feature (for example Secret Detection), th
feature category or is most closely related to it should maintain the project.
In this case, the Engineering Manager for the feature category is assigned as the project owner.
Members with the `owner` role in the project are the DRIs responsible for triaging open issues and merge requests to ensure they get addressed promptly.
Members with the `owner` role for the project are the DRIs responsible for triaging open issues and merge requests to ensure they get addressed promptly.
The component project can be created by a separate team or individual initially but it must be transitioned
to a set of owners before the first version gets published to the catalog.

View File

@ -142,6 +142,47 @@ The optimization underlying mechanic is based on the concept of time efficiency.
the exponential moving average of time efficiencies for the last N jobs and updates the batch
size of the batched background migration to its optimal value.
#### For GitLab SAAS
When updating a large dataset specify different batch sizes for GitLab SAAS.
```ruby
# frozen_string_literal: true
class BatchedMigration < Gitlab::Database::Migration[2.2]
BATCH_SIZE = 1000
SUB_BATCH_SIZE = 100
GITLAB_OPTIMIZED_BATCH_SIZE = 75_000
GITLAB_OPTIMIZED_SUB_BATCH_SIZE = 250
def up
queue_batched_background_migration(
MIGRATION,
TABLE_NAME,
COLUMN_NAME,
job_interval: DELAY_INTERVAL,
**batch_sizes
)
end
private
def batch_sizes
if Gitlab.com_except_jh?
{
batch_size: GITLAB_OPTIMIZED_BATCH_SIZE,
sub_batch_size: GITLAB_OPTIMIZED_SUB_BATCH_SIZE
}
else
{
batch_size: BATCH_SIZE,
sub_batch_size: SUB_BATCH_SIZE
}
end
end
end
```
### Job retry mechanism
The batched background migrations retry mechanism ensures that a job is executed again in case of failure.

View File

@ -37,7 +37,7 @@ current stable branch:
Prerequisites:
- The person requesting the backport does this step. You must have at
least the Developer role in the [Technical Writing project](https://gitlab.com/gitlab-org/technical-writing).
least the Developer role for the [Technical Writing project](https://gitlab.com/gitlab-org/technical-writing).
1. Open an [issue in the Technical Writing project](https://gitlab.com/gitlab-org/technical-writing/-/issues/new)
using the [backport changes template](https://gitlab.com/gitlab-org/technical-writing/-/blob/main/.gitlab/issue_templates/backport_changes.md).
@ -92,7 +92,7 @@ For the change to appear in:
Prerequisites:
- The technical writer assigned to the backport does this step. You must have at
least the Maintainer role in the [Technical Writing project](https://gitlab.com/gitlab-org/technical-writing).
least the Maintainer role for the [Technical Writing project](https://gitlab.com/gitlab-org/technical-writing).
After the changes are merged to the appropriate stable branch,
you must update the Docker image that holds that version's documentation.

View File

@ -35,7 +35,7 @@ appears in the merge request widget. Use the app to go to your changes.
The `review-docs-cleanup` job is triggered automatically on merge. This job deletes the review app.
You must have the Developer role in the project. Users without the Developer role, such
You must have the Developer role for the project. Users without the Developer role, such
as external contributors, cannot run the manual job. In that case, ask someone from
the GitLab team to run the job.

View File

@ -997,7 +997,7 @@ and should leave it off when you can.
Use **GitLab Duo Workflow**. After first use, use **Duo Workflow**.
Do not use **Workflow** by itself.
Do not use **Workflow** by itself.
## GitLab Flavored Markdown
@ -1815,13 +1815,13 @@ Use lowercase for **review app**.
A user has a role **for** a project or group.
Use:
Use:
- You must have the Owner role for the group.
Instead of:
- You must have the Owner role in the group.
- You must have the Owner role for the group.
Do not use **roles** and [**permissions**](#permissions) interchangeably. Each user is assigned a role. Each role includes a set of permissions.

View File

@ -259,7 +259,7 @@ Git LFS is enabled by default for both self-managed instances and GitLab.com.
Prerequisites:
- You must have at least the Developer role in the project.
- You must have at least the Developer role for the project.
To enable or disable Git LFS at the project level:

View File

@ -258,10 +258,10 @@ Review the invite errors and try again:
- Alex Smith: Access level should be greater than or equal to Owner inherited membership from group Development
```
> You cannot give Alex a subgroup role with an access level less than their role in the subgroup's parent group, as they have an inherited membership from the parent group.
> You cannot give Alex a subgroup role with an access level less than their role for the subgroup's parent group, as they have an inherited membership from the parent group.
You decide to keep Alex as an Owner in this subgroup as it is appropriate given
their role in the organization. Select **Cancel** to cancel this invite.
their role for the organization. Select **Cancel** to cancel this invite.
The Product Management subgroup has the correct members and roles. Next you will
add users to the Engineering subgroup.
@ -339,14 +339,14 @@ Grayson Garcia should be in the **User Experience** subgroup as well.
### Add users to other subgroups
You can add Grayson to the **User Experience** subgroup as a specific role, while
keeping their role in the **Technical Writing** subgroup the same.
keeping their role for the **Technical Writing** subgroup the same.
1. Go to the **User Experience** subgroup.
1. On the left sidebar, select **Subgroup information > Members**. You and Alex
Smith are currently the only members. These are inherited roles.
1. Select **Invite members**.
1. Invite Grayson Garcia as a Developer, a role with a lower level of permissions
than their Maintainer role in the **Technical Writing** subgroup.
than their Maintainer role for the **Technical Writing** subgroup.
This means that Grayson Garcia does not have an unnecessarily high level of permissions
in the User Experience subgroup.

View File

@ -72,7 +72,7 @@ Prerequisites:
- A custom domain name `example.com` or subdomain `subdomain.example.com`.
- Access to your domain's server control panel to set up a DNS `TXT` record to verify your domain's ownership.
- A project in the group. This project will be linked to the verified domains, and should not be deleted.
- You must have the Owner role in the top-level group.
- You must have the Owner role for the top-level group.
Domain verification applies at the top-level group and to all subgroups and projects
nested under that top-level parent group.

View File

@ -183,7 +183,7 @@ You can turn on GitLab Duo experiment and beta features for your group on GitLab
Prerequisites:
- You must have the Owner role in the top-level group.
- You must have the Owner role for the top-level group.
To turn on GitLab Duo experiment and beta features for a top-level group:

View File

@ -25,7 +25,7 @@ You can apply multiple compliance frameworks to a project.
## Prerequisites
- To create, edit, and delete compliance frameworks, users must have either:
- The Owner role in the top-level group.
- The Owner role for the top-level group.
- Be assigned a [custom role](../custom_roles.md) with the `admin_compliance_framework`
[custom permission](../custom_roles/abilities.md#compliance-management).
- To add or remove a compliance framework to or from a project, the group to which the project belongs must have a

View File

@ -115,7 +115,7 @@ If you need to copy a group to a different GitLab instance,
When transferring groups, note:
- Changing a group's parent can have unintended side effects. See [what happens when a repository path changes](../project/repository/index.md#what-happens-when-a-repository-path-changes).
- You must have the Owner role in the source and target group.
- You must have the Owner role for the source and target group.
- You must update your local repositories to point to the new location.
- If the immediate parent group's visibility is lower than the group's current visibility, visibility levels for subgroups and projects change to match the new parent group's visibility.
- Only explicit group membership is transferred, not inherited membership. If the group's Owners have only inherited membership, this leaves the group without an Owner. In this case, the user transferring the group becomes the group's Owner.

View File

@ -424,11 +424,11 @@ automatically confirms user accounts. Users still receive an
Prerequisites:
- You must have the Owner role in the group that the enterprise user belongs to.
- You must have the Owner role for the group that the enterprise user belongs to.
- The group SSO must be enabled.
You can disable password authentication for the group's [enterprise users](../../enterprise_user/index.md).
This stops enterprise users from using their username and password to authenticate.
This stops enterprise users from using their username and password to authenticate.
Instead, these users can do either of the following:
- Use the group's SAML IdP to authenticate with GitLab web UI.

View File

@ -349,7 +349,7 @@ Make sure you are using the expected authentication mechanism.
### `Not Found` or `404` error when pulling image
Errors like these might indicate that the user running the job doesn't have
a minimum of the Guest role in the Dependency Proxy group:
a minimum of the Guest role for the Dependency Proxy group:
- ```plaintext
ERROR: gitlab.example.com:443/group1/dependency_proxy/containers/alpine:latest: not found

View File

@ -127,7 +127,7 @@ In GitLab 17.3 and later, you can use the Admin UI to disable personal access to
Prerequisites:
- You must have the Owner role in the group that the enterprise user belongs to.
- You must have the Owner role for the group that the enterprise user belongs to.
Disabling the personal access tokens of a group's [enterprise users](../enterprise_user/index.md):
@ -254,7 +254,7 @@ Allowing personal access tokens for service accounts to be created with no expir
Prerequisites:
- You must have the Owner role in the top-level group.
- You must have the Owner role for the top-level group.
1. On the left sidebar, select **Search or go to** and find your group.
1. Select **Settings > General > Permissions and group features**.

View File

@ -37,7 +37,7 @@ GitLab supports two different modes of file locking:
## Permissions
Locks can be created by any person who has at least
Developer role in the repository.
Developer role for the repository.
Only the user who locked the file or directory can edit locked files. Other
users are prevented from modifying locked files by pushing, merging,

View File

@ -36,7 +36,7 @@ iterations of the GitLab Jira importer.
## Prerequisites
- To be able to import issues from a Jira project you must have read access on Jira
issues and at least the Maintainer role in the GitLab project that you wish to import into.
issues and at least the Maintainer role for the GitLab project that you wish to import into.
- This feature uses the existing GitLab [Jira integration](../../../integration/jira/index.md).
Make sure you have the integration set up before trying to import Jira issues.

View File

@ -145,10 +145,10 @@ Prerequisites:
- You must have the Maintainer or Owner role.
If the importing member's role in the target project is:
If the importing member's role for the target project is:
- Maintainer, then members with the Owner role in the source project are imported with the Maintainer role.
- Owner, then members with the Owner role in the source project are imported with the Owner role.
- Maintainer, then members with the Owner role for the source project are imported with the Maintainer role.
- Owner, then members with the Owner role for the source project are imported with the Owner role.
To import a project's members:

View File

@ -64,10 +64,10 @@ Each member's access is based on the:
- Role they're assigned in the group.
- Maximum role you choose when you invite the group.
If a group member has a role in the group with fewer permissions than the maximum project role,
If a group member has a role for the group with fewer permissions than the maximum project role,
the member keeps the permissions of their group role.
For example, if you add a member with the Guest role to a project with a maximum role of Maintainer,
the member has only the permissions of the Guest role in the project.
the member has only the permissions of the Guest role for the project.
In addition:
@ -205,7 +205,7 @@ This behavior is intended to help group Owners to better manage the memberships
### Examples
`User A` is a direct member of `Group 1` and has the Maintainer role in the group.
`User A` is a direct member of `Group 1` and has the Maintainer role for the group.
`Group 2` invites `Group 1` with the Developer role.
`User A` has the Developer role in `Group 2`.

View File

@ -54,7 +54,7 @@ You can push directly to the branch of the forked repository if:
- The author of the merge request has enabled contributions from upstream
members.
- You have at least the Developer role in the
- You have at least the Developer role for the
upstream project.
In the following example:

View File

@ -47,7 +47,7 @@ For a full list of checks and their API equivalents, see
Prerequisites:
- You must have at least the Developer role in the project.
- You must have at least the Developer role for the project.
- If your project configuration requires it, all threads in the
merge request [must be resolved](index.md#resolve-a-thread).
- The merge request must have received all required approvals.
@ -142,7 +142,7 @@ CI providers with it.
Prerequisites:
- Ensure your project's CI/CD configuration runs a pipeline for every merge request.
- You must have at least the Maintainer role in the project.
- You must have at least the Maintainer role for the project.
To enable this setting:
@ -166,7 +166,7 @@ merge requests from merging.
Prerequisites:
- You must have at least the Maintainer role in the project.
- You must have at least the Maintainer role for the project.
To change this behavior:

View File

@ -52,7 +52,7 @@ a downstream fork.
Prerequisites:
- You must have a role in the project that allows you to edit merge requests, and add
- You must have a role for the project that allows you to edit merge requests, and add
code to the repository.
- Your project must use the [merge method](methods/index.md#fast-forward-merge) **Merge Commit**,
which is set in the project's **Settings > Merge requests**.

View File

@ -31,7 +31,7 @@ Branches are public by default. To protect the confidentiality of your work, you
must create your branches and merge requests in the same namespace, but downstream
in a private fork. If you create your private fork in the same namespace as the
public repository, your fork inherits the permissions of the upstream public repository.
Users with the Developer role in the upstream public repository inherit those upstream
Users with the Developer role for the upstream public repository inherit those upstream
permissions in your downstream private fork without action by you. These users can
immediately push code to branches in your private fork to help fix the confidential issue.
@ -41,7 +41,7 @@ namespace than the upstream repository. The two namespaces might not contain the
Prerequisites:
- You have the Owner or Maintainer role in the public repository, as you need one
- You have the Owner or Maintainer role for the public repository, as you need one
of these roles to [create a subgroup](../../group/subgroups/index.md).
- You have [forked](../repository/forking_workflow.md) the public repository.
- Your fork has a **Visibility level** of _Private_.

View File

@ -153,7 +153,7 @@ You can edit a dependent merge request and remove a dependency.
Prerequisites:
- You must have a role in the project that allows you to edit merge requests.
- You must have a role for the project that allows you to edit merge requests.
1. On the left sidebar, select **Search or go to** and find your project.
1. Select **Code > Merge requests** and identify your merge request.

View File

@ -61,7 +61,7 @@ When bulk editing merge requests in a group, you can edit the following attribut
Prerequisites:
- You must have at least the Developer role in the project.
- You must have at least the Developer role for the project.
To update multiple group merge requests at the same time:

View File

@ -28,7 +28,7 @@ After a merge request merges, you can revert all changes in the merge request.
Prerequisites:
- You must have a role in the project that allows you to edit merge requests, and add
- You must have a role for the project that allows you to edit merge requests, and add
code to the repository.
- Your project must use the [merge method](methods/index.md#fast-forward-merge) **Merge Commit**,
set in your project's **Settings > Merge requests**.
@ -67,7 +67,7 @@ You can revert any commit in a repository into either:
Prerequisites:
- Your role in the project must allow you to edit merge requests, and add
- Your role for the project must allow you to edit merge requests, and add
code to the repository.
- The commit must not have already been reverted, as the **Revert** option is not
shown in this case.

View File

@ -318,7 +318,7 @@ after a few hours.
Prerequisites:
- You have the Owner or Maintainer role in the project.
- You have the Owner or Maintainer role for the project.
To do this:

View File

@ -99,7 +99,7 @@ To add or subtract changed lines, next to **From line**, select **+** or **-**.
Prerequisites:
- You must be the author of the merge request, or have at least the Developer role in the project.
- You must be the author of the merge request, or have at least the Developer role for the project.
To apply suggested changes directly from the merge request:
@ -187,7 +187,7 @@ For example, to customize the commit message to output
Prerequisites:
- You must have a role in the project that allows you to commit to the source branch.
- You must have a role for the project that allows you to commit to the source branch.
To reduce the number of commits added to your branch, apply multiple
suggestions in a single commit.

View File

@ -143,7 +143,7 @@ is ignored in favor of the group level setting.
Prerequisites:
- You must have the Owner role in the group.
- You must have the Owner role for the group.
To protect a branch for all the projects in a group:

View File

@ -203,6 +203,6 @@ box as you type it.
If it doesn't, it's possible that:
- The feature related to the quick action isn't available to you based on your subscription tier or
user role in the group or project.
user role for the group or project.
- A required condition for the quick action isn't met.
For example, you're running `/unlabel` on an issue without any labels.

View File

@ -40,7 +40,7 @@ the [Git commands you need](#update-the-default-branch-name-in-your-repository)
Prerequisites:
- You have the Owner or Maintainer role in the project.
- You have the Owner or Maintainer role for the project.
To update the default branch for an individual [project](../../index.md):

View File

@ -187,7 +187,7 @@ For a quick overview, items that are exported include:
- Protected branches and tags
- Push rules
- Emoji reactions
- Project and inherited group members, as long as the user has the Maintainer role in the
- Project and inherited group members, as long as the user has the Maintainer role for the
exported project's group or is an administrator
#### Project items that are not exported

View File

@ -46,7 +46,7 @@ To set up infrastructure for workspaces:
Prerequisites:
- Ensure your [workspace infrastructure](#set-up-workspace-infrastructure) is already set up.
- You must have at least the Developer role in the workspace or agent project.
- You must have at least the Developer role for the workspace or agent project.
- In each project where you want to create a workspace, create a [devfile](index.md#devfile):
1. On the left sidebar, select **Search or go to** and find your project.
1. In the root directory of your project, create a file named `devfile`.
@ -175,7 +175,7 @@ No agents available to create workspaces. Please consult Workspaces documentatio
To resolve this issue:
- If you do not have at least the Developer role in the workspace or agent project, contact your administrator.
- If you do not have at least the Developer role for the workspace or agent project, contact your administrator.
- If the ancestor groups of the project do not have an allowed agent,
[allow an agent](gitlab_agent_configuration.md#allow-a-cluster-agent-for-workspaces-in-a-group) for any of these groups.
- If the `remote_development` module is disabled for the GitLab agent,

View File

@ -91,7 +91,7 @@ Running workspaces stop when they are automatically terminated or manually stopp
## Legacy agent authorization strategy
In GitLab 17.1 and earlier, an agent doesn't have to be allowed to be available in a group for creating workspaces. You can use an agent present anywhere in the top-level group (or the root group) of a workspace project to create a workspace, as long as the remote development module is enabled and you have at least the Developer role in the root group.
In GitLab 17.1 and earlier, an agent doesn't have to be allowed to be available in a group for creating workspaces. You can use an agent present anywhere in the top-level group (or the root group) of a workspace project to create a workspace, as long as the remote development module is enabled and you have at least the Developer role for the root group.
For example, if the path to your workspace project is `top-group/subgroup-1/subgroup-2/workspace-project`,
you can use any configured agent in `top-group` and in any of its subgroups.

View File

@ -282,7 +282,7 @@ module Gitlab
if creating_linked_ldap_user?
metadata.set_attribute_synced(:name, true) if gl_user.name == ldap_person.name
metadata.set_attribute_synced(:email, true) if gl_user.email == ldap_person.email&.first
metadata.set_attribute_synced(:email, true) if gl_user.email.downcase == ldap_person.email&.first&.downcase
metadata.provider = ldap_person.provider
end
end

View File

@ -0,0 +1,10 @@
# frozen_string_literal: true
module Gitlab
module BackgroundMigration
class BackfillSubscriptionUserAddOnAssignmentsOrganizationId < BackfillDesiredShardingKeyJob
operation_name :backfill_subscription_user_add_on_assignments_organization_id
feature_category :seat_cost_management
end
end
end

View File

@ -12,7 +12,7 @@ module Gitlab
end
def self.banzai_timeout_disabled?
Gitlab::Utils.to_boolean(ENV['DISABLE_BANZAI_TIMEOUT'], default: false)
Gitlab::Utils.to_boolean(ENV['GITLAB_DISABLE_MARKDOWN_TIMEOUT'], default: false)
end
end
end

View File

@ -3,7 +3,7 @@
module Gitlab
module Tracking
class StandardContext
GITLAB_STANDARD_SCHEMA_URL = 'iglu:com.gitlab/gitlab_standard/jsonschema/1-1-0'
GITLAB_STANDARD_SCHEMA_URL = 'iglu:com.gitlab/gitlab_standard/jsonschema/1-1-1'
GITLAB_RAILS_SOURCE = 'gitlab-rails'
def initialize(
@ -50,6 +50,7 @@ module Gitlab
{
environment: environment,
source: source,
correlation_id: Labkit::Correlation::CorrelationId.current_or_new_id,
plan: plan_name,
extra: extra,
user_id: user_id,

View File

@ -13174,6 +13174,9 @@ msgstr ""
msgid "CodeSuggestions|%{linkStart}Code Suggestions%{linkEnd} uses generative AI to suggest code while you're developing."
msgstr ""
msgid "CodeSuggestions|%{linkStart}GitLab Duo%{linkEnd} is only available to instances with a synchronized subscription. Add an activation code to synchronize your subscription."
msgstr ""
msgid "CodeSuggestions|%{title}"
msgstr ""
@ -13234,6 +13237,9 @@ msgstr ""
msgid "CodeSuggestions|Run health check"
msgstr ""
msgid "CodeSuggestions|Subscription not synchronized"
msgstr ""
msgid "CodeSuggestions|Tests are running"
msgstr ""
@ -13246,9 +13252,15 @@ msgstr ""
msgid "CodeSuggestions|Updating..."
msgstr ""
msgid "CodeSuggestions|You have successfully added a license that activates on %{date}."
msgstr ""
msgid "CodeSuggestions|Your GitLab Duo Pro trial has expired"
msgstr ""
msgid "CodeSuggestions|Your subscription was successfully activated."
msgstr ""
msgid "CodeSuggestions|trial"
msgstr ""
@ -37476,6 +37488,9 @@ msgstr ""
msgid "Open Selection"
msgstr ""
msgid "Open action menu"
msgstr ""
msgid "Open color picker"
msgstr ""
@ -40858,6 +40873,9 @@ msgstr ""
msgid "Preferences|When you type in a description or comment box, selected text is surrounded by the corresponding character after typing one of the following characters: %{supported_characters}."
msgstr ""
msgid "Premium plan"
msgstr ""
msgid "Preparing the report for the scan."
msgstr ""
@ -43425,7 +43443,7 @@ msgstr ""
msgid "Promotions|Repository Mirroring is a way to mirror repositories from external sources. It can be used to mirror all branches, tags, and commits that you have in your repository."
msgstr ""
msgid "Promotions|See the other features in the %{subscription_link_start}Premium plan%{subscription_link_end}"
msgid "Promotions|See the other features in the %{subscription_link}"
msgstr ""
msgid "Promotions|Set the number of necessary approvals and define a list of approvers needed for every merge request in a project."
@ -53108,6 +53126,12 @@ msgstr ""
msgid "Switch branch/tag"
msgstr ""
msgid "Switch to new dashboard"
msgstr ""
msgid "Switch to old dashboard"
msgstr ""
msgid "Switch to plain text editing"
msgstr ""

View File

@ -0,0 +1,33 @@
import { shallowMount } from '@vue/test-utils';
import { GlDisclosureDropdown } from '@gitlab/ui';
import { useMockInternalEventsTracking } from 'helpers/tracking_internal_events_helper';
import ActionDropdown from '~/merge_request_dashboard/components/action_dropdown.vue';
describe('Merge request dashboard action dropdown', () => {
let wrapper;
const { bindInternalEventDocument } = useMockInternalEventsTracking();
function createComponent(experimentEnabled) {
wrapper = shallowMount(ActionDropdown, {
provide: { experimentEnabled },
});
}
it.each`
experimentEnabled | value
${true} | ${1}
${false} | ${0}
`('calls tracking method with value $value', async ({ experimentEnabled, value }) => {
createComponent(experimentEnabled);
const { trackEventSpy } = bindInternalEventDocument(wrapper.element);
await wrapper.findComponent(GlDisclosureDropdown).vm.$emit('action', { id: 0 });
expect(trackEventSpy).toHaveBeenCalledWith(
'toggle_merge_request_redesign',
{ value },
undefined,
);
});
});

View File

@ -48,6 +48,20 @@ RSpec.describe Resolvers::LabelsResolver do
end
end
context 'with mutually exclusive arguments' do
let(:params) do
{
title: 'matching', search_term: 'anything'
}
end
it 'returns a top-level error' do
expect_graphql_error_to_be_created(GraphQL::Schema::Validator::ValidationFailedError) do
resolve_labels(project, params)
end
end
end
describe 'association preloading' do
let_it_be(:project) { create(:project, :private, group: sub_subgroup) }

View File

@ -88,7 +88,9 @@ RSpec.describe GitlabSchema.types['Group'], feature_category: :groups_and_projec
end
it_behaves_like 'a GraphQL type with labels' do
let(:labels_resolver_arguments) { [:search_term, :includeAncestorGroups, :includeDescendantGroups, :onlyGroupLabels, :searchIn] }
let(:labels_resolver_arguments) do
[:search_term, :includeAncestorGroups, :includeDescendantGroups, :onlyGroupLabels, :searchIn, :title]
end
end
describe 'milestones' do

View File

@ -486,7 +486,7 @@ RSpec.describe GitlabSchema.types['Project'], feature_category: :groups_and_proj
end
it_behaves_like 'a GraphQL type with labels' do
let(:labels_resolver_arguments) { [:search_term, :includeAncestorGroups, :searchIn] }
let(:labels_resolver_arguments) { [:search_term, :includeAncestorGroups, :searchIn, :title] }
end
describe 'jira_imports' do

View File

@ -396,4 +396,27 @@ RSpec.describe MergeRequestsHelper, feature_category: :code_review_workflow do
expect(subject).to include(expected_data)
end
end
describe '#merge_request_dashboard_enabled?' do
using RSpec::Parameterized::TableSyntax
let_it_be(:current_user) { build_stubbed(:user) }
where(:enabled, :search_page, :result) do
true | true | false
true | false | true
false | false | false
false | true | false
end
with_them do
before do
stub_feature_flags(merge_request_dashboard: enabled)
allow(helper).to receive(:current_page?).and_return(search_page)
end
it { expect(helper.merge_request_dashboard_enabled?(current_user)).to eq(result) }
end
end
end

Some files were not shown because too many files have changed in this diff Show More