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-rails', '~> 7.2', require: 'elasticsearch/rails/instrumentation' # 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-s3', '~> 1.149.1' # 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-partitions","version":"1.877.0","platform":"ruby","checksum":"9552ed7bbd3700ed1eeb0121c160ceaf64fa5dbaff5a1ff5fe6fd8481ecd9cfd"},
{"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-s3","version":"1.149.1","platform":"ruby","checksum":"664e608190d42b486dc79b5dc65e7c2240923902a9833063327a9d831226a46a"},
{"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-core (~> 3, >= 3.99.0)
aws-sigv4 (~> 1.1)
aws-sdk-core (3.194.1)
aws-sdk-core (3.194.2)
aws-eventstream (~> 1, >= 1.3.0)
aws-partitions (~> 1, >= 1.651.0)
aws-sigv4 (~> 1.8)
@ -1921,7 +1921,7 @@ DEPENDENCIES
attr_encrypted (~> 3.2.4)!
awesome_print
aws-sdk-cloudformation (~> 1)
aws-sdk-core (~> 3.194.1)
aws-sdk-core (~> 3.194.2)
aws-sdk-s3 (~> 1.149.1)
axe-core-rspec (~> 4.9.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>
<gl-link
: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"
>{{ pipeline.merge_request.source_branch }}</gl-link
><clipboard-button

View File

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

View File

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

View File

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

View File

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

View File

@ -30,17 +30,11 @@ module SendFileUpload
headers.store(*Gitlab::Workhorse.send_url(file_upload.url(**redirect_params)))
head :ok
else
redirect_to cdn_fronted_url(file_upload, redirect_params)
end
end
def cdn_fronted_url(file, redirect_params)
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)
file_url = ObjectStorage::CDN::FileUrl.new(
file: file_upload,
ip_address: request.remote_ip,
redirect_params: redirect_params)
redirect_to file_url.url
end
end

View File

@ -6,6 +6,7 @@ module Mutations
class Create < BaseMutation
graphql_name 'IntegrationExclusionCreate'
include ResolvesIds
MAX_PROJECT_IDS = 100
field :exclusions, [::Types::Integrations::ExclusionType],
null: true,
@ -19,14 +20,18 @@ module Mutations
argument :project_ids,
[::Types::GlobalIDType[::Project]],
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
def resolve(integration_name:, project_ids:)
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(
current_user: current_user,

View File

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

View File

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

View File

@ -16,6 +16,8 @@ module ResolvesMergeRequests
args[:include_subgroups] = true
end
rewrite_param_name(args, :reviewer_wildcard_id, :reviewer_id)
mr_finder = MergeRequestsFinder.new(current_user, args.compact)
finder = Gitlab::Graphql::Loaders::IssuableLoader.new(mr_parent, mr_finder)
@ -42,6 +44,10 @@ module ResolvesMergeRequests
[:target_project, :author]
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
{
assignees: [:assignees],

View File

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

View File

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

View File

@ -14,17 +14,8 @@ module Resolvers
alias_method :organization, :object
def resolve_groups(**args)
::Organizations::GroupsFinder.new(context[:current_user], finder_params(args)).execute
end
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)
finder_params = args.merge(organization: organization)
::Organizations::GroupsFinder.new(context[:current_user], finder_params).execute
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),
canDestroy: can?(current_user, :"destroy_#{issuable.to_ability_name}", issuable),
issuableRef: issuable.to_reference,
imported: issuable.imported?,
markdownPreviewPath: preview_markdown_path(parent, target_type: issuable.model_name, target_id: issuable.iid),
markdownDocsPath: help_page_path('user/markdown'),
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 }
end
def sticky_header_data
def sticky_header_data(project, merge_request)
data = {
iid: @merge_request.iid,
projectPath: @project.full_path,
sourceProjectPath: @merge_request.source_project_path,
title: markdown_field(@merge_request, :title),
iid: merge_request.iid,
projectPath: project.full_path,
sourceProjectPath: merge_request.source_project_path,
title: markdown_field(merge_request, :title),
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: [
['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],
['diffs', _('Changes'), diffs_project_merge_request_path(@project, @merge_request), @diffs_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],
['diffs', _('Changes'), diffs_project_merge_request_path(project, merge_request), @diffs_count]
]
}
if @project.builds_enabled?
data[:tabs].insert(2, ['pipelines', _('Pipelines'), pipelines_project_merge_request_path(@project, @merge_request), @number_of_pipelines])
if project.builds_enabled?
data[:tabs].insert(2, ['pipelines', _('Pipelines'), pipelines_project_merge_request_path(project, merge_request), @number_of_pipelines])
end
data

View File

@ -19,7 +19,10 @@ module Integrations
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
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
.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

View File

@ -5,8 +5,8 @@
.event-item-timestamp.gl-font-sm
#{time_ago_with_tooltip(event.created_at)}
- if event.imported?
%span
= render "import/shared/imported_text", importable: _('event')
%span &middot;
= render "import/shared/imported_badge", text_only: true, importable: _('event')
- if event.wiki_page?
= 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,34 +1,40 @@
- @no_container = true
- container_class = fluid_layout ? '' : 'container-limited'
- add_to_breadcrumbs s_("CompareRevisions|Compare revisions"), project_compare_index_path(@project)
- page_title "#{params[:from]} to #{params[:to]}"
- has_diff = @commits.present? || @diffs.present? && @diffs.diff_files.present?
-# Only show commit list in the first page
- hide_commit_list = params[:page].present? && params[:page] != '1'
.gl-border-b-0.gl-mb-0.gl-pt-4
.js-signature-container{ data: { 'signatures-path' => signatures_namespace_project_compare_index_path } }
#js-compare-selector{ data: project_compare_selector_data(@project, @merge_request, params) }
.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-compare-selector{ data: project_compare_selector_data(@project, @merge_request, params) }
- if has_diff
= render "projects/commits/commit_list" unless hide_commit_list
= render "projects/diffs/diffs",
diffs: @diffs,
environment: @environment,
diff_page_context: "is-compare",
page: pagination_params[:page],
paginate_diffs: true,
paginate_diffs_per_page: Projects::CompareController::COMMIT_DIFFS_PER_PAGE
.container-fluid{ class: [container_class] }
= render "projects/commits/commit_list" unless hide_commit_list
.container-fluid
= render "projects/diffs/diffs",
diffs: @diffs,
environment: @environment,
diff_page_context: "is-compare",
page: pagination_params[:page],
paginate_diffs: true,
paginate_diffs_per_page: Projects::CompareController::COMMIT_DIFFS_PER_PAGE
- else
= render Pajamas::CardComponent.new(card_options: { class: "gl-bg-gray-10" }) do |c|
- c.with_body do
= render Pajamas::EmptyStateComponent.new(svg_path: 'illustrations/empty-state/empty-commit-md.svg',
title: s_("CompareRevisions|There isn't anything to compare")) do |c|
.container-fluid
= render Pajamas::CardComponent.new(card_options: { class: "gl-bg-gray-10" }) do |c|
- c.with_body do
= render Pajamas::EmptyStateComponent.new(svg_path: 'illustrations/empty-state/empty-commit-md.svg',
title: s_("CompareRevisions|There isn't anything to compare")) do |c|
- c.with_description do
- if params[:to] == params[:from]
- source_branch = capture do
%span.ref-name= params[:from]
- target_branch = capture do
%span.ref-name= params[:to]
= (s_("CompareRevisions|%{source_branch} and %{target_branch} are the same.") % { source_branch: source_branch, target_branch: target_branch }).html_safe
- else
= _("To get a valid comparison, select two different branches.")
- c.with_description do
- if params[:to] == params[:from]
- source_branch = capture do
%span.ref-name= params[:from]
- target_branch = capture do
%span.ref-name= params[:to]
= (s_("CompareRevisions|%{source_branch} and %{target_branch} are the same.") % { source_branch: source_branch, target_branch: target_branch }).html_safe
- else
= _("To get a valid comparison, select two different branches.")

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}" }
.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)

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 } }
= 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 } }
= render "projects/merge_requests/mr_box"
.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
&middot;
%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?
.note-actions
- 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
# 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
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. 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="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
@ -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="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
@ -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="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="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="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. |
@ -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="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="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="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. |
@ -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="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="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="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. |
@ -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="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="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="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. |
@ -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="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="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="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. |
@ -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="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="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="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. |
@ -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="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="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="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. |
@ -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="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="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="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. |
@ -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="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="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="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. |
@ -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="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="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="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. |
@ -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="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="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="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. |
@ -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="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="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="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. |
@ -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="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="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="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. |
@ -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="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="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="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. |
@ -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="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="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="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. |
@ -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="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="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="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. |
@ -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="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="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="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. |
@ -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="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`
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="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="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="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. |
@ -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="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="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="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. |

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.
> - 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.
> - [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:
@ -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. 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
To cancel a running import:

View File

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

View File

@ -695,7 +695,8 @@ module API
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'
redirect(cdn_fronted_url(file))
file_url = ObjectStorage::CDN::FileUrl.new(file: file, ip_address: ip_address)
redirect(file_url.url)
else
header(*Gitlab::Workhorse.send_url(file.url))
status :ok
@ -703,16 +704,6 @@ module API
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)
Gitlab::UsageDataCounters.count(event_name)
rescue StandardError => error

View File

@ -23115,9 +23115,6 @@ msgstr ""
msgid "Get started"
msgstr ""
msgid "Get started with GitLab"
msgstr ""
msgid "Get started with error tracking"
msgstr ""
@ -30357,9 +30354,6 @@ msgstr ""
msgid "LearnGitlab|Contact your administrator to start a free Ultimate trial."
msgstr ""
msgid "LearnGitlab|Ok, let's go"
msgstr ""
msgid "LearnGitlab|View administrator list"
msgstr ""
@ -42398,9 +42392,6 @@ msgstr ""
msgid "Read their documentation."
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."
msgstr ""

View File

@ -31,6 +31,7 @@ module QA
personal_access_token: ENV['GITLAB_QA_ACCESS_TOKEN'])
@delete_before = Date.parse(ENV['DELETE_BEFORE'] || (Date.today - 1).to_s)
@dry_run = dry_run
@permanently_delete = !!(ENV['PERMANENTLY_DELETE'].to_s =~ /true|1|y/i)
@type = nil
end
@ -47,7 +48,7 @@ module QA
response = delete(resource_request(resource, permanently_remove: true, full_path: path))
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)
else
log_failure(resource, response)
@ -84,7 +85,9 @@ module QA
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
log_failure(resource, response)
end
@ -183,7 +186,7 @@ module QA
# @return [Array<String, Hash>] results
def log_failure(resource, response)
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 }]
end
@ -228,6 +231,8 @@ module QA
print_failed_deletion_attempts(failed_deletions)
logger.info('Done')
exit 1 unless failed_deletions.blank?
end
# 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
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

View File

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

View File

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

View File

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

View File

@ -22,6 +22,16 @@ RSpec.describe Resolvers::ProjectMergeRequestsResolver do
)
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
it 'filters merge requests by assignee username' do
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
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
it 'does not find anything' do
@ -64,6 +74,20 @@ RSpec.describe Resolvers::ProjectMergeRequestsResolver do
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)
resolve(resolver, obj: project, args: args, ctx: { current_user: user })
end

View File

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

View File

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

View File

@ -10,6 +10,7 @@ RSpec.describe MergeRequestsHelper, feature_category: :code_review_workflow do
include ProjectForksHelper
include IconsHelper
include IssuablesHelper
include MarkupHelper
let_it_be(:current_user) { create(:user) }
@ -218,6 +219,31 @@ RSpec.describe MergeRequestsHelper, feature_category: :code_review_workflow do
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
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
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_used_cdn: false).and_call_original
@ -1195,35 +1197,6 @@ RSpec.describe API::Helpers, feature_category: :shared do
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
where(:params, :allow_unauthorized, :current_user_set, :expected) do
{} | 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
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

View File

@ -41,20 +41,28 @@ RSpec.describe Mutations::Integrations::Exclusions::Delete, feature_category: :i
end
context 'and there are integrations' do
let!(:instance_integration) { create(:beyond_identity_integration) }
let!(:existing_exclusion) do
create(:beyond_identity_integration, project: project, active: false, inherit_from_id: nil,
instance: false)
end
it 'enables the integration for the specified project' do
resolve_mutation
context 'and the integration is active for the instance' do
let!(:instance_integration) { create(:beyond_identity_integration) }
existing_exclusion.reload
expect(existing_exclusion).to be_activated
expect(existing_exclusion.inherit_from_id).to eq(instance_integration.id)
exclusion_response = graphql_data['integrationExclusionDelete']['exclusions'][0]
expect(exclusion_response['project']['id']).to eq(project.to_global_id.to_s)
it 'enables the integration for the specified project' do
resolve_mutation
existing_exclusion.reload
expect(existing_exclusion).to be_activated
expect(existing_exclusion.inherit_from_id).to eq(instance_integration.id)
exclusion_response = graphql_data['integrationExclusionDelete']['exclusions'][0]
expect(exclusion_response['project']['id']).to eq(project.to_global_id.to_s)
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

View File

@ -149,26 +149,6 @@ RSpec.describe 'getting organization information', feature_category: :cell do
expect(groups.pluck('id')).to match_array(expected_groups)
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
let(:search) { 'oth' }
let(:organization_fields) do

View File

@ -716,11 +716,14 @@ RSpec.describe API::Issues, feature_category: :team_planning do
end
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)
end
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)
expect(response).to have_gitlab_http_status(:not_found)

View File

@ -24,6 +24,9 @@ RSpec.shared_examples 'issuable participants endpoint' do
end
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)
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