Add latest changes from gitlab-org/gitlab@master
This commit is contained in:
parent
1df76ff02f
commit
2f9b2f549e
2
Gemfile
2
Gemfile
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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"},
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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"},
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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, {
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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: {
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
});
|
||||
|
|
|
|||
|
|
@ -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')
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -44,6 +44,11 @@ module InviteMembersHelper
|
|||
}
|
||||
end
|
||||
|
||||
# Overridden in EE
|
||||
def invite_group_dataset(source)
|
||||
{}
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def group_select_data(source)
|
||||
|
|
|
|||
|
|
@ -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'),
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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))) }
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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]
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -0,0 +1 @@
|
|||
dd5436446beef26ff9b5c3ae3bdea11f5215253407b8f6499405c66d20ce6924
|
||||
|
|
@ -0,0 +1 @@
|
|||
e87a4eae4274701551acd3cafd4cc345562424476b48463876dadac02b0ba140
|
||||
|
|
@ -0,0 +1 @@
|
|||
a8697ca4a389cc7e5995a87707ba75aad2a1a3261ac7b9672f33a9a42e221149
|
||||
|
|
@ -0,0 +1 @@
|
|||
11370470201bcc08109ee5ff49613c232e0bb6e106c865bfe972dcc2d87eab6e
|
||||
|
|
@ -0,0 +1 @@
|
|||
e5f7e898ef7e7535bc485d7ebdbb83ef8ad10c59fc8394ad13b6e1814af23faa
|
||||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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`. |
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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).
|
||||
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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**:
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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**.
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
||||
|
|
|
|||
|
|
@ -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`.
|
||||
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
||||
|
|
|
|||
|
|
@ -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**.
|
||||
|
|
|
|||
|
|
@ -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_.
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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):
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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 ""
|
||||
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
);
|
||||
});
|
||||
});
|
||||
|
|
@ -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) }
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
Loading…
Reference in New Issue