Add latest changes from gitlab-org/gitlab@master

This commit is contained in:
GitLab Bot 2024-05-10 21:17:33 +00:00
parent d23f0cff3c
commit 6f3d5ab313
53 changed files with 328 additions and 179 deletions

View File

@ -203,7 +203,7 @@ gem 'seed-fu', '~> 2.3.7' # rubocop:todo Gemfile/MissingFeatureCategory
gem 'elasticsearch-model', '~> 7.2' # rubocop:todo Gemfile/MissingFeatureCategory gem 'elasticsearch-model', '~> 7.2' # rubocop:todo Gemfile/MissingFeatureCategory
gem 'elasticsearch-rails', '~> 7.2', require: 'elasticsearch/rails/instrumentation' # rubocop:todo Gemfile/MissingFeatureCategory gem 'elasticsearch-rails', '~> 7.2', require: 'elasticsearch/rails/instrumentation' # rubocop:todo Gemfile/MissingFeatureCategory
gem 'elasticsearch-api', '7.13.3' # rubocop:todo Gemfile/MissingFeatureCategory gem 'elasticsearch-api', '7.13.3' # rubocop:todo Gemfile/MissingFeatureCategory
gem 'aws-sdk-core', '~> 3.194.1' # rubocop:todo Gemfile/MissingFeatureCategory gem 'aws-sdk-core', '~> 3.194.2' # rubocop:todo Gemfile/MissingFeatureCategory
gem 'aws-sdk-cloudformation', '~> 1' # rubocop:todo Gemfile/MissingFeatureCategory gem 'aws-sdk-cloudformation', '~> 1' # rubocop:todo Gemfile/MissingFeatureCategory
gem 'aws-sdk-s3', '~> 1.149.1' # rubocop:todo Gemfile/MissingFeatureCategory gem 'aws-sdk-s3', '~> 1.149.1' # rubocop:todo Gemfile/MissingFeatureCategory
gem 'faraday_middleware-aws-sigv4', '~>0.3.0' # rubocop:todo Gemfile/MissingFeatureCategory gem 'faraday_middleware-aws-sigv4', '~>0.3.0' # rubocop:todo Gemfile/MissingFeatureCategory

View File

@ -36,7 +36,7 @@
{"name":"aws-eventstream","version":"1.3.0","platform":"ruby","checksum":"f1434cc03ab2248756eb02cfa45e900e59a061d7fbdc4a9fd82a5dd23d796d3f"}, {"name":"aws-eventstream","version":"1.3.0","platform":"ruby","checksum":"f1434cc03ab2248756eb02cfa45e900e59a061d7fbdc4a9fd82a5dd23d796d3f"},
{"name":"aws-partitions","version":"1.877.0","platform":"ruby","checksum":"9552ed7bbd3700ed1eeb0121c160ceaf64fa5dbaff5a1ff5fe6fd8481ecd9cfd"}, {"name":"aws-partitions","version":"1.877.0","platform":"ruby","checksum":"9552ed7bbd3700ed1eeb0121c160ceaf64fa5dbaff5a1ff5fe6fd8481ecd9cfd"},
{"name":"aws-sdk-cloudformation","version":"1.41.0","platform":"ruby","checksum":"31e47539719734413671edf9b1a31f8673fbf9688549f50c41affabbcb1c6b26"}, {"name":"aws-sdk-cloudformation","version":"1.41.0","platform":"ruby","checksum":"31e47539719734413671edf9b1a31f8673fbf9688549f50c41affabbcb1c6b26"},
{"name":"aws-sdk-core","version":"3.194.1","platform":"ruby","checksum":"3ac7a3d6b872ae69ded6ee0394e3b64645dde1f7c78e123b7dd84700d392607a"}, {"name":"aws-sdk-core","version":"3.194.2","platform":"ruby","checksum":"f925fb739cd093e5834910aed85aba5ac8d1b210f26c2cf51f0daf932cc77567"},
{"name":"aws-sdk-kms","version":"1.76.0","platform":"ruby","checksum":"e7f75013cba9ba357144f66bbc600631c192e2cda9dd572794be239654e2cf49"}, {"name":"aws-sdk-kms","version":"1.76.0","platform":"ruby","checksum":"e7f75013cba9ba357144f66bbc600631c192e2cda9dd572794be239654e2cf49"},
{"name":"aws-sdk-s3","version":"1.149.1","platform":"ruby","checksum":"664e608190d42b486dc79b5dc65e7c2240923902a9833063327a9d831226a46a"}, {"name":"aws-sdk-s3","version":"1.149.1","platform":"ruby","checksum":"664e608190d42b486dc79b5dc65e7c2240923902a9833063327a9d831226a46a"},
{"name":"aws-sigv4","version":"1.8.0","platform":"ruby","checksum":"84dd99768b91b93b63d1d8e53ee837cfd06ab402812772a7899a78f9f9117cbc"}, {"name":"aws-sigv4","version":"1.8.0","platform":"ruby","checksum":"84dd99768b91b93b63d1d8e53ee837cfd06ab402812772a7899a78f9f9117cbc"},

View File

@ -303,7 +303,7 @@ GEM
aws-sdk-cloudformation (1.41.0) aws-sdk-cloudformation (1.41.0)
aws-sdk-core (~> 3, >= 3.99.0) aws-sdk-core (~> 3, >= 3.99.0)
aws-sigv4 (~> 1.1) aws-sigv4 (~> 1.1)
aws-sdk-core (3.194.1) aws-sdk-core (3.194.2)
aws-eventstream (~> 1, >= 1.3.0) aws-eventstream (~> 1, >= 1.3.0)
aws-partitions (~> 1, >= 1.651.0) aws-partitions (~> 1, >= 1.651.0)
aws-sigv4 (~> 1.8) aws-sigv4 (~> 1.8)
@ -1921,7 +1921,7 @@ DEPENDENCIES
attr_encrypted (~> 3.2.4)! attr_encrypted (~> 3.2.4)!
awesome_print awesome_print
aws-sdk-cloudformation (~> 1) aws-sdk-cloudformation (~> 1)
aws-sdk-core (~> 3.194.1) aws-sdk-core (~> 3.194.2)
aws-sdk-s3 (~> 1.149.1) aws-sdk-s3 (~> 1.149.1)
axe-core-rspec (~> 4.9.0) axe-core-rspec (~> 4.9.0)
babosa (~> 2.0) babosa (~> 2.0)

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 18 KiB

View File

@ -140,7 +140,7 @@ export default {
<template #source> <template #source>
<gl-link <gl-link
:href="pipeline.merge_request.source_branch_path" :href="pipeline.merge_request.source_branch_path"
class="link-commit ref-name gl-mt-1" class="link-commit ref-name gl-break-all gl-mt-1"
data-testid="source-branch-link" data-testid="source-branch-link"
>{{ pipeline.merge_request.source_branch }}</gl-link >{{ pipeline.merge_request.source_branch }}</gl-link
><clipboard-button ><clipboard-button

View File

@ -6,6 +6,7 @@
fragment DesignItem on Design { fragment DesignItem on Design {
...DesignListItem ...DesignListItem
fullPath fullPath
imported
diffRefs { diffRefs {
...DesignDiffRefs ...DesignDiffRefs
} }

View File

@ -46,6 +46,7 @@ export function initIssuableApp(store) {
issuableId, issuableId,
issueType, issueType,
hasIterationsFeature, hasIterationsFeature,
imported,
// for issue // for issue
registerPath, registerPath,
signInPath, signInPath,
@ -129,6 +130,7 @@ export function initIssuableApp(store) {
descriptionComponent: issueType === TYPE_INCIDENT ? IncidentTabs : DescriptionComponent, descriptionComponent: issueType === TYPE_INCIDENT ? IncidentTabs : DescriptionComponent,
isConfidential: this.getNoteableData?.confidential, isConfidential: this.getNoteableData?.confidential,
isLocked: this.getNoteableData?.discussion_locked, isLocked: this.getNoteableData?.discussion_locked,
isImported: imported,
issuableStatus: this.getNoteableData?.state, issuableStatus: this.getNoteableData?.state,
issuableType: issueType, issuableType: issueType,
issueId: this.getNoteableData?.id?.toString(), issueId: this.getNoteableData?.id?.toString(),

View File

@ -247,7 +247,7 @@ export default {
</template> </template>
<template v-if="isImported"> <template v-if="isImported">
<span>·</span> <span v-if="isSystemNote">&middot;</span>
<imported-badge :text-only="isSystemNote" :importable-type="importableType" size="sm" /> <imported-badge :text-only="isSystemNote" :importable-type="importableType" size="sm" />
</template> </template>

View File

@ -8,7 +8,7 @@
.todos-list > .todo { .todos-list > .todo {
// workaround because we cannot use border-collapse // workaround because we cannot use border-collapse
padding: 6px 12px !important; padding: 6px 12px !important;
border-top: 1px solid transparent; margin-top: -1px;
span:not(.todo-label), span:not(.todo-label),
button, button,

View File

@ -30,17 +30,11 @@ module SendFileUpload
headers.store(*Gitlab::Workhorse.send_url(file_upload.url(**redirect_params))) headers.store(*Gitlab::Workhorse.send_url(file_upload.url(**redirect_params)))
head :ok head :ok
else else
redirect_to cdn_fronted_url(file_upload, redirect_params) file_url = ObjectStorage::CDN::FileUrl.new(
end file: file_upload,
end ip_address: request.remote_ip,
redirect_params: redirect_params)
def cdn_fronted_url(file, redirect_params) redirect_to file_url.url
if file.respond_to?(:cdn_enabled_url)
result = file.cdn_enabled_url(request.remote_ip, redirect_params[:query])
Gitlab::ApplicationContext.push(artifact_used_cdn: result.used_cdn)
result.url
else
file.url(**redirect_params)
end end
end end

View File

@ -6,6 +6,7 @@ module Mutations
class Create < BaseMutation class Create < BaseMutation
graphql_name 'IntegrationExclusionCreate' graphql_name 'IntegrationExclusionCreate'
include ResolvesIds include ResolvesIds
MAX_PROJECT_IDS = 100
field :exclusions, [::Types::Integrations::ExclusionType], field :exclusions, [::Types::Integrations::ExclusionType],
null: true, null: true,
@ -19,14 +20,18 @@ module Mutations
argument :project_ids, argument :project_ids,
[::Types::GlobalIDType[::Project]], [::Types::GlobalIDType[::Project]],
required: true, required: true,
description: 'Ids of projects to exclude.' description: "IDs of projects to exclude up to a maximum of #{MAX_PROJECT_IDS}."
authorize :admin_all_resources authorize :admin_all_resources
def resolve(integration_name:, project_ids:) def resolve(integration_name:, project_ids:)
authorize!(:global) authorize!(:global)
projects = Project.id_in(resolve_ids(project_ids)) if project_ids.length > MAX_PROJECT_IDS
raise Gitlab::Graphql::Errors::ArgumentError, "Count of projectIds should be less than #{MAX_PROJECT_IDS}"
end
projects = Project.id_in(resolve_ids(project_ids)).limit(MAX_PROJECT_IDS)
result = ::Integrations::Exclusions::CreateService.new( result = ::Integrations::Exclusions::CreateService.new(
current_user: current_user, current_user: current_user,

View File

@ -19,7 +19,7 @@ module Mutations
argument :project_ids, argument :project_ids,
[::Types::GlobalIDType[::Project]], [::Types::GlobalIDType[::Project]],
required: true, required: true,
description: 'Id of excluded project.' description: 'IDs of excluded projects.'
authorize :admin_all_resources authorize :admin_all_resources

View File

@ -14,6 +14,7 @@ query GetSnippetQuery($ids: [SnippetID!]) {
httpUrlToRepo httpUrlToRepo
sshUrlToRepo sshUrlToRepo
hidden hidden
imported
blobs { blobs {
__typename __typename
hasUnretrievableBlobs hasUnretrievableBlobs

View File

@ -16,6 +16,8 @@ module ResolvesMergeRequests
args[:include_subgroups] = true args[:include_subgroups] = true
end end
rewrite_param_name(args, :reviewer_wildcard_id, :reviewer_id)
mr_finder = MergeRequestsFinder.new(current_user, args.compact) mr_finder = MergeRequestsFinder.new(current_user, args.compact)
finder = Gitlab::Graphql::Loaders::IssuableLoader.new(mr_parent, mr_finder) finder = Gitlab::Graphql::Loaders::IssuableLoader.new(mr_parent, mr_finder)
@ -42,6 +44,10 @@ module ResolvesMergeRequests
[:target_project, :author] [:target_project, :author]
end end
def rewrite_param_name(params, old_name, new_name)
params[new_name] = params.delete(old_name) if params && params[old_name].present?
end
def preloads def preloads
{ {
assignees: [:assignees], assignees: [:assignees],

View File

@ -20,12 +20,8 @@ module Resolvers
def resolve_groups(**args) def resolve_groups(**args)
GroupsFinder GroupsFinder
.new(context[:current_user], finder_params(args)) .new(context[:current_user], args)
.execute .execute
end end
def finder_params(args)
args
end
end end
end end

View File

@ -25,6 +25,9 @@ module Resolvers
argument :reviewer_username, GraphQL::Types::String, argument :reviewer_username, GraphQL::Types::String,
required: false, required: false,
description: 'Username of the reviewer.' description: 'Username of the reviewer.'
argument :reviewer_wildcard_id, ::Types::ReviewerWildcardIdEnum,
required: false,
description: 'Filter by reviewer presence. Incompatible with reviewerUsername.'
end end
argument :iids, [GraphQL::Types::String], argument :iids, [GraphQL::Types::String],

View File

@ -14,17 +14,8 @@ module Resolvers
alias_method :organization, :object alias_method :organization, :object
def resolve_groups(**args) def resolve_groups(**args)
::Organizations::GroupsFinder.new(context[:current_user], finder_params(args)).execute finder_params = args.merge(organization: organization)
end ::Organizations::GroupsFinder.new(context[:current_user], finder_params).execute
def finder_params(args)
extra_args = if Feature.enabled?(:resolve_all_organization_groups, current_user)
{ organization: organization }
else
{ organization: organization, include_ancestors: false, all_available: false }
end
super.merge(extra_args)
end end
end end
end end

View File

@ -0,0 +1,11 @@
# frozen_string_literal: true
module Types
class ReviewerWildcardIdEnum < BaseEnum
graphql_name 'ReviewerWildcardId'
description 'Reviewer ID wildcard values'
value 'NONE', 'No reviewer is assigned.'
value 'ANY', 'Any reviewer is assigned.'
end
end

View File

@ -164,6 +164,7 @@ module IssuablesHelper
canUpdate: can?(current_user, :"update_#{issuable.to_ability_name}", issuable), canUpdate: can?(current_user, :"update_#{issuable.to_ability_name}", issuable),
canDestroy: can?(current_user, :"destroy_#{issuable.to_ability_name}", issuable), canDestroy: can?(current_user, :"destroy_#{issuable.to_ability_name}", issuable),
issuableRef: issuable.to_reference, issuableRef: issuable.to_reference,
imported: issuable.imported?,
markdownPreviewPath: preview_markdown_path(parent, target_type: issuable.model_name, target_id: issuable.iid), markdownPreviewPath: preview_markdown_path(parent, target_type: issuable.model_name, target_id: issuable.iid),
markdownDocsPath: help_page_path('user/markdown'), markdownDocsPath: help_page_path('user/markdown'),
lockVersion: issuable.lock_version, lockVersion: issuable.lock_version,

View File

@ -311,23 +311,24 @@ module MergeRequestsHelper
_('%{author} requested to merge %{source_branch} %{copy_button} into %{target_branch} %{created_at}').html_safe % { author: link_to_author.html_safe, source_branch: merge_request_source_branch(merge_request).html_safe, copy_button: copy_button.html_safe, target_branch: target_branch.html_safe, created_at: time_ago_with_tooltip(merge_request.created_at, html_class: 'gl-display-inline-block').html_safe } _('%{author} requested to merge %{source_branch} %{copy_button} into %{target_branch} %{created_at}').html_safe % { author: link_to_author.html_safe, source_branch: merge_request_source_branch(merge_request).html_safe, copy_button: copy_button.html_safe, target_branch: target_branch.html_safe, created_at: time_ago_with_tooltip(merge_request.created_at, html_class: 'gl-display-inline-block').html_safe }
end end
def sticky_header_data def sticky_header_data(project, merge_request)
data = { data = {
iid: @merge_request.iid, iid: merge_request.iid,
projectPath: @project.full_path, projectPath: project.full_path,
sourceProjectPath: @merge_request.source_project_path, sourceProjectPath: merge_request.source_project_path,
title: markdown_field(@merge_request, :title), title: markdown_field(merge_request, :title),
isFluidLayout: fluid_layout.to_s, isFluidLayout: fluid_layout.to_s,
blocksMerge: @project.only_allow_merge_if_all_discussions_are_resolved?.to_s, blocksMerge: project.only_allow_merge_if_all_discussions_are_resolved?.to_s,
imported: merge_request.imported?.to_s,
tabs: [ tabs: [
['show', _('Overview'), project_merge_request_path(@project, @merge_request), @merge_request.related_notes.user.count], ['show', _('Overview'), project_merge_request_path(project, merge_request), merge_request.related_notes.user.count],
['commits', _('Commits'), commits_project_merge_request_path(@project, @merge_request), @commits_count], ['commits', _('Commits'), commits_project_merge_request_path(project, merge_request), @commits_count],
['diffs', _('Changes'), diffs_project_merge_request_path(@project, @merge_request), @diffs_count] ['diffs', _('Changes'), diffs_project_merge_request_path(project, merge_request), @diffs_count]
] ]
} }
if @project.builds_enabled? if project.builds_enabled?
data[:tabs].insert(2, ['pipelines', _('Pipelines'), pipelines_project_merge_request_path(@project, @merge_request), @number_of_pipelines]) data[:tabs].insert(2, ['pipelines', _('Pipelines'), pipelines_project_merge_request_path(project, merge_request), @number_of_pipelines])
end end
data data

View File

@ -19,7 +19,10 @@ module Integrations
instance_integration = integration_class.for_instance.first instance_integration = integration_class.for_instance.first
return ServiceResponse.success(payload: exclusions.destroy_all) unless instance_integration # rubocop: disable Cop/DestroyAll -- We load exclusions so we can have the deleted exclusions in the response unless instance_integration
integration_class.id_in(exclusions.map(&:id)).delete_all
return ServiceResponse.success(payload: exclusions)
end
::Integrations::Propagation::BulkUpdateService.new(instance_integration, exclusions).execute ::Integrations::Propagation::BulkUpdateService.new(instance_integration, exclusions).execute
ServiceResponse.success(payload: exclusions) ServiceResponse.success(payload: exclusions)

View File

@ -0,0 +1,27 @@
# frozen_string_literal: true
module ObjectStorage
module CDN
class FileUrl
def initialize(file:, ip_address:, redirect_params: {})
@file = file
@ip_address = ip_address
@redirect_params = redirect_params
end
def url
if file.respond_to?(:cdn_enabled_url)
result = file.cdn_enabled_url(ip_address, redirect_params[:query])
Gitlab::ApplicationContext.push(artifact_used_cdn: result.used_cdn)
result.url
else
file.url(**redirect_params)
end
end
private
attr_reader :file, :ip_address, :redirect_params
end
end
end

View File

@ -1,4 +1,4 @@
%li.todo.gl-hover-border-blue-200.gl-hover-bg-blue-50.gl-hover-cursor-pointer.gl-relative{ class: "todo-#{todo.done? ? 'done' : 'pending'}", id: dom_id(todo) } %li.todo.gl-border-t.gl-border-gray-50.gl-hover-border-blue-200.gl-hover-bg-blue-50.gl-hover-cursor-pointer.gl-relative{ class: "hover:gl-z-1 todo-#{todo.done? ? 'done' : 'pending'}", id: dom_id(todo) }
.gl-display-flex.gl-flex-direction-column.gl-sm-flex-direction-row.gl-sm-align-items-center .gl-display-flex.gl-flex-direction-column.gl-sm-flex-direction-row.gl-sm-align-items-center
.todo-item.gl-overflow-hidden.gl-overflow-x-auto.gl-align-self-center.gl-w-full{ data: { testid: "todo-item-container" } } .todo-item.gl-overflow-hidden.gl-overflow-x-auto.gl-align-self-center.gl-w-full{ data: { testid: "todo-item-container" } }
.todo-title.gl-pt-2.gl-pb-3.gl-px-2.gl-md-mb-1.gl-font-sm.gl-text-secondary .todo-title.gl-pt-2.gl-pb-3.gl-px-2.gl-md-mb-1.gl-font-sm.gl-text-secondary

View File

@ -5,8 +5,8 @@
.event-item-timestamp.gl-font-sm .event-item-timestamp.gl-font-sm
#{time_ago_with_tooltip(event.created_at)} #{time_ago_with_tooltip(event.created_at)}
- if event.imported? - if event.imported?
%span %span &middot;
= render "import/shared/imported_text", importable: _('event') = render "import/shared/imported_badge", text_only: true, importable: _('event')
- if event.wiki_page? - if event.wiki_page?
= render "events/event/wiki", event: event = render "events/event/wiki", event: event

View File

@ -0,0 +1,7 @@
- tooltip_title = safe_format(s_('BulkImport|This %{importable} was imported from another instance.'), importable: local_assigns[:importable])
- text_only = local_assigns.fetch(:text_only, false)
- if text_only
%span.has-tooltip.gl-line-height-normal.gl-font-sm{ title: tooltip_title }= _('Imported')
- else
= render Pajamas::BadgeComponent.new(_('Imported'), size: :sm, title: tooltip_title, class: 'has-tooltip')

View File

@ -1,3 +0,0 @@
- tooltip_title = safe_format(s_('BulkImport|This %{importable} was imported from another instance.'), importable: local_assigns[:importable])
%span.has-tooltip.gl-line-height-normal.gl-font-sm{ title: tooltip_title }= _('Imported')

View File

@ -1,15 +1,20 @@
- @no_container = true
- container_class = fluid_layout ? '' : 'container-limited'
- add_to_breadcrumbs s_("CompareRevisions|Compare revisions"), project_compare_index_path(@project) - add_to_breadcrumbs s_("CompareRevisions|Compare revisions"), project_compare_index_path(@project)
- page_title "#{params[:from]} to #{params[:to]}" - page_title "#{params[:from]} to #{params[:to]}"
- has_diff = @commits.present? || @diffs.present? && @diffs.diff_files.present? - has_diff = @commits.present? || @diffs.present? && @diffs.diff_files.present?
-# Only show commit list in the first page -# Only show commit list in the first page
- hide_commit_list = params[:page].present? && params[:page] != '1' - hide_commit_list = params[:page].present? && params[:page] != '1'
.gl-border-b-0.gl-mb-0.gl-pt-4 .container-fluid{ class: [container_class] }
.gl-border-b-0.gl-mb-0.gl-pt-4
.js-signature-container{ data: { 'signatures-path' => signatures_namespace_project_compare_index_path } } .js-signature-container{ data: { 'signatures-path' => signatures_namespace_project_compare_index_path } }
#js-compare-selector{ data: project_compare_selector_data(@project, @merge_request, params) } #js-compare-selector{ data: project_compare_selector_data(@project, @merge_request, params) }
- if has_diff - if has_diff
.container-fluid{ class: [container_class] }
= render "projects/commits/commit_list" unless hide_commit_list = render "projects/commits/commit_list" unless hide_commit_list
.container-fluid
= render "projects/diffs/diffs", = render "projects/diffs/diffs",
diffs: @diffs, diffs: @diffs,
environment: @environment, environment: @environment,
@ -18,6 +23,7 @@
paginate_diffs: true, paginate_diffs: true,
paginate_diffs_per_page: Projects::CompareController::COMMIT_DIFFS_PER_PAGE paginate_diffs_per_page: Projects::CompareController::COMMIT_DIFFS_PER_PAGE
- else - else
.container-fluid
= render Pajamas::CardComponent.new(card_options: { class: "gl-bg-gray-10" }) do |c| = render Pajamas::CardComponent.new(card_options: { class: "gl-bg-gray-10" }) do |c|
- c.with_body do - c.with_body do
= render Pajamas::EmptyStateComponent.new(svg_path: 'illustrations/empty-state/empty-commit-md.svg', = render Pajamas::EmptyStateComponent.new(svg_path: 'illustrations/empty-state/empty-commit-md.svg',

View File

@ -1,3 +1,3 @@
.detail-page-description.gl-pt-2.gl-pb-4.gl-display-flex.gl-align-items-baseline.gl-flex-wrap{ class: "#{'is-merge-request' if !fluid_layout}" } .detail-page-description.gl-pt-2.gl-pb-4.gl-display-flex.gl-align-items-baseline.gl-flex-wrap{ class: "#{'is-merge-request' if !fluid_layout}" }
.js-mr-header{ data: { project_path: @merge_request.project.path_with_namespace, hidden: @merge_request.hidden?.to_s, iid: @merge_request.iid, state: @merge_request.state } } .js-mr-header{ data: { project_path: @merge_request.project.path_with_namespace, hidden: @merge_request.hidden?.to_s, imported: @merge_request.imported?.to_s, iid: @merge_request.iid, state: @merge_request.state } }
= merge_request_header(@project, @merge_request) = merge_request_header(@project, @merge_request)

View File

@ -21,7 +21,7 @@
.merge-request{ data: { mr_action: mr_action, url: merge_request_path(@merge_request, format: :json), project_path: project_path(@merge_request.project), lock_version: @merge_request.lock_version, diffs_batch_cache_key: @diffs_batch_cache_key } } .merge-request{ data: { mr_action: mr_action, url: merge_request_path(@merge_request, format: :json), project_path: project_path(@merge_request.project), lock_version: @merge_request.lock_version, diffs_batch_cache_key: @diffs_batch_cache_key } }
= render "projects/merge_requests/mr_title" = render "projects/merge_requests/mr_title"
#js-merge-sticky-header{ data: { data: sticky_header_data.to_json } } #js-merge-sticky-header{ data: { data: sticky_header_data(@project, @merge_request).to_json } }
.merge-request-details.issuable-details{ data: { id: @merge_request.project.id } } .merge-request-details.issuable-details{ data: { id: @merge_request.project.id } }
= render "projects/merge_requests/mr_box" = render "projects/merge_requests/mr_box"
.gl-static.merge-request-tabs-holder{ class: "#{'js-tabs-affix' unless ENV['RAILS_ENV'] == 'test'}" } .gl-static.merge-request-tabs-holder{ class: "#{'js-tabs-affix' unless ENV['RAILS_ENV'] == 'test'}" }

View File

@ -45,6 +45,8 @@
%span.system-note-separator.gl-display-none.gl-sm-display-inline %span.system-note-separator.gl-display-none.gl-sm-display-inline
&middot; &middot;
%a.system-note-separator{ href: "##{dom_id(note)}" }= time_ago_with_tooltip(note.created_at, placement: 'bottom', html_class: 'note-created-ago') %a.system-note-separator{ href: "##{dom_id(note)}" }= time_ago_with_tooltip(note.created_at, placement: 'bottom', html_class: 'note-created-ago')
- if note.imported?
= render "import/shared/imported_badge", importable: note.system? ? _('activity') : _('comment')
- unless note.system? - unless note.system?
.note-actions .note-actions
- if note.for_personal_snippet? - if note.for_personal_snippet?

View File

@ -1,9 +0,0 @@
---
name: resolve_all_organization_groups
feature_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/444218
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/146600
rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/444981
milestone: '16.11'
group: group::tenant scale
type: gitlab_com_derisk
default_enabled: false

View File

@ -148,7 +148,7 @@ License.current.license_id
License.current.data License.current.data
# Confirm the current billable seat count excluding guest users. This is useful for customers who use an Ultimate subscription tier where Guest seats are not counted. # Confirm the current billable seat count excluding guest users. This is useful for customers who use an Ultimate subscription tier where Guest seats are not counted.
User.active.without_bots.excluding_guests.count User.active.without_bots.excluding_guests_and_requests.count
``` ```

View File

@ -225,7 +225,7 @@ LFS objects are also [S3-compatible](lfs/index.md#storing-lfs-objects-in-remote-
## Configure where new repositories are stored ## Configure where new repositories are stored
After you configure multiple repository storages, you can choose where new repositories are stored: After you [configure multiple repository storages](https://docs.gitlab.com/omnibus/settings/configuration.html#store-git-data-in-an-alternative-directory), you can choose where new repositories are stored:
1. On the left sidebar, at the bottom, select **Admin Area**. 1. On the left sidebar, at the bottom, select **Admin Area**.
1. Select **Settings > Repository**. 1. Select **Settings > Repository**.

View File

@ -5460,7 +5460,7 @@ Input type: `IntegrationExclusionCreateInput`
| ---- | ---- | ----------- | | ---- | ---- | ----------- |
| <a id="mutationintegrationexclusioncreateclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. | | <a id="mutationintegrationexclusioncreateclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
| <a id="mutationintegrationexclusioncreateintegrationname"></a>`integrationName` | [`IntegrationType!`](#integrationtype) | Type of integration to exclude. | | <a id="mutationintegrationexclusioncreateintegrationname"></a>`integrationName` | [`IntegrationType!`](#integrationtype) | Type of integration to exclude. |
| <a id="mutationintegrationexclusioncreateprojectids"></a>`projectIds` | [`[ProjectID!]!`](#projectid) | Ids of projects to exclude. | | <a id="mutationintegrationexclusioncreateprojectids"></a>`projectIds` | [`[ProjectID!]!`](#projectid) | IDs of projects to exclude up to a maximum of 100. |
#### Fields #### Fields
@ -5484,7 +5484,7 @@ Input type: `IntegrationExclusionDeleteInput`
| ---- | ---- | ----------- | | ---- | ---- | ----------- |
| <a id="mutationintegrationexclusiondeleteclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. | | <a id="mutationintegrationexclusiondeleteclientmutationid"></a>`clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. |
| <a id="mutationintegrationexclusiondeleteintegrationname"></a>`integrationName` | [`IntegrationType!`](#integrationtype) | Type of integration. | | <a id="mutationintegrationexclusiondeleteintegrationname"></a>`integrationName` | [`IntegrationType!`](#integrationtype) | Type of integration. |
| <a id="mutationintegrationexclusiondeleteprojectids"></a>`projectIds` | [`[ProjectID!]!`](#projectid) | Id of excluded project. | | <a id="mutationintegrationexclusiondeleteprojectids"></a>`projectIds` | [`[ProjectID!]!`](#projectid) | IDs of excluded projects. |
#### Fields #### Fields
@ -15690,6 +15690,7 @@ four standard [pagination arguments](#pagination-arguments):
| <a id="addonuserassignedmergerequestsreviewstate"></a>`reviewState` **{warning-solid}** | [`MergeRequestReviewState`](#mergerequestreviewstate) | **Introduced** in GitLab 17.0. **Status**: Experiment. Reviewer state of the merge request. | | <a id="addonuserassignedmergerequestsreviewstate"></a>`reviewState` **{warning-solid}** | [`MergeRequestReviewState`](#mergerequestreviewstate) | **Introduced** in GitLab 17.0. **Status**: Experiment. Reviewer state of the merge request. |
| <a id="addonuserassignedmergerequestsreviewstates"></a>`reviewStates` **{warning-solid}** | [`[MergeRequestReviewState!]`](#mergerequestreviewstate) | **Introduced** in GitLab 17.0. **Status**: Experiment. Reviewer states of the merge request. | | <a id="addonuserassignedmergerequestsreviewstates"></a>`reviewStates` **{warning-solid}** | [`[MergeRequestReviewState!]`](#mergerequestreviewstate) | **Introduced** in GitLab 17.0. **Status**: Experiment. Reviewer states of the merge request. |
| <a id="addonuserassignedmergerequestsreviewerusername"></a>`reviewerUsername` | [`String`](#string) | Username of the reviewer. | | <a id="addonuserassignedmergerequestsreviewerusername"></a>`reviewerUsername` | [`String`](#string) | Username of the reviewer. |
| <a id="addonuserassignedmergerequestsreviewerwildcardid"></a>`reviewerWildcardId` | [`ReviewerWildcardId`](#reviewerwildcardid) | Filter by reviewer presence. Incompatible with reviewerUsername. |
| <a id="addonuserassignedmergerequestssort"></a>`sort` | [`MergeRequestSort`](#mergerequestsort) | Sort merge requests by this criteria. | | <a id="addonuserassignedmergerequestssort"></a>`sort` | [`MergeRequestSort`](#mergerequestsort) | Sort merge requests by this criteria. |
| <a id="addonuserassignedmergerequestssourcebranches"></a>`sourceBranches` | [`[String!]`](#string) | Array of source branch names. All resolved merge requests will have one of these branches as their source. | | <a id="addonuserassignedmergerequestssourcebranches"></a>`sourceBranches` | [`[String!]`](#string) | Array of source branch names. All resolved merge requests will have one of these branches as their source. |
| <a id="addonuserassignedmergerequestsstate"></a>`state` | [`MergeRequestState`](#mergerequeststate) | Merge request state. If provided, all resolved merge requests will have this state. | | <a id="addonuserassignedmergerequestsstate"></a>`state` | [`MergeRequestState`](#mergerequeststate) | Merge request state. If provided, all resolved merge requests will have this state. |
@ -15728,6 +15729,7 @@ four standard [pagination arguments](#pagination-arguments):
| <a id="addonuserauthoredmergerequestsreviewstate"></a>`reviewState` **{warning-solid}** | [`MergeRequestReviewState`](#mergerequestreviewstate) | **Introduced** in GitLab 17.0. **Status**: Experiment. Reviewer state of the merge request. | | <a id="addonuserauthoredmergerequestsreviewstate"></a>`reviewState` **{warning-solid}** | [`MergeRequestReviewState`](#mergerequestreviewstate) | **Introduced** in GitLab 17.0. **Status**: Experiment. Reviewer state of the merge request. |
| <a id="addonuserauthoredmergerequestsreviewstates"></a>`reviewStates` **{warning-solid}** | [`[MergeRequestReviewState!]`](#mergerequestreviewstate) | **Introduced** in GitLab 17.0. **Status**: Experiment. Reviewer states of the merge request. | | <a id="addonuserauthoredmergerequestsreviewstates"></a>`reviewStates` **{warning-solid}** | [`[MergeRequestReviewState!]`](#mergerequestreviewstate) | **Introduced** in GitLab 17.0. **Status**: Experiment. Reviewer states of the merge request. |
| <a id="addonuserauthoredmergerequestsreviewerusername"></a>`reviewerUsername` | [`String`](#string) | Username of the reviewer. | | <a id="addonuserauthoredmergerequestsreviewerusername"></a>`reviewerUsername` | [`String`](#string) | Username of the reviewer. |
| <a id="addonuserauthoredmergerequestsreviewerwildcardid"></a>`reviewerWildcardId` | [`ReviewerWildcardId`](#reviewerwildcardid) | Filter by reviewer presence. Incompatible with reviewerUsername. |
| <a id="addonuserauthoredmergerequestssort"></a>`sort` | [`MergeRequestSort`](#mergerequestsort) | Sort merge requests by this criteria. | | <a id="addonuserauthoredmergerequestssort"></a>`sort` | [`MergeRequestSort`](#mergerequestsort) | Sort merge requests by this criteria. |
| <a id="addonuserauthoredmergerequestssourcebranches"></a>`sourceBranches` | [`[String!]`](#string) | Array of source branch names. All resolved merge requests will have one of these branches as their source. | | <a id="addonuserauthoredmergerequestssourcebranches"></a>`sourceBranches` | [`[String!]`](#string) | Array of source branch names. All resolved merge requests will have one of these branches as their source. |
| <a id="addonuserauthoredmergerequestsstate"></a>`state` | [`MergeRequestState`](#mergerequeststate) | Merge request state. If provided, all resolved merge requests will have this state. | | <a id="addonuserauthoredmergerequestsstate"></a>`state` | [`MergeRequestState`](#mergerequeststate) | Merge request state. If provided, all resolved merge requests will have this state. |
@ -16452,6 +16454,7 @@ four standard [pagination arguments](#pagination-arguments):
| <a id="autocompleteduserassignedmergerequestsreviewstate"></a>`reviewState` **{warning-solid}** | [`MergeRequestReviewState`](#mergerequestreviewstate) | **Introduced** in GitLab 17.0. **Status**: Experiment. Reviewer state of the merge request. | | <a id="autocompleteduserassignedmergerequestsreviewstate"></a>`reviewState` **{warning-solid}** | [`MergeRequestReviewState`](#mergerequestreviewstate) | **Introduced** in GitLab 17.0. **Status**: Experiment. Reviewer state of the merge request. |
| <a id="autocompleteduserassignedmergerequestsreviewstates"></a>`reviewStates` **{warning-solid}** | [`[MergeRequestReviewState!]`](#mergerequestreviewstate) | **Introduced** in GitLab 17.0. **Status**: Experiment. Reviewer states of the merge request. | | <a id="autocompleteduserassignedmergerequestsreviewstates"></a>`reviewStates` **{warning-solid}** | [`[MergeRequestReviewState!]`](#mergerequestreviewstate) | **Introduced** in GitLab 17.0. **Status**: Experiment. Reviewer states of the merge request. |
| <a id="autocompleteduserassignedmergerequestsreviewerusername"></a>`reviewerUsername` | [`String`](#string) | Username of the reviewer. | | <a id="autocompleteduserassignedmergerequestsreviewerusername"></a>`reviewerUsername` | [`String`](#string) | Username of the reviewer. |
| <a id="autocompleteduserassignedmergerequestsreviewerwildcardid"></a>`reviewerWildcardId` | [`ReviewerWildcardId`](#reviewerwildcardid) | Filter by reviewer presence. Incompatible with reviewerUsername. |
| <a id="autocompleteduserassignedmergerequestssort"></a>`sort` | [`MergeRequestSort`](#mergerequestsort) | Sort merge requests by this criteria. | | <a id="autocompleteduserassignedmergerequestssort"></a>`sort` | [`MergeRequestSort`](#mergerequestsort) | Sort merge requests by this criteria. |
| <a id="autocompleteduserassignedmergerequestssourcebranches"></a>`sourceBranches` | [`[String!]`](#string) | Array of source branch names. All resolved merge requests will have one of these branches as their source. | | <a id="autocompleteduserassignedmergerequestssourcebranches"></a>`sourceBranches` | [`[String!]`](#string) | Array of source branch names. All resolved merge requests will have one of these branches as their source. |
| <a id="autocompleteduserassignedmergerequestsstate"></a>`state` | [`MergeRequestState`](#mergerequeststate) | Merge request state. If provided, all resolved merge requests will have this state. | | <a id="autocompleteduserassignedmergerequestsstate"></a>`state` | [`MergeRequestState`](#mergerequeststate) | Merge request state. If provided, all resolved merge requests will have this state. |
@ -16490,6 +16493,7 @@ four standard [pagination arguments](#pagination-arguments):
| <a id="autocompleteduserauthoredmergerequestsreviewstate"></a>`reviewState` **{warning-solid}** | [`MergeRequestReviewState`](#mergerequestreviewstate) | **Introduced** in GitLab 17.0. **Status**: Experiment. Reviewer state of the merge request. | | <a id="autocompleteduserauthoredmergerequestsreviewstate"></a>`reviewState` **{warning-solid}** | [`MergeRequestReviewState`](#mergerequestreviewstate) | **Introduced** in GitLab 17.0. **Status**: Experiment. Reviewer state of the merge request. |
| <a id="autocompleteduserauthoredmergerequestsreviewstates"></a>`reviewStates` **{warning-solid}** | [`[MergeRequestReviewState!]`](#mergerequestreviewstate) | **Introduced** in GitLab 17.0. **Status**: Experiment. Reviewer states of the merge request. | | <a id="autocompleteduserauthoredmergerequestsreviewstates"></a>`reviewStates` **{warning-solid}** | [`[MergeRequestReviewState!]`](#mergerequestreviewstate) | **Introduced** in GitLab 17.0. **Status**: Experiment. Reviewer states of the merge request. |
| <a id="autocompleteduserauthoredmergerequestsreviewerusername"></a>`reviewerUsername` | [`String`](#string) | Username of the reviewer. | | <a id="autocompleteduserauthoredmergerequestsreviewerusername"></a>`reviewerUsername` | [`String`](#string) | Username of the reviewer. |
| <a id="autocompleteduserauthoredmergerequestsreviewerwildcardid"></a>`reviewerWildcardId` | [`ReviewerWildcardId`](#reviewerwildcardid) | Filter by reviewer presence. Incompatible with reviewerUsername. |
| <a id="autocompleteduserauthoredmergerequestssort"></a>`sort` | [`MergeRequestSort`](#mergerequestsort) | Sort merge requests by this criteria. | | <a id="autocompleteduserauthoredmergerequestssort"></a>`sort` | [`MergeRequestSort`](#mergerequestsort) | Sort merge requests by this criteria. |
| <a id="autocompleteduserauthoredmergerequestssourcebranches"></a>`sourceBranches` | [`[String!]`](#string) | Array of source branch names. All resolved merge requests will have one of these branches as their source. | | <a id="autocompleteduserauthoredmergerequestssourcebranches"></a>`sourceBranches` | [`[String!]`](#string) | Array of source branch names. All resolved merge requests will have one of these branches as their source. |
| <a id="autocompleteduserauthoredmergerequestsstate"></a>`state` | [`MergeRequestState`](#mergerequeststate) | Merge request state. If provided, all resolved merge requests will have this state. | | <a id="autocompleteduserauthoredmergerequestsstate"></a>`state` | [`MergeRequestState`](#mergerequeststate) | Merge request state. If provided, all resolved merge requests will have this state. |
@ -18624,6 +18628,7 @@ four standard [pagination arguments](#pagination-arguments):
| <a id="currentuserassignedmergerequestsreviewstate"></a>`reviewState` **{warning-solid}** | [`MergeRequestReviewState`](#mergerequestreviewstate) | **Introduced** in GitLab 17.0. **Status**: Experiment. Reviewer state of the merge request. | | <a id="currentuserassignedmergerequestsreviewstate"></a>`reviewState` **{warning-solid}** | [`MergeRequestReviewState`](#mergerequestreviewstate) | **Introduced** in GitLab 17.0. **Status**: Experiment. Reviewer state of the merge request. |
| <a id="currentuserassignedmergerequestsreviewstates"></a>`reviewStates` **{warning-solid}** | [`[MergeRequestReviewState!]`](#mergerequestreviewstate) | **Introduced** in GitLab 17.0. **Status**: Experiment. Reviewer states of the merge request. | | <a id="currentuserassignedmergerequestsreviewstates"></a>`reviewStates` **{warning-solid}** | [`[MergeRequestReviewState!]`](#mergerequestreviewstate) | **Introduced** in GitLab 17.0. **Status**: Experiment. Reviewer states of the merge request. |
| <a id="currentuserassignedmergerequestsreviewerusername"></a>`reviewerUsername` | [`String`](#string) | Username of the reviewer. | | <a id="currentuserassignedmergerequestsreviewerusername"></a>`reviewerUsername` | [`String`](#string) | Username of the reviewer. |
| <a id="currentuserassignedmergerequestsreviewerwildcardid"></a>`reviewerWildcardId` | [`ReviewerWildcardId`](#reviewerwildcardid) | Filter by reviewer presence. Incompatible with reviewerUsername. |
| <a id="currentuserassignedmergerequestssort"></a>`sort` | [`MergeRequestSort`](#mergerequestsort) | Sort merge requests by this criteria. | | <a id="currentuserassignedmergerequestssort"></a>`sort` | [`MergeRequestSort`](#mergerequestsort) | Sort merge requests by this criteria. |
| <a id="currentuserassignedmergerequestssourcebranches"></a>`sourceBranches` | [`[String!]`](#string) | Array of source branch names. All resolved merge requests will have one of these branches as their source. | | <a id="currentuserassignedmergerequestssourcebranches"></a>`sourceBranches` | [`[String!]`](#string) | Array of source branch names. All resolved merge requests will have one of these branches as their source. |
| <a id="currentuserassignedmergerequestsstate"></a>`state` | [`MergeRequestState`](#mergerequeststate) | Merge request state. If provided, all resolved merge requests will have this state. | | <a id="currentuserassignedmergerequestsstate"></a>`state` | [`MergeRequestState`](#mergerequeststate) | Merge request state. If provided, all resolved merge requests will have this state. |
@ -18662,6 +18667,7 @@ four standard [pagination arguments](#pagination-arguments):
| <a id="currentuserauthoredmergerequestsreviewstate"></a>`reviewState` **{warning-solid}** | [`MergeRequestReviewState`](#mergerequestreviewstate) | **Introduced** in GitLab 17.0. **Status**: Experiment. Reviewer state of the merge request. | | <a id="currentuserauthoredmergerequestsreviewstate"></a>`reviewState` **{warning-solid}** | [`MergeRequestReviewState`](#mergerequestreviewstate) | **Introduced** in GitLab 17.0. **Status**: Experiment. Reviewer state of the merge request. |
| <a id="currentuserauthoredmergerequestsreviewstates"></a>`reviewStates` **{warning-solid}** | [`[MergeRequestReviewState!]`](#mergerequestreviewstate) | **Introduced** in GitLab 17.0. **Status**: Experiment. Reviewer states of the merge request. | | <a id="currentuserauthoredmergerequestsreviewstates"></a>`reviewStates` **{warning-solid}** | [`[MergeRequestReviewState!]`](#mergerequestreviewstate) | **Introduced** in GitLab 17.0. **Status**: Experiment. Reviewer states of the merge request. |
| <a id="currentuserauthoredmergerequestsreviewerusername"></a>`reviewerUsername` | [`String`](#string) | Username of the reviewer. | | <a id="currentuserauthoredmergerequestsreviewerusername"></a>`reviewerUsername` | [`String`](#string) | Username of the reviewer. |
| <a id="currentuserauthoredmergerequestsreviewerwildcardid"></a>`reviewerWildcardId` | [`ReviewerWildcardId`](#reviewerwildcardid) | Filter by reviewer presence. Incompatible with reviewerUsername. |
| <a id="currentuserauthoredmergerequestssort"></a>`sort` | [`MergeRequestSort`](#mergerequestsort) | Sort merge requests by this criteria. | | <a id="currentuserauthoredmergerequestssort"></a>`sort` | [`MergeRequestSort`](#mergerequestsort) | Sort merge requests by this criteria. |
| <a id="currentuserauthoredmergerequestssourcebranches"></a>`sourceBranches` | [`[String!]`](#string) | Array of source branch names. All resolved merge requests will have one of these branches as their source. | | <a id="currentuserauthoredmergerequestssourcebranches"></a>`sourceBranches` | [`[String!]`](#string) | Array of source branch names. All resolved merge requests will have one of these branches as their source. |
| <a id="currentuserauthoredmergerequestsstate"></a>`state` | [`MergeRequestState`](#mergerequeststate) | Merge request state. If provided, all resolved merge requests will have this state. | | <a id="currentuserauthoredmergerequestsstate"></a>`state` | [`MergeRequestState`](#mergerequeststate) | Merge request state. If provided, all resolved merge requests will have this state. |
@ -23896,6 +23902,7 @@ four standard [pagination arguments](#pagination-arguments):
| <a id="mergerequestassigneeassignedmergerequestsreviewstate"></a>`reviewState` **{warning-solid}** | [`MergeRequestReviewState`](#mergerequestreviewstate) | **Introduced** in GitLab 17.0. **Status**: Experiment. Reviewer state of the merge request. | | <a id="mergerequestassigneeassignedmergerequestsreviewstate"></a>`reviewState` **{warning-solid}** | [`MergeRequestReviewState`](#mergerequestreviewstate) | **Introduced** in GitLab 17.0. **Status**: Experiment. Reviewer state of the merge request. |
| <a id="mergerequestassigneeassignedmergerequestsreviewstates"></a>`reviewStates` **{warning-solid}** | [`[MergeRequestReviewState!]`](#mergerequestreviewstate) | **Introduced** in GitLab 17.0. **Status**: Experiment. Reviewer states of the merge request. | | <a id="mergerequestassigneeassignedmergerequestsreviewstates"></a>`reviewStates` **{warning-solid}** | [`[MergeRequestReviewState!]`](#mergerequestreviewstate) | **Introduced** in GitLab 17.0. **Status**: Experiment. Reviewer states of the merge request. |
| <a id="mergerequestassigneeassignedmergerequestsreviewerusername"></a>`reviewerUsername` | [`String`](#string) | Username of the reviewer. | | <a id="mergerequestassigneeassignedmergerequestsreviewerusername"></a>`reviewerUsername` | [`String`](#string) | Username of the reviewer. |
| <a id="mergerequestassigneeassignedmergerequestsreviewerwildcardid"></a>`reviewerWildcardId` | [`ReviewerWildcardId`](#reviewerwildcardid) | Filter by reviewer presence. Incompatible with reviewerUsername. |
| <a id="mergerequestassigneeassignedmergerequestssort"></a>`sort` | [`MergeRequestSort`](#mergerequestsort) | Sort merge requests by this criteria. | | <a id="mergerequestassigneeassignedmergerequestssort"></a>`sort` | [`MergeRequestSort`](#mergerequestsort) | Sort merge requests by this criteria. |
| <a id="mergerequestassigneeassignedmergerequestssourcebranches"></a>`sourceBranches` | [`[String!]`](#string) | Array of source branch names. All resolved merge requests will have one of these branches as their source. | | <a id="mergerequestassigneeassignedmergerequestssourcebranches"></a>`sourceBranches` | [`[String!]`](#string) | Array of source branch names. All resolved merge requests will have one of these branches as their source. |
| <a id="mergerequestassigneeassignedmergerequestsstate"></a>`state` | [`MergeRequestState`](#mergerequeststate) | Merge request state. If provided, all resolved merge requests will have this state. | | <a id="mergerequestassigneeassignedmergerequestsstate"></a>`state` | [`MergeRequestState`](#mergerequeststate) | Merge request state. If provided, all resolved merge requests will have this state. |
@ -23934,6 +23941,7 @@ four standard [pagination arguments](#pagination-arguments):
| <a id="mergerequestassigneeauthoredmergerequestsreviewstate"></a>`reviewState` **{warning-solid}** | [`MergeRequestReviewState`](#mergerequestreviewstate) | **Introduced** in GitLab 17.0. **Status**: Experiment. Reviewer state of the merge request. | | <a id="mergerequestassigneeauthoredmergerequestsreviewstate"></a>`reviewState` **{warning-solid}** | [`MergeRequestReviewState`](#mergerequestreviewstate) | **Introduced** in GitLab 17.0. **Status**: Experiment. Reviewer state of the merge request. |
| <a id="mergerequestassigneeauthoredmergerequestsreviewstates"></a>`reviewStates` **{warning-solid}** | [`[MergeRequestReviewState!]`](#mergerequestreviewstate) | **Introduced** in GitLab 17.0. **Status**: Experiment. Reviewer states of the merge request. | | <a id="mergerequestassigneeauthoredmergerequestsreviewstates"></a>`reviewStates` **{warning-solid}** | [`[MergeRequestReviewState!]`](#mergerequestreviewstate) | **Introduced** in GitLab 17.0. **Status**: Experiment. Reviewer states of the merge request. |
| <a id="mergerequestassigneeauthoredmergerequestsreviewerusername"></a>`reviewerUsername` | [`String`](#string) | Username of the reviewer. | | <a id="mergerequestassigneeauthoredmergerequestsreviewerusername"></a>`reviewerUsername` | [`String`](#string) | Username of the reviewer. |
| <a id="mergerequestassigneeauthoredmergerequestsreviewerwildcardid"></a>`reviewerWildcardId` | [`ReviewerWildcardId`](#reviewerwildcardid) | Filter by reviewer presence. Incompatible with reviewerUsername. |
| <a id="mergerequestassigneeauthoredmergerequestssort"></a>`sort` | [`MergeRequestSort`](#mergerequestsort) | Sort merge requests by this criteria. | | <a id="mergerequestassigneeauthoredmergerequestssort"></a>`sort` | [`MergeRequestSort`](#mergerequestsort) | Sort merge requests by this criteria. |
| <a id="mergerequestassigneeauthoredmergerequestssourcebranches"></a>`sourceBranches` | [`[String!]`](#string) | Array of source branch names. All resolved merge requests will have one of these branches as their source. | | <a id="mergerequestassigneeauthoredmergerequestssourcebranches"></a>`sourceBranches` | [`[String!]`](#string) | Array of source branch names. All resolved merge requests will have one of these branches as their source. |
| <a id="mergerequestassigneeauthoredmergerequestsstate"></a>`state` | [`MergeRequestState`](#mergerequeststate) | Merge request state. If provided, all resolved merge requests will have this state. | | <a id="mergerequestassigneeauthoredmergerequestsstate"></a>`state` | [`MergeRequestState`](#mergerequeststate) | Merge request state. If provided, all resolved merge requests will have this state. |
@ -24206,6 +24214,7 @@ four standard [pagination arguments](#pagination-arguments):
| <a id="mergerequestauthorassignedmergerequestsreviewstate"></a>`reviewState` **{warning-solid}** | [`MergeRequestReviewState`](#mergerequestreviewstate) | **Introduced** in GitLab 17.0. **Status**: Experiment. Reviewer state of the merge request. | | <a id="mergerequestauthorassignedmergerequestsreviewstate"></a>`reviewState` **{warning-solid}** | [`MergeRequestReviewState`](#mergerequestreviewstate) | **Introduced** in GitLab 17.0. **Status**: Experiment. Reviewer state of the merge request. |
| <a id="mergerequestauthorassignedmergerequestsreviewstates"></a>`reviewStates` **{warning-solid}** | [`[MergeRequestReviewState!]`](#mergerequestreviewstate) | **Introduced** in GitLab 17.0. **Status**: Experiment. Reviewer states of the merge request. | | <a id="mergerequestauthorassignedmergerequestsreviewstates"></a>`reviewStates` **{warning-solid}** | [`[MergeRequestReviewState!]`](#mergerequestreviewstate) | **Introduced** in GitLab 17.0. **Status**: Experiment. Reviewer states of the merge request. |
| <a id="mergerequestauthorassignedmergerequestsreviewerusername"></a>`reviewerUsername` | [`String`](#string) | Username of the reviewer. | | <a id="mergerequestauthorassignedmergerequestsreviewerusername"></a>`reviewerUsername` | [`String`](#string) | Username of the reviewer. |
| <a id="mergerequestauthorassignedmergerequestsreviewerwildcardid"></a>`reviewerWildcardId` | [`ReviewerWildcardId`](#reviewerwildcardid) | Filter by reviewer presence. Incompatible with reviewerUsername. |
| <a id="mergerequestauthorassignedmergerequestssort"></a>`sort` | [`MergeRequestSort`](#mergerequestsort) | Sort merge requests by this criteria. | | <a id="mergerequestauthorassignedmergerequestssort"></a>`sort` | [`MergeRequestSort`](#mergerequestsort) | Sort merge requests by this criteria. |
| <a id="mergerequestauthorassignedmergerequestssourcebranches"></a>`sourceBranches` | [`[String!]`](#string) | Array of source branch names. All resolved merge requests will have one of these branches as their source. | | <a id="mergerequestauthorassignedmergerequestssourcebranches"></a>`sourceBranches` | [`[String!]`](#string) | Array of source branch names. All resolved merge requests will have one of these branches as their source. |
| <a id="mergerequestauthorassignedmergerequestsstate"></a>`state` | [`MergeRequestState`](#mergerequeststate) | Merge request state. If provided, all resolved merge requests will have this state. | | <a id="mergerequestauthorassignedmergerequestsstate"></a>`state` | [`MergeRequestState`](#mergerequeststate) | Merge request state. If provided, all resolved merge requests will have this state. |
@ -24244,6 +24253,7 @@ four standard [pagination arguments](#pagination-arguments):
| <a id="mergerequestauthorauthoredmergerequestsreviewstate"></a>`reviewState` **{warning-solid}** | [`MergeRequestReviewState`](#mergerequestreviewstate) | **Introduced** in GitLab 17.0. **Status**: Experiment. Reviewer state of the merge request. | | <a id="mergerequestauthorauthoredmergerequestsreviewstate"></a>`reviewState` **{warning-solid}** | [`MergeRequestReviewState`](#mergerequestreviewstate) | **Introduced** in GitLab 17.0. **Status**: Experiment. Reviewer state of the merge request. |
| <a id="mergerequestauthorauthoredmergerequestsreviewstates"></a>`reviewStates` **{warning-solid}** | [`[MergeRequestReviewState!]`](#mergerequestreviewstate) | **Introduced** in GitLab 17.0. **Status**: Experiment. Reviewer states of the merge request. | | <a id="mergerequestauthorauthoredmergerequestsreviewstates"></a>`reviewStates` **{warning-solid}** | [`[MergeRequestReviewState!]`](#mergerequestreviewstate) | **Introduced** in GitLab 17.0. **Status**: Experiment. Reviewer states of the merge request. |
| <a id="mergerequestauthorauthoredmergerequestsreviewerusername"></a>`reviewerUsername` | [`String`](#string) | Username of the reviewer. | | <a id="mergerequestauthorauthoredmergerequestsreviewerusername"></a>`reviewerUsername` | [`String`](#string) | Username of the reviewer. |
| <a id="mergerequestauthorauthoredmergerequestsreviewerwildcardid"></a>`reviewerWildcardId` | [`ReviewerWildcardId`](#reviewerwildcardid) | Filter by reviewer presence. Incompatible with reviewerUsername. |
| <a id="mergerequestauthorauthoredmergerequestssort"></a>`sort` | [`MergeRequestSort`](#mergerequestsort) | Sort merge requests by this criteria. | | <a id="mergerequestauthorauthoredmergerequestssort"></a>`sort` | [`MergeRequestSort`](#mergerequestsort) | Sort merge requests by this criteria. |
| <a id="mergerequestauthorauthoredmergerequestssourcebranches"></a>`sourceBranches` | [`[String!]`](#string) | Array of source branch names. All resolved merge requests will have one of these branches as their source. | | <a id="mergerequestauthorauthoredmergerequestssourcebranches"></a>`sourceBranches` | [`[String!]`](#string) | Array of source branch names. All resolved merge requests will have one of these branches as their source. |
| <a id="mergerequestauthorauthoredmergerequestsstate"></a>`state` | [`MergeRequestState`](#mergerequeststate) | Merge request state. If provided, all resolved merge requests will have this state. | | <a id="mergerequestauthorauthoredmergerequestsstate"></a>`state` | [`MergeRequestState`](#mergerequeststate) | Merge request state. If provided, all resolved merge requests will have this state. |
@ -24563,6 +24573,7 @@ four standard [pagination arguments](#pagination-arguments):
| <a id="mergerequestparticipantassignedmergerequestsreviewstate"></a>`reviewState` **{warning-solid}** | [`MergeRequestReviewState`](#mergerequestreviewstate) | **Introduced** in GitLab 17.0. **Status**: Experiment. Reviewer state of the merge request. | | <a id="mergerequestparticipantassignedmergerequestsreviewstate"></a>`reviewState` **{warning-solid}** | [`MergeRequestReviewState`](#mergerequestreviewstate) | **Introduced** in GitLab 17.0. **Status**: Experiment. Reviewer state of the merge request. |
| <a id="mergerequestparticipantassignedmergerequestsreviewstates"></a>`reviewStates` **{warning-solid}** | [`[MergeRequestReviewState!]`](#mergerequestreviewstate) | **Introduced** in GitLab 17.0. **Status**: Experiment. Reviewer states of the merge request. | | <a id="mergerequestparticipantassignedmergerequestsreviewstates"></a>`reviewStates` **{warning-solid}** | [`[MergeRequestReviewState!]`](#mergerequestreviewstate) | **Introduced** in GitLab 17.0. **Status**: Experiment. Reviewer states of the merge request. |
| <a id="mergerequestparticipantassignedmergerequestsreviewerusername"></a>`reviewerUsername` | [`String`](#string) | Username of the reviewer. | | <a id="mergerequestparticipantassignedmergerequestsreviewerusername"></a>`reviewerUsername` | [`String`](#string) | Username of the reviewer. |
| <a id="mergerequestparticipantassignedmergerequestsreviewerwildcardid"></a>`reviewerWildcardId` | [`ReviewerWildcardId`](#reviewerwildcardid) | Filter by reviewer presence. Incompatible with reviewerUsername. |
| <a id="mergerequestparticipantassignedmergerequestssort"></a>`sort` | [`MergeRequestSort`](#mergerequestsort) | Sort merge requests by this criteria. | | <a id="mergerequestparticipantassignedmergerequestssort"></a>`sort` | [`MergeRequestSort`](#mergerequestsort) | Sort merge requests by this criteria. |
| <a id="mergerequestparticipantassignedmergerequestssourcebranches"></a>`sourceBranches` | [`[String!]`](#string) | Array of source branch names. All resolved merge requests will have one of these branches as their source. | | <a id="mergerequestparticipantassignedmergerequestssourcebranches"></a>`sourceBranches` | [`[String!]`](#string) | Array of source branch names. All resolved merge requests will have one of these branches as their source. |
| <a id="mergerequestparticipantassignedmergerequestsstate"></a>`state` | [`MergeRequestState`](#mergerequeststate) | Merge request state. If provided, all resolved merge requests will have this state. | | <a id="mergerequestparticipantassignedmergerequestsstate"></a>`state` | [`MergeRequestState`](#mergerequeststate) | Merge request state. If provided, all resolved merge requests will have this state. |
@ -24601,6 +24612,7 @@ four standard [pagination arguments](#pagination-arguments):
| <a id="mergerequestparticipantauthoredmergerequestsreviewstate"></a>`reviewState` **{warning-solid}** | [`MergeRequestReviewState`](#mergerequestreviewstate) | **Introduced** in GitLab 17.0. **Status**: Experiment. Reviewer state of the merge request. | | <a id="mergerequestparticipantauthoredmergerequestsreviewstate"></a>`reviewState` **{warning-solid}** | [`MergeRequestReviewState`](#mergerequestreviewstate) | **Introduced** in GitLab 17.0. **Status**: Experiment. Reviewer state of the merge request. |
| <a id="mergerequestparticipantauthoredmergerequestsreviewstates"></a>`reviewStates` **{warning-solid}** | [`[MergeRequestReviewState!]`](#mergerequestreviewstate) | **Introduced** in GitLab 17.0. **Status**: Experiment. Reviewer states of the merge request. | | <a id="mergerequestparticipantauthoredmergerequestsreviewstates"></a>`reviewStates` **{warning-solid}** | [`[MergeRequestReviewState!]`](#mergerequestreviewstate) | **Introduced** in GitLab 17.0. **Status**: Experiment. Reviewer states of the merge request. |
| <a id="mergerequestparticipantauthoredmergerequestsreviewerusername"></a>`reviewerUsername` | [`String`](#string) | Username of the reviewer. | | <a id="mergerequestparticipantauthoredmergerequestsreviewerusername"></a>`reviewerUsername` | [`String`](#string) | Username of the reviewer. |
| <a id="mergerequestparticipantauthoredmergerequestsreviewerwildcardid"></a>`reviewerWildcardId` | [`ReviewerWildcardId`](#reviewerwildcardid) | Filter by reviewer presence. Incompatible with reviewerUsername. |
| <a id="mergerequestparticipantauthoredmergerequestssort"></a>`sort` | [`MergeRequestSort`](#mergerequestsort) | Sort merge requests by this criteria. | | <a id="mergerequestparticipantauthoredmergerequestssort"></a>`sort` | [`MergeRequestSort`](#mergerequestsort) | Sort merge requests by this criteria. |
| <a id="mergerequestparticipantauthoredmergerequestssourcebranches"></a>`sourceBranches` | [`[String!]`](#string) | Array of source branch names. All resolved merge requests will have one of these branches as their source. | | <a id="mergerequestparticipantauthoredmergerequestssourcebranches"></a>`sourceBranches` | [`[String!]`](#string) | Array of source branch names. All resolved merge requests will have one of these branches as their source. |
| <a id="mergerequestparticipantauthoredmergerequestsstate"></a>`state` | [`MergeRequestState`](#mergerequeststate) | Merge request state. If provided, all resolved merge requests will have this state. | | <a id="mergerequestparticipantauthoredmergerequestsstate"></a>`state` | [`MergeRequestState`](#mergerequeststate) | Merge request state. If provided, all resolved merge requests will have this state. |
@ -24909,6 +24921,7 @@ four standard [pagination arguments](#pagination-arguments):
| <a id="mergerequestreviewerassignedmergerequestsreviewstate"></a>`reviewState` **{warning-solid}** | [`MergeRequestReviewState`](#mergerequestreviewstate) | **Introduced** in GitLab 17.0. **Status**: Experiment. Reviewer state of the merge request. | | <a id="mergerequestreviewerassignedmergerequestsreviewstate"></a>`reviewState` **{warning-solid}** | [`MergeRequestReviewState`](#mergerequestreviewstate) | **Introduced** in GitLab 17.0. **Status**: Experiment. Reviewer state of the merge request. |
| <a id="mergerequestreviewerassignedmergerequestsreviewstates"></a>`reviewStates` **{warning-solid}** | [`[MergeRequestReviewState!]`](#mergerequestreviewstate) | **Introduced** in GitLab 17.0. **Status**: Experiment. Reviewer states of the merge request. | | <a id="mergerequestreviewerassignedmergerequestsreviewstates"></a>`reviewStates` **{warning-solid}** | [`[MergeRequestReviewState!]`](#mergerequestreviewstate) | **Introduced** in GitLab 17.0. **Status**: Experiment. Reviewer states of the merge request. |
| <a id="mergerequestreviewerassignedmergerequestsreviewerusername"></a>`reviewerUsername` | [`String`](#string) | Username of the reviewer. | | <a id="mergerequestreviewerassignedmergerequestsreviewerusername"></a>`reviewerUsername` | [`String`](#string) | Username of the reviewer. |
| <a id="mergerequestreviewerassignedmergerequestsreviewerwildcardid"></a>`reviewerWildcardId` | [`ReviewerWildcardId`](#reviewerwildcardid) | Filter by reviewer presence. Incompatible with reviewerUsername. |
| <a id="mergerequestreviewerassignedmergerequestssort"></a>`sort` | [`MergeRequestSort`](#mergerequestsort) | Sort merge requests by this criteria. | | <a id="mergerequestreviewerassignedmergerequestssort"></a>`sort` | [`MergeRequestSort`](#mergerequestsort) | Sort merge requests by this criteria. |
| <a id="mergerequestreviewerassignedmergerequestssourcebranches"></a>`sourceBranches` | [`[String!]`](#string) | Array of source branch names. All resolved merge requests will have one of these branches as their source. | | <a id="mergerequestreviewerassignedmergerequestssourcebranches"></a>`sourceBranches` | [`[String!]`](#string) | Array of source branch names. All resolved merge requests will have one of these branches as their source. |
| <a id="mergerequestreviewerassignedmergerequestsstate"></a>`state` | [`MergeRequestState`](#mergerequeststate) | Merge request state. If provided, all resolved merge requests will have this state. | | <a id="mergerequestreviewerassignedmergerequestsstate"></a>`state` | [`MergeRequestState`](#mergerequeststate) | Merge request state. If provided, all resolved merge requests will have this state. |
@ -24947,6 +24960,7 @@ four standard [pagination arguments](#pagination-arguments):
| <a id="mergerequestreviewerauthoredmergerequestsreviewstate"></a>`reviewState` **{warning-solid}** | [`MergeRequestReviewState`](#mergerequestreviewstate) | **Introduced** in GitLab 17.0. **Status**: Experiment. Reviewer state of the merge request. | | <a id="mergerequestreviewerauthoredmergerequestsreviewstate"></a>`reviewState` **{warning-solid}** | [`MergeRequestReviewState`](#mergerequestreviewstate) | **Introduced** in GitLab 17.0. **Status**: Experiment. Reviewer state of the merge request. |
| <a id="mergerequestreviewerauthoredmergerequestsreviewstates"></a>`reviewStates` **{warning-solid}** | [`[MergeRequestReviewState!]`](#mergerequestreviewstate) | **Introduced** in GitLab 17.0. **Status**: Experiment. Reviewer states of the merge request. | | <a id="mergerequestreviewerauthoredmergerequestsreviewstates"></a>`reviewStates` **{warning-solid}** | [`[MergeRequestReviewState!]`](#mergerequestreviewstate) | **Introduced** in GitLab 17.0. **Status**: Experiment. Reviewer states of the merge request. |
| <a id="mergerequestreviewerauthoredmergerequestsreviewerusername"></a>`reviewerUsername` | [`String`](#string) | Username of the reviewer. | | <a id="mergerequestreviewerauthoredmergerequestsreviewerusername"></a>`reviewerUsername` | [`String`](#string) | Username of the reviewer. |
| <a id="mergerequestreviewerauthoredmergerequestsreviewerwildcardid"></a>`reviewerWildcardId` | [`ReviewerWildcardId`](#reviewerwildcardid) | Filter by reviewer presence. Incompatible with reviewerUsername. |
| <a id="mergerequestreviewerauthoredmergerequestssort"></a>`sort` | [`MergeRequestSort`](#mergerequestsort) | Sort merge requests by this criteria. | | <a id="mergerequestreviewerauthoredmergerequestssort"></a>`sort` | [`MergeRequestSort`](#mergerequestsort) | Sort merge requests by this criteria. |
| <a id="mergerequestreviewerauthoredmergerequestssourcebranches"></a>`sourceBranches` | [`[String!]`](#string) | Array of source branch names. All resolved merge requests will have one of these branches as their source. | | <a id="mergerequestreviewerauthoredmergerequestssourcebranches"></a>`sourceBranches` | [`[String!]`](#string) | Array of source branch names. All resolved merge requests will have one of these branches as their source. |
| <a id="mergerequestreviewerauthoredmergerequestsstate"></a>`state` | [`MergeRequestState`](#mergerequeststate) | Merge request state. If provided, all resolved merge requests will have this state. | | <a id="mergerequestreviewerauthoredmergerequestsstate"></a>`state` | [`MergeRequestState`](#mergerequeststate) | Merge request state. If provided, all resolved merge requests will have this state. |
@ -27865,6 +27879,7 @@ four standard [pagination arguments](#pagination-arguments):
| <a id="projectmergerequestsreviewstate"></a>`reviewState` **{warning-solid}** | [`MergeRequestReviewState`](#mergerequestreviewstate) | **Introduced** in GitLab 17.0. **Status**: Experiment. Reviewer state of the merge request. | | <a id="projectmergerequestsreviewstate"></a>`reviewState` **{warning-solid}** | [`MergeRequestReviewState`](#mergerequestreviewstate) | **Introduced** in GitLab 17.0. **Status**: Experiment. Reviewer state of the merge request. |
| <a id="projectmergerequestsreviewstates"></a>`reviewStates` **{warning-solid}** | [`[MergeRequestReviewState!]`](#mergerequestreviewstate) | **Introduced** in GitLab 17.0. **Status**: Experiment. Reviewer states of the merge request. | | <a id="projectmergerequestsreviewstates"></a>`reviewStates` **{warning-solid}** | [`[MergeRequestReviewState!]`](#mergerequestreviewstate) | **Introduced** in GitLab 17.0. **Status**: Experiment. Reviewer states of the merge request. |
| <a id="projectmergerequestsreviewerusername"></a>`reviewerUsername` | [`String`](#string) | Username of the reviewer. | | <a id="projectmergerequestsreviewerusername"></a>`reviewerUsername` | [`String`](#string) | Username of the reviewer. |
| <a id="projectmergerequestsreviewerwildcardid"></a>`reviewerWildcardId` | [`ReviewerWildcardId`](#reviewerwildcardid) | Filter by reviewer presence. Incompatible with reviewerUsername. |
| <a id="projectmergerequestssort"></a>`sort` | [`MergeRequestSort`](#mergerequestsort) | Sort merge requests by this criteria. | | <a id="projectmergerequestssort"></a>`sort` | [`MergeRequestSort`](#mergerequestsort) | Sort merge requests by this criteria. |
| <a id="projectmergerequestssourcebranches"></a>`sourceBranches` | [`[String!]`](#string) | Array of source branch names. All resolved merge requests will have one of these branches as their source. | | <a id="projectmergerequestssourcebranches"></a>`sourceBranches` | [`[String!]`](#string) | Array of source branch names. All resolved merge requests will have one of these branches as their source. |
| <a id="projectmergerequestsstate"></a>`state` | [`MergeRequestState`](#mergerequeststate) | Merge request state. If provided, all resolved merge requests will have this state. | | <a id="projectmergerequestsstate"></a>`state` | [`MergeRequestState`](#mergerequeststate) | Merge request state. If provided, all resolved merge requests will have this state. |
@ -30605,6 +30620,7 @@ four standard [pagination arguments](#pagination-arguments):
| <a id="usercoreassignedmergerequestsreviewstate"></a>`reviewState` **{warning-solid}** | [`MergeRequestReviewState`](#mergerequestreviewstate) | **Introduced** in GitLab 17.0. **Status**: Experiment. Reviewer state of the merge request. | | <a id="usercoreassignedmergerequestsreviewstate"></a>`reviewState` **{warning-solid}** | [`MergeRequestReviewState`](#mergerequestreviewstate) | **Introduced** in GitLab 17.0. **Status**: Experiment. Reviewer state of the merge request. |
| <a id="usercoreassignedmergerequestsreviewstates"></a>`reviewStates` **{warning-solid}** | [`[MergeRequestReviewState!]`](#mergerequestreviewstate) | **Introduced** in GitLab 17.0. **Status**: Experiment. Reviewer states of the merge request. | | <a id="usercoreassignedmergerequestsreviewstates"></a>`reviewStates` **{warning-solid}** | [`[MergeRequestReviewState!]`](#mergerequestreviewstate) | **Introduced** in GitLab 17.0. **Status**: Experiment. Reviewer states of the merge request. |
| <a id="usercoreassignedmergerequestsreviewerusername"></a>`reviewerUsername` | [`String`](#string) | Username of the reviewer. | | <a id="usercoreassignedmergerequestsreviewerusername"></a>`reviewerUsername` | [`String`](#string) | Username of the reviewer. |
| <a id="usercoreassignedmergerequestsreviewerwildcardid"></a>`reviewerWildcardId` | [`ReviewerWildcardId`](#reviewerwildcardid) | Filter by reviewer presence. Incompatible with reviewerUsername. |
| <a id="usercoreassignedmergerequestssort"></a>`sort` | [`MergeRequestSort`](#mergerequestsort) | Sort merge requests by this criteria. | | <a id="usercoreassignedmergerequestssort"></a>`sort` | [`MergeRequestSort`](#mergerequestsort) | Sort merge requests by this criteria. |
| <a id="usercoreassignedmergerequestssourcebranches"></a>`sourceBranches` | [`[String!]`](#string) | Array of source branch names. All resolved merge requests will have one of these branches as their source. | | <a id="usercoreassignedmergerequestssourcebranches"></a>`sourceBranches` | [`[String!]`](#string) | Array of source branch names. All resolved merge requests will have one of these branches as their source. |
| <a id="usercoreassignedmergerequestsstate"></a>`state` | [`MergeRequestState`](#mergerequeststate) | Merge request state. If provided, all resolved merge requests will have this state. | | <a id="usercoreassignedmergerequestsstate"></a>`state` | [`MergeRequestState`](#mergerequeststate) | Merge request state. If provided, all resolved merge requests will have this state. |
@ -30643,6 +30659,7 @@ four standard [pagination arguments](#pagination-arguments):
| <a id="usercoreauthoredmergerequestsreviewstate"></a>`reviewState` **{warning-solid}** | [`MergeRequestReviewState`](#mergerequestreviewstate) | **Introduced** in GitLab 17.0. **Status**: Experiment. Reviewer state of the merge request. | | <a id="usercoreauthoredmergerequestsreviewstate"></a>`reviewState` **{warning-solid}** | [`MergeRequestReviewState`](#mergerequestreviewstate) | **Introduced** in GitLab 17.0. **Status**: Experiment. Reviewer state of the merge request. |
| <a id="usercoreauthoredmergerequestsreviewstates"></a>`reviewStates` **{warning-solid}** | [`[MergeRequestReviewState!]`](#mergerequestreviewstate) | **Introduced** in GitLab 17.0. **Status**: Experiment. Reviewer states of the merge request. | | <a id="usercoreauthoredmergerequestsreviewstates"></a>`reviewStates` **{warning-solid}** | [`[MergeRequestReviewState!]`](#mergerequestreviewstate) | **Introduced** in GitLab 17.0. **Status**: Experiment. Reviewer states of the merge request. |
| <a id="usercoreauthoredmergerequestsreviewerusername"></a>`reviewerUsername` | [`String`](#string) | Username of the reviewer. | | <a id="usercoreauthoredmergerequestsreviewerusername"></a>`reviewerUsername` | [`String`](#string) | Username of the reviewer. |
| <a id="usercoreauthoredmergerequestsreviewerwildcardid"></a>`reviewerWildcardId` | [`ReviewerWildcardId`](#reviewerwildcardid) | Filter by reviewer presence. Incompatible with reviewerUsername. |
| <a id="usercoreauthoredmergerequestssort"></a>`sort` | [`MergeRequestSort`](#mergerequestsort) | Sort merge requests by this criteria. | | <a id="usercoreauthoredmergerequestssort"></a>`sort` | [`MergeRequestSort`](#mergerequestsort) | Sort merge requests by this criteria. |
| <a id="usercoreauthoredmergerequestssourcebranches"></a>`sourceBranches` | [`[String!]`](#string) | Array of source branch names. All resolved merge requests will have one of these branches as their source. | | <a id="usercoreauthoredmergerequestssourcebranches"></a>`sourceBranches` | [`[String!]`](#string) | Array of source branch names. All resolved merge requests will have one of these branches as their source. |
| <a id="usercoreauthoredmergerequestsstate"></a>`state` | [`MergeRequestState`](#mergerequeststate) | Merge request state. If provided, all resolved merge requests will have this state. | | <a id="usercoreauthoredmergerequestsstate"></a>`state` | [`MergeRequestState`](#mergerequeststate) | Merge request state. If provided, all resolved merge requests will have this state. |
@ -34448,6 +34465,15 @@ Status of a requirement based on last test report.
| <a id="requirementstatusfiltermissing"></a>`MISSING` | Requirements without any test report. | | <a id="requirementstatusfiltermissing"></a>`MISSING` | Requirements without any test report. |
| <a id="requirementstatusfilterpassed"></a>`PASSED` | Passed test report. | | <a id="requirementstatusfilterpassed"></a>`PASSED` | Passed test report. |
### `ReviewerWildcardId`
Reviewer ID wildcard values.
| Value | Description |
| ----- | ----------- |
| <a id="reviewerwildcardidany"></a>`ANY` | Any reviewer is assigned. |
| <a id="reviewerwildcardidnone"></a>`NONE` | No reviewer is assigned. |
### `SastUiComponentSize` ### `SastUiComponentSize`
Size of UI component in SAST configuration page. Size of UI component in SAST configuration page.
@ -36805,6 +36831,7 @@ four standard [pagination arguments](#pagination-arguments):
| <a id="userassignedmergerequestsreviewstate"></a>`reviewState` **{warning-solid}** | [`MergeRequestReviewState`](#mergerequestreviewstate) | **Introduced** in GitLab 17.0. **Status**: Experiment. Reviewer state of the merge request. | | <a id="userassignedmergerequestsreviewstate"></a>`reviewState` **{warning-solid}** | [`MergeRequestReviewState`](#mergerequestreviewstate) | **Introduced** in GitLab 17.0. **Status**: Experiment. Reviewer state of the merge request. |
| <a id="userassignedmergerequestsreviewstates"></a>`reviewStates` **{warning-solid}** | [`[MergeRequestReviewState!]`](#mergerequestreviewstate) | **Introduced** in GitLab 17.0. **Status**: Experiment. Reviewer states of the merge request. | | <a id="userassignedmergerequestsreviewstates"></a>`reviewStates` **{warning-solid}** | [`[MergeRequestReviewState!]`](#mergerequestreviewstate) | **Introduced** in GitLab 17.0. **Status**: Experiment. Reviewer states of the merge request. |
| <a id="userassignedmergerequestsreviewerusername"></a>`reviewerUsername` | [`String`](#string) | Username of the reviewer. | | <a id="userassignedmergerequestsreviewerusername"></a>`reviewerUsername` | [`String`](#string) | Username of the reviewer. |
| <a id="userassignedmergerequestsreviewerwildcardid"></a>`reviewerWildcardId` | [`ReviewerWildcardId`](#reviewerwildcardid) | Filter by reviewer presence. Incompatible with reviewerUsername. |
| <a id="userassignedmergerequestssort"></a>`sort` | [`MergeRequestSort`](#mergerequestsort) | Sort merge requests by this criteria. | | <a id="userassignedmergerequestssort"></a>`sort` | [`MergeRequestSort`](#mergerequestsort) | Sort merge requests by this criteria. |
| <a id="userassignedmergerequestssourcebranches"></a>`sourceBranches` | [`[String!]`](#string) | Array of source branch names. All resolved merge requests will have one of these branches as their source. | | <a id="userassignedmergerequestssourcebranches"></a>`sourceBranches` | [`[String!]`](#string) | Array of source branch names. All resolved merge requests will have one of these branches as their source. |
| <a id="userassignedmergerequestsstate"></a>`state` | [`MergeRequestState`](#mergerequeststate) | Merge request state. If provided, all resolved merge requests will have this state. | | <a id="userassignedmergerequestsstate"></a>`state` | [`MergeRequestState`](#mergerequeststate) | Merge request state. If provided, all resolved merge requests will have this state. |
@ -36843,6 +36870,7 @@ four standard [pagination arguments](#pagination-arguments):
| <a id="userauthoredmergerequestsreviewstate"></a>`reviewState` **{warning-solid}** | [`MergeRequestReviewState`](#mergerequestreviewstate) | **Introduced** in GitLab 17.0. **Status**: Experiment. Reviewer state of the merge request. | | <a id="userauthoredmergerequestsreviewstate"></a>`reviewState` **{warning-solid}** | [`MergeRequestReviewState`](#mergerequestreviewstate) | **Introduced** in GitLab 17.0. **Status**: Experiment. Reviewer state of the merge request. |
| <a id="userauthoredmergerequestsreviewstates"></a>`reviewStates` **{warning-solid}** | [`[MergeRequestReviewState!]`](#mergerequestreviewstate) | **Introduced** in GitLab 17.0. **Status**: Experiment. Reviewer states of the merge request. | | <a id="userauthoredmergerequestsreviewstates"></a>`reviewStates` **{warning-solid}** | [`[MergeRequestReviewState!]`](#mergerequestreviewstate) | **Introduced** in GitLab 17.0. **Status**: Experiment. Reviewer states of the merge request. |
| <a id="userauthoredmergerequestsreviewerusername"></a>`reviewerUsername` | [`String`](#string) | Username of the reviewer. | | <a id="userauthoredmergerequestsreviewerusername"></a>`reviewerUsername` | [`String`](#string) | Username of the reviewer. |
| <a id="userauthoredmergerequestsreviewerwildcardid"></a>`reviewerWildcardId` | [`ReviewerWildcardId`](#reviewerwildcardid) | Filter by reviewer presence. Incompatible with reviewerUsername. |
| <a id="userauthoredmergerequestssort"></a>`sort` | [`MergeRequestSort`](#mergerequestsort) | Sort merge requests by this criteria. | | <a id="userauthoredmergerequestssort"></a>`sort` | [`MergeRequestSort`](#mergerequestsort) | Sort merge requests by this criteria. |
| <a id="userauthoredmergerequestssourcebranches"></a>`sourceBranches` | [`[String!]`](#string) | Array of source branch names. All resolved merge requests will have one of these branches as their source. | | <a id="userauthoredmergerequestssourcebranches"></a>`sourceBranches` | [`[String!]`](#string) | Array of source branch names. All resolved merge requests will have one of these branches as their source. |
| <a id="userauthoredmergerequestsstate"></a>`state` | [`MergeRequestState`](#mergerequeststate) | Merge request state. If provided, all resolved merge requests will have this state. | | <a id="userauthoredmergerequestsstate"></a>`state` | [`MergeRequestState`](#mergerequeststate) | Merge request state. If provided, all resolved merge requests will have this state. |

View File

@ -303,6 +303,7 @@ To view group import history:
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/429109) in GitLab 16.6 [with a flag](../../feature_flags.md) named `bulk_import_details_page`. Enabled by default. > - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/429109) in GitLab 16.6 [with a flag](../../feature_flags.md) named `bulk_import_details_page`. Enabled by default.
> - Feature flag `bulk_import_details_page` removed in GitLab 16.8. > - Feature flag `bulk_import_details_page` removed in GitLab 16.8.
> - Details for partially completed and completed imports [added](https://gitlab.com/gitlab-org/gitlab/-/issues/437874) in GitLab 16.9. > - Details for partially completed and completed imports [added](https://gitlab.com/gitlab-org/gitlab/-/issues/437874) in GitLab 16.9.
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/443492) in GitLab 17.0, an **Imported** badge to indicate that designs, epics, issues, merge requests, notes (system notes and comments), snippets, and user profile activity were imported.
To review the results of an import: To review the results of an import:
@ -310,6 +311,8 @@ To review the results of an import:
1. To see the details of a failed import, select the **See failures** link on any import with a **Failed** or **Partially completed** status. 1. To see the details of a failed import, select the **See failures** link on any import with a **Failed** or **Partially completed** status.
1. If the import has a **Partially completed** or **Complete** status, to see which items were and were not imported, select **Details**. 1. If the import has a **Partially completed** or **Complete** status, to see which items were and were not imported, select **Details**.
You can also see that an item was imported when you see an **Imported** badge on some items in the GitLab UI.
## Cancel a running import ## Cancel a running import
To cancel a running import: To cancel a running import:

View File

@ -31,6 +31,8 @@ variables:
RUBY_VERSION: "3.1" RUBY_VERSION: "3.1"
default: default:
tags:
- gitlab-org
image: "ruby:${RUBY_VERSION}" image: "ruby:${RUBY_VERSION}"
cache: cache:
key: "$[[inputs.gem_name]]-${RUBY_VERSION}" key: "$[[inputs.gem_name]]-${RUBY_VERSION}"

View File

@ -695,7 +695,8 @@ module API
elsif supports_direct_download && file.class.direct_download_enabled? elsif supports_direct_download && file.class.direct_download_enabled?
return redirect(ObjectStorage::S3.signed_head_url(file)) if request.head? && file.fog_credentials[:provider] == 'AWS' return redirect(ObjectStorage::S3.signed_head_url(file)) if request.head? && file.fog_credentials[:provider] == 'AWS'
redirect(cdn_fronted_url(file)) file_url = ObjectStorage::CDN::FileUrl.new(file: file, ip_address: ip_address)
redirect(file_url.url)
else else
header(*Gitlab::Workhorse.send_url(file.url)) header(*Gitlab::Workhorse.send_url(file.url))
status :ok status :ok
@ -703,16 +704,6 @@ module API
end end
end end
def cdn_fronted_url(file)
if file.respond_to?(:cdn_enabled_url)
result = file.cdn_enabled_url(ip_address)
Gitlab::ApplicationContext.push(artifact_used_cdn: result.used_cdn)
result.url
else
file.url
end
end
def increment_counter(event_name) def increment_counter(event_name)
Gitlab::UsageDataCounters.count(event_name) Gitlab::UsageDataCounters.count(event_name)
rescue StandardError => error rescue StandardError => error

View File

@ -23115,9 +23115,6 @@ msgstr ""
msgid "Get started" msgid "Get started"
msgstr "" msgstr ""
msgid "Get started with GitLab"
msgstr ""
msgid "Get started with error tracking" msgid "Get started with error tracking"
msgstr "" msgstr ""
@ -30357,9 +30354,6 @@ msgstr ""
msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial." msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
msgstr "" msgstr ""
msgid "LearnGitlab|Ok, let's go"
msgstr ""
msgid "LearnGitlab|View administrator list" msgid "LearnGitlab|View administrator list"
msgstr "" msgstr ""
@ -42398,9 +42392,6 @@ msgstr ""
msgid "Read their documentation." msgid "Read their documentation."
msgstr "" msgstr ""
msgid "Ready to get started with GitLab? Follow these steps to set up your workspace, plan and commit changes, and deploy your project."
msgstr ""
msgid "Ready to merge by members who can write to the target branch." msgid "Ready to merge by members who can write to the target branch."
msgstr "" msgstr ""

View File

@ -31,6 +31,7 @@ module QA
personal_access_token: ENV['GITLAB_QA_ACCESS_TOKEN']) personal_access_token: ENV['GITLAB_QA_ACCESS_TOKEN'])
@delete_before = Date.parse(ENV['DELETE_BEFORE'] || (Date.today - 1).to_s) @delete_before = Date.parse(ENV['DELETE_BEFORE'] || (Date.today - 1).to_s)
@dry_run = dry_run @dry_run = dry_run
@permanently_delete = !!(ENV['PERMANENTLY_DELETE'].to_s =~ /true|1|y/i)
@type = nil @type = nil
end end
@ -47,7 +48,7 @@ module QA
response = delete(resource_request(resource, permanently_remove: true, full_path: path)) response = delete(resource_request(resource, permanently_remove: true, full_path: path))
wait_for_resource_deletion(resource, true) if success?(response&.code) wait_for_resource_deletion(resource, true) if success?(response&.code)
if success?(response&.code) && permanently_deleted?(resource) if permanently_deleted?(resource)
log_permanent_deletion(resource) log_permanent_deletion(resource)
else else
log_failure(resource, response) log_failure(resource, response)
@ -84,7 +85,9 @@ module QA
return log_failure(resource, response) unless mark_for_deletion_possible?(resource) return log_failure(resource, response) unless mark_for_deletion_possible?(resource)
ENV['PERMANENTLY_DELETE'] ? delete_permanently(resource) : log_marked_for_deletion(resource) @permanently_delete ? delete_permanently(resource) : log_marked_for_deletion(resource)
elsif response&.code == 404
log_permanent_deletion(resource)
else else
log_failure(resource, response) log_failure(resource, response)
end end
@ -183,7 +186,7 @@ module QA
# @return [Array<String, Hash>] results # @return [Array<String, Hash>] results
def log_failure(resource, response) def log_failure(resource, response)
path = resource_path(resource) path = resource_path(resource)
logger.error("\e[31mFAILED\e[0m to delete #{@type} #{path} with #{response.code}. Resource still exists.\n") logger.error("\e[31mFAILED\e[0m to delete #{@type} #{path} with #{response.code}.\n")
["failed_deletions", { path: path, response: response }] ["failed_deletions", { path: path, response: response }]
end end
@ -228,6 +231,8 @@ module QA
print_failed_deletion_attempts(failed_deletions) print_failed_deletion_attempts(failed_deletions)
logger.info('Done') logger.info('Done')
exit 1 unless failed_deletions.blank?
end end
# Check if a resource can be marked for deletion # Check if a resource can be marked for deletion
@ -301,7 +306,11 @@ module QA
wait_until(max_duration: 60, sleep_interval: 1, raise_on_failure: false) do wait_until(max_duration: 60, sleep_interval: 1, raise_on_failure: false) do
response = get(resource_request(resource)) response = get(resource_request(resource))
permanent ? response.code == 404 : response.code == 404 || marked_for_deletion?(parse_body(response)) if permanent
response&.code == 404
else
response&.code == 404 || (success?(response&.code) && marked_for_deletion?(parse_body(response)))
end
end end
end end
end end

View File

@ -33,6 +33,10 @@ RSpec.describe SendFileUpload, feature_category: :user_profile do
end end
def current_user; end def current_user; end
def request
ActionDispatch::Request.new({})
end
end end
end end

View File

@ -21,6 +21,7 @@ exports[`Design management design index page when loaded renders design index 1`
iid="1" iid="1"
image="test.jpg" image="test.jpg"
imagev432x230="test.jpg" imagev432x230="test.jpg"
imported="true"
islatestversion="true" islatestversion="true"
issidebaropen="true" issidebaropen="true"
issue="[object Object]" issue="[object Object]"

View File

@ -46,6 +46,7 @@ export const createGQLSnippet = () => ({
}, },
}, },
hidden: false, hidden: false,
imported: false,
}); });
export const createGQLSnippetsQueryResponse = (snippets) => ({ export const createGQLSnippetsQueryResponse = (snippets) => ({

View File

@ -22,6 +22,16 @@ RSpec.describe Resolvers::ProjectMergeRequestsResolver do
) )
end end
let_it_be(:merge_request2) do
create(
:merge_request,
:unique_branches,
source_project: project,
target_project: project,
author: other_user
)
end
context 'by assignee' do context 'by assignee' do
it 'filters merge requests by assignee username' do it 'filters merge requests by assignee username' do
result = resolve_mr(project, assignee_username: other_user.username) result = resolve_mr(project, assignee_username: other_user.username)
@ -40,7 +50,7 @@ RSpec.describe Resolvers::ProjectMergeRequestsResolver do
it 'filters merge requests by author username' do it 'filters merge requests by author username' do
result = resolve_mr(project, author_username: other_user.username) result = resolve_mr(project, author_username: other_user.username)
expect(result).to contain_exactly(merge_request) expect(result).to contain_exactly(merge_request, merge_request2)
end end
it 'does not find anything' do it 'does not find anything' do
@ -64,6 +74,20 @@ RSpec.describe Resolvers::ProjectMergeRequestsResolver do
end end
end end
context 'with reviewer wildcard param' do
it 'filters merge requests by NONE wildcard' do
result = resolve_mr(project, reviewer_wildcard_id: 'NONE')
expect(result).to contain_exactly(merge_request2)
end
it 'filters merge requests by ANY wildcard' do
result = resolve_mr(project, reviewer_wildcard_id: 'ANY')
expect(result).to contain_exactly(merge_request)
end
end
def resolve_mr(project, resolver: described_class, user: current_user, **args) def resolve_mr(project, resolver: described_class, user: current_user, **args)
resolve(resolver, obj: project, args: args, ctx: { current_user: user }) resolve(resolver, obj: project, args: args, ctx: { current_user: user })
end end

View File

@ -354,6 +354,7 @@ RSpec.describe GitlabSchema.types['Project'], feature_category: :groups_and_proj
:author_username, :author_username,
:assignee_username, :assignee_username,
:reviewer_username, :reviewer_username,
:reviewer_wildcard_id,
:review_state, :review_state,
:review_states, :review_states,
:milestone_title, :milestone_title,

View File

@ -252,6 +252,7 @@ RSpec.describe IssuablesHelper, feature_category: :team_planning do
canUpdate: true, canUpdate: true,
canDestroy: true, canDestroy: true,
issuableRef: "##{issue.iid}", issuableRef: "##{issue.iid}",
imported: issue.imported?,
markdownPreviewPath: "/#{@project.full_path}/preview_markdown?target_id=#{issue.iid}&target_type=Issue", markdownPreviewPath: "/#{@project.full_path}/preview_markdown?target_id=#{issue.iid}&target_type=Issue",
markdownDocsPath: '/help/user/markdown', markdownDocsPath: '/help/user/markdown',
lockVersion: issue.lock_version, lockVersion: issue.lock_version,

View File

@ -10,6 +10,7 @@ RSpec.describe MergeRequestsHelper, feature_category: :code_review_workflow do
include ProjectForksHelper include ProjectForksHelper
include IconsHelper include IconsHelper
include IssuablesHelper include IssuablesHelper
include MarkupHelper
let_it_be(:current_user) { create(:user) } let_it_be(:current_user) { create(:user) }
@ -218,6 +219,31 @@ RSpec.describe MergeRequestsHelper, feature_category: :code_review_workflow do
end end
end end
describe '#sticky_header_data' do
let_it_be(:project) { create(:project) }
let(:merge_request) do
create(:merge_request, source_project: project, target_project: project, imported_from: imported_from)
end
subject { sticky_header_data(project, merge_request) }
context 'when the merge request is not imported' do
let(:imported_from) { :none }
it 'returns data with imported set as false' do
expect(subject[:imported]).to eq('false')
end
end
context 'when the merge request is imported' do
let(:imported_from) { :gitlab_migration }
it 'returns data with imported set as true' do
expect(subject[:imported]).to eq('true')
end
end
end
describe '#tab_count_display' do describe '#tab_count_display' do
let(:merge_request) { create(:merge_request) } let(:merge_request) { create(:merge_request) }

View File

@ -1174,7 +1174,9 @@ RSpec.describe API::Helpers, feature_category: :shared do
it 'redirects to a CDN-fronted URL' do it 'redirects to a CDN-fronted URL' do
expect(helper).to receive(:redirect) expect(helper).to receive(:redirect)
expect(helper).to receive(:cdn_fronted_url).and_call_original expect_next_instance_of(ObjectStorage::CDN::FileUrl) do |instance|
expect(instance).to receive(:url).and_call_original
end
expect(Gitlab::ApplicationContext).to receive(:push).with(artifact: artifact.file.model).and_call_original expect(Gitlab::ApplicationContext).to receive(:push).with(artifact: artifact.file.model).and_call_original
expect(Gitlab::ApplicationContext).to receive(:push).with(artifact_used_cdn: false).and_call_original expect(Gitlab::ApplicationContext).to receive(:push).with(artifact_used_cdn: false).and_call_original
@ -1195,35 +1197,6 @@ RSpec.describe API::Helpers, feature_category: :shared do
end end
end end
describe '#cdn_frontend_url' do
before do
allow(helper).to receive(:env).and_return({})
stub_artifacts_object_storage(enabled: true)
end
context 'with a CI artifact' do
let(:artifact) { create(:ci_job_artifact, :zip, :remote_store) }
it 'retrieves a CDN-fronted URL' do
expect(artifact.file).to receive(:cdn_enabled_url).and_call_original
expect(Gitlab::ApplicationContext).to receive(:push).with(artifact_used_cdn: false).and_call_original
expect(helper.cdn_fronted_url(artifact.file)).to be_a(String)
end
end
context 'with a file upload' do
let(:url) { 'https://example.com/path/to/upload' }
it 'retrieves the file URL' do
file = double(url: url)
expect(Gitlab::ApplicationContext).not_to receive(:push)
expect(helper.cdn_fronted_url(file)).to eq(url)
end
end
end
describe '#order_by_similarity?' do describe '#order_by_similarity?' do
where(:params, :allow_unauthorized, :current_user_set, :expected) do where(:params, :allow_unauthorized, :current_user_set, :expected) do
{} | false | false | false {} | false | false | false

View File

@ -56,5 +56,21 @@ RSpec.describe Mutations::Integrations::Exclusions::Create, feature_category: :i
expect(existing_exclusion.inherit_from_id).to be_nil expect(existing_exclusion.inherit_from_id).to be_nil
end end
end end
context 'and the number of project ids exceeds the maximum' do
let(:stubbed_limit) { 1 }
let(:project_ids) { [project, project2].map { |p| p.to_global_id.to_s } }
before do
stub_const("#{described_class.name}::MAX_PROJECT_IDS", stubbed_limit)
end
it 'responds with an error' do
resolve_mutation
expect(graphql_errors.first['message']).to eq(
"Count of projectIds should be less than #{stubbed_limit}"
)
end
end
end end
end end

View File

@ -41,12 +41,14 @@ RSpec.describe Mutations::Integrations::Exclusions::Delete, feature_category: :i
end end
context 'and there are integrations' do context 'and there are integrations' do
let!(:instance_integration) { create(:beyond_identity_integration) }
let!(:existing_exclusion) do let!(:existing_exclusion) do
create(:beyond_identity_integration, project: project, active: false, inherit_from_id: nil, create(:beyond_identity_integration, project: project, active: false, inherit_from_id: nil,
instance: false) instance: false)
end end
context 'and the integration is active for the instance' do
let!(:instance_integration) { create(:beyond_identity_integration) }
it 'enables the integration for the specified project' do it 'enables the integration for the specified project' do
resolve_mutation resolve_mutation
@ -57,5 +59,11 @@ RSpec.describe Mutations::Integrations::Exclusions::Delete, feature_category: :i
expect(exclusion_response['project']['id']).to eq(project.to_global_id.to_s) expect(exclusion_response['project']['id']).to eq(project.to_global_id.to_s)
end end
end end
it 'deletes the integration' do
expect { resolve_mutation }.to change { Integration.count }.from(1).to(0)
expect(graphql_errors).to be_nil
end
end
end end
end end

View File

@ -149,26 +149,6 @@ RSpec.describe 'getting organization information', feature_category: :cell do
expect(groups.pluck('id')).to match_array(expected_groups) expect(groups.pluck('id')).to match_array(expected_groups)
end end
context 'when resolve_all_organization_groups feature flag is disabled' do
before do
stub_feature_flags(resolve_all_organization_groups: false)
end
it 'does not return ancestors of authorized groups' do
request_organization
expect(groups.pluck('id')).not_to include(parent_group_global_id)
end
it 'does not return all visible groups' do
request_organization
visible_groups = [parent_group, organization_group]
.map { |group| group.to_global_id.to_s }
expect(groups.pluck('id')).not_to include(*visible_groups)
end
end
context 'with `search` argument' do context 'with `search` argument' do
let(:search) { 'oth' } let(:search) { 'oth' }
let(:organization_fields) do let(:organization_fields) do

View File

@ -716,11 +716,14 @@ RSpec.describe API::Issues, feature_category: :team_planning do
end end
it 'returns 404 if issue id not found' do it 'returns 404 if issue id not found' do
get api("/projects/#{project.id}/issues/54321", user) get api("/projects/#{project.id}/issues/#{non_existing_record_id}", user)
expect(response).to have_gitlab_http_status(:not_found) expect(response).to have_gitlab_http_status(:not_found)
end end
it 'returns 404 if the issue ID is used' do it 'returns 404 if the issue ID is used' do
# Make sure other issues don't exist with a matching iid
Issue.where.not(id: issue.id).delete_all
get api("/projects/#{project.id}/issues/#{issue.id}", user) get api("/projects/#{project.id}/issues/#{issue.id}", user)
expect(response).to have_gitlab_http_status(:not_found) expect(response).to have_gitlab_http_status(:not_found)

View File

@ -24,6 +24,9 @@ RSpec.shared_examples 'issuable participants endpoint' do
end end
it 'returns a 404 when id is used instead of iid' do it 'returns a 404 when id is used instead of iid' do
# Make sure other entities don't exist with a matching iid
entity.class.where.not(id: entity.id).delete_all
get api("/projects/#{project.id}/#{area}/#{entity.id}/participants", user) get api("/projects/#{project.id}/#{area}/#{entity.id}/participants", user)
expect(response).to have_gitlab_http_status(:not_found) expect(response).to have_gitlab_http_status(:not_found)

View File

@ -0,0 +1,40 @@
# frozen_string_literal: true
require 'spec_helper'
RSpec.describe ObjectStorage::CDN::FileUrl, feature_category: :source_code_management do
subject(:file_url) do
described_class.new(
file: file,
ip_address: ip_address,
redirect_params: redirect_params)
end
let(:ip_address) { '127.0.0.1' }
let(:redirect_params) { {} }
describe '#url' do
before do
stub_artifacts_object_storage(enabled: true)
end
context 'with a CI artifact' do
let(:file) { create(:ci_job_artifact, :zip, :remote_store).file }
it 'retrieves a CDN-frontend URL' do
expect(::Gitlab::ApplicationContext).to receive(:push).with(artifact_used_cdn: false).and_call_original
expect(file_url.url).to be_a(String)
end
end
context 'with a file upload' do
let(:expected_url) { 'https://example.com/path/to/upload' }
let(:file) { instance_double(::GitlabUploader, url: expected_url) }
it 'retrieves the file URL' do
expect(::Gitlab::ApplicationContext).not_to receive(:push)
expect(file_url.url).to eq(expected_url)
end
end
end
end