Add latest changes from gitlab-org/gitlab@master

This commit is contained in:
GitLab Bot 2025-07-17 12:08:09 +00:00
parent b49ea2b72f
commit 9fe0324bb2
150 changed files with 1402 additions and 1337 deletions

View File

@ -247,7 +247,6 @@ variables:
RSPEC_MATCHING_JS_FILES_PATH: rspec/js_matching_files.txt RSPEC_MATCHING_JS_FILES_PATH: rspec/js_matching_files.txt
RSPEC_MATCHING_TESTS_EE_PATH: rspec/matching_tests-ee.txt RSPEC_MATCHING_TESTS_EE_PATH: rspec/matching_tests-ee.txt
RSPEC_MATCHING_TESTS_FOSS_PATH: rspec/matching_tests-foss.txt RSPEC_MATCHING_TESTS_FOSS_PATH: rspec/matching_tests-foss.txt
RSPEC_MATCHING_TEST_FILES_PATH: rspec/matching_test_files.txt
RSPEC_PACKED_TESTS_MAPPING_PATH: crystalball/packed-mapping.json RSPEC_PACKED_TESTS_MAPPING_PATH: crystalball/packed-mapping.json
RSPEC_PACKED_TESTS_MAPPING_ALT_PATH: crystalball/packed-mapping-alt.json RSPEC_PACKED_TESTS_MAPPING_ALT_PATH: crystalball/packed-mapping-alt.json
RSPEC_PREDICTIVE_PIPELINE_TEMPLATE_YML: .gitlab/ci/rails/rspec-predictive.gitlab-ci.yml.erb RSPEC_PREDICTIVE_PIPELINE_TEMPLATE_YML: .gitlab/ci/rails/rspec-predictive.gitlab-ci.yml.erb

View File

@ -132,35 +132,27 @@ detect-tests:
needs: [] needs: []
stage: prepare stage: prepare
before_script: before_script:
- source ./scripts/utils.sh
- source ./scripts/rspec_helpers.sh
# Use alternative coverage based mappings for tier-2 pipeline # Use alternative coverage based mappings for tier-2 pipeline
- | - |
if echo "$CI_MERGE_REQUEST_LABELS" | grep -q "pipeline::tier-2"; then if echo "$CI_MERGE_REQUEST_LABELS" | grep -q "pipeline::tier-2"; then
echo "Using alternative coverage based mappings"
MAPPING_TYPE=coverage MAPPING_TYPE=coverage
else else
echo "Using standard described_class based mappings"
MAPPING_TYPE=described_class MAPPING_TYPE=described_class
fi fi
script: script:
- | - |
# $FIND_CHANGES_MERGE_REQUEST_IID is defined in as-if-foss.gitlab-ci.yml # $FIND_CHANGES_MERGE_REQUEST_IID is defined in as-if-foss.gitlab-ci.yml
if [ -n "$CI_MERGE_REQUEST_IID" ] || [ -n "$FIND_CHANGES_MERGE_REQUEST_IID" ]; then if [ -n "$CI_MERGE_REQUEST_IID" ] || [ -n "$FIND_CHANGES_MERGE_REQUEST_IID" ]; then
mkdir -p $(dirname "$RSPEC_CHANGED_FILES_PATH") tooling/bin/predictive_tests \
--ci \
tooling/bin/predictive_tests --ci --select-tests --with-crystalball-mappings --mapping-type $MAPPING_TYPE --with-crystalball-mappings \
--mapping-type $MAPPING_TYPE \
filter_rspec_matched_foss_tests ${RSPEC_MATCHING_TEST_FILES_PATH} ${RSPEC_MATCHING_TESTS_FOSS_PATH}; --with-frontend-fixture-mappings \
filter_rspec_matched_ee_tests ${RSPEC_MATCHING_TEST_FILES_PATH} ${RSPEC_MATCHING_TESTS_EE_PATH}; --frontend-fixtures-mapping-path $FRONTEND_FIXTURES_MAPPING_PATH \
--matching-foss-rspec-test-files-path $RSPEC_MATCHING_TESTS_FOSS_PATH \
echoinfo 'Related FOSS RSpec tests:' --matching-ee-rspec-test-files-path $RSPEC_MATCHING_TESTS_EE_PATH \
echoinfo "$(tr ' ' '\n' < $RSPEC_MATCHING_TESTS_FOSS_PATH)" --matching-jest-test-files-path $RSPEC_MATCHING_JS_FILES_PATH \
echo "" --changed-files-path $RSPEC_CHANGED_FILES_PATH
echoinfo 'Related EE RSpec tests:'
echoinfo "$(tr ' ' '\n' < $RSPEC_MATCHING_TESTS_EE_PATH)"
echo ""
fi fi
artifacts: artifacts:
expire_in: 7d expire_in: 7d
@ -170,7 +162,6 @@ detect-tests:
- ${RSPEC_MATCHING_JS_FILES_PATH} - ${RSPEC_MATCHING_JS_FILES_PATH}
- ${RSPEC_MATCHING_TESTS_EE_PATH} - ${RSPEC_MATCHING_TESTS_EE_PATH}
- ${RSPEC_MATCHING_TESTS_FOSS_PATH} - ${RSPEC_MATCHING_TESTS_FOSS_PATH}
- ${RSPEC_MATCHING_TEST_FILES_PATH}
detect-previous-failed-tests: detect-previous-failed-tests:
extends: extends:

View File

@ -82,35 +82,16 @@ export-predictive-test-metrics:
dependencies: [] dependencies: []
variables: variables:
GLCI_PREDICTIVE_TEST_METRICS_OUTPUT_DIR: "tmp/predictive_tests" GLCI_PREDICTIVE_TEST_METRICS_OUTPUT_DIR: "tmp/predictive_tests"
GLCI_ALL_FAILED_RSPEC_TESTS_FILE: "${GLCI_PREDICTIVE_TEST_METRICS_OUTPUT_DIR}/rspec_all_failed_tests.txt"
before_script: before_script:
- source ./scripts/utils.sh - source ./scripts/utils.sh
- source ./scripts/rspec_helpers.sh - source ./scripts/rspec_helpers.sh
- retrieve_failed_tests "${GLCI_PREDICTIVE_TEST_METRICS_OUTPUT_DIR}" "oneline" "latest" - retrieve_failed_tests "${GLCI_PREDICTIVE_TEST_METRICS_OUTPUT_DIR}" "oneline" "latest"
script: script:
- tooling/bin/predictive_tests --export-predictive-backend-metrics - |
tooling/bin/predictive_test_metrics \
--export-backend-metrics \
--failed-backend-tests-file "${GLCI_PREDICTIVE_TEST_METRICS_OUTPUT_DIR}/rspec_all_failed_tests.txt"
artifacts: artifacts:
expire_in: 7d expire_in: 7d
paths: paths:
- $GLCI_PREDICTIVE_TEST_METRICS_OUTPUT_DIR - $GLCI_PREDICTIVE_TEST_METRICS_OUTPUT_DIR
export-predictive-test-metrics-frontend:
extends:
- export-predictive-test-metrics
- .yarn-cache
- .with-ci-node-image
dependencies:
- detect-tests
- graphql-schema-dump
variables:
GLCI_JEST_FAILED_TESTS_FILE: "${GLCI_PREDICTIVE_TEST_METRICS_OUTPUT_DIR}/jest_failed_tests.txt"
before_script:
- !reference [export-predictive-test-metrics, before_script]
- yarn_install_script
script:
- tooling/bin/predictive_tests --export-predictive-frontend-metrics
artifacts:
expire_in: 7d
paths:
- $GLCI_PREDICTIVE_TEST_METRICS_OUTPUT_DIR
- $JEST_MATCHING_TEST_FILES_PATH

View File

@ -45,6 +45,8 @@ instructions:
fileFilters: fileFilters:
- "spec/**/*_spec.rb" - "spec/**/*_spec.rb"
- "ee/spec/**/*_spec.rb" - "ee/spec/**/*_spec.rb"
- "!spec/factories/**/*"
- "!spec/support/**/*"
instructions: | instructions: |
1. Test both happy paths and edge cases 1. Test both happy paths and edge cases
2. Include error scenarios 2. Include error scenarios

View File

@ -164,7 +164,7 @@ gem 'grape-path-helpers', '~> 2.0.1', feature_category: :api
gem 'rack-cors', '~> 2.0.1', require: 'rack/cors', feature_category: :shared gem 'rack-cors', '~> 2.0.1', require: 'rack/cors', feature_category: :shared
# GraphQL API # GraphQL API
gem 'graphql', '2.4.13', feature_category: :api gem 'graphql', '2.5.11', feature_category: :api
gem 'graphql-docs', '~> 5.0.0', group: [:development, :test], feature_category: :api gem 'graphql-docs', '~> 5.0.0', group: [:development, :test], feature_category: :api
gem 'apollo_upload_server', '~> 2.1.6', feature_category: :api gem 'apollo_upload_server', '~> 2.1.6', feature_category: :api

View File

@ -292,7 +292,7 @@
{"name":"grape-swagger-entity","version":"0.5.5","platform":"ruby","checksum":"a2a0eb28964b1a56775a3571358a9f0a300b703dbaee1ee535adb2a7bed7ece6"}, {"name":"grape-swagger-entity","version":"0.5.5","platform":"ruby","checksum":"a2a0eb28964b1a56775a3571358a9f0a300b703dbaee1ee535adb2a7bed7ece6"},
{"name":"grape_logging","version":"1.8.4","platform":"ruby","checksum":"efcc3e322dbd5d620a68f078733b7db043cf12680144cd03c982f14115c792d1"}, {"name":"grape_logging","version":"1.8.4","platform":"ruby","checksum":"efcc3e322dbd5d620a68f078733b7db043cf12680144cd03c982f14115c792d1"},
{"name":"graphlyte","version":"1.0.0","platform":"ruby","checksum":"b5af4ab67dde6e961f00ea1c18f159f73b52ed11395bb4ece297fe628fa1804d"}, {"name":"graphlyte","version":"1.0.0","platform":"ruby","checksum":"b5af4ab67dde6e961f00ea1c18f159f73b52ed11395bb4ece297fe628fa1804d"},
{"name":"graphql","version":"2.4.13","platform":"ruby","checksum":"fb1db6e9e24c93c995f8083d66ec65ea70991aa2b68da1b15a360b418af5aa9d"}, {"name":"graphql","version":"2.5.11","platform":"ruby","checksum":"1169ffc6e215fd4d60056455b672c40a0cafa0607262049c2cca343b0f6bdb5c"},
{"name":"graphql-docs","version":"5.0.0","platform":"ruby","checksum":"76baca6e5a803a4b6a9fbbbfdbf16742b7c4c546c8592b6e1a7aa4e79e562d04"}, {"name":"graphql-docs","version":"5.0.0","platform":"ruby","checksum":"76baca6e5a803a4b6a9fbbbfdbf16742b7c4c546c8592b6e1a7aa4e79e562d04"},
{"name":"grpc","version":"1.63.0","platform":"aarch64-linux","checksum":"dc75c5fd570b819470781d9512105dddfdd11d984f38b8e60bb946f92d1f79ee"}, {"name":"grpc","version":"1.63.0","platform":"aarch64-linux","checksum":"dc75c5fd570b819470781d9512105dddfdd11d984f38b8e60bb946f92d1f79ee"},
{"name":"grpc","version":"1.63.0","platform":"arm64-darwin","checksum":"91b93a354508a9d1772f095554f2e4c04358c2b32d7a670e3705b7fc4695c996"}, {"name":"grpc","version":"1.63.0","platform":"arm64-darwin","checksum":"91b93a354508a9d1772f095554f2e4c04358c2b32d7a670e3705b7fc4695c996"},

View File

@ -948,7 +948,7 @@ GEM
grape grape
rack rack
graphlyte (1.0.0) graphlyte (1.0.0)
graphql (2.4.13) graphql (2.5.11)
base64 base64
fiber-storage fiber-storage
logger logger
@ -2205,7 +2205,7 @@ DEPENDENCIES
grape-swagger-entity (~> 0.5.5) grape-swagger-entity (~> 0.5.5)
grape_logging (~> 1.8, >= 1.8.4) grape_logging (~> 1.8, >= 1.8.4)
graphlyte (~> 1.0.0) graphlyte (~> 1.0.0)
graphql (= 2.4.13) graphql (= 2.5.11)
graphql-docs (~> 5.0.0) graphql-docs (~> 5.0.0)
grpc (= 1.63.0) grpc (= 1.63.0)
gssapi (~> 1.3.1) gssapi (~> 1.3.1)

View File

@ -292,7 +292,7 @@
{"name":"grape-swagger-entity","version":"0.5.5","platform":"ruby","checksum":"a2a0eb28964b1a56775a3571358a9f0a300b703dbaee1ee535adb2a7bed7ece6"}, {"name":"grape-swagger-entity","version":"0.5.5","platform":"ruby","checksum":"a2a0eb28964b1a56775a3571358a9f0a300b703dbaee1ee535adb2a7bed7ece6"},
{"name":"grape_logging","version":"1.8.4","platform":"ruby","checksum":"efcc3e322dbd5d620a68f078733b7db043cf12680144cd03c982f14115c792d1"}, {"name":"grape_logging","version":"1.8.4","platform":"ruby","checksum":"efcc3e322dbd5d620a68f078733b7db043cf12680144cd03c982f14115c792d1"},
{"name":"graphlyte","version":"1.0.0","platform":"ruby","checksum":"b5af4ab67dde6e961f00ea1c18f159f73b52ed11395bb4ece297fe628fa1804d"}, {"name":"graphlyte","version":"1.0.0","platform":"ruby","checksum":"b5af4ab67dde6e961f00ea1c18f159f73b52ed11395bb4ece297fe628fa1804d"},
{"name":"graphql","version":"2.4.13","platform":"ruby","checksum":"fb1db6e9e24c93c995f8083d66ec65ea70991aa2b68da1b15a360b418af5aa9d"}, {"name":"graphql","version":"2.5.11","platform":"ruby","checksum":"1169ffc6e215fd4d60056455b672c40a0cafa0607262049c2cca343b0f6bdb5c"},
{"name":"graphql-docs","version":"5.0.0","platform":"ruby","checksum":"76baca6e5a803a4b6a9fbbbfdbf16742b7c4c546c8592b6e1a7aa4e79e562d04"}, {"name":"graphql-docs","version":"5.0.0","platform":"ruby","checksum":"76baca6e5a803a4b6a9fbbbfdbf16742b7c4c546c8592b6e1a7aa4e79e562d04"},
{"name":"grpc","version":"1.63.0","platform":"aarch64-linux","checksum":"dc75c5fd570b819470781d9512105dddfdd11d984f38b8e60bb946f92d1f79ee"}, {"name":"grpc","version":"1.63.0","platform":"aarch64-linux","checksum":"dc75c5fd570b819470781d9512105dddfdd11d984f38b8e60bb946f92d1f79ee"},
{"name":"grpc","version":"1.63.0","platform":"arm64-darwin","checksum":"91b93a354508a9d1772f095554f2e4c04358c2b32d7a670e3705b7fc4695c996"}, {"name":"grpc","version":"1.63.0","platform":"arm64-darwin","checksum":"91b93a354508a9d1772f095554f2e4c04358c2b32d7a670e3705b7fc4695c996"},

View File

@ -942,7 +942,7 @@ GEM
grape grape
rack rack
graphlyte (1.0.0) graphlyte (1.0.0)
graphql (2.4.13) graphql (2.5.11)
base64 base64
fiber-storage fiber-storage
logger logger
@ -2200,7 +2200,7 @@ DEPENDENCIES
grape-swagger-entity (~> 0.5.5) grape-swagger-entity (~> 0.5.5)
grape_logging (~> 1.8, >= 1.8.4) grape_logging (~> 1.8, >= 1.8.4)
graphlyte (~> 1.0.0) graphlyte (~> 1.0.0)
graphql (= 2.4.13) graphql (= 2.5.11)
graphql-docs (~> 5.0.0) graphql-docs (~> 5.0.0)
grpc (= 1.63.0) grpc (= 1.63.0)
gssapi (~> 1.3.1) gssapi (~> 1.3.1)

View File

@ -9,7 +9,7 @@ import {
import GroupsList from '~/vue_shared/components/groups_list/groups_list.vue'; import GroupsList from '~/vue_shared/components/groups_list/groups_list.vue';
import { formatGraphQLGroups } from '~/vue_shared/components/groups_list/formatter'; import { formatGraphQLGroups } from '~/vue_shared/components/groups_list/formatter';
import ResourceListsEmptyState from '~/vue_shared/components/resource_lists/empty_state.vue'; import ResourceListsEmptyState from '~/vue_shared/components/resource_lists/empty_state.vue';
import adminGroupsQuery from 'ee_else_ce/admin/groups/index/graphql/queries/groups.query.graphql'; import adminGroupsQuery from './graphql/queries/groups.query.graphql';
const baseTab = { const baseTab = {
formatter: (groups) => formatter: (groups) =>

View File

@ -0,0 +1,7 @@
# id field is requested by ~/graphql_shared/fragments/group.fragment.graphql
# eslint-disable-next-line @graphql-eslint/require-selections
fragment AdminGroup on Group {
projectStatistics {
storageSize
}
}

View File

@ -1,5 +1,6 @@
#import "~/graphql_shared/fragments/group.fragment.graphql" #import "~/graphql_shared/fragments/group.fragment.graphql"
#import "~/graphql_shared/fragments/page_info.fragment.graphql" #import "~/graphql_shared/fragments/page_info.fragment.graphql"
#import "ee_else_ce/admin/groups/index/graphql/fragments/admin_group.fragment.graphql"
query adminGroupsQuery( query adminGroupsQuery(
$first: Int $first: Int
@ -22,9 +23,7 @@ query adminGroupsQuery(
) { ) {
nodes { nodes {
...Group ...Group
projectStatistics { ...AdminGroup
storageSize
}
} }
pageInfo { pageInfo {
...PageInfo ...PageInfo

View File

@ -190,7 +190,10 @@ export const TOGGLE_MARKDOWN_PREVIEW = {
// However, this particular shortcut has been in place since before the `mod` key was available. // However, this particular shortcut has been in place since before the `mod` key was available.
// We've chosen to leave this implemented as-is for the time being to avoid breaking people's workflows. // We've chosen to leave this implemented as-is for the time being to avoid breaking people's workflows.
// See discussion in https://gitlab.com/gitlab-org/gitlab/-/merge_requests/45308#note_527490548. // See discussion in https://gitlab.com/gitlab-org/gitlab/-/merge_requests/45308#note_527490548.
defaultKeys: ['ctrl+shift+p', 'command+shift+p'], // Update 2025-07-17: Adding `alt` version to fix an issue in Windows
// This new combination is compatible across Mac, Linux and Windows.
// See https://gitlab.com/gitlab-org/gitlab/-/issues/17600#note_2633177789
defaultKeys: ['ctrl+shift+p', 'command+shift+p', 'alt+shift+p'],
}; };
/** /**

View File

@ -1,12 +1,15 @@
import { DiffFile } from '~/rapid_diffs/diff_file'; import { DiffFile } from '~/rapid_diffs/web_components/diff_file';
import { VIEWER_ADAPTERS } from '~/rapid_diffs/adapters'; import { VIEWER_ADAPTERS } from '~/rapid_diffs/app/adapters';
customElements.define('diff-file', DiffFile); customElements.define('diff-file', DiffFile);
customElements.define( customElements.define(
'diff-file-mounted', 'diff-file-mounted',
class extends HTMLElement { class extends HTMLElement {
connectedCallback() { connectedCallback() {
this.parentElement.mount({ adapterConfig: VIEWER_ADAPTERS, observe: () => {} }); this.parentElement.mount({
adapterConfig: VIEWER_ADAPTERS,
observe: () => {},
});
} }
}, },
); );

View File

@ -1,7 +1,7 @@
<script> <script>
import { GlIcon, GlSkeletonLoader } from '@gitlab/ui'; import { GlIcon, GlSkeletonLoader } from '@gitlab/ui';
import { STATUS_CLOSED } from '~/issues/constants'; import { STATUS_CLOSED } from '~/issues/constants';
import { humanTimeframe, isInPast, localeDateFormat, newDate } from '~/lib/utils/datetime_utility'; import { humanTimeframe, isInPast, newDate } from '~/lib/utils/datetime_utility';
import { __ } from '~/locale'; import { __ } from '~/locale';
import { STATE_CLOSED, METADATA_KEYS } from '~/work_items/constants'; import { STATE_CLOSED, METADATA_KEYS } from '~/work_items/constants';
import { import {
@ -46,12 +46,10 @@ export default {
return this.issue.dueDate || findStartAndDueDateWidget(this.issue)?.dueDate; return this.issue.dueDate || findStartAndDueDateWidget(this.issue)?.dueDate;
}, },
datesText() { datesText() {
if (this.startDate) { if (this.startDate || this.dueDate) {
return humanTimeframe(newDate(this.startDate), newDate(this.dueDate)); return humanTimeframe(newDate(this.startDate), newDate(this.dueDate));
} }
if (this.dueDate) {
return localeDateFormat.asDate.format(newDate(this.dueDate));
}
return null; return null;
}, },
isClosed() { isClosed() {

View File

@ -176,7 +176,7 @@ export function initPolling() {
noteable_id: this.notesData.noteableId, noteable_id: this.notesData.noteableId,
}, },
{ {
connected() { connected: () => {
this.fetchUpdatedNotes(); this.fetchUpdatedNotes();
}, },
received(data) { received(data) {

View File

@ -1,10 +1,3 @@
import { initGroupsListWithFilteredSearch } from '~/groups/init_groups_list_with_filtered_search';
import { initYourWorkGroups } from '~/groups/your_work'; import { initYourWorkGroups } from '~/groups/your_work';
import { DASHBOARD_FILTERED_SEARCH_NAMESPACE } from '~/groups/constants';
import DashboardGroupsEmptyState from '~/groups/components/empty_states/dashboard_groups_empty_state.vue';
initGroupsListWithFilteredSearch({
filteredSearchNamespace: DASHBOARD_FILTERED_SEARCH_NAMESPACE,
EmptyState: DashboardGroupsEmptyState,
});
initYourWorkGroups(); initYourWorkGroups();

View File

@ -1,6 +1,6 @@
import initCommitActions from '~/projects/commit'; import initCommitActions from '~/projects/commit';
import { initCommitBoxInfo } from '~/projects/commit_box/info'; import { initCommitBoxInfo } from '~/projects/commit_box/info';
import { createRapidDiffsApp } from '~/rapid_diffs/app'; import { createRapidDiffsApp } from '~/rapid_diffs';
initCommitBoxInfo(); initCommitBoxInfo();
initCommitActions(); initCommitActions();

View File

@ -1,5 +1,5 @@
import initCompareSelector from '~/projects/compare'; import initCompareSelector from '~/projects/compare';
import { createRapidDiffsApp } from '~/rapid_diffs/app'; import { createRapidDiffsApp } from '~/rapid_diffs';
initCompareSelector(); initCompareSelector();

View File

@ -7,7 +7,7 @@ import initPipelines from '~/commit/pipelines/pipelines_bundle';
import MergeRequest from '~/merge_request'; import MergeRequest from '~/merge_request';
import CompareApp from '~/merge_requests/components/compare_app.vue'; import CompareApp from '~/merge_requests/components/compare_app.vue';
import { __ } from '~/locale'; import { __ } from '~/locale';
import { createRapidDiffsApp } from '~/rapid_diffs/app'; import { createRapidDiffsApp } from '~/rapid_diffs';
const mrNewCompareNode = document.querySelector('.js-merge-request-new-compare'); const mrNewCompareNode = document.querySelector('.js-merge-request-new-compare');
if (mrNewCompareNode) { if (mrNewCompareNode) {

View File

@ -1,4 +1,4 @@
import { initMrPage } from '~/pages/projects/merge_requests/page'; import { initMrPage } from '~/pages/projects/merge_requests/page';
import { createRapidDiffsApp } from '~/rapid_diffs/app'; import { createRapidDiffsApp } from '~/rapid_diffs';
initMrPage(createRapidDiffsApp); initMrPage(createRapidDiffsApp);

View File

@ -0,0 +1,6 @@
export const MOUNTED = 'MOUNTED';
export const CLICK = 'CLICK';
export const VISIBLE = 'VISIBLE';
export const INVISIBLE = 'INVISIBLE';
export const EXPAND_FILE = 'EXPAND_FILE';
export const COLLAPSE_FILE = 'COLLAPSE_FILE';

View File

@ -1,16 +0,0 @@
import { ExpandLinesAdapter } from '~/rapid_diffs/expand_lines/adapter';
import { OptionsMenuAdapter } from '~/rapid_diffs/options_menu/adapter';
import { ToggleFileAdapter } from '~/rapid_diffs/toggle_file/adapter';
import { DisableDiffSideAdapter } from '~/rapid_diffs/disable_diff_side/adapter';
import { ImageAdapter } from '~/rapid_diffs/image_viewer/adapter';
import { LoadFileAdapter } from '~/rapid_diffs/load_file/adapter';
import { LineLinkAdapter } from '~/rapid_diffs/line_link/adapter';
const HEADER_ADAPTERS = [OptionsMenuAdapter, ToggleFileAdapter];
export const VIEWER_ADAPTERS = {
text_inline: [...HEADER_ADAPTERS, ExpandLinesAdapter, LineLinkAdapter],
text_parallel: [...HEADER_ADAPTERS, ExpandLinesAdapter, DisableDiffSideAdapter, LineLinkAdapter],
image: [...HEADER_ADAPTERS, ImageAdapter],
no_preview: [...HEADER_ADAPTERS, LoadFileAdapter],
};

View File

@ -1,4 +1,4 @@
import { INVISIBLE, VISIBLE } from '~/rapid_diffs/events'; import { INVISIBLE, VISIBLE } from '~/rapid_diffs/adapter_events';
const opposingSides = { const opposingSides = {
old: 'new', old: 'new',
@ -14,7 +14,7 @@ function disableDiffsSideHandler(e) {
const getBody = (diffElement) => diffElement.querySelector('[data-file-body]'); const getBody = (diffElement) => diffElement.querySelector('[data-file-body]');
export const DisableDiffSideAdapter = { export const disableDiffSideAdapter = {
[VISIBLE]() { [VISIBLE]() {
this.sink.disableDiffsSideHandler = disableDiffsSideHandler.bind(this); this.sink.disableDiffsSideHandler = disableDiffsSideHandler.bind(this);
getBody(this.diffElement).addEventListener('mousedown', this.sink.disableDiffsSideHandler); getBody(this.diffElement).addEventListener('mousedown', this.sink.disableDiffsSideHandler);

View File

@ -1,5 +1,5 @@
import { getLines } from '~/rapid_diffs/expand_lines/get_lines'; import { getLines } from '~/rapid_diffs/adapters/expand_lines/get_lines';
import { DiffLineRow } from '~/rapid_diffs/expand_lines/diff_line_row'; import { DiffLineRow } from '~/rapid_diffs/adapters/expand_lines/diff_line_row';
import { createAlert } from '~/alert'; import { createAlert } from '~/alert';
import { s__ } from '~/locale'; import { s__ } from '~/locale';
@ -13,7 +13,7 @@ const getSurroundingLines = (hunkHeaderRow) => {
return [lineBefore, lineAfter].map((lineRow) => (lineRow ? new DiffLineRow(lineRow) : null)); return [lineBefore, lineAfter].map((lineRow) => (lineRow ? new DiffLineRow(lineRow) : null));
}; };
export const ExpandLinesAdapter = { export const expandLinesAdapter = {
clicks: { clicks: {
async expandLines(event, button) { async expandLines(event, button) {
const { expandDirection } = button.dataset; const { expandDirection } = button.dataset;

View File

@ -1,8 +1,8 @@
import Vue from 'vue'; import Vue from 'vue';
import ImageDiffViewer from '~/vue_shared/components/diff_viewer/viewers/image_diff_viewer.vue'; import ImageDiffViewer from '~/vue_shared/components/diff_viewer/viewers/image_diff_viewer.vue';
import { MOUNTED } from '../events'; import { MOUNTED } from '../adapter_events';
export const ImageAdapter = { export const imageAdapter = {
[MOUNTED]() { [MOUNTED]() {
const data = JSON.parse(this.diffElement.querySelector('[data-image-data]').dataset.imageData); const data = JSON.parse(this.diffElement.querySelector('[data-image-data]').dataset.imageData);
// eslint-disable-next-line no-new // eslint-disable-next-line no-new

View File

@ -1,4 +1,4 @@
import { INVISIBLE, VISIBLE } from '~/rapid_diffs/events'; import { INVISIBLE, VISIBLE } from '~/rapid_diffs/adapter_events';
import { NO_SCROLL_TO_HASH_CLASS } from '~/lib/utils/common_utils'; import { NO_SCROLL_TO_HASH_CLASS } from '~/lib/utils/common_utils';
function disableScrollToLink(e) { function disableScrollToLink(e) {
@ -24,7 +24,7 @@ function disableScrollToLink(e) {
const getBody = (diffElement) => diffElement.querySelector('[data-file-body]'); const getBody = (diffElement) => diffElement.querySelector('[data-file-body]');
export const LineLinkAdapter = { export const lineLinkAdapter = {
[VISIBLE]() { [VISIBLE]() {
this.sink.disableScrollToLink = disableScrollToLink.bind(this); this.sink.disableScrollToLink = disableScrollToLink.bind(this);
getBody(this.diffElement).addEventListener('click', this.sink.disableScrollToLink); getBody(this.diffElement).addEventListener('click', this.sink.disableScrollToLink);

View File

@ -10,7 +10,7 @@ function htmlToElement(html) {
return doc.body.firstChild; return doc.body.firstChild;
} }
export const LoadFileAdapter = { export const loadFileAdapter = {
clicks: { clicks: {
async showChanges(event, button) { async showChanges(event, button) {
const { parallelView, showWhitespace } = useDiffsView(pinia); const { parallelView, showWhitespace } = useDiffsView(pinia);

View File

@ -6,7 +6,7 @@ function getMenuItems(container) {
return JSON.parse(container.querySelector('script').textContent); return JSON.parse(container.querySelector('script').textContent);
} }
export const OptionsMenuAdapter = { export const optionsMenuAdapter = {
clicks: { clicks: {
toggleOptionsMenu(event, button) { toggleOptionsMenu(event, button) {
const menuContainer = this.diffElement.querySelector('[data-options-menu]'); const menuContainer = this.diffElement.querySelector('[data-options-menu]');

View File

@ -1,4 +1,4 @@
import { COLLAPSE_FILE, EXPAND_FILE, MOUNTED } from '~/rapid_diffs/events'; import { COLLAPSE_FILE, EXPAND_FILE, MOUNTED } from '~/rapid_diffs/adapter_events';
function getDetails(root) { function getDetails(root) {
return root.querySelector('[data-file-body]'); return root.querySelector('[data-file-body]');
@ -32,7 +32,7 @@ function stopTransition(element) {
}); });
} }
export const ToggleFileAdapter = { export const toggleFileAdapter = {
clicks: { clicks: {
toggleFile(event, button) { toggleFile(event, button) {
const collapsed = this.diffElement.dataset.collapsed === 'true'; const collapsed = this.diffElement.dataset.collapsed === 'true';

View File

@ -0,0 +1,16 @@
import { expandLinesAdapter } from '~/rapid_diffs/adapters/expand_lines';
import { optionsMenuAdapter } from '~/rapid_diffs/adapters/options_menu';
import { toggleFileAdapter } from '~/rapid_diffs/adapters/toggle_file';
import { disableDiffSideAdapter } from '~/rapid_diffs/adapters/disable_diff_side';
import { imageAdapter } from '~/rapid_diffs/adapters/image_viewer';
import { loadFileAdapter } from '~/rapid_diffs/adapters/load_file';
import { lineLinkAdapter } from '~/rapid_diffs/adapters/line_link';
const HEADER_ADAPTERS = [optionsMenuAdapter, toggleFileAdapter];
export const VIEWER_ADAPTERS = {
text_inline: [...HEADER_ADAPTERS, expandLinesAdapter, lineLinkAdapter],
text_parallel: [...HEADER_ADAPTERS, expandLinesAdapter, disableDiffSideAdapter, lineLinkAdapter],
image: [...HEADER_ADAPTERS, imageAdapter],
no_preview: [...HEADER_ADAPTERS, loadFileAdapter],
};

View File

@ -1,7 +1,7 @@
import Vue from 'vue'; import Vue from 'vue';
import axios from '~/lib/utils/axios_utils'; import axios from '~/lib/utils/axios_utils';
import { pinia } from '~/pinia/instance'; import { pinia } from '~/pinia/instance';
import { DiffFile } from '~/rapid_diffs/diff_file'; import { DiffFile } from '~/rapid_diffs/web_components/diff_file';
import FileBrowserToggle from '~/diffs/components/file_browser_toggle.vue'; import FileBrowserToggle from '~/diffs/components/file_browser_toggle.vue';
import { generateTreeList } from '~/diffs/utils/tree_worker_utils'; import { generateTreeList } from '~/diffs/utils/tree_worker_utils';
import { SET_TREE_DATA } from '~/diffs/store/mutation_types'; import { SET_TREE_DATA } from '~/diffs/store/mutation_types';

View File

@ -1,20 +1,20 @@
// eslint-disable-next-line max-classes-per-file
import { pinia } from '~/pinia/instance'; import { pinia } from '~/pinia/instance';
import { initViewSettings } from '~/rapid_diffs/app/view_settings'; import { initViewSettings } from '~/rapid_diffs/app/view_settings';
import { DiffFile } from '~/rapid_diffs/diff_file'; import { DiffFile } from '~/rapid_diffs/web_components/diff_file';
import { useDiffsList } from '~/rapid_diffs/stores/diffs_list'; import { useDiffsList } from '~/rapid_diffs/stores/diffs_list';
import { initFileBrowser } from '~/rapid_diffs/app/init_file_browser'; import { initFileBrowser } from '~/rapid_diffs/app/file_browser';
import { StreamingError } from '~/rapid_diffs/streaming_error'; import { StreamingError } from '~/rapid_diffs/web_components/streaming_error';
import { useDiffsView } from '~/rapid_diffs/stores/diffs_view'; import { useDiffsView } from '~/rapid_diffs/stores/diffs_view';
import { initHiddenFilesWarning } from '~/rapid_diffs/app/init_hidden_files_warning'; import { initHiddenFilesWarning } from '~/rapid_diffs/app/init_hidden_files_warning';
import { createAlert } from '~/alert'; import { createAlert } from '~/alert';
import { __ } from '~/locale'; import { __ } from '~/locale';
import { fixWebComponentsStreamingOnSafari } from '~/rapid_diffs/app/safari_fix'; import { fixWebComponentsStreamingOnSafari } from '~/rapid_diffs/app/quirks/safari_fix';
import { DIFF_FILE_MOUNTED } from '~/rapid_diffs/dom_events'; import { DIFF_FILE_MOUNTED } from '~/rapid_diffs/dom_events';
import { VIEWER_ADAPTERS } from '~/rapid_diffs/adapters'; import { VIEWER_ADAPTERS } from '~/rapid_diffs/app/adapters';
import { camelizeKeys } from '~/lib/utils/object_utils'; import { camelizeKeys } from '~/lib/utils/object_utils';
import { disableBrokenContentVisibility } from '~/rapid_diffs/app/content_visibility_fix'; import { disableBrokenContentVisibility } from '~/rapid_diffs/app/quirks/content_visibility_fix';
import { useApp } from '~/rapid_diffs/stores/app'; import { useApp } from '~/rapid_diffs/stores/app';
import { createDiffFileMounted } from '~/rapid_diffs/web_components/diff_file_mounted';
// This facade interface joins together all the bits and pieces of Rapid Diffs: DiffFile, Settings, File browser, etc. // This facade interface joins together all the bits and pieces of Rapid Diffs: DiffFile, Settings, File browser, etc.
// It's a unified entrypoint for Rapid Diffs and all external communications should happen through this interface. // It's a unified entrypoint for Rapid Diffs and all external communications should happen through this interface.
@ -25,9 +25,11 @@ export class RapidDiffsFacade {
adapterConfig = VIEWER_ADAPTERS; adapterConfig = VIEWER_ADAPTERS;
#DiffFileImplementation; #DiffFileImplementation;
#DiffFileMounted;
constructor({ DiffFileImplementation = DiffFile } = {}) { constructor({ DiffFileImplementation = DiffFile } = {}) {
this.#DiffFileImplementation = DiffFileImplementation; this.#DiffFileImplementation = DiffFileImplementation;
this.#DiffFileMounted = createDiffFileMounted(this);
this.root = document.querySelector('[data-rapid-diffs]'); this.root = document.querySelector('[data-rapid-diffs]');
} }
@ -105,15 +107,6 @@ export class RapidDiffsFacade {
); );
} }
get #DiffFileMounted() {
const appContext = this;
return class extends HTMLElement {
connectedCallback() {
this.parentElement.mount(appContext);
}
};
}
#initHeader() { #initHeader() {
useDiffsView(pinia).diffsStatsEndpoint = this.appData.diffsStatsEndpoint; useDiffsView(pinia).diffsStatsEndpoint = this.appData.diffsStatsEndpoint;
useDiffsView(pinia).streamUrl = this.appData.reloadStreamUrl; useDiffsView(pinia).streamUrl = this.appData.reloadStreamUrl;
@ -155,7 +148,3 @@ export class RapidDiffsFacade {
return this.appData.lazy; return this.appData.lazy;
} }
} }
export const createRapidDiffsApp = (options) => {
return new RapidDiffsFacade(options);
};

View File

@ -4,7 +4,7 @@ import { useDiffsView } from '~/rapid_diffs/stores/diffs_view';
import { pinia } from '~/pinia/instance'; import { pinia } from '~/pinia/instance';
import HiddenFilesWarning from '~/diffs/components/hidden_files_warning.vue'; import HiddenFilesWarning from '~/diffs/components/hidden_files_warning.vue';
export async function initHiddenFilesWarning(el) { export function initHiddenFilesWarning(el) {
// eslint-disable-next-line no-new // eslint-disable-next-line no-new
new Vue({ new Vue({
el, el,

View File

@ -1,5 +0,0 @@
import Vue from 'vue';
import { createPinia, PiniaVuePlugin } from 'pinia';
Vue.use(PiniaVuePlugin);
export const pinia = createPinia();

View File

@ -3,8 +3,8 @@ import { mapState, mapActions } from 'pinia';
import { parseBoolean } from '~/lib/utils/common_utils'; import { parseBoolean } from '~/lib/utils/common_utils';
import { useDiffsView } from '~/rapid_diffs/stores/diffs_view'; import { useDiffsView } from '~/rapid_diffs/stores/diffs_view';
import DiffAppControls from '~/diffs/components/diff_app_controls.vue'; import DiffAppControls from '~/diffs/components/diff_app_controls.vue';
import { DiffFile } from '~/rapid_diffs/diff_file'; import { DiffFile } from '~/rapid_diffs/web_components/diff_file';
import { COLLAPSE_FILE, EXPAND_FILE } from '~/rapid_diffs/events'; import { COLLAPSE_FILE, EXPAND_FILE } from '~/rapid_diffs/adapter_events';
import { useDiffsList } from '~/rapid_diffs/stores/diffs_list'; import { useDiffsList } from '~/rapid_diffs/stores/diffs_list';
const collapseAllFiles = () => { const collapseAllFiles = () => {

View File

@ -1,6 +0,0 @@
export const MOUNTED = 'mounted';
export const CLICK = 'click';
export const VISIBLE = 'visible';
export const INVISIBLE = 'invisible';
export const EXPAND_FILE = 'EXPAND_FILE';
export const COLLAPSE_FILE = 'COLLAPSE_FILE';

View File

@ -0,0 +1,5 @@
import { RapidDiffsFacade } from '~/rapid_diffs/app';
export const createRapidDiffsApp = (options) => {
return new RapidDiffsFacade(options);
};

View File

@ -2,7 +2,7 @@ import { defineStore } from 'pinia';
import { debounce } from 'lodash'; import { debounce } from 'lodash';
import { renderHtmlStreams } from '~/streaming/render_html_streams'; import { renderHtmlStreams } from '~/streaming/render_html_streams';
import { toPolyfillReadable } from '~/streaming/polyfills'; import { toPolyfillReadable } from '~/streaming/polyfills';
import { DiffFile } from '~/rapid_diffs/diff_file'; import { DiffFile } from '~/rapid_diffs/web_components/diff_file';
import { performanceMarkAndMeasure } from '~/performance/utils'; import { performanceMarkAndMeasure } from '~/performance/utils';
export const statuses = { export const statuses = {

View File

@ -1,7 +1,7 @@
/** @typedef {import('./app/index.js').RapidDiffsFacade} */ /** @typedef {import('../app').RapidDiffsFacade} */
import { camelizeKeys } from '~/lib/utils/object_utils'; import { camelizeKeys } from '~/lib/utils/object_utils';
import { DIFF_FILE_MOUNTED } from './dom_events'; import { DIFF_FILE_MOUNTED } from '../dom_events';
import * as events from './events'; import * as events from '../adapter_events';
const eventNames = Object.values(events); const eventNames = Object.values(events);
const dataCacheKey = Symbol('data'); const dataCacheKey = Symbol('data');
@ -66,7 +66,7 @@ export class DiffFile extends HTMLElement {
_trigger(event, ...args) { _trigger(event, ...args) {
if (!eventNames.includes(event)) if (!eventNames.includes(event))
throw new Error( throw new Error(
`Missing event declaration: ${event}. Did you forget to declare this in ~/rapid_diffs/events.js?`, `Missing event declaration: ${event}. Did you forget to declare this in ~/rapid_diffs/adapter_events.js?`,
); );
this.adapters.forEach((adapter) => adapter[event]?.call?.(this.adapterContext, ...args)); this.adapters.forEach((adapter) => adapter[event]?.call?.(this.adapterContext, ...args));
} }

View File

@ -0,0 +1,8 @@
export const createDiffFileMounted = (appContext) => {
return class extends HTMLElement {
connectedCallback() {
// this context is injected into the DiffFile component
this.parentElement.mount(appContext);
}
};
};

View File

@ -273,11 +273,7 @@ export default {
class="gl-flex gl-flex-wrap gl-items-center gl-gap-3 gl-self-end" class="gl-flex gl-flex-wrap gl-items-center gl-gap-3 gl-self-end"
data-testid="blob-controls" data-testid="blob-controls"
> >
<open-mr-badge <open-mr-badge :project-path="projectPath" :blob-path="filePath" />
v-if="glFeatures.filterBlobPath"
:project-path="projectPath"
:blob-path="filePath"
/>
<gl-button <gl-button
v-gl-tooltip.html="findFileTooltip" v-gl-tooltip.html="findFileTooltip"
:title="findFileTooltip" :title="findFileTooltip"

View File

@ -4,7 +4,9 @@ import {
GlTooltipDirective, GlTooltipDirective,
GlDisclosureDropdownGroup, GlDisclosureDropdownGroup,
GlDisclosureDropdownItem, GlDisclosureDropdownItem,
GlLink,
} from '@gitlab/ui'; } from '@gitlab/ui';
import { isMetaClick } from '~/lib/utils/common_utils';
import { visitUrl } from '~/lib/utils/url_utility'; import { visitUrl } from '~/lib/utils/url_utility';
import InviteMembersTrigger from '~/invite_members/components/invite_members_trigger.vue'; import InviteMembersTrigger from '~/invite_members/components/invite_members_trigger.vue';
import { __, s__ } from '~/locale'; import { __, s__ } from '~/locale';
@ -13,9 +15,9 @@ import {
TRIGGER_ELEMENT_DISCLOSURE_DROPDOWN, TRIGGER_ELEMENT_DISCLOSURE_DROPDOWN,
} from '~/invite_members/constants'; } from '~/invite_members/constants';
import { import {
BASE_ALLOWED_CREATE_TYPES,
WORK_ITEM_TYPE_NAME_EPIC, WORK_ITEM_TYPE_NAME_EPIC,
CREATE_NEW_WORK_ITEM_MODAL, CREATE_NEW_WORK_ITEM_MODAL,
CREATE_NEW_GROUP_WORK_ITEM_MODAL,
NAME_TO_TEXT_LOWERCASE_MAP, NAME_TO_TEXT_LOWERCASE_MAP,
sprintfWorkItem, sprintfWorkItem,
} from '~/work_items/constants'; } from '~/work_items/constants';
@ -30,6 +32,7 @@ export default {
GlDisclosureDropdown, GlDisclosureDropdown,
GlDisclosureDropdownGroup, GlDisclosureDropdownGroup,
GlDisclosureDropdownItem, GlDisclosureDropdownItem,
GlLink,
InviteMembersTrigger, InviteMembersTrigger,
CreateWorkItemModal: () => import('~/work_items/components/create_work_item_modal.vue'), CreateWorkItemModal: () => import('~/work_items/components/create_work_item_modal.vue'),
}, },
@ -39,7 +42,7 @@ export default {
i18n: { i18n: {
createNew: __('Create new…'), createNew: __('Create new…'),
}, },
inject: ['isImpersonating', 'fullPath', 'workItemPlanningViewEnabled'], inject: ['isGroup', 'isImpersonating', 'fullPath', 'workItemPlanningViewEnabled'],
props: { props: {
groups: { groups: {
type: Array, type: Array,
@ -49,17 +52,27 @@ export default {
data() { data() {
return { return {
dropdownOpen: false, dropdownOpen: false,
showCreateGroupWorkItemModal: false,
showCreateWorkItemModal: false, showCreateWorkItemModal: false,
}; };
}, },
computed: { computed: {
allowedWorkItemTypes() {
if (this.isGroup) {
return [];
}
return BASE_ALLOWED_CREATE_TYPES;
},
dropdownOffset() { dropdownOffset() {
return { return {
mainAxis: DROPDOWN_Y_OFFSET, mainAxis: DROPDOWN_Y_OFFSET,
crossAxis: this.isImpersonating ? DROPDOWN_X_OFFSET_IMPERSONATING : DROPDOWN_X_OFFSET_BASE, crossAxis: this.isImpersonating ? DROPDOWN_X_OFFSET_IMPERSONATING : DROPDOWN_X_OFFSET_BASE,
}; };
}, },
preselectedWorkItemType() {
return !this.workItemPlanningViewEnabled && this.isGroup
? WORK_ITEM_TYPE_NAME_EPIC
: undefined;
},
}, },
methods: { methods: {
isInvitedMembers(groupItem) { isInvitedMembers(groupItem) {
@ -68,15 +81,24 @@ export default {
isCreateWorkItem(groupItem) { isCreateWorkItem(groupItem) {
return groupItem.component === CREATE_NEW_WORK_ITEM_MODAL; return groupItem.component === CREATE_NEW_WORK_ITEM_MODAL;
}, },
isCreateGroupWorkItem(groupItem) { getCreateWorkItemItem(groupItem) {
return groupItem.component === CREATE_NEW_GROUP_WORK_ITEM_MODAL; // Make sure <gl-disclosure-dropdown-item> doesn't have an href so it's
// not rendered as <a> which prevents us from opening the create modal
return { ...groupItem, href: undefined };
}, },
handleCreateWorkItemClick() { getCreateWorkItemHref(groupItem) {
if (this.workItemPlanningViewEnabled) { return this.workItemPlanningViewEnabled ? undefined : groupItem.href;
this.showCreateWorkItemModal = true; },
} else { handleCreateWorkItemClick(event) {
this.showCreateGroupWorkItemModal = true; if (event && isMetaClick(event)) {
// opening in a new tab
return;
} }
// don't follow the link for normal clicks - open in modal
event?.preventDefault?.();
this.showCreateWorkItemModal = true;
}, },
handleWorkItemCreated(workItem) { handleWorkItemCreated(workItem) {
// Triggering the toast at this component, because we want to lazy load the modal // Triggering the toast at this component, because we want to lazy load the modal
@ -85,7 +107,6 @@ export default {
// Hide the modal first to prevent the component from being destroyed // Hide the modal first to prevent the component from being destroyed
// before we can capture the event data // before we can capture the event data
this.showCreateGroupWorkItemModal = false;
this.showCreateWorkItemModal = false; this.showCreateWorkItemModal = false;
const workItemType = NAME_TO_TEXT_LOWERCASE_MAP[workItem?.workItemType?.name]; const workItemType = NAME_TO_TEXT_LOWERCASE_MAP[workItem?.workItemType?.name];
@ -134,40 +155,37 @@ export default {
trigger-source="top_nav" trigger-source="top_nav"
:trigger-element="$options.TRIGGER_ELEMENT_DISCLOSURE_DROPDOWN" :trigger-element="$options.TRIGGER_ELEMENT_DISCLOSURE_DROPDOWN"
/> />
<gl-disclosure-dropdown-item
v-else-if="isCreateGroupWorkItem(groupItem)"
:key="`${groupItem.text}-group-modal-trigger`"
:item="groupItem"
data-testid="new-group-work-item-trigger"
@action="showCreateGroupWorkItemModal = true"
/>
<gl-disclosure-dropdown-item <gl-disclosure-dropdown-item
v-else-if="isCreateWorkItem(groupItem)" v-else-if="isCreateWorkItem(groupItem)"
:key="`${groupItem.text}-modal-trigger`" :key="`${groupItem.text}-modal-trigger`"
:item="groupItem" :item="getCreateWorkItemItem(groupItem)"
data-testid="new-work-item-trigger" data-testid="new-work-item-trigger"
@action="handleCreateWorkItemClick" @action="handleCreateWorkItemClick"
/> >
<template #list-item>
<gl-link
v-if="getCreateWorkItemHref(groupItem)"
class="gl-block gl-text-default hover:gl-text-default hover:gl-no-underline"
:href="getCreateWorkItemHref(groupItem)"
@click.stop="handleCreateWorkItemClick"
>
{{ groupItem.text }}
</gl-link>
</template>
</gl-disclosure-dropdown-item>
<gl-disclosure-dropdown-item v-else :key="groupItem.text" :item="groupItem" /> <gl-disclosure-dropdown-item v-else :key="groupItem.text" :item="groupItem" />
</template> </template>
</gl-disclosure-dropdown-group> </gl-disclosure-dropdown-group>
<create-work-item-modal
v-if="showCreateGroupWorkItemModal"
visible
:full-path="fullPath"
hide-button
is-group
data-testid="new-group-work-item-modal"
:preselected-work-item-type="$options.WORK_ITEM_TYPE_NAME_EPIC"
@hideModal="showCreateGroupWorkItemModal = false"
@workItemCreated="handleWorkItemCreated"
/>
<create-work-item-modal <create-work-item-modal
v-if="showCreateWorkItemModal" v-if="showCreateWorkItemModal"
visible :allowed-work-item-types="allowedWorkItemTypes"
hide-button :always-show-work-item-type-select="!isGroup"
data-testid="new-work-item-modal"
:full-path="fullPath" :full-path="fullPath"
hide-button
:is-group="isGroup"
:preselected-work-item-type="preselectedWorkItemType"
visible
data-testid="new-work-item-modal"
@hideModal="showCreateWorkItemModal = false" @hideModal="showCreateWorkItemModal = false"
@workItemCreated="handleWorkItemCreated" @workItemCreated="handleWorkItemCreated"
/> />

View File

@ -14,13 +14,18 @@ export const availableGraphQLGroupActions = ({
isSelfDeletionInProgress, isSelfDeletionInProgress,
isSelfDeletionScheduled, isSelfDeletionScheduled,
}) => { }) => {
// No actions available when group deletion is in progress
if (isSelfDeletionInProgress) {
return [];
}
const baseActions = []; const baseActions = [];
if (userPermissions.viewEditPage) { if (userPermissions.viewEditPage) {
baseActions.push(ACTION_EDIT); baseActions.push(ACTION_EDIT);
} }
if (userPermissions.removeGroup && isSelfDeletionScheduled && !isSelfDeletionInProgress) { if (userPermissions.removeGroup && isSelfDeletionScheduled) {
baseActions.push(ACTION_RESTORE); baseActions.push(ACTION_RESTORE);
} }
@ -33,7 +38,7 @@ export const availableGraphQLGroupActions = ({
if (!markedForDeletion) { if (!markedForDeletion) {
baseActions.push(ACTION_DELETE); baseActions.push(ACTION_DELETE);
// Groups with self deletion scheduled can be deleted immediately // Groups with self deletion scheduled can be deleted immediately
} else if (isSelfDeletionScheduled && !isSelfDeletionInProgress) { } else if (isSelfDeletionScheduled) {
baseActions.push(ACTION_DELETE_IMMEDIATELY); baseActions.push(ACTION_DELETE_IMMEDIATELY);
} }
} }

View File

@ -17,7 +17,6 @@ import {
} from '../../constants'; } from '../../constants';
import workItemBulkUpdateMutation from '../../graphql/list/work_item_bulk_update.mutation.graphql'; import workItemBulkUpdateMutation from '../../graphql/list/work_item_bulk_update.mutation.graphql';
import getAvailableBulkEditWidgets from '../../graphql/list/get_available_bulk_edit_widgets.query.graphql'; import getAvailableBulkEditWidgets from '../../graphql/list/get_available_bulk_edit_widgets.query.graphql';
import workItemParent from '../../graphql/list/work_item_parent.query.graphql';
import WorkItemBulkEditAssignee from './work_item_bulk_edit_assignee.vue'; import WorkItemBulkEditAssignee from './work_item_bulk_edit_assignee.vue';
import WorkItemBulkEditDropdown from './work_item_bulk_edit_dropdown.vue'; import WorkItemBulkEditDropdown from './work_item_bulk_edit_dropdown.vue';
import WorkItemBulkEditLabels from './work_item_bulk_edit_labels.vue'; import WorkItemBulkEditLabels from './work_item_bulk_edit_labels.vue';
@ -84,7 +83,6 @@ export default {
assigneeId: undefined, assigneeId: undefined,
confidentiality: undefined, confidentiality: undefined,
healthStatus: undefined, healthStatus: undefined,
parentNamespaceId: undefined,
removeLabelIds: [], removeLabelIds: [],
state: undefined, state: undefined,
subscription: undefined, subscription: undefined,
@ -94,22 +92,6 @@ export default {
}; };
}, },
apollo: { apollo: {
parentNamespaceId: {
query: workItemParent,
variables() {
return {
fullPath: this.isGroup
? this.fullPath
: this.fullPath.substring(0, this.fullPath.lastIndexOf('/')),
};
},
update(data) {
return data.namespace.id;
},
skip() {
return !this.shouldUseGraphQLBulkEdit;
},
},
availableWidgets: { availableWidgets: {
query: getAvailableBulkEditWidgets, query: getAvailableBulkEditWidgets,
variables() { variables() {
@ -196,7 +178,7 @@ export default {
mutation: workItemBulkUpdateMutation, mutation: workItemBulkUpdateMutation,
variables: { variables: {
input: { input: {
parentId: this.parentNamespaceId, fullPath: this.fullPath,
ids: this.checkedItems.map((item) => item.id), ids: this.checkedItems.map((item) => item.id),
labelsWidget: hasLabelsToUpdate labelsWidget: hasLabelsToUpdate
? { ? {

View File

@ -270,7 +270,7 @@ export default {
mounted() { mounted() {
const DEFAULT_TEMPLATE_NAME = 'default'; const DEFAULT_TEMPLATE_NAME = 'default';
const templateNameFromRoute = const templateNameFromRoute =
this.$route.query[paramName] || this.$route.query[oldParamNameFromPreWorkItems]; this.$route?.query[paramName] || this.$route?.query[oldParamNameFromPreWorkItems];
const templateName = !this.isNewWorkItemRoute const templateName = !this.isNewWorkItemRoute
? DEFAULT_TEMPLATE_NAME ? DEFAULT_TEMPLATE_NAME
: templateNameFromRoute || DEFAULT_TEMPLATE_NAME; : templateNameFromRoute || DEFAULT_TEMPLATE_NAME;
@ -459,7 +459,7 @@ export default {
return; return;
} }
const params = new URLSearchParams(this.$route.query); const params = new URLSearchParams(this.$route?.query);
params.delete(paramName); params.delete(paramName);
params.delete(oldParamNameFromPreWorkItems); params.delete(oldParamNameFromPreWorkItems);
if (this.selectedTemplate && this.isNewWorkItemRoute) { if (this.selectedTemplate && this.isNewWorkItemRoute) {

View File

@ -206,7 +206,6 @@ export const DEFAULT_EPIC_COLORS = '#1068bf';
export const MAX_FREQUENT_PROJECTS = 3; export const MAX_FREQUENT_PROJECTS = 3;
export const MAX_FREQUENT_ITEMS = 3; export const MAX_FREQUENT_ITEMS = 3;
export const CREATE_NEW_WORK_ITEM_MODAL = 'create_new_work_item_modal'; export const CREATE_NEW_WORK_ITEM_MODAL = 'create_new_work_item_modal';
export const CREATE_NEW_GROUP_WORK_ITEM_MODAL = 'create_new_group_work_item_modal';
export const RELATED_ITEM_ID_URL_QUERY_PARAM = 'related_item_id'; export const RELATED_ITEM_ID_URL_QUERY_PARAM = 'related_item_id';
export const WORK_ITEM_REFERENCE_CHAR = '#'; export const WORK_ITEM_REFERENCE_CHAR = '#';

View File

@ -8,6 +8,9 @@ class Admin::GroupsController < Admin::ApplicationController
feature_category :groups_and_projects, [:create, :destroy, :edit, :index, :members_update, :new, :show, :update] feature_category :groups_and_projects, [:create, :destroy, :edit, :index, :members_update, :new, :show, :update]
def index def index
# Groups are loaded via GraphQL query on frontend
return if Feature.enabled?(:admin_groups_vue, current_user)
@groups = groups.sort_by_attribute(@sort = pagination_params[:sort]) @groups = groups.sort_by_attribute(@sort = pagination_params[:sort])
@groups = @groups.search(safe_params[:name]) if safe_params[:name].present? @groups = @groups.search(safe_params[:name]) if safe_params[:name].present?
@groups = @groups.page(pagination_params[:page]) @groups = @groups.page(pagination_params[:page])

View File

@ -548,11 +548,15 @@ class ApplicationController < BaseActionController
auth_user if strong_memoized?(:auth_user) auth_user if strong_memoized?(:auth_user)
end end
# Used by `set_current_organization` in BaseActionController def set_current_organization
def organization_params return if ::Current.organization_assigned
params.permit(
::Current.organization = Gitlab::Current::Organization.new(
params: params.permit(
:controller, :namespace_id, :group_id, :id, :organization_path :controller, :namespace_id, :group_id, :id, :organization_path
) ),
user: current_user
).organization
end end
end end

View File

@ -30,21 +30,6 @@ class BaseActionController < ActionController::Base
connect_src_values = Array.wrap(default_connect_src) | [Gitlab::CurrentSettings.snowplow_collector_hostname] connect_src_values = Array.wrap(default_connect_src) | [Gitlab::CurrentSettings.snowplow_collector_hostname]
p.connect_src(*connect_src_values) p.connect_src(*connect_src_values)
end end
def set_current_organization
return if ::Current.organization_assigned
organization = Gitlab::Current::Organization.new(
params: organization_params,
user: current_user,
session: session
).organization
session_key = Gitlab::Current::Organization::SESSION_KEY
session[session_key] = organization.id if organization && session[session_key] != organization.id
::Current.organization = organization
end
end end
# rubocop:enable Gitlab/NamespacedClass # rubocop:enable Gitlab/NamespacedClass
# rubocop:enable Rails/ApplicationController # rubocop:enable Rails/ApplicationController

View File

@ -148,9 +148,8 @@ class Oauth::AuthorizationsController < Doorkeeper::AuthorizationsController
) && !doorkeeper_application&.trusted? ) && !doorkeeper_application&.trusted?
end end
# Used by `set_current_organization` in BaseActionController def set_current_organization
def organization_params ::Current.organization = Gitlab::Current::Organization.new(user: current_user).organization
{}
end end
end end

View File

@ -47,7 +47,6 @@ class Projects::BlobController < Projects::ApplicationController
before_action do before_action do
push_frontend_feature_flag(:inline_blame, @project) push_frontend_feature_flag(:inline_blame, @project)
push_frontend_feature_flag(:filter_blob_path, current_user)
push_licensed_feature(:file_locks) if @project.licensed_feature_available?(:file_locks) push_licensed_feature(:file_locks) if @project.licensed_feature_available?(:file_locks)
push_frontend_feature_flag(:directory_code_dropdown_updates, current_user) push_frontend_feature_flag(:directory_code_dropdown_updates, current_user)
push_frontend_feature_flag(:repository_file_tree_browser, @project) push_frontend_feature_flag(:repository_file_tree_browser, @project)

View File

@ -19,7 +19,6 @@ class Projects::TreeController < Projects::ApplicationController
before_action do before_action do
push_frontend_feature_flag(:inline_blame, @project) push_frontend_feature_flag(:inline_blame, @project)
push_frontend_feature_flag(:filter_blob_path, current_user)
push_licensed_feature(:file_locks) if @project.licensed_feature_available?(:file_locks) push_licensed_feature(:file_locks) if @project.licensed_feature_available?(:file_locks)
push_frontend_feature_flag(:directory_code_dropdown_updates, current_user) push_frontend_feature_flag(:directory_code_dropdown_updates, current_user)
push_frontend_feature_flag(:repository_file_tree_browser, @project) push_frontend_feature_flag(:repository_file_tree_browser, @project)

View File

@ -42,7 +42,6 @@ class ProjectsController < Projects::ApplicationController
push_frontend_feature_flag(:edit_branch_rules, @project) push_frontend_feature_flag(:edit_branch_rules, @project)
# TODO: We need to remove the FF eventually when we rollout page_specific_styles # TODO: We need to remove the FF eventually when we rollout page_specific_styles
push_frontend_feature_flag(:page_specific_styles, current_user) push_frontend_feature_flag(:page_specific_styles, current_user)
push_frontend_feature_flag(:filter_blob_path, current_user)
push_licensed_feature(:file_locks) if @project.present? && @project.licensed_feature_available?(:file_locks) push_licensed_feature(:file_locks) if @project.present? && @project.licensed_feature_available?(:file_locks)
push_frontend_feature_flag(:directory_code_dropdown_updates, current_user) push_frontend_feature_flag(:directory_code_dropdown_updates, current_user)

View File

@ -22,8 +22,6 @@ module ResolvesMergeRequests
args[:include_subgroups] = true args[:include_subgroups] = true
end end
args.delete(:blob_path) if Feature.disabled?(:filter_blob_path, current_user)
validate_blob_path!(args) validate_blob_path!(args)
rewrite_param_name(args, :reviewer_wildcard_id, :reviewer_id) rewrite_param_name(args, :reviewer_wildcard_id, :reviewer_id)

View File

@ -90,7 +90,6 @@ module Resolvers
description: <<~DESC description: <<~DESC
Path of the blob changed in merge request. Path of the blob changed in merge request.
Requires state, targetBranches, and createdAfter arguments. Requires state, targetBranches, and createdAfter arguments.
Available only when the feature flag `filter_blob_path` is enabled.
DESC DESC
argument :created_after, Types::TimeType, argument :created_after, Types::TimeType,

View File

@ -61,7 +61,7 @@ module Nav
::Gitlab::Nav::TopNavMenuItem.build( ::Gitlab::Nav::TopNavMenuItem.build(
id: 'new_group_work_item', id: 'new_group_work_item',
title: _('New work item'), title: _('New work item'),
component: 'create_new_group_work_item_modal', component: 'create_new_work_item_modal',
data: { data: {
track_action: 'click_link_new_group_work_item', track_action: 'click_link_new_group_work_item',
track_label: 'plus_menu_dropdown', track_label: 'plus_menu_dropdown',
@ -109,6 +109,7 @@ module Nav
id: 'new_issue', id: 'new_issue',
title: _('New issue'), title: _('New issue'),
href: new_project_issue_path(project), href: new_project_issue_path(project),
component: 'create_new_work_item_modal',
data: { data: {
track_action: 'click_link_new_issue', track_action: 'click_link_new_issue',
track_label: 'plus_menu_dropdown', track_label: 'plus_menu_dropdown',

View File

@ -81,6 +81,18 @@ module Emails
) )
end end
def pipeline_variables_migration_complete_email(user, group, counts)
@user = user
@group = group
@updated_count = counts[:updated_count]
@skipped_count = counts[:skipped_count]
email_with_layout(
to: @user.notification_email_for(@group),
subject: subject("Pipeline variables settings migration complete")
)
end
def repository_push_email(project_id, opts = {}) def repository_push_email(project_id, opts = {})
@message = @message =
Gitlab::Email::Message::RepositoryPush.new(self, project_id, opts) Gitlab::Email::Message::RepositoryPush.new(self, project_id, opts)

View File

@ -253,6 +253,22 @@ class NotifyPreview < ActionMailer::Preview
Notify.pipeline_fixed_email(pipeline, pipeline.user.try(:email)) Notify.pipeline_fixed_email(pipeline, pipeline.user.try(:email))
end end
def pipeline_variables_migration_complete_email
Notify.pipeline_variables_migration_complete_email(user, group, { updated_count: 5, skipped_count: 3 }).message
end
def pipeline_variables_migration_complete_email_all_updated
Notify.pipeline_variables_migration_complete_email(user, group, { updated_count: 10, skipped_count: 0 }).message
end
def pipeline_variables_migration_complete_email_single_project
Notify.pipeline_variables_migration_complete_email(user, group, { updated_count: 1, skipped_count: 0 }).message
end
def pipeline_variables_migration_complete_email_single_skipped
Notify.pipeline_variables_migration_complete_email(user, group, { updated_count: 2, skipped_count: 1 }).message
end
def pipeline_schedule_owner_unavailable def pipeline_schedule_owner_unavailable
Notify.pipeline_schedule_owner_unavailable_email(pipeline_schedule, user) Notify.pipeline_schedule_owner_unavailable_email(pipeline_schedule, user)
end end

View File

@ -13,11 +13,14 @@ module Ci
return ServiceResponse.error(message: 'You are not authorized to perform this action') unless authorized? return ServiceResponse.error(message: 'You are not authorized to perform this action') unless authorized?
updated_count = 0 updated_count = 0
total_projects_with_pipeline_variables = 0
parent_group.self_and_descendants.each_batch do |group_batch| parent_group.self_and_descendants.each_batch do |group_batch|
all_projects_ci_cd_settings = ProjectCiCdSetting.for_namespace(group_batch) all_projects_ci_cd_settings = ProjectCiCdSetting.for_namespace(group_batch)
.with_pipeline_variables_enabled .with_pipeline_variables_enabled
total_projects_with_pipeline_variables += all_projects_ci_cd_settings.count
all_projects_ci_cd_settings all_projects_ci_cd_settings
.each_batch(of: PROJECTS_BATCH_SIZE) do |ci_cd_settings| .each_batch(of: PROJECTS_BATCH_SIZE) do |ci_cd_settings|
batch_updated_count = batch_updated_count =
@ -29,7 +32,12 @@ module Ci
end end
end end
ServiceResponse.success(payload: { updated_count: updated_count }) skipped_count = total_projects_with_pipeline_variables - updated_count
ServiceResponse.success(payload: {
updated_count: updated_count,
skipped_count: skipped_count
})
end end
private private

View File

@ -1 +0,0 @@
#js-groups-list-with-filtered-search{ data: { app_data: groups_list_with_filtered_search_app_data(dashboard_groups_path(format: :json, archived: false)) } }

View File

@ -3,26 +3,5 @@
= render_dashboard_ultimate_trial(current_user) = render_dashboard_ultimate_trial(current_user)
= render_product_usage_data_collection_changes(current_user) = render_product_usage_data_collection_changes(current_user)
- if Feature.enabled?(:your_work_groups_vue, current_user) = render 'dashboard/groups_head'
= render 'dashboard/groups_head' #js-your-work-groups-app{ data: { app_data: groups_list_with_filtered_search_app_data(dashboard_groups_path(format: :json)) } }
#js-your-work-groups-app{ data: { app_data: groups_list_with_filtered_search_app_data(dashboard_groups_path(format: :json)) } }
- else
%div{ data: { testid: 'groups-page' } }
- if current_user.groups.exists?
= render 'dashboard/groups_head'
= render 'groups'
- else
- button_text = _("New group") if current_user.can_create_group?
- button_link = new_group_path if current_user.can_create_group?
= render Pajamas::EmptyStateComponent.new(svg_path: 'illustrations/empty-state/empty-groups-md.svg',
title: s_('GroupsEmptyState|A group is a collection of several projects'),
primary_button_text: button_text,
primary_button_link: button_link,
primary_button_options: { data: { testid: "new-group-button" } },
secondary_button_text: _("Explore groups"),
secondary_button_link: explore_groups_path,
secondary_button_options: { data: { testid: "explore-groups-button" } },
empty_state_options: { data: { testid: 'groups-empty-state' } }) do |c|
- c.with_description do
= s_("GroupsEmptyState|If you organize your projects under a group, it works like a folder. You can manage your group member's permissions and access to each project in the group.")

View File

@ -0,0 +1,17 @@
%p
= s_('Notify|All projects in the %{group_name} group were checked for pipeline variables usage.').html_safe % { group_name: link_to(@group.name, @group.web_url) }
%p
- if @updated_count == 1
= s_('Notify|1 project was not using pipeline variables. CI/CD settings were updated to prevent future pipeline variable usage.')
- else
= s_('Notify|%{updated_count} projects were not using pipeline variables. CI/CD settings were updated to prevent future pipeline variable usage.') % { updated_count: @updated_count }
%p
- if @skipped_count == 0
= s_('Notify|All projects in this group have CI/CD setting set to prevent pipeline variable usage. 🎉')
- else
- if @skipped_count == 1
= s_('Notify|1 project has used pipeline variables in the past. This project\'s CI/CD settings were not updated as there is a risk the setting change would impact pipelines.')
- else
= s_('Notify|%{skipped_count} have used pipeline variables in the past. These projects\' CI/CD settings were not updated as there is a risk the setting change would impact pipelines.') % { skipped_count: @skipped_count }
%p
= s_('Notify|Projects that could not be updated need manual review. You can check the documentation for more information about the pipeline variable setting migration tool.')

View File

@ -0,0 +1,7 @@
Pipeline variables migration has completed for group <%= @group.name %>
Group URL: <%= @group.web_url %>
<%= @updated_count %> project CI/CD settings were updated to restrict pipeline variable access.
Projects in this group hierarchy now have pipeline variables restricted to maintainers and owners only.

View File

@ -28,6 +28,13 @@ module Ci
return unless result.success? return unless result.success?
log_extra_metadata_on_done(:disabled_pipeline_variables_count, result.payload[:updated_count]) log_extra_metadata_on_done(:disabled_pipeline_variables_count, result.payload[:updated_count])
Notify.pipeline_variables_migration_complete_email(
current_user, group, {
updated_count: result.payload[:updated_count],
skipped_count: result.payload[:skipped_count]
}
).deliver_later
end end
end end
end end

View File

@ -1,9 +0,0 @@
---
name: filter_blob_path
feature_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/499245
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/172997
rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/505449
milestone: '17.7'
group: group::source code
type: beta
default_enabled: true

View File

@ -1,9 +0,0 @@
---
name: your_work_groups_vue
feature_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/502477
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/183596
rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/542790
milestone: '17.10'
group: group::organizations
type: beta
default_enabled: false

View File

@ -8,20 +8,29 @@
module Rack module Rack
class Request class Request
def trusted_proxy?(ip) def trusted_proxy?(ip)
Rails.application.config.action_dispatch.trusted_proxies.any? { |proxy| proxy === ip } Rails.application.config.action_dispatch.trusted_proxies.any? { |proxy| proxy.include?(ip) }
rescue IPAddr::InvalidAddressError rescue IPAddr::InvalidAddressError
false false
end end
end end
end end
gitlab_trusted_proxies = Array(Gitlab.config.gitlab.trusted_proxies).map do |proxy| # Trust custom proxies from config.
trusted_proxies = Array(Gitlab.config.gitlab.trusted_proxies).map do |proxy|
IPAddr.new(proxy) IPAddr.new(proxy)
rescue IPAddr::InvalidAddressError rescue IPAddr::InvalidAddressError
end.compact end
Rails.application.config.action_dispatch.trusted_proxies = ( # Default to private IPs if no proxies configured.
['127.0.0.1', '::1'] + gitlab_trusted_proxies) trusted_proxies = ActionDispatch::RemoteIp::TRUSTED_PROXIES if trusted_proxies.empty?
# Always trust localhost.
trusted_proxies += [IPAddr.new('127.0.0.1'), IPAddr.new('::1')]
# Trust all proxies in their IPv6 mapped format.
trusted_proxies += trusted_proxies.compact.select(&:ipv4?).map(&:ipv4_mapped)
Rails.application.config.action_dispatch.trusted_proxies = trusted_proxies.uniq
# A monkey patch to make trusted proxies work with Rails 5.0. # A monkey patch to make trusted proxies work with Rails 5.0.
# Inspired by https://github.com/rails/rails/issues/5223#issuecomment-263778719 # Inspired by https://github.com/rails/rails/issues/5223#issuecomment-263778719

View File

@ -0,0 +1,9 @@
# frozen_string_literal: true
class AddTopLevelAncestorToSbomGraphPaths < Gitlab::Database::Migration[2.3]
milestone '18.3'
def change
add_column :sbom_graph_paths, :top_level_ancestor, :boolean, default: false, null: false
end
end

View File

@ -0,0 +1 @@
322a14c59203133addd60adada1e77b5b81e6ab540186756ef1b72304cf25959

View File

@ -23019,7 +23019,8 @@ CREATE TABLE sbom_graph_paths (
project_id bigint NOT NULL, project_id bigint NOT NULL,
path_length integer NOT NULL, path_length integer NOT NULL,
created_at timestamp with time zone NOT NULL, created_at timestamp with time zone NOT NULL,
updated_at timestamp with time zone NOT NULL updated_at timestamp with time zone NOT NULL,
top_level_ancestor boolean DEFAULT false NOT NULL
); );
CREATE SEQUENCE sbom_graph_paths_id_seq CREATE SEQUENCE sbom_graph_paths_id_seq

View File

@ -21650,7 +21650,7 @@ four standard [pagination arguments](#pagination-arguments):
| <a id="addonuserassignedmergerequestsapprovedby"></a>`approvedBy` | [`[String!]`](#string) | Usernames of the approvers. | | <a id="addonuserassignedmergerequestsapprovedby"></a>`approvedBy` | [`[String!]`](#string) | Usernames of the approvers. |
| <a id="addonuserassignedmergerequestsapprover"></a>`approver` | [`[String!]`](#string) | Usernames of possible approvers. | | <a id="addonuserassignedmergerequestsapprover"></a>`approver` | [`[String!]`](#string) | Usernames of possible approvers. |
| <a id="addonuserassignedmergerequestsauthorusername"></a>`authorUsername` | [`String`](#string) | Username of the author. | | <a id="addonuserassignedmergerequestsauthorusername"></a>`authorUsername` | [`String`](#string) | Username of the author. |
| <a id="addonuserassignedmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. Available only when the feature flag `filter_blob_path` is enabled. | | <a id="addonuserassignedmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. |
| <a id="addonuserassignedmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. | | <a id="addonuserassignedmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. |
| <a id="addonuserassignedmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. | | <a id="addonuserassignedmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. |
| <a id="addonuserassignedmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. | | <a id="addonuserassignedmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. |
@ -21708,7 +21708,7 @@ four standard [pagination arguments](#pagination-arguments):
| <a id="addonuserauthoredmergerequestsassigneeusername"></a>`assigneeUsername` | [`String`](#string) | Username of the assignee. | | <a id="addonuserauthoredmergerequestsassigneeusername"></a>`assigneeUsername` | [`String`](#string) | Username of the assignee. |
| <a id="addonuserauthoredmergerequestsassigneeusernames"></a>`assigneeUsernames` | [`[String!]`](#string) | Usernames of users assigned to the merge request. | | <a id="addonuserauthoredmergerequestsassigneeusernames"></a>`assigneeUsernames` | [`[String!]`](#string) | Usernames of users assigned to the merge request. |
| <a id="addonuserauthoredmergerequestsassigneewildcardid"></a>`assigneeWildcardId` | [`AssigneeWildcardId`](#assigneewildcardid) | Filter by assignee presence. Incompatible with assigneeUsernames and assigneeUsername. | | <a id="addonuserauthoredmergerequestsassigneewildcardid"></a>`assigneeWildcardId` | [`AssigneeWildcardId`](#assigneewildcardid) | Filter by assignee presence. Incompatible with assigneeUsernames and assigneeUsername. |
| <a id="addonuserauthoredmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. Available only when the feature flag `filter_blob_path` is enabled. | | <a id="addonuserauthoredmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. |
| <a id="addonuserauthoredmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. | | <a id="addonuserauthoredmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. |
| <a id="addonuserauthoredmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. | | <a id="addonuserauthoredmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. |
| <a id="addonuserauthoredmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. | | <a id="addonuserauthoredmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. |
@ -21828,7 +21828,7 @@ four standard [pagination arguments](#pagination-arguments):
| <a id="addonuserreviewrequestedmergerequestsassigneeusernames"></a>`assigneeUsernames` | [`[String!]`](#string) | Usernames of users assigned to the merge request. | | <a id="addonuserreviewrequestedmergerequestsassigneeusernames"></a>`assigneeUsernames` | [`[String!]`](#string) | Usernames of users assigned to the merge request. |
| <a id="addonuserreviewrequestedmergerequestsassigneewildcardid"></a>`assigneeWildcardId` | [`AssigneeWildcardId`](#assigneewildcardid) | Filter by assignee presence. Incompatible with assigneeUsernames and assigneeUsername. | | <a id="addonuserreviewrequestedmergerequestsassigneewildcardid"></a>`assigneeWildcardId` | [`AssigneeWildcardId`](#assigneewildcardid) | Filter by assignee presence. Incompatible with assigneeUsernames and assigneeUsername. |
| <a id="addonuserreviewrequestedmergerequestsauthorusername"></a>`authorUsername` | [`String`](#string) | Username of the author. | | <a id="addonuserreviewrequestedmergerequestsauthorusername"></a>`authorUsername` | [`String`](#string) | Username of the author. |
| <a id="addonuserreviewrequestedmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. Available only when the feature flag `filter_blob_path` is enabled. | | <a id="addonuserreviewrequestedmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. |
| <a id="addonuserreviewrequestedmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. | | <a id="addonuserreviewrequestedmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. |
| <a id="addonuserreviewrequestedmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. | | <a id="addonuserreviewrequestedmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. |
| <a id="addonuserreviewrequestedmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. | | <a id="addonuserreviewrequestedmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. |
@ -22875,7 +22875,7 @@ four standard [pagination arguments](#pagination-arguments):
| <a id="autocompleteduserassignedmergerequestsapprovedby"></a>`approvedBy` | [`[String!]`](#string) | Usernames of the approvers. | | <a id="autocompleteduserassignedmergerequestsapprovedby"></a>`approvedBy` | [`[String!]`](#string) | Usernames of the approvers. |
| <a id="autocompleteduserassignedmergerequestsapprover"></a>`approver` | [`[String!]`](#string) | Usernames of possible approvers. | | <a id="autocompleteduserassignedmergerequestsapprover"></a>`approver` | [`[String!]`](#string) | Usernames of possible approvers. |
| <a id="autocompleteduserassignedmergerequestsauthorusername"></a>`authorUsername` | [`String`](#string) | Username of the author. | | <a id="autocompleteduserassignedmergerequestsauthorusername"></a>`authorUsername` | [`String`](#string) | Username of the author. |
| <a id="autocompleteduserassignedmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. Available only when the feature flag `filter_blob_path` is enabled. | | <a id="autocompleteduserassignedmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. |
| <a id="autocompleteduserassignedmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. | | <a id="autocompleteduserassignedmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. |
| <a id="autocompleteduserassignedmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. | | <a id="autocompleteduserassignedmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. |
| <a id="autocompleteduserassignedmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. | | <a id="autocompleteduserassignedmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. |
@ -22933,7 +22933,7 @@ four standard [pagination arguments](#pagination-arguments):
| <a id="autocompleteduserauthoredmergerequestsassigneeusername"></a>`assigneeUsername` | [`String`](#string) | Username of the assignee. | | <a id="autocompleteduserauthoredmergerequestsassigneeusername"></a>`assigneeUsername` | [`String`](#string) | Username of the assignee. |
| <a id="autocompleteduserauthoredmergerequestsassigneeusernames"></a>`assigneeUsernames` | [`[String!]`](#string) | Usernames of users assigned to the merge request. | | <a id="autocompleteduserauthoredmergerequestsassigneeusernames"></a>`assigneeUsernames` | [`[String!]`](#string) | Usernames of users assigned to the merge request. |
| <a id="autocompleteduserauthoredmergerequestsassigneewildcardid"></a>`assigneeWildcardId` | [`AssigneeWildcardId`](#assigneewildcardid) | Filter by assignee presence. Incompatible with assigneeUsernames and assigneeUsername. | | <a id="autocompleteduserauthoredmergerequestsassigneewildcardid"></a>`assigneeWildcardId` | [`AssigneeWildcardId`](#assigneewildcardid) | Filter by assignee presence. Incompatible with assigneeUsernames and assigneeUsername. |
| <a id="autocompleteduserauthoredmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. Available only when the feature flag `filter_blob_path` is enabled. | | <a id="autocompleteduserauthoredmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. |
| <a id="autocompleteduserauthoredmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. | | <a id="autocompleteduserauthoredmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. |
| <a id="autocompleteduserauthoredmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. | | <a id="autocompleteduserauthoredmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. |
| <a id="autocompleteduserauthoredmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. | | <a id="autocompleteduserauthoredmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. |
@ -23065,7 +23065,7 @@ four standard [pagination arguments](#pagination-arguments):
| <a id="autocompleteduserreviewrequestedmergerequestsassigneeusernames"></a>`assigneeUsernames` | [`[String!]`](#string) | Usernames of users assigned to the merge request. | | <a id="autocompleteduserreviewrequestedmergerequestsassigneeusernames"></a>`assigneeUsernames` | [`[String!]`](#string) | Usernames of users assigned to the merge request. |
| <a id="autocompleteduserreviewrequestedmergerequestsassigneewildcardid"></a>`assigneeWildcardId` | [`AssigneeWildcardId`](#assigneewildcardid) | Filter by assignee presence. Incompatible with assigneeUsernames and assigneeUsername. | | <a id="autocompleteduserreviewrequestedmergerequestsassigneewildcardid"></a>`assigneeWildcardId` | [`AssigneeWildcardId`](#assigneewildcardid) | Filter by assignee presence. Incompatible with assigneeUsernames and assigneeUsername. |
| <a id="autocompleteduserreviewrequestedmergerequestsauthorusername"></a>`authorUsername` | [`String`](#string) | Username of the author. | | <a id="autocompleteduserreviewrequestedmergerequestsauthorusername"></a>`authorUsername` | [`String`](#string) | Username of the author. |
| <a id="autocompleteduserreviewrequestedmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. Available only when the feature flag `filter_blob_path` is enabled. | | <a id="autocompleteduserreviewrequestedmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. |
| <a id="autocompleteduserreviewrequestedmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. | | <a id="autocompleteduserreviewrequestedmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. |
| <a id="autocompleteduserreviewrequestedmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. | | <a id="autocompleteduserreviewrequestedmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. |
| <a id="autocompleteduserreviewrequestedmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. | | <a id="autocompleteduserreviewrequestedmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. |
@ -25974,7 +25974,7 @@ four standard [pagination arguments](#pagination-arguments):
| <a id="currentuserassignedmergerequestsapprovedby"></a>`approvedBy` | [`[String!]`](#string) | Usernames of the approvers. | | <a id="currentuserassignedmergerequestsapprovedby"></a>`approvedBy` | [`[String!]`](#string) | Usernames of the approvers. |
| <a id="currentuserassignedmergerequestsapprover"></a>`approver` | [`[String!]`](#string) | Usernames of possible approvers. | | <a id="currentuserassignedmergerequestsapprover"></a>`approver` | [`[String!]`](#string) | Usernames of possible approvers. |
| <a id="currentuserassignedmergerequestsauthorusername"></a>`authorUsername` | [`String`](#string) | Username of the author. | | <a id="currentuserassignedmergerequestsauthorusername"></a>`authorUsername` | [`String`](#string) | Username of the author. |
| <a id="currentuserassignedmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. Available only when the feature flag `filter_blob_path` is enabled. | | <a id="currentuserassignedmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. |
| <a id="currentuserassignedmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. | | <a id="currentuserassignedmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. |
| <a id="currentuserassignedmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. | | <a id="currentuserassignedmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. |
| <a id="currentuserassignedmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. | | <a id="currentuserassignedmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. |
@ -26035,7 +26035,7 @@ four standard [pagination arguments](#pagination-arguments):
| <a id="currentuserassigneeorreviewermergerequestsapprovedby"></a>`approvedBy` | [`[String!]`](#string) | Usernames of the approvers. | | <a id="currentuserassigneeorreviewermergerequestsapprovedby"></a>`approvedBy` | [`[String!]`](#string) | Usernames of the approvers. |
| <a id="currentuserassigneeorreviewermergerequestsapprover"></a>`approver` | [`[String!]`](#string) | Usernames of possible approvers. | | <a id="currentuserassigneeorreviewermergerequestsapprover"></a>`approver` | [`[String!]`](#string) | Usernames of possible approvers. |
| <a id="currentuserassigneeorreviewermergerequestsassignedreviewstates"></a>`assignedReviewStates` | [`[MergeRequestReviewState!]`](#mergerequestreviewstate) | Reviewer states for merge requests the current user is assigned to. | | <a id="currentuserassigneeorreviewermergerequestsassignedreviewstates"></a>`assignedReviewStates` | [`[MergeRequestReviewState!]`](#mergerequestreviewstate) | Reviewer states for merge requests the current user is assigned to. |
| <a id="currentuserassigneeorreviewermergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. Available only when the feature flag `filter_blob_path` is enabled. | | <a id="currentuserassigneeorreviewermergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. |
| <a id="currentuserassigneeorreviewermergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. | | <a id="currentuserassigneeorreviewermergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. |
| <a id="currentuserassigneeorreviewermergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. | | <a id="currentuserassigneeorreviewermergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. |
| <a id="currentuserassigneeorreviewermergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. | | <a id="currentuserassigneeorreviewermergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. |
@ -26092,7 +26092,7 @@ four standard [pagination arguments](#pagination-arguments):
| <a id="currentuserauthoredmergerequestsassigneeusername"></a>`assigneeUsername` | [`String`](#string) | Username of the assignee. | | <a id="currentuserauthoredmergerequestsassigneeusername"></a>`assigneeUsername` | [`String`](#string) | Username of the assignee. |
| <a id="currentuserauthoredmergerequestsassigneeusernames"></a>`assigneeUsernames` | [`[String!]`](#string) | Usernames of users assigned to the merge request. | | <a id="currentuserauthoredmergerequestsassigneeusernames"></a>`assigneeUsernames` | [`[String!]`](#string) | Usernames of users assigned to the merge request. |
| <a id="currentuserauthoredmergerequestsassigneewildcardid"></a>`assigneeWildcardId` | [`AssigneeWildcardId`](#assigneewildcardid) | Filter by assignee presence. Incompatible with assigneeUsernames and assigneeUsername. | | <a id="currentuserauthoredmergerequestsassigneewildcardid"></a>`assigneeWildcardId` | [`AssigneeWildcardId`](#assigneewildcardid) | Filter by assignee presence. Incompatible with assigneeUsernames and assigneeUsername. |
| <a id="currentuserauthoredmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. Available only when the feature flag `filter_blob_path` is enabled. | | <a id="currentuserauthoredmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. |
| <a id="currentuserauthoredmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. | | <a id="currentuserauthoredmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. |
| <a id="currentuserauthoredmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. | | <a id="currentuserauthoredmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. |
| <a id="currentuserauthoredmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. | | <a id="currentuserauthoredmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. |
@ -26212,7 +26212,7 @@ four standard [pagination arguments](#pagination-arguments):
| <a id="currentuserreviewrequestedmergerequestsassigneeusernames"></a>`assigneeUsernames` | [`[String!]`](#string) | Usernames of users assigned to the merge request. | | <a id="currentuserreviewrequestedmergerequestsassigneeusernames"></a>`assigneeUsernames` | [`[String!]`](#string) | Usernames of users assigned to the merge request. |
| <a id="currentuserreviewrequestedmergerequestsassigneewildcardid"></a>`assigneeWildcardId` | [`AssigneeWildcardId`](#assigneewildcardid) | Filter by assignee presence. Incompatible with assigneeUsernames and assigneeUsername. | | <a id="currentuserreviewrequestedmergerequestsassigneewildcardid"></a>`assigneeWildcardId` | [`AssigneeWildcardId`](#assigneewildcardid) | Filter by assignee presence. Incompatible with assigneeUsernames and assigneeUsername. |
| <a id="currentuserreviewrequestedmergerequestsauthorusername"></a>`authorUsername` | [`String`](#string) | Username of the author. | | <a id="currentuserreviewrequestedmergerequestsauthorusername"></a>`authorUsername` | [`String`](#string) | Username of the author. |
| <a id="currentuserreviewrequestedmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. Available only when the feature flag `filter_blob_path` is enabled. | | <a id="currentuserreviewrequestedmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. |
| <a id="currentuserreviewrequestedmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. | | <a id="currentuserreviewrequestedmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. |
| <a id="currentuserreviewrequestedmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. | | <a id="currentuserreviewrequestedmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. |
| <a id="currentuserreviewrequestedmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. | | <a id="currentuserreviewrequestedmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. |
@ -30124,7 +30124,7 @@ four standard [pagination arguments](#pagination-arguments):
| <a id="groupmergerequestsassigneeusernames"></a>`assigneeUsernames` | [`[String!]`](#string) | Usernames of users assigned to the merge request. | | <a id="groupmergerequestsassigneeusernames"></a>`assigneeUsernames` | [`[String!]`](#string) | Usernames of users assigned to the merge request. |
| <a id="groupmergerequestsassigneewildcardid"></a>`assigneeWildcardId` | [`AssigneeWildcardId`](#assigneewildcardid) | Filter by assignee presence. Incompatible with assigneeUsernames and assigneeUsername. | | <a id="groupmergerequestsassigneewildcardid"></a>`assigneeWildcardId` | [`AssigneeWildcardId`](#assigneewildcardid) | Filter by assignee presence. Incompatible with assigneeUsernames and assigneeUsername. |
| <a id="groupmergerequestsauthorusername"></a>`authorUsername` | [`String`](#string) | Username of the author. | | <a id="groupmergerequestsauthorusername"></a>`authorUsername` | [`String`](#string) | Username of the author. |
| <a id="groupmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. Available only when the feature flag `filter_blob_path` is enabled. | | <a id="groupmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. |
| <a id="groupmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. | | <a id="groupmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. |
| <a id="groupmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. | | <a id="groupmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. |
| <a id="groupmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. | | <a id="groupmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. |
@ -32808,7 +32808,7 @@ four standard [pagination arguments](#pagination-arguments):
| <a id="mergerequestassigneeassignedmergerequestsapprovedby"></a>`approvedBy` | [`[String!]`](#string) | Usernames of the approvers. | | <a id="mergerequestassigneeassignedmergerequestsapprovedby"></a>`approvedBy` | [`[String!]`](#string) | Usernames of the approvers. |
| <a id="mergerequestassigneeassignedmergerequestsapprover"></a>`approver` | [`[String!]`](#string) | Usernames of possible approvers. | | <a id="mergerequestassigneeassignedmergerequestsapprover"></a>`approver` | [`[String!]`](#string) | Usernames of possible approvers. |
| <a id="mergerequestassigneeassignedmergerequestsauthorusername"></a>`authorUsername` | [`String`](#string) | Username of the author. | | <a id="mergerequestassigneeassignedmergerequestsauthorusername"></a>`authorUsername` | [`String`](#string) | Username of the author. |
| <a id="mergerequestassigneeassignedmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. Available only when the feature flag `filter_blob_path` is enabled. | | <a id="mergerequestassigneeassignedmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. |
| <a id="mergerequestassigneeassignedmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. | | <a id="mergerequestassigneeassignedmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. |
| <a id="mergerequestassigneeassignedmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. | | <a id="mergerequestassigneeassignedmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. |
| <a id="mergerequestassigneeassignedmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. | | <a id="mergerequestassigneeassignedmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. |
@ -32866,7 +32866,7 @@ four standard [pagination arguments](#pagination-arguments):
| <a id="mergerequestassigneeauthoredmergerequestsassigneeusername"></a>`assigneeUsername` | [`String`](#string) | Username of the assignee. | | <a id="mergerequestassigneeauthoredmergerequestsassigneeusername"></a>`assigneeUsername` | [`String`](#string) | Username of the assignee. |
| <a id="mergerequestassigneeauthoredmergerequestsassigneeusernames"></a>`assigneeUsernames` | [`[String!]`](#string) | Usernames of users assigned to the merge request. | | <a id="mergerequestassigneeauthoredmergerequestsassigneeusernames"></a>`assigneeUsernames` | [`[String!]`](#string) | Usernames of users assigned to the merge request. |
| <a id="mergerequestassigneeauthoredmergerequestsassigneewildcardid"></a>`assigneeWildcardId` | [`AssigneeWildcardId`](#assigneewildcardid) | Filter by assignee presence. Incompatible with assigneeUsernames and assigneeUsername. | | <a id="mergerequestassigneeauthoredmergerequestsassigneewildcardid"></a>`assigneeWildcardId` | [`AssigneeWildcardId`](#assigneewildcardid) | Filter by assignee presence. Incompatible with assigneeUsernames and assigneeUsername. |
| <a id="mergerequestassigneeauthoredmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. Available only when the feature flag `filter_blob_path` is enabled. | | <a id="mergerequestassigneeauthoredmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. |
| <a id="mergerequestassigneeauthoredmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. | | <a id="mergerequestassigneeauthoredmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. |
| <a id="mergerequestassigneeauthoredmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. | | <a id="mergerequestassigneeauthoredmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. |
| <a id="mergerequestassigneeauthoredmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. | | <a id="mergerequestassigneeauthoredmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. |
@ -32986,7 +32986,7 @@ four standard [pagination arguments](#pagination-arguments):
| <a id="mergerequestassigneereviewrequestedmergerequestsassigneeusernames"></a>`assigneeUsernames` | [`[String!]`](#string) | Usernames of users assigned to the merge request. | | <a id="mergerequestassigneereviewrequestedmergerequestsassigneeusernames"></a>`assigneeUsernames` | [`[String!]`](#string) | Usernames of users assigned to the merge request. |
| <a id="mergerequestassigneereviewrequestedmergerequestsassigneewildcardid"></a>`assigneeWildcardId` | [`AssigneeWildcardId`](#assigneewildcardid) | Filter by assignee presence. Incompatible with assigneeUsernames and assigneeUsername. | | <a id="mergerequestassigneereviewrequestedmergerequestsassigneewildcardid"></a>`assigneeWildcardId` | [`AssigneeWildcardId`](#assigneewildcardid) | Filter by assignee presence. Incompatible with assigneeUsernames and assigneeUsername. |
| <a id="mergerequestassigneereviewrequestedmergerequestsauthorusername"></a>`authorUsername` | [`String`](#string) | Username of the author. | | <a id="mergerequestassigneereviewrequestedmergerequestsauthorusername"></a>`authorUsername` | [`String`](#string) | Username of the author. |
| <a id="mergerequestassigneereviewrequestedmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. Available only when the feature flag `filter_blob_path` is enabled. | | <a id="mergerequestassigneereviewrequestedmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. |
| <a id="mergerequestassigneereviewrequestedmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. | | <a id="mergerequestassigneereviewrequestedmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. |
| <a id="mergerequestassigneereviewrequestedmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. | | <a id="mergerequestassigneereviewrequestedmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. |
| <a id="mergerequestassigneereviewrequestedmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. | | <a id="mergerequestassigneereviewrequestedmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. |
@ -33229,7 +33229,7 @@ four standard [pagination arguments](#pagination-arguments):
| <a id="mergerequestauthorassignedmergerequestsapprovedby"></a>`approvedBy` | [`[String!]`](#string) | Usernames of the approvers. | | <a id="mergerequestauthorassignedmergerequestsapprovedby"></a>`approvedBy` | [`[String!]`](#string) | Usernames of the approvers. |
| <a id="mergerequestauthorassignedmergerequestsapprover"></a>`approver` | [`[String!]`](#string) | Usernames of possible approvers. | | <a id="mergerequestauthorassignedmergerequestsapprover"></a>`approver` | [`[String!]`](#string) | Usernames of possible approvers. |
| <a id="mergerequestauthorassignedmergerequestsauthorusername"></a>`authorUsername` | [`String`](#string) | Username of the author. | | <a id="mergerequestauthorassignedmergerequestsauthorusername"></a>`authorUsername` | [`String`](#string) | Username of the author. |
| <a id="mergerequestauthorassignedmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. Available only when the feature flag `filter_blob_path` is enabled. | | <a id="mergerequestauthorassignedmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. |
| <a id="mergerequestauthorassignedmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. | | <a id="mergerequestauthorassignedmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. |
| <a id="mergerequestauthorassignedmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. | | <a id="mergerequestauthorassignedmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. |
| <a id="mergerequestauthorassignedmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. | | <a id="mergerequestauthorassignedmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. |
@ -33287,7 +33287,7 @@ four standard [pagination arguments](#pagination-arguments):
| <a id="mergerequestauthorauthoredmergerequestsassigneeusername"></a>`assigneeUsername` | [`String`](#string) | Username of the assignee. | | <a id="mergerequestauthorauthoredmergerequestsassigneeusername"></a>`assigneeUsername` | [`String`](#string) | Username of the assignee. |
| <a id="mergerequestauthorauthoredmergerequestsassigneeusernames"></a>`assigneeUsernames` | [`[String!]`](#string) | Usernames of users assigned to the merge request. | | <a id="mergerequestauthorauthoredmergerequestsassigneeusernames"></a>`assigneeUsernames` | [`[String!]`](#string) | Usernames of users assigned to the merge request. |
| <a id="mergerequestauthorauthoredmergerequestsassigneewildcardid"></a>`assigneeWildcardId` | [`AssigneeWildcardId`](#assigneewildcardid) | Filter by assignee presence. Incompatible with assigneeUsernames and assigneeUsername. | | <a id="mergerequestauthorauthoredmergerequestsassigneewildcardid"></a>`assigneeWildcardId` | [`AssigneeWildcardId`](#assigneewildcardid) | Filter by assignee presence. Incompatible with assigneeUsernames and assigneeUsername. |
| <a id="mergerequestauthorauthoredmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. Available only when the feature flag `filter_blob_path` is enabled. | | <a id="mergerequestauthorauthoredmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. |
| <a id="mergerequestauthorauthoredmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. | | <a id="mergerequestauthorauthoredmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. |
| <a id="mergerequestauthorauthoredmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. | | <a id="mergerequestauthorauthoredmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. |
| <a id="mergerequestauthorauthoredmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. | | <a id="mergerequestauthorauthoredmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. |
@ -33407,7 +33407,7 @@ four standard [pagination arguments](#pagination-arguments):
| <a id="mergerequestauthorreviewrequestedmergerequestsassigneeusernames"></a>`assigneeUsernames` | [`[String!]`](#string) | Usernames of users assigned to the merge request. | | <a id="mergerequestauthorreviewrequestedmergerequestsassigneeusernames"></a>`assigneeUsernames` | [`[String!]`](#string) | Usernames of users assigned to the merge request. |
| <a id="mergerequestauthorreviewrequestedmergerequestsassigneewildcardid"></a>`assigneeWildcardId` | [`AssigneeWildcardId`](#assigneewildcardid) | Filter by assignee presence. Incompatible with assigneeUsernames and assigneeUsername. | | <a id="mergerequestauthorreviewrequestedmergerequestsassigneewildcardid"></a>`assigneeWildcardId` | [`AssigneeWildcardId`](#assigneewildcardid) | Filter by assignee presence. Incompatible with assigneeUsernames and assigneeUsername. |
| <a id="mergerequestauthorreviewrequestedmergerequestsauthorusername"></a>`authorUsername` | [`String`](#string) | Username of the author. | | <a id="mergerequestauthorreviewrequestedmergerequestsauthorusername"></a>`authorUsername` | [`String`](#string) | Username of the author. |
| <a id="mergerequestauthorreviewrequestedmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. Available only when the feature flag `filter_blob_path` is enabled. | | <a id="mergerequestauthorreviewrequestedmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. |
| <a id="mergerequestauthorreviewrequestedmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. | | <a id="mergerequestauthorreviewrequestedmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. |
| <a id="mergerequestauthorreviewrequestedmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. | | <a id="mergerequestauthorreviewrequestedmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. |
| <a id="mergerequestauthorreviewrequestedmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. | | <a id="mergerequestauthorreviewrequestedmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. |
@ -33701,7 +33701,7 @@ four standard [pagination arguments](#pagination-arguments):
| <a id="mergerequestparticipantassignedmergerequestsapprovedby"></a>`approvedBy` | [`[String!]`](#string) | Usernames of the approvers. | | <a id="mergerequestparticipantassignedmergerequestsapprovedby"></a>`approvedBy` | [`[String!]`](#string) | Usernames of the approvers. |
| <a id="mergerequestparticipantassignedmergerequestsapprover"></a>`approver` | [`[String!]`](#string) | Usernames of possible approvers. | | <a id="mergerequestparticipantassignedmergerequestsapprover"></a>`approver` | [`[String!]`](#string) | Usernames of possible approvers. |
| <a id="mergerequestparticipantassignedmergerequestsauthorusername"></a>`authorUsername` | [`String`](#string) | Username of the author. | | <a id="mergerequestparticipantassignedmergerequestsauthorusername"></a>`authorUsername` | [`String`](#string) | Username of the author. |
| <a id="mergerequestparticipantassignedmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. Available only when the feature flag `filter_blob_path` is enabled. | | <a id="mergerequestparticipantassignedmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. |
| <a id="mergerequestparticipantassignedmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. | | <a id="mergerequestparticipantassignedmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. |
| <a id="mergerequestparticipantassignedmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. | | <a id="mergerequestparticipantassignedmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. |
| <a id="mergerequestparticipantassignedmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. | | <a id="mergerequestparticipantassignedmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. |
@ -33759,7 +33759,7 @@ four standard [pagination arguments](#pagination-arguments):
| <a id="mergerequestparticipantauthoredmergerequestsassigneeusername"></a>`assigneeUsername` | [`String`](#string) | Username of the assignee. | | <a id="mergerequestparticipantauthoredmergerequestsassigneeusername"></a>`assigneeUsername` | [`String`](#string) | Username of the assignee. |
| <a id="mergerequestparticipantauthoredmergerequestsassigneeusernames"></a>`assigneeUsernames` | [`[String!]`](#string) | Usernames of users assigned to the merge request. | | <a id="mergerequestparticipantauthoredmergerequestsassigneeusernames"></a>`assigneeUsernames` | [`[String!]`](#string) | Usernames of users assigned to the merge request. |
| <a id="mergerequestparticipantauthoredmergerequestsassigneewildcardid"></a>`assigneeWildcardId` | [`AssigneeWildcardId`](#assigneewildcardid) | Filter by assignee presence. Incompatible with assigneeUsernames and assigneeUsername. | | <a id="mergerequestparticipantauthoredmergerequestsassigneewildcardid"></a>`assigneeWildcardId` | [`AssigneeWildcardId`](#assigneewildcardid) | Filter by assignee presence. Incompatible with assigneeUsernames and assigneeUsername. |
| <a id="mergerequestparticipantauthoredmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. Available only when the feature flag `filter_blob_path` is enabled. | | <a id="mergerequestparticipantauthoredmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. |
| <a id="mergerequestparticipantauthoredmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. | | <a id="mergerequestparticipantauthoredmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. |
| <a id="mergerequestparticipantauthoredmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. | | <a id="mergerequestparticipantauthoredmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. |
| <a id="mergerequestparticipantauthoredmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. | | <a id="mergerequestparticipantauthoredmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. |
@ -33879,7 +33879,7 @@ four standard [pagination arguments](#pagination-arguments):
| <a id="mergerequestparticipantreviewrequestedmergerequestsassigneeusernames"></a>`assigneeUsernames` | [`[String!]`](#string) | Usernames of users assigned to the merge request. | | <a id="mergerequestparticipantreviewrequestedmergerequestsassigneeusernames"></a>`assigneeUsernames` | [`[String!]`](#string) | Usernames of users assigned to the merge request. |
| <a id="mergerequestparticipantreviewrequestedmergerequestsassigneewildcardid"></a>`assigneeWildcardId` | [`AssigneeWildcardId`](#assigneewildcardid) | Filter by assignee presence. Incompatible with assigneeUsernames and assigneeUsername. | | <a id="mergerequestparticipantreviewrequestedmergerequestsassigneewildcardid"></a>`assigneeWildcardId` | [`AssigneeWildcardId`](#assigneewildcardid) | Filter by assignee presence. Incompatible with assigneeUsernames and assigneeUsername. |
| <a id="mergerequestparticipantreviewrequestedmergerequestsauthorusername"></a>`authorUsername` | [`String`](#string) | Username of the author. | | <a id="mergerequestparticipantreviewrequestedmergerequestsauthorusername"></a>`authorUsername` | [`String`](#string) | Username of the author. |
| <a id="mergerequestparticipantreviewrequestedmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. Available only when the feature flag `filter_blob_path` is enabled. | | <a id="mergerequestparticipantreviewrequestedmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. |
| <a id="mergerequestparticipantreviewrequestedmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. | | <a id="mergerequestparticipantreviewrequestedmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. |
| <a id="mergerequestparticipantreviewrequestedmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. | | <a id="mergerequestparticipantreviewrequestedmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. |
| <a id="mergerequestparticipantreviewrequestedmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. | | <a id="mergerequestparticipantreviewrequestedmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. |
@ -34141,7 +34141,7 @@ four standard [pagination arguments](#pagination-arguments):
| <a id="mergerequestreviewerassignedmergerequestsapprovedby"></a>`approvedBy` | [`[String!]`](#string) | Usernames of the approvers. | | <a id="mergerequestreviewerassignedmergerequestsapprovedby"></a>`approvedBy` | [`[String!]`](#string) | Usernames of the approvers. |
| <a id="mergerequestreviewerassignedmergerequestsapprover"></a>`approver` | [`[String!]`](#string) | Usernames of possible approvers. | | <a id="mergerequestreviewerassignedmergerequestsapprover"></a>`approver` | [`[String!]`](#string) | Usernames of possible approvers. |
| <a id="mergerequestreviewerassignedmergerequestsauthorusername"></a>`authorUsername` | [`String`](#string) | Username of the author. | | <a id="mergerequestreviewerassignedmergerequestsauthorusername"></a>`authorUsername` | [`String`](#string) | Username of the author. |
| <a id="mergerequestreviewerassignedmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. Available only when the feature flag `filter_blob_path` is enabled. | | <a id="mergerequestreviewerassignedmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. |
| <a id="mergerequestreviewerassignedmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. | | <a id="mergerequestreviewerassignedmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. |
| <a id="mergerequestreviewerassignedmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. | | <a id="mergerequestreviewerassignedmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. |
| <a id="mergerequestreviewerassignedmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. | | <a id="mergerequestreviewerassignedmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. |
@ -34199,7 +34199,7 @@ four standard [pagination arguments](#pagination-arguments):
| <a id="mergerequestreviewerauthoredmergerequestsassigneeusername"></a>`assigneeUsername` | [`String`](#string) | Username of the assignee. | | <a id="mergerequestreviewerauthoredmergerequestsassigneeusername"></a>`assigneeUsername` | [`String`](#string) | Username of the assignee. |
| <a id="mergerequestreviewerauthoredmergerequestsassigneeusernames"></a>`assigneeUsernames` | [`[String!]`](#string) | Usernames of users assigned to the merge request. | | <a id="mergerequestreviewerauthoredmergerequestsassigneeusernames"></a>`assigneeUsernames` | [`[String!]`](#string) | Usernames of users assigned to the merge request. |
| <a id="mergerequestreviewerauthoredmergerequestsassigneewildcardid"></a>`assigneeWildcardId` | [`AssigneeWildcardId`](#assigneewildcardid) | Filter by assignee presence. Incompatible with assigneeUsernames and assigneeUsername. | | <a id="mergerequestreviewerauthoredmergerequestsassigneewildcardid"></a>`assigneeWildcardId` | [`AssigneeWildcardId`](#assigneewildcardid) | Filter by assignee presence. Incompatible with assigneeUsernames and assigneeUsername. |
| <a id="mergerequestreviewerauthoredmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. Available only when the feature flag `filter_blob_path` is enabled. | | <a id="mergerequestreviewerauthoredmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. |
| <a id="mergerequestreviewerauthoredmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. | | <a id="mergerequestreviewerauthoredmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. |
| <a id="mergerequestreviewerauthoredmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. | | <a id="mergerequestreviewerauthoredmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. |
| <a id="mergerequestreviewerauthoredmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. | | <a id="mergerequestreviewerauthoredmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. |
@ -34319,7 +34319,7 @@ four standard [pagination arguments](#pagination-arguments):
| <a id="mergerequestreviewerreviewrequestedmergerequestsassigneeusernames"></a>`assigneeUsernames` | [`[String!]`](#string) | Usernames of users assigned to the merge request. | | <a id="mergerequestreviewerreviewrequestedmergerequestsassigneeusernames"></a>`assigneeUsernames` | [`[String!]`](#string) | Usernames of users assigned to the merge request. |
| <a id="mergerequestreviewerreviewrequestedmergerequestsassigneewildcardid"></a>`assigneeWildcardId` | [`AssigneeWildcardId`](#assigneewildcardid) | Filter by assignee presence. Incompatible with assigneeUsernames and assigneeUsername. | | <a id="mergerequestreviewerreviewrequestedmergerequestsassigneewildcardid"></a>`assigneeWildcardId` | [`AssigneeWildcardId`](#assigneewildcardid) | Filter by assignee presence. Incompatible with assigneeUsernames and assigneeUsername. |
| <a id="mergerequestreviewerreviewrequestedmergerequestsauthorusername"></a>`authorUsername` | [`String`](#string) | Username of the author. | | <a id="mergerequestreviewerreviewrequestedmergerequestsauthorusername"></a>`authorUsername` | [`String`](#string) | Username of the author. |
| <a id="mergerequestreviewerreviewrequestedmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. Available only when the feature flag `filter_blob_path` is enabled. | | <a id="mergerequestreviewerreviewrequestedmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. |
| <a id="mergerequestreviewerreviewrequestedmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. | | <a id="mergerequestreviewerreviewrequestedmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. |
| <a id="mergerequestreviewerreviewrequestedmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. | | <a id="mergerequestreviewerreviewrequestedmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. |
| <a id="mergerequestreviewerreviewrequestedmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. | | <a id="mergerequestreviewerreviewrequestedmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. |
@ -38352,7 +38352,7 @@ four standard [pagination arguments](#pagination-arguments):
| <a id="projectmergerequestsassigneeusernames"></a>`assigneeUsernames` | [`[String!]`](#string) | Usernames of users assigned to the merge request. | | <a id="projectmergerequestsassigneeusernames"></a>`assigneeUsernames` | [`[String!]`](#string) | Usernames of users assigned to the merge request. |
| <a id="projectmergerequestsassigneewildcardid"></a>`assigneeWildcardId` | [`AssigneeWildcardId`](#assigneewildcardid) | Filter by assignee presence. Incompatible with assigneeUsernames and assigneeUsername. | | <a id="projectmergerequestsassigneewildcardid"></a>`assigneeWildcardId` | [`AssigneeWildcardId`](#assigneewildcardid) | Filter by assignee presence. Incompatible with assigneeUsernames and assigneeUsername. |
| <a id="projectmergerequestsauthorusername"></a>`authorUsername` | [`String`](#string) | Username of the author. | | <a id="projectmergerequestsauthorusername"></a>`authorUsername` | [`String`](#string) | Username of the author. |
| <a id="projectmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. Available only when the feature flag `filter_blob_path` is enabled. | | <a id="projectmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. |
| <a id="projectmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. | | <a id="projectmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. |
| <a id="projectmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. | | <a id="projectmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. |
| <a id="projectmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. | | <a id="projectmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. |
@ -42124,7 +42124,7 @@ four standard [pagination arguments](#pagination-arguments):
| <a id="usercoreassignedmergerequestsapprovedby"></a>`approvedBy` | [`[String!]`](#string) | Usernames of the approvers. | | <a id="usercoreassignedmergerequestsapprovedby"></a>`approvedBy` | [`[String!]`](#string) | Usernames of the approvers. |
| <a id="usercoreassignedmergerequestsapprover"></a>`approver` | [`[String!]`](#string) | Usernames of possible approvers. | | <a id="usercoreassignedmergerequestsapprover"></a>`approver` | [`[String!]`](#string) | Usernames of possible approvers. |
| <a id="usercoreassignedmergerequestsauthorusername"></a>`authorUsername` | [`String`](#string) | Username of the author. | | <a id="usercoreassignedmergerequestsauthorusername"></a>`authorUsername` | [`String`](#string) | Username of the author. |
| <a id="usercoreassignedmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. Available only when the feature flag `filter_blob_path` is enabled. | | <a id="usercoreassignedmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. |
| <a id="usercoreassignedmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. | | <a id="usercoreassignedmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. |
| <a id="usercoreassignedmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. | | <a id="usercoreassignedmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. |
| <a id="usercoreassignedmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. | | <a id="usercoreassignedmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. |
@ -42182,7 +42182,7 @@ four standard [pagination arguments](#pagination-arguments):
| <a id="usercoreauthoredmergerequestsassigneeusername"></a>`assigneeUsername` | [`String`](#string) | Username of the assignee. | | <a id="usercoreauthoredmergerequestsassigneeusername"></a>`assigneeUsername` | [`String`](#string) | Username of the assignee. |
| <a id="usercoreauthoredmergerequestsassigneeusernames"></a>`assigneeUsernames` | [`[String!]`](#string) | Usernames of users assigned to the merge request. | | <a id="usercoreauthoredmergerequestsassigneeusernames"></a>`assigneeUsernames` | [`[String!]`](#string) | Usernames of users assigned to the merge request. |
| <a id="usercoreauthoredmergerequestsassigneewildcardid"></a>`assigneeWildcardId` | [`AssigneeWildcardId`](#assigneewildcardid) | Filter by assignee presence. Incompatible with assigneeUsernames and assigneeUsername. | | <a id="usercoreauthoredmergerequestsassigneewildcardid"></a>`assigneeWildcardId` | [`AssigneeWildcardId`](#assigneewildcardid) | Filter by assignee presence. Incompatible with assigneeUsernames and assigneeUsername. |
| <a id="usercoreauthoredmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. Available only when the feature flag `filter_blob_path` is enabled. | | <a id="usercoreauthoredmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. |
| <a id="usercoreauthoredmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. | | <a id="usercoreauthoredmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. |
| <a id="usercoreauthoredmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. | | <a id="usercoreauthoredmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. |
| <a id="usercoreauthoredmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. | | <a id="usercoreauthoredmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. |
@ -42302,7 +42302,7 @@ four standard [pagination arguments](#pagination-arguments):
| <a id="usercorereviewrequestedmergerequestsassigneeusernames"></a>`assigneeUsernames` | [`[String!]`](#string) | Usernames of users assigned to the merge request. | | <a id="usercorereviewrequestedmergerequestsassigneeusernames"></a>`assigneeUsernames` | [`[String!]`](#string) | Usernames of users assigned to the merge request. |
| <a id="usercorereviewrequestedmergerequestsassigneewildcardid"></a>`assigneeWildcardId` | [`AssigneeWildcardId`](#assigneewildcardid) | Filter by assignee presence. Incompatible with assigneeUsernames and assigneeUsername. | | <a id="usercorereviewrequestedmergerequestsassigneewildcardid"></a>`assigneeWildcardId` | [`AssigneeWildcardId`](#assigneewildcardid) | Filter by assignee presence. Incompatible with assigneeUsernames and assigneeUsername. |
| <a id="usercorereviewrequestedmergerequestsauthorusername"></a>`authorUsername` | [`String`](#string) | Username of the author. | | <a id="usercorereviewrequestedmergerequestsauthorusername"></a>`authorUsername` | [`String`](#string) | Username of the author. |
| <a id="usercorereviewrequestedmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. Available only when the feature flag `filter_blob_path` is enabled. | | <a id="usercorereviewrequestedmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. |
| <a id="usercorereviewrequestedmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. | | <a id="usercorereviewrequestedmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. |
| <a id="usercorereviewrequestedmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. | | <a id="usercorereviewrequestedmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. |
| <a id="usercorereviewrequestedmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. | | <a id="usercorereviewrequestedmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. |
@ -51348,7 +51348,7 @@ four standard [pagination arguments](#pagination-arguments):
| <a id="userassignedmergerequestsapprovedby"></a>`approvedBy` | [`[String!]`](#string) | Usernames of the approvers. | | <a id="userassignedmergerequestsapprovedby"></a>`approvedBy` | [`[String!]`](#string) | Usernames of the approvers. |
| <a id="userassignedmergerequestsapprover"></a>`approver` | [`[String!]`](#string) | Usernames of possible approvers. | | <a id="userassignedmergerequestsapprover"></a>`approver` | [`[String!]`](#string) | Usernames of possible approvers. |
| <a id="userassignedmergerequestsauthorusername"></a>`authorUsername` | [`String`](#string) | Username of the author. | | <a id="userassignedmergerequestsauthorusername"></a>`authorUsername` | [`String`](#string) | Username of the author. |
| <a id="userassignedmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. Available only when the feature flag `filter_blob_path` is enabled. | | <a id="userassignedmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. |
| <a id="userassignedmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. | | <a id="userassignedmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. |
| <a id="userassignedmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. | | <a id="userassignedmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. |
| <a id="userassignedmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. | | <a id="userassignedmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. |
@ -51406,7 +51406,7 @@ four standard [pagination arguments](#pagination-arguments):
| <a id="userauthoredmergerequestsassigneeusername"></a>`assigneeUsername` | [`String`](#string) | Username of the assignee. | | <a id="userauthoredmergerequestsassigneeusername"></a>`assigneeUsername` | [`String`](#string) | Username of the assignee. |
| <a id="userauthoredmergerequestsassigneeusernames"></a>`assigneeUsernames` | [`[String!]`](#string) | Usernames of users assigned to the merge request. | | <a id="userauthoredmergerequestsassigneeusernames"></a>`assigneeUsernames` | [`[String!]`](#string) | Usernames of users assigned to the merge request. |
| <a id="userauthoredmergerequestsassigneewildcardid"></a>`assigneeWildcardId` | [`AssigneeWildcardId`](#assigneewildcardid) | Filter by assignee presence. Incompatible with assigneeUsernames and assigneeUsername. | | <a id="userauthoredmergerequestsassigneewildcardid"></a>`assigneeWildcardId` | [`AssigneeWildcardId`](#assigneewildcardid) | Filter by assignee presence. Incompatible with assigneeUsernames and assigneeUsername. |
| <a id="userauthoredmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. Available only when the feature flag `filter_blob_path` is enabled. | | <a id="userauthoredmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. |
| <a id="userauthoredmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. | | <a id="userauthoredmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. |
| <a id="userauthoredmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. | | <a id="userauthoredmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. |
| <a id="userauthoredmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. | | <a id="userauthoredmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. |
@ -51526,7 +51526,7 @@ four standard [pagination arguments](#pagination-arguments):
| <a id="userreviewrequestedmergerequestsassigneeusernames"></a>`assigneeUsernames` | [`[String!]`](#string) | Usernames of users assigned to the merge request. | | <a id="userreviewrequestedmergerequestsassigneeusernames"></a>`assigneeUsernames` | [`[String!]`](#string) | Usernames of users assigned to the merge request. |
| <a id="userreviewrequestedmergerequestsassigneewildcardid"></a>`assigneeWildcardId` | [`AssigneeWildcardId`](#assigneewildcardid) | Filter by assignee presence. Incompatible with assigneeUsernames and assigneeUsername. | | <a id="userreviewrequestedmergerequestsassigneewildcardid"></a>`assigneeWildcardId` | [`AssigneeWildcardId`](#assigneewildcardid) | Filter by assignee presence. Incompatible with assigneeUsernames and assigneeUsername. |
| <a id="userreviewrequestedmergerequestsauthorusername"></a>`authorUsername` | [`String`](#string) | Username of the author. | | <a id="userreviewrequestedmergerequestsauthorusername"></a>`authorUsername` | [`String`](#string) | Username of the author. |
| <a id="userreviewrequestedmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. Available only when the feature flag `filter_blob_path` is enabled. | | <a id="userreviewrequestedmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. |
| <a id="userreviewrequestedmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. | | <a id="userreviewrequestedmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. |
| <a id="userreviewrequestedmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. | | <a id="userreviewrequestedmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. |
| <a id="userreviewrequestedmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. | | <a id="userreviewrequestedmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. |

View File

@ -377,6 +377,90 @@ To define the retry interval for failed namespaces:
(for example, `30m` (30 minutes), `2h` (two hours), or `1d` (one day)). (for example, `30m` (30 minutes), `2h` (two hours), or `1d` (one day)).
1. Select **Save changes**. 1. Select **Save changes**.
## Sizing recommendations
The following recommendations might be over-provisioned for some deployments.
You should monitor your deployment to ensure:
- No out-of-memory events occur.
- CPU throttling is not excessive.
- Indexing performance meets your requirements.
Adjust resources based on your specific workload characteristics, including:
- Repository size and complexity
- Number of active developers
- Frequency of code changes
- Indexing patterns
### Nodes
For optimal performance, proper sizing of Zoekt nodes is crucial.
Sizing recommendations differ between Kubernetes and VM deployments
due to how resources are allocated and managed.
#### Kubernetes deployments
The following table shows recommended resources for Kubernetes deployments
based on index storage requirements:
| Disk | Webserver CPU | Webserver memory | Indexer CPU | Indexer memory |
|--------|---------------|-------------------|-------------|----------------|
| 128 GB | 1 | 16 GiB | 1 | 6 GiB |
| 256 GB | 1.5 | 32 GiB | 1 | 8 GiB |
| 512 GB | 2 | 64 GiB | 1 | 12 GiB |
| 1 TB | 3 | 128 GiB | 1.5 | 24 GiB |
| 2 TB | 4 | 256 GiB | 2 | 32 GiB |
To manage resources more granularly, you can allocate
CPU and memory separately to different containers.
For Kubernetes deployments:
- Do not set CPU limits for Zoekt containers.
CPU limits might cause unnecessary throttling during indexing bursts,
which would significantly impact performance.
Instead, rely on resource requests to guarantee minimum CPU availability
and ensure containers use additional CPU when available and needed.
- Set appropriate memory limits to prevent resource contention
and out-of-memory conditions.
- Use high-performance storage classes for better indexing performance.
GitLab.com uses `pd-balanced` on GCP, which balances performance and cost.
Equivalent options include `gp3` on AWS and `Premium_LRS` on Azure.
#### VM and bare metal deployments
The following table shows recommended resources for VM and bare metal deployments
based on index storage requirements:
| Disk | VM size | Total CPU | Total memory | AWS | GCP | Azure |
|--------|----------|-----------|--------------|--------------|-----------------|-------|
| 128 GB | Small | 2 cores | 16 GB | `r5.large` | `n1-highmem-2` | `Standard_E2s_v3` |
| 256 GB | Medium | 4 cores | 32 GB | `r5.xlarge` | `n1-highmem-4` | `Standard_E4s_v3` |
| 512 GB | Large | 4 cores | 64 GB | `r5.2xlarge` | `n1-highmem-8` | `Standard_E8s_v3` |
| 1 TB | X-Large | 8 cores | 128 GB | `r5.4xlarge` | `n1-highmem-16` | `Standard_E16s_v3` |
| 2 TB | 2X-Large | 16 cores | 256 GB | `r5.8xlarge` | `n1-highmem-32` | `Standard_E32s_v3` |
You can allocate these resources only to the entire node.
For VM and bare metal deployments:
- Monitor CPU, memory, and disk usage to identify bottlenecks.
Both webserver and indexer processes share the same CPU and memory resources.
- Consider using SSD storage for better indexing performance.
- Ensure adequate network bandwidth for data transfer between GitLab and Zoekt nodes.
### Storage
Storage requirements for Zoekt vary significantly based on repository characteristics,
including the number of large and binary files.
As a starting point, you can estimate your Zoekt storage to be half your Gitaly storage.
For example, if your Gitaly storage is 1 TB, you might need approximately 500 GB of Zoekt storage.
To monitor the use of Zoekt nodes, see [check indexing status](#check-indexing-status).
If namespaces are not being indexed due to low disk space, consider adding or scaling up nodes.
## Run Zoekt on a separate server ## Run Zoekt on a separate server
{{< history >}} {{< history >}}

View File

@ -12,6 +12,7 @@ Choose and manage the subscription that's right for you and your organization.
- [GitLab plans](choosing_subscription.md) - [GitLab plans](choosing_subscription.md)
- [Manage subscription](manage_subscription.md) - [Manage subscription](manage_subscription.md)
- [Manage users and seats](manage_users_and_seats.md)
- [GitLab.com subscription](gitlab_com/_index.md) - [GitLab.com subscription](gitlab_com/_index.md)
- [GitLab Self-Managed subscription](self_managed/_index.md) - [GitLab Self-Managed subscription](self_managed/_index.md)
- [GitLab Dedicated](gitlab_dedicated/_index.md) - [GitLab Dedicated](gitlab_dedicated/_index.md)

View File

@ -14,5 +14,6 @@ Use these examples to instruct GitLab Duo.
- [Refactor legacy code](refactor_legacy_code.md) - [Refactor legacy code](refactor_legacy_code.md)
- [Generate tests](generate_tests.md) - [Generate tests](generate_tests.md)
- [Debug failing code](debug_failing_code.md) - [Debug failing code](debug_failing_code.md)
- [Analyze security vulnerabilities](analyze_vulnerabilities.md)
{{< /cards >}} {{< /cards >}}

View File

@ -0,0 +1,100 @@
---
stage: AI-powered
group: AI Framework
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://handbook.gitlab.com/handbook/product/ux/technical-writing/#assignments
description: Analyze security vulnerabilities and prioritize fixes based on business impact.
title: Analyze security vulnerabilities and prioritize fixes
---
Follow these guidelines when you need to evaluate multiple security vulnerabilities
and determine which ones require immediate attention.
- Time estimate: 15-25 minutes
- Level: Intermediate
- Prerequisites: GitLab Duo Enterprise add-on, vulnerabilities available in the vulnerability report
## The challenge
Security scans often generate numerous vulnerability alerts, making it difficult
to identify false positives and determine which issues pose the greatest business risk.
## The approach
Analyze vulnerabilities, assess business impact, and create prioritized remediation plans
by using GitLab Duo Chat, Vulnerability Explanation, and Vulnerability Resolution.
### Step 1: Explain vulnerabilities
Go to the vulnerability report for your project.
For each high or critical vulnerability, use Vulnerability Explanation to explain the issue. Then, use Duo Chat to ask follow-up questions.
```plaintext
Based on the earlier vulnerability explanation:
1. What specific security risk does this pose?
2. How could this be exploited in our [application_type]?
3. What data or systems could be compromised?
4. Is this a true positive or likely false positive?
5. What is the realistic business impact?
Consider our application stack: [technology_stack] and deployment environment: [environment_details].
```
Expected outcome: Clear explanation of each vulnerability's real-world impact and how it could be exploited.
### Step 2: Prioritize risks
Use GitLab Duo Chat to analyze multiple vulnerabilities together and create a priority matrix.
```plaintext
Based on these vulnerability explanations, help me prioritize fixes:
[paste_vulnerability_summaries]
Create a priority matrix considering:
1. Exploitability (how easy to exploit)
2. Business impact (what gets compromised)
3. Exposure level (public-facing vs internal)
4. Fix complexity (simple patch vs major changes)
Rank as Critical/High/Medium/Low priority with justification.
```
Expected outcome: Prioritized vulnerability list with business-focused risk assessment.
### Step 3: Generate fix plans
For high-priority vulnerabilities, use Vulnerability Resolution or Chat to get specific remediation guidance.
```plaintext
Provide a detailed remediation plan for this [vulnerability_type]:
1. Immediate steps to reduce risk
2. Code changes needed (with examples)
3. Configuration updates required
4. Testing approach to verify the fix
5. Timeline estimate for implementation
Focus on [security_framework] compliance and our [coding_standards].
```
Expected outcome: Actionable remediation plans with specific implementation steps.
## Tips
- Start with Critical and High severity vulnerabilities first.
- Use Vulnerability Explanation to understand the context before diving into fixes.
- Consider your specific application architecture when assessing business impact.
- Ask GitLab Duo Chat to explain technical terms or attack vectors you're unfamiliar with.
- Group similar vulnerabilities together for batch analysis and consistent fixes.
- Use the Security Dashboard to track progress on remediation efforts.
## Verify
Ensure that:
- Priority rankings reflect actual business risk, not just CVSS scores.
- Remediation plans include specific code examples and testing steps.
- False positives are clearly identified and documented.
- Critical vulnerabilities have immediate mitigation strategies identified.
- Fix timelines are realistic and account for testing and deployment processes.

View File

@ -110,6 +110,7 @@ To explore all public or internal groups:
{{< history >}} {{< history >}}
- **Member** tab [introduced](https://gitlab.com/groups/gitlab-org/-/epics/13781) in GitLab 18.2 [with a flag](../../administration/feature_flags/_index.md) named `your_work_groups_vue`. Disabled by default. - **Member** tab [introduced](https://gitlab.com/groups/gitlab-org/-/epics/13781) in GitLab 18.2 [with a flag](../../administration/feature_flags/_index.md) named `your_work_groups_vue`. Disabled by default.
- [Generally available](https://gitlab.com/gitlab-org/gitlab/-/issues/542790) in GitLab 18.3. Feature flag `your_work_groups_vue` removed.
{{< /history >}} {{< /history >}}
@ -123,8 +124,6 @@ This page shows groups that you are a member of through:
- Membership of a subgroup's parent group. - Membership of a subgroup's parent group.
- Direct or inherited membership of a project in the group or subgroup. - Direct or inherited membership of a project in the group or subgroup.
If the `your_work_groups_vue` feature flag is enabled, groups that you are a member of appear in the **Member** tab.
## View a group ## View a group
{{< history >}} {{< history >}}
@ -283,18 +282,18 @@ the deletion job will instead restore and unarchive the group, so the group will
{{< history >}} {{< history >}}
- **Inactive** tab [introduced](https://gitlab.com/groups/gitlab-org/-/epics/13781) in GitLab 18.2 [with a flag](../../administration/feature_flags/_index.md) named `your_work_groups_vue`. Disabled by default. - **Inactive** tab [introduced](https://gitlab.com/groups/gitlab-org/-/epics/13781) in GitLab 18.2 [with a flag](../../administration/feature_flags/_index.md) named `your_work_groups_vue`. Disabled by default.
- [Generally available](https://gitlab.com/gitlab-org/gitlab/-/issues/542790) in GitLab 18.3. Feature flag `your_work_groups_vue` removed.
{{< /history >}} {{< /history >}}
To view a list of the subgroups that are pending deletion in a group: To view a list of the groups that are pending deletion:
1. On the left sidebar, select **Search or go to** and find your group. 1. On the left sidebar, select **Search or go to** and find your group.
1. Select **Subgroups and projects**. 1. Select **View all my groups**.
1. Select the **Inactive** tab.
Groups that are marked for deletion are labeled **Pending deletion**. Groups that are marked for deletion are labeled **Pending deletion**.
If the `your_work_groups_vue` feature flag is enabled, groups marked for deletion appear in the **Inactive** tab.
## Delete a group immediately ## Delete a group immediately
{{< history >}} {{< history >}}

View File

@ -118,6 +118,7 @@ To create a permalink:
- [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/448868) in GitLab 17.10 [with a flag](../../../../administration/feature_flags/_index.md) named `filter_blob_path`. - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/448868) in GitLab 17.10 [with a flag](../../../../administration/feature_flags/_index.md) named `filter_blob_path`.
- [Enabled on GitLab.com](https://gitlab.com/gitlab-org/gitlab/-/issues/505449) in GitLab 17.11. - [Enabled on GitLab.com](https://gitlab.com/gitlab-org/gitlab/-/issues/505449) in GitLab 17.11.
- [Enabled on GitLab Self-Managed and GitLab Dedicated](https://gitlab.com/gitlab-org/gitlab/-/issues/505449) in GitLab 18.0. - [Enabled on GitLab Self-Managed and GitLab Dedicated](https://gitlab.com/gitlab-org/gitlab/-/issues/505449) in GitLab 18.0.
- [Generally available](https://gitlab.com/gitlab-org/gitlab/-/issues/539215) in GitLab 18.2. Feature flag `filter_blob_path` removed.
{{< /history >}} {{< /history >}}

View File

@ -136,6 +136,7 @@ module Banzai
node['href'] = new_href node['href'] = new_href
# the rich text editor needs to know what the original placeholders were # the rich text editor needs to know what the original placeholders were
node['data-canonical-src'] = href
node['data-placeholder'] = href node['data-placeholder'] = href
sanitize_link(node) sanitize_link(node)
@ -174,9 +175,9 @@ module Banzai
end end
node['data-src'] = new_url node['data-src'] = new_url
node['data-canonical-src'] = url
# the rich text editor needs to know what the original placeholders were # the rich text editor needs to know what the original placeholders were
node['data-canonical-src'] = url
node['data-placeholder'] = url node['data-placeholder'] = url
sanitize_link(node) sanitize_link(node)

View File

@ -53,10 +53,14 @@ module Gitlab
def trusted_ips def trusted_ips
strong_memoize(:trusted_ips) do strong_memoize(:trusted_ips) do
config.ip_whitelist.map do |proxy| trusted = config.ip_whitelist.map do |proxy|
IPAddr.new(proxy) IPAddr.new(proxy)
rescue IPAddr::InvalidAddressError rescue IPAddr::InvalidAddressError
end.compact end
trusted += trusted.compact.select(&:ipv4?).map(&:ipv4_mapped)
trusted.uniq
end end
end end
end end

View File

@ -3,18 +3,15 @@
module Gitlab module Gitlab
module Current module Current
class Organization class Organization
attr_reader :params, :user, :session attr_reader :params, :user
SESSION_KEY = :organization_id def initialize(params: {}, user: nil)
def initialize(params: {}, session: nil, user: nil)
@params = params @params = params
@user = user @user = user
@session = session
end end
def organization def organization
from_params || from_session || from_user || fallback_organization from_params || from_user || fallback_organization
end end
private private
@ -29,12 +26,6 @@ module Gitlab
::Organizations::Organization.with_user(user).first ::Organizations::Organization.with_user(user).first
end end
def from_session
return unless session.respond_to?(:[]) && session[SESSION_KEY]
::Organizations::Organization.find_by_id(session[SESSION_KEY])
end
def from_group_params def from_group_params
path = params[:namespace_id] || params[:group_id] path = params[:namespace_id] || params[:group_id]
path ||= params[:id] if params[:controller] == 'groups' path ||= params[:id] if params[:controller] == 'groups'

View File

@ -6054,7 +6054,7 @@ msgstr ""
msgid "AiPowered|Failed to disable GitLab Duo Workflow." msgid "AiPowered|Failed to disable GitLab Duo Workflow."
msgstr "" msgstr ""
msgid "AiPowered|Failed to enable GitLab Duo Workflow." msgid "AiPowered|Failed to enable GitLab Duo Agent Platform."
msgstr "" msgstr ""
msgid "AiPowered|Features are available. However, any group, subgroup, or project can turn them off." msgid "AiPowered|Features are available. However, any group, subgroup, or project can turn them off."
@ -6072,6 +6072,12 @@ msgstr ""
msgid "AiPowered|Get started with GitLab Duo Core" msgid "AiPowered|Get started with GitLab Duo Core"
msgstr "" msgstr ""
msgid "AiPowered|GitLab Duo Agent Platform is now on for the instance and the service account (%{accountId}) was created. To use Agent Platform in your groups, you must turn on AI features for specific groups."
msgstr ""
msgid "AiPowered|GitLab Duo Agent Platform is now on for the instance. To use Agent Platform in your groups, you must turn on AI features for specific groups."
msgstr ""
msgid "AiPowered|GitLab Duo Chat conversation expiration" msgid "AiPowered|GitLab Duo Chat conversation expiration"
msgstr "" msgstr ""
@ -6093,12 +6099,6 @@ msgstr ""
msgid "AiPowered|GitLab Duo Workflow has successfully been turned off." msgid "AiPowered|GitLab Duo Workflow has successfully been turned off."
msgstr "" msgstr ""
msgid "AiPowered|GitLab Duo Workflow is now on for the instance and the service account (%{accountId}) was created. To use Workflow in your groups, you must turn on AI features for specific groups."
msgstr ""
msgid "AiPowered|GitLab Duo Workflow is now on for the instance. To use Workflow in your groups, you must turn on AI features for specific groups."
msgstr ""
msgid "AiPowered|GitLab Duo availability" msgid "AiPowered|GitLab Duo availability"
msgstr "" msgstr ""
@ -42369,6 +42369,9 @@ msgstr ""
msgid "Notify|%{singular_or_plural_line} %{error_lines}: Work item type is not available. Please check your license and permissions." msgid "Notify|%{singular_or_plural_line} %{error_lines}: Work item type is not available. Please check your license and permissions."
msgstr "" msgstr ""
msgid "Notify|%{skipped_count} have used pipeline variables in the past. These projects' CI/CD settings were not updated as there is a risk the setting change would impact pipelines."
msgstr ""
msgid "Notify|%{strong_open}%{user_name}%{strong_close} updated the custom email address credentials for the Service Desk of %{project_link_start}%{project_name}%{project_link_end} and triggered the verification process." msgid "Notify|%{strong_open}%{user_name}%{strong_close} updated the custom email address credentials for the Service Desk of %{project_link_start}%{project_name}%{project_link_end} and triggered the verification process."
msgstr "" msgstr ""
@ -42381,9 +42384,18 @@ msgstr ""
msgid "Notify|%{updated_by_user_name} pushed new commits to merge request %{mr_link}" msgid "Notify|%{updated_by_user_name} pushed new commits to merge request %{mr_link}"
msgstr "" msgstr ""
msgid "Notify|%{updated_count} projects were not using pipeline variables. CI/CD settings were updated to prevent future pipeline variable usage."
msgstr ""
msgid "Notify|%{work_items} successfully imported." msgid "Notify|%{work_items} successfully imported."
msgstr "" msgstr ""
msgid "Notify|1 project has used pipeline variables in the past. This project's CI/CD settings were not updated as there is a risk the setting change would impact pipelines."
msgstr ""
msgid "Notify|1 project was not using pipeline variables. CI/CD settings were updated to prevent future pipeline variable usage."
msgstr ""
msgid "Notify|A new GPG key was added to your account:" msgid "Notify|A new GPG key was added to your account:"
msgstr "" msgstr ""
@ -42399,6 +42411,12 @@ msgstr ""
msgid "Notify|All discussions on merge request %{mr_link} were resolved by %{name}" msgid "Notify|All discussions on merge request %{mr_link} were resolved by %{name}"
msgstr "" msgstr ""
msgid "Notify|All projects in the %{group_name} group were checked for pipeline variables usage."
msgstr ""
msgid "Notify|All projects in this group have CI/CD setting set to prevent pipeline variable usage. 🎉"
msgstr ""
msgid "Notify|And %{total_stripped_new_commits_count} more" msgid "Notify|And %{total_stripped_new_commits_count} more"
msgstr "" msgstr ""
@ -42564,6 +42582,9 @@ msgstr ""
msgid "Notify|Project %{project_name} was exported successfully." msgid "Notify|Project %{project_name} was exported successfully."
msgstr "" msgstr ""
msgid "Notify|Projects that could not be updated need manual review. You can check the documentation for more information about the pipeline variable setting migration tool."
msgstr ""
msgid "Notify|Read timeout:" msgid "Notify|Read timeout:"
msgstr "" msgstr ""
@ -70873,6 +70894,9 @@ msgstr ""
msgid "WorkItems|Fields" msgid "WorkItems|Fields"
msgstr "" msgstr ""
msgid "WorkItems|How do I use statuses?"
msgstr ""
msgid "WorkItems|Open items in side panel" msgid "WorkItems|Open items in side panel"
msgstr "" msgstr ""

View File

@ -64,7 +64,7 @@
"@gitlab/favicon-overlay": "2.0.0", "@gitlab/favicon-overlay": "2.0.0",
"@gitlab/fonts": "^1.3.0", "@gitlab/fonts": "^1.3.0",
"@gitlab/query-language-rust": "0.13.1", "@gitlab/query-language-rust": "0.13.1",
"@gitlab/svgs": "3.138.0", "@gitlab/svgs": "3.141.0",
"@gitlab/ui": "115.5.0", "@gitlab/ui": "115.5.0",
"@gitlab/vue-router-vue3": "npm:vue-router@4.5.1", "@gitlab/vue-router-vue3": "npm:vue-router@4.5.1",
"@gitlab/vuex-vue3": "npm:vuex@4.1.0", "@gitlab/vuex-vue3": "npm:vuex@4.1.0",

View File

@ -43,7 +43,13 @@ module Gitlab
] ]
} }
}, },
gitlab: { "gitlab-exporter": { enabled: false } }, gitlab: {
"gitlab-exporter": { enabled: false },
"gitlab-shell": {
sshDaemon: 'gitlab-sshd',
config: { proxyProtocol: true }
}
},
redis: { metrics: { enabled: false } }, redis: { metrics: { enabled: false } },
prometheus: { install: false }, prometheus: { install: false },
certmanager: { install: false }, certmanager: { install: false },

View File

@ -72,7 +72,13 @@ RSpec.describe Gitlab::Orchestrator::Deployment::DefaultValues do
] ]
} }
}, },
gitlab: { "gitlab-exporter": { enabled: false } }, gitlab: {
"gitlab-exporter": { enabled: false },
"gitlab-shell": {
sshDaemon: 'gitlab-sshd',
config: { proxyProtocol: true }
}
},
redis: { metrics: { enabled: false } }, redis: { metrics: { enabled: false } },
prometheus: { install: false }, prometheus: { install: false },
certmanager: { install: false }, certmanager: { install: false },

View File

@ -10,7 +10,7 @@ module QA
element 'new-group-button' element 'new-group-button'
end end
view 'app/views/dashboard/groups/index.html.haml' do view 'app/assets/javascripts/groups/your_work/constants.js' do
element 'groups-empty-state' element 'groups-empty-state'
end end

View File

@ -12,6 +12,10 @@ module QA
base.class_eval do base.class_eval do
include QA::Page::SubMenus::CreateNewMenu include QA::Page::SubMenus::CreateNewMenu
view 'app/assets/javascripts/work_items/components/create_work_item_modal.vue' do
element 'new-work-item-modal-link'
end
end end
end end
@ -19,6 +23,9 @@ module QA
within_new_item_menu do within_new_item_menu do
click_element(:create_menu_item, create_menu_item: 'new_issue') click_element(:create_menu_item, create_menu_item: 'new_issue')
end end
# Click the "Open in full page" link if modal appears
click_element('new-work-item-modal-link') if has_element?('new-work-item-modal-link')
end end
def go_to_new_merge_request def go_to_new_merge_request

View File

@ -92,15 +92,13 @@ module QA
project.visit! project.visit!
Page::Project::Menu.perform(&:go_to_new_issue) Page::Project::Menu.perform(&:go_to_new_issue)
work_item_view_enabled = Page::Project::Issue::Show.perform(&:work_item_enabled?) work_item_view_enabled = Page::Project::Issue::Show.perform(&:work_item_enabled?)
if work_item_view_enabled
resource = Resource::WorkItem.fabricate_via_browser_ui! { |work_item| work_item.project = project }
index_page_type = Page::Project::Issue::Index index_page_type = Page::Project::Issue::Index
show_page_type = Page::Project::WorkItem::Show show_page_type = Page::Project::WorkItem::Show
resource = if work_item_view_enabled
Resource::WorkItem.fabricate_via_browser_ui! { |work_item| work_item.project = project }
else else
resource = Resource::Issue.fabricate_via_browser_ui! { |issue| issue.project = project } Resource::Issue.fabricate_via_browser_ui! { |issue| issue.project = project }
index_page_type = Page::Project::Issue::Index
show_page_type = Page::Project::Issue::Show
end end
[resource, index_page_type, show_page_type] [resource, index_page_type, show_page_type]

View File

@ -15,19 +15,6 @@ function update_tests_metadata() {
cleanup_individual_job_reports cleanup_individual_job_reports
} }
function retrieve_tests_mapping() {
local mapping_archive="${1:-$RSPEC_PACKED_TESTS_MAPPING_PATH}"
local mapping_path="${2:-$RSPEC_TESTS_MAPPING_PATH}"
mkdir -p $(dirname "$mapping_archive")
if [[ ! -f "${mapping_archive}" ]]; then
(curl --fail --location -o "${mapping_archive}.gz" "https://gitlab-org.gitlab.io/gitlab/${mapping_archive}.gz" && gzip -d "${mapping_archive}.gz") || echo "{}" > "${mapping_archive}"
fi
scripts/unpack-test-mapping "${mapping_archive}" "${mapping_path}"
}
function retrieve_frontend_fixtures_mapping() { function retrieve_frontend_fixtures_mapping() {
mkdir -p $(dirname "$FRONTEND_FIXTURES_MAPPING_PATH") mkdir -p $(dirname "$FRONTEND_FIXTURES_MAPPING_PATH")
@ -526,22 +513,6 @@ function rspec_fail_fast() {
fi fi
} }
function filter_rspec_matched_foss_tests() {
local matching_tests_file="${1}"
local foss_matching_tests_file="${2}"
# Keep only FOSS files that exists
cat ${matching_tests_file} | ruby -e 'puts $stdin.read.split(" ").select { |f| f.start_with?("spec/") && File.exist?(f) }.join(" ")' > "${foss_matching_tests_file}"
}
function filter_rspec_matched_ee_tests() {
local matching_tests_file="${1}"
local ee_matching_tests_file="${2}"
# Keep only EE files that exists
cat ${matching_tests_file} | ruby -e 'puts $stdin.read.split(" ").select { |f| f.start_with?("ee/spec/") && File.exist?(f) }.join(" ")' > "${ee_matching_tests_file}"
}
function generate_frontend_fixtures_mapping() { function generate_frontend_fixtures_mapping() {
local pattern="" local pattern=""

View File

@ -15,6 +15,11 @@ RSpec.describe Admin::GroupsController, :with_current_organization, feature_cate
let!(:group_2) { create(:group, name: 'Ygroup') } let!(:group_2) { create(:group, name: 'Ygroup') }
let!(:group_3) { create(:group, name: 'Jgroup', created_at: 2.days.ago, updated_at: 1.day.ago) } let!(:group_3) { create(:group, name: 'Jgroup', created_at: 2.days.ago, updated_at: 1.day.ago) }
before do
# This endpoint will become a no-op once the `admin_groups_vue` flag has been rolled out.
stub_feature_flags(admin_groups_vue: false)
end
render_views render_views
it 'lists available groups' do it 'lists available groups' do

View File

@ -1,7 +1,7 @@
# frozen_string_literal: true # frozen_string_literal: true
require 'spec_helper' require 'spec_helper'
RSpec.describe ApplicationController, :with_current_organization, feature_category: :shared do RSpec.describe ApplicationController, feature_category: :shared do
include TermsHelper include TermsHelper
let(:user) { create(:user) } let(:user) { create(:user) }
@ -68,11 +68,10 @@ RSpec.describe ApplicationController, :with_current_organization, feature_catego
def index; end def index; end
end end
it 'sets current organization and session' do it 'sets current organization' do
get :index, format: :json get :index, format: :json
expect(Current.organization).to eq(current_organization) expect(Current.organization).to eq(current_organization)
expect(session[Gitlab::Current::Organization::SESSION_KEY]).to eq(current_organization.id)
end end
context 'when multiple calls in one example are done' do context 'when multiple calls in one example are done' do

View File

@ -18,18 +18,6 @@ RSpec.describe 'Dashboard Group', :with_current_organization, :js, feature_categ
sign_in(user) sign_in(user)
end end
context 'when your_work_groups_vue feature flag is disabled' do
before do
stub_feature_flags(your_work_groups_vue: false)
end
it 'renders empty state' do
visit dashboard_groups_path
expect(page).to have_css '[data-testid="groups-empty-state"]'
end
end
it 'renders empty state' do it 'renders empty state' do
visit dashboard_groups_path visit dashboard_groups_path
@ -75,18 +63,6 @@ RSpec.describe 'Dashboard Group', :with_current_organization, :js, feature_categ
group.add_developer(user) group.add_developer(user)
end end
context 'when your_work_groups_vue feature flag is disabled' do
before do
stub_feature_flags(your_work_groups_vue: false)
end
it 'defaults sort dropdown to Created date' do
visit dashboard_groups_path
expect(page).to have_button('Created date')
end
end
it 'defaults sort dropdown to Updated date' do it 'defaults sort dropdown to Updated date' do
visit dashboard_groups_path visit dashboard_groups_path

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