Add latest changes from gitlab-org/gitlab@master
This commit is contained in:
parent
b49ea2b72f
commit
9fe0324bb2
|
@ -247,7 +247,6 @@ variables:
|
|||
RSPEC_MATCHING_JS_FILES_PATH: rspec/js_matching_files.txt
|
||||
RSPEC_MATCHING_TESTS_EE_PATH: rspec/matching_tests-ee.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_ALT_PATH: crystalball/packed-mapping-alt.json
|
||||
RSPEC_PREDICTIVE_PIPELINE_TEMPLATE_YML: .gitlab/ci/rails/rspec-predictive.gitlab-ci.yml.erb
|
||||
|
|
|
@ -132,35 +132,27 @@ detect-tests:
|
|||
needs: []
|
||||
stage: prepare
|
||||
before_script:
|
||||
- source ./scripts/utils.sh
|
||||
- source ./scripts/rspec_helpers.sh
|
||||
# Use alternative coverage based mappings for tier-2 pipeline
|
||||
- |
|
||||
if echo "$CI_MERGE_REQUEST_LABELS" | grep -q "pipeline::tier-2"; then
|
||||
echo "Using alternative coverage based mappings"
|
||||
MAPPING_TYPE=coverage
|
||||
else
|
||||
echo "Using standard described_class based mappings"
|
||||
MAPPING_TYPE=described_class
|
||||
fi
|
||||
script:
|
||||
- |
|
||||
# $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
|
||||
mkdir -p $(dirname "$RSPEC_CHANGED_FILES_PATH")
|
||||
|
||||
tooling/bin/predictive_tests --ci --select-tests --with-crystalball-mappings --mapping-type $MAPPING_TYPE
|
||||
|
||||
filter_rspec_matched_foss_tests ${RSPEC_MATCHING_TEST_FILES_PATH} ${RSPEC_MATCHING_TESTS_FOSS_PATH};
|
||||
filter_rspec_matched_ee_tests ${RSPEC_MATCHING_TEST_FILES_PATH} ${RSPEC_MATCHING_TESTS_EE_PATH};
|
||||
|
||||
echoinfo 'Related FOSS RSpec tests:'
|
||||
echoinfo "$(tr ' ' '\n' < $RSPEC_MATCHING_TESTS_FOSS_PATH)"
|
||||
echo ""
|
||||
|
||||
echoinfo 'Related EE RSpec tests:'
|
||||
echoinfo "$(tr ' ' '\n' < $RSPEC_MATCHING_TESTS_EE_PATH)"
|
||||
echo ""
|
||||
tooling/bin/predictive_tests \
|
||||
--ci \
|
||||
--with-crystalball-mappings \
|
||||
--mapping-type $MAPPING_TYPE \
|
||||
--with-frontend-fixture-mappings \
|
||||
--frontend-fixtures-mapping-path $FRONTEND_FIXTURES_MAPPING_PATH \
|
||||
--matching-foss-rspec-test-files-path $RSPEC_MATCHING_TESTS_FOSS_PATH \
|
||||
--matching-ee-rspec-test-files-path $RSPEC_MATCHING_TESTS_EE_PATH \
|
||||
--matching-jest-test-files-path $RSPEC_MATCHING_JS_FILES_PATH \
|
||||
--changed-files-path $RSPEC_CHANGED_FILES_PATH
|
||||
fi
|
||||
artifacts:
|
||||
expire_in: 7d
|
||||
|
@ -170,7 +162,6 @@ detect-tests:
|
|||
- ${RSPEC_MATCHING_JS_FILES_PATH}
|
||||
- ${RSPEC_MATCHING_TESTS_EE_PATH}
|
||||
- ${RSPEC_MATCHING_TESTS_FOSS_PATH}
|
||||
- ${RSPEC_MATCHING_TEST_FILES_PATH}
|
||||
|
||||
detect-previous-failed-tests:
|
||||
extends:
|
||||
|
|
|
@ -82,35 +82,16 @@ export-predictive-test-metrics:
|
|||
dependencies: []
|
||||
variables:
|
||||
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:
|
||||
- source ./scripts/utils.sh
|
||||
- source ./scripts/rspec_helpers.sh
|
||||
- retrieve_failed_tests "${GLCI_PREDICTIVE_TEST_METRICS_OUTPUT_DIR}" "oneline" "latest"
|
||||
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:
|
||||
expire_in: 7d
|
||||
paths:
|
||||
- $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
|
||||
|
|
|
@ -45,6 +45,8 @@ instructions:
|
|||
fileFilters:
|
||||
- "spec/**/*_spec.rb"
|
||||
- "ee/spec/**/*_spec.rb"
|
||||
- "!spec/factories/**/*"
|
||||
- "!spec/support/**/*"
|
||||
instructions: |
|
||||
1. Test both happy paths and edge cases
|
||||
2. Include error scenarios
|
||||
|
|
2
Gemfile
2
Gemfile
|
@ -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
|
||||
|
||||
# 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 'apollo_upload_server', '~> 2.1.6', feature_category: :api
|
||||
|
||||
|
|
|
@ -292,7 +292,7 @@
|
|||
{"name":"grape-swagger-entity","version":"0.5.5","platform":"ruby","checksum":"a2a0eb28964b1a56775a3571358a9f0a300b703dbaee1ee535adb2a7bed7ece6"},
|
||||
{"name":"grape_logging","version":"1.8.4","platform":"ruby","checksum":"efcc3e322dbd5d620a68f078733b7db043cf12680144cd03c982f14115c792d1"},
|
||||
{"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":"grpc","version":"1.63.0","platform":"aarch64-linux","checksum":"dc75c5fd570b819470781d9512105dddfdd11d984f38b8e60bb946f92d1f79ee"},
|
||||
{"name":"grpc","version":"1.63.0","platform":"arm64-darwin","checksum":"91b93a354508a9d1772f095554f2e4c04358c2b32d7a670e3705b7fc4695c996"},
|
||||
|
|
|
@ -948,7 +948,7 @@ GEM
|
|||
grape
|
||||
rack
|
||||
graphlyte (1.0.0)
|
||||
graphql (2.4.13)
|
||||
graphql (2.5.11)
|
||||
base64
|
||||
fiber-storage
|
||||
logger
|
||||
|
@ -2205,7 +2205,7 @@ DEPENDENCIES
|
|||
grape-swagger-entity (~> 0.5.5)
|
||||
grape_logging (~> 1.8, >= 1.8.4)
|
||||
graphlyte (~> 1.0.0)
|
||||
graphql (= 2.4.13)
|
||||
graphql (= 2.5.11)
|
||||
graphql-docs (~> 5.0.0)
|
||||
grpc (= 1.63.0)
|
||||
gssapi (~> 1.3.1)
|
||||
|
|
|
@ -292,7 +292,7 @@
|
|||
{"name":"grape-swagger-entity","version":"0.5.5","platform":"ruby","checksum":"a2a0eb28964b1a56775a3571358a9f0a300b703dbaee1ee535adb2a7bed7ece6"},
|
||||
{"name":"grape_logging","version":"1.8.4","platform":"ruby","checksum":"efcc3e322dbd5d620a68f078733b7db043cf12680144cd03c982f14115c792d1"},
|
||||
{"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":"grpc","version":"1.63.0","platform":"aarch64-linux","checksum":"dc75c5fd570b819470781d9512105dddfdd11d984f38b8e60bb946f92d1f79ee"},
|
||||
{"name":"grpc","version":"1.63.0","platform":"arm64-darwin","checksum":"91b93a354508a9d1772f095554f2e4c04358c2b32d7a670e3705b7fc4695c996"},
|
||||
|
|
|
@ -942,7 +942,7 @@ GEM
|
|||
grape
|
||||
rack
|
||||
graphlyte (1.0.0)
|
||||
graphql (2.4.13)
|
||||
graphql (2.5.11)
|
||||
base64
|
||||
fiber-storage
|
||||
logger
|
||||
|
@ -2200,7 +2200,7 @@ DEPENDENCIES
|
|||
grape-swagger-entity (~> 0.5.5)
|
||||
grape_logging (~> 1.8, >= 1.8.4)
|
||||
graphlyte (~> 1.0.0)
|
||||
graphql (= 2.4.13)
|
||||
graphql (= 2.5.11)
|
||||
graphql-docs (~> 5.0.0)
|
||||
grpc (= 1.63.0)
|
||||
gssapi (~> 1.3.1)
|
||||
|
|
|
@ -9,7 +9,7 @@ import {
|
|||
import GroupsList from '~/vue_shared/components/groups_list/groups_list.vue';
|
||||
import { formatGraphQLGroups } from '~/vue_shared/components/groups_list/formatter';
|
||||
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 = {
|
||||
formatter: (groups) =>
|
||||
|
|
|
@ -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
|
||||
}
|
||||
}
|
|
@ -1,5 +1,6 @@
|
|||
#import "~/graphql_shared/fragments/group.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(
|
||||
$first: Int
|
||||
|
@ -22,9 +23,7 @@ query adminGroupsQuery(
|
|||
) {
|
||||
nodes {
|
||||
...Group
|
||||
projectStatistics {
|
||||
storageSize
|
||||
}
|
||||
...AdminGroup
|
||||
}
|
||||
pageInfo {
|
||||
...PageInfo
|
||||
|
|
|
@ -190,7 +190,10 @@ export const TOGGLE_MARKDOWN_PREVIEW = {
|
|||
// 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.
|
||||
// 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'],
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
|
@ -1,12 +1,15 @@
|
|||
import { DiffFile } from '~/rapid_diffs/diff_file';
|
||||
import { VIEWER_ADAPTERS } from '~/rapid_diffs/adapters';
|
||||
import { DiffFile } from '~/rapid_diffs/web_components/diff_file';
|
||||
import { VIEWER_ADAPTERS } from '~/rapid_diffs/app/adapters';
|
||||
|
||||
customElements.define('diff-file', DiffFile);
|
||||
customElements.define(
|
||||
'diff-file-mounted',
|
||||
class extends HTMLElement {
|
||||
connectedCallback() {
|
||||
this.parentElement.mount({ adapterConfig: VIEWER_ADAPTERS, observe: () => {} });
|
||||
this.parentElement.mount({
|
||||
adapterConfig: VIEWER_ADAPTERS,
|
||||
observe: () => {},
|
||||
});
|
||||
}
|
||||
},
|
||||
);
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
<script>
|
||||
import { GlIcon, GlSkeletonLoader } from '@gitlab/ui';
|
||||
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 { STATE_CLOSED, METADATA_KEYS } from '~/work_items/constants';
|
||||
import {
|
||||
|
@ -46,12 +46,10 @@ export default {
|
|||
return this.issue.dueDate || findStartAndDueDateWidget(this.issue)?.dueDate;
|
||||
},
|
||||
datesText() {
|
||||
if (this.startDate) {
|
||||
if (this.startDate || this.dueDate) {
|
||||
return humanTimeframe(newDate(this.startDate), newDate(this.dueDate));
|
||||
}
|
||||
if (this.dueDate) {
|
||||
return localeDateFormat.asDate.format(newDate(this.dueDate));
|
||||
}
|
||||
|
||||
return null;
|
||||
},
|
||||
isClosed() {
|
||||
|
|
|
@ -176,7 +176,7 @@ export function initPolling() {
|
|||
noteable_id: this.notesData.noteableId,
|
||||
},
|
||||
{
|
||||
connected() {
|
||||
connected: () => {
|
||||
this.fetchUpdatedNotes();
|
||||
},
|
||||
received(data) {
|
||||
|
|
|
@ -1,10 +1,3 @@
|
|||
import { initGroupsListWithFilteredSearch } from '~/groups/init_groups_list_with_filtered_search';
|
||||
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();
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
import initCommitActions from '~/projects/commit';
|
||||
import { initCommitBoxInfo } from '~/projects/commit_box/info';
|
||||
import { createRapidDiffsApp } from '~/rapid_diffs/app';
|
||||
import { createRapidDiffsApp } from '~/rapid_diffs';
|
||||
|
||||
initCommitBoxInfo();
|
||||
initCommitActions();
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
import initCompareSelector from '~/projects/compare';
|
||||
import { createRapidDiffsApp } from '~/rapid_diffs/app';
|
||||
import { createRapidDiffsApp } from '~/rapid_diffs';
|
||||
|
||||
initCompareSelector();
|
||||
|
||||
|
|
|
@ -7,7 +7,7 @@ import initPipelines from '~/commit/pipelines/pipelines_bundle';
|
|||
import MergeRequest from '~/merge_request';
|
||||
import CompareApp from '~/merge_requests/components/compare_app.vue';
|
||||
import { __ } from '~/locale';
|
||||
import { createRapidDiffsApp } from '~/rapid_diffs/app';
|
||||
import { createRapidDiffsApp } from '~/rapid_diffs';
|
||||
|
||||
const mrNewCompareNode = document.querySelector('.js-merge-request-new-compare');
|
||||
if (mrNewCompareNode) {
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import { initMrPage } from '~/pages/projects/merge_requests/page';
|
||||
import { createRapidDiffsApp } from '~/rapid_diffs/app';
|
||||
import { createRapidDiffsApp } from '~/rapid_diffs';
|
||||
|
||||
initMrPage(createRapidDiffsApp);
|
||||
|
|
|
@ -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';
|
|
@ -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],
|
||||
};
|
|
@ -1,4 +1,4 @@
|
|||
import { INVISIBLE, VISIBLE } from '~/rapid_diffs/events';
|
||||
import { INVISIBLE, VISIBLE } from '~/rapid_diffs/adapter_events';
|
||||
|
||||
const opposingSides = {
|
||||
old: 'new',
|
||||
|
@ -14,7 +14,7 @@ function disableDiffsSideHandler(e) {
|
|||
|
||||
const getBody = (diffElement) => diffElement.querySelector('[data-file-body]');
|
||||
|
||||
export const DisableDiffSideAdapter = {
|
||||
export const disableDiffSideAdapter = {
|
||||
[VISIBLE]() {
|
||||
this.sink.disableDiffsSideHandler = disableDiffsSideHandler.bind(this);
|
||||
getBody(this.diffElement).addEventListener('mousedown', this.sink.disableDiffsSideHandler);
|
|
@ -1,5 +1,5 @@
|
|||
import { getLines } from '~/rapid_diffs/expand_lines/get_lines';
|
||||
import { DiffLineRow } from '~/rapid_diffs/expand_lines/diff_line_row';
|
||||
import { getLines } from '~/rapid_diffs/adapters/expand_lines/get_lines';
|
||||
import { DiffLineRow } from '~/rapid_diffs/adapters/expand_lines/diff_line_row';
|
||||
import { createAlert } from '~/alert';
|
||||
import { s__ } from '~/locale';
|
||||
|
||||
|
@ -13,7 +13,7 @@ const getSurroundingLines = (hunkHeaderRow) => {
|
|||
return [lineBefore, lineAfter].map((lineRow) => (lineRow ? new DiffLineRow(lineRow) : null));
|
||||
};
|
||||
|
||||
export const ExpandLinesAdapter = {
|
||||
export const expandLinesAdapter = {
|
||||
clicks: {
|
||||
async expandLines(event, button) {
|
||||
const { expandDirection } = button.dataset;
|
|
@ -1,8 +1,8 @@
|
|||
import Vue from '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]() {
|
||||
const data = JSON.parse(this.diffElement.querySelector('[data-image-data]').dataset.imageData);
|
||||
// eslint-disable-next-line no-new
|
|
@ -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';
|
||||
|
||||
function disableScrollToLink(e) {
|
||||
|
@ -24,7 +24,7 @@ function disableScrollToLink(e) {
|
|||
|
||||
const getBody = (diffElement) => diffElement.querySelector('[data-file-body]');
|
||||
|
||||
export const LineLinkAdapter = {
|
||||
export const lineLinkAdapter = {
|
||||
[VISIBLE]() {
|
||||
this.sink.disableScrollToLink = disableScrollToLink.bind(this);
|
||||
getBody(this.diffElement).addEventListener('click', this.sink.disableScrollToLink);
|
|
@ -10,7 +10,7 @@ function htmlToElement(html) {
|
|||
return doc.body.firstChild;
|
||||
}
|
||||
|
||||
export const LoadFileAdapter = {
|
||||
export const loadFileAdapter = {
|
||||
clicks: {
|
||||
async showChanges(event, button) {
|
||||
const { parallelView, showWhitespace } = useDiffsView(pinia);
|
|
@ -6,7 +6,7 @@ function getMenuItems(container) {
|
|||
return JSON.parse(container.querySelector('script').textContent);
|
||||
}
|
||||
|
||||
export const OptionsMenuAdapter = {
|
||||
export const optionsMenuAdapter = {
|
||||
clicks: {
|
||||
toggleOptionsMenu(event, button) {
|
||||
const menuContainer = this.diffElement.querySelector('[data-options-menu]');
|
|
@ -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) {
|
||||
return root.querySelector('[data-file-body]');
|
||||
|
@ -32,7 +32,7 @@ function stopTransition(element) {
|
|||
});
|
||||
}
|
||||
|
||||
export const ToggleFileAdapter = {
|
||||
export const toggleFileAdapter = {
|
||||
clicks: {
|
||||
toggleFile(event, button) {
|
||||
const collapsed = this.diffElement.dataset.collapsed === 'true';
|
|
@ -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],
|
||||
};
|
|
@ -1,7 +1,7 @@
|
|||
import Vue from 'vue';
|
||||
import axios from '~/lib/utils/axios_utils';
|
||||
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 { generateTreeList } from '~/diffs/utils/tree_worker_utils';
|
||||
import { SET_TREE_DATA } from '~/diffs/store/mutation_types';
|
|
@ -1,20 +1,20 @@
|
|||
// eslint-disable-next-line max-classes-per-file
|
||||
import { pinia } from '~/pinia/instance';
|
||||
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 { initFileBrowser } from '~/rapid_diffs/app/init_file_browser';
|
||||
import { StreamingError } from '~/rapid_diffs/streaming_error';
|
||||
import { initFileBrowser } from '~/rapid_diffs/app/file_browser';
|
||||
import { StreamingError } from '~/rapid_diffs/web_components/streaming_error';
|
||||
import { useDiffsView } from '~/rapid_diffs/stores/diffs_view';
|
||||
import { initHiddenFilesWarning } from '~/rapid_diffs/app/init_hidden_files_warning';
|
||||
import { createAlert } from '~/alert';
|
||||
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 { VIEWER_ADAPTERS } from '~/rapid_diffs/adapters';
|
||||
import { VIEWER_ADAPTERS } from '~/rapid_diffs/app/adapters';
|
||||
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 { 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.
|
||||
// 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;
|
||||
|
||||
#DiffFileImplementation;
|
||||
#DiffFileMounted;
|
||||
|
||||
constructor({ DiffFileImplementation = DiffFile } = {}) {
|
||||
this.#DiffFileImplementation = DiffFileImplementation;
|
||||
this.#DiffFileMounted = createDiffFileMounted(this);
|
||||
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() {
|
||||
useDiffsView(pinia).diffsStatsEndpoint = this.appData.diffsStatsEndpoint;
|
||||
useDiffsView(pinia).streamUrl = this.appData.reloadStreamUrl;
|
||||
|
@ -155,7 +148,3 @@ export class RapidDiffsFacade {
|
|||
return this.appData.lazy;
|
||||
}
|
||||
}
|
||||
|
||||
export const createRapidDiffsApp = (options) => {
|
||||
return new RapidDiffsFacade(options);
|
||||
};
|
||||
|
|
|
@ -4,7 +4,7 @@ import { useDiffsView } from '~/rapid_diffs/stores/diffs_view';
|
|||
import { pinia } from '~/pinia/instance';
|
||||
import HiddenFilesWarning from '~/diffs/components/hidden_files_warning.vue';
|
||||
|
||||
export async function initHiddenFilesWarning(el) {
|
||||
export function initHiddenFilesWarning(el) {
|
||||
// eslint-disable-next-line no-new
|
||||
new Vue({
|
||||
el,
|
||||
|
|
|
@ -1,5 +0,0 @@
|
|||
import Vue from 'vue';
|
||||
import { createPinia, PiniaVuePlugin } from 'pinia';
|
||||
|
||||
Vue.use(PiniaVuePlugin);
|
||||
export const pinia = createPinia();
|
|
@ -3,8 +3,8 @@ import { mapState, mapActions } from 'pinia';
|
|||
import { parseBoolean } from '~/lib/utils/common_utils';
|
||||
import { useDiffsView } from '~/rapid_diffs/stores/diffs_view';
|
||||
import DiffAppControls from '~/diffs/components/diff_app_controls.vue';
|
||||
import { DiffFile } from '~/rapid_diffs/diff_file';
|
||||
import { COLLAPSE_FILE, EXPAND_FILE } from '~/rapid_diffs/events';
|
||||
import { DiffFile } from '~/rapid_diffs/web_components/diff_file';
|
||||
import { COLLAPSE_FILE, EXPAND_FILE } from '~/rapid_diffs/adapter_events';
|
||||
import { useDiffsList } from '~/rapid_diffs/stores/diffs_list';
|
||||
|
||||
const collapseAllFiles = () => {
|
||||
|
|
|
@ -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';
|
|
@ -0,0 +1,5 @@
|
|||
import { RapidDiffsFacade } from '~/rapid_diffs/app';
|
||||
|
||||
export const createRapidDiffsApp = (options) => {
|
||||
return new RapidDiffsFacade(options);
|
||||
};
|
|
@ -2,7 +2,7 @@ import { defineStore } from 'pinia';
|
|||
import { debounce } from 'lodash';
|
||||
import { renderHtmlStreams } from '~/streaming/render_html_streams';
|
||||
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';
|
||||
|
||||
export const statuses = {
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/** @typedef {import('./app/index.js').RapidDiffsFacade} */
|
||||
/** @typedef {import('../app').RapidDiffsFacade} */
|
||||
import { camelizeKeys } from '~/lib/utils/object_utils';
|
||||
import { DIFF_FILE_MOUNTED } from './dom_events';
|
||||
import * as events from './events';
|
||||
import { DIFF_FILE_MOUNTED } from '../dom_events';
|
||||
import * as events from '../adapter_events';
|
||||
|
||||
const eventNames = Object.values(events);
|
||||
const dataCacheKey = Symbol('data');
|
||||
|
@ -66,7 +66,7 @@ export class DiffFile extends HTMLElement {
|
|||
_trigger(event, ...args) {
|
||||
if (!eventNames.includes(event))
|
||||
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));
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
};
|
||||
};
|
|
@ -273,11 +273,7 @@ export default {
|
|||
class="gl-flex gl-flex-wrap gl-items-center gl-gap-3 gl-self-end"
|
||||
data-testid="blob-controls"
|
||||
>
|
||||
<open-mr-badge
|
||||
v-if="glFeatures.filterBlobPath"
|
||||
:project-path="projectPath"
|
||||
:blob-path="filePath"
|
||||
/>
|
||||
<open-mr-badge :project-path="projectPath" :blob-path="filePath" />
|
||||
<gl-button
|
||||
v-gl-tooltip.html="findFileTooltip"
|
||||
:title="findFileTooltip"
|
||||
|
|
|
@ -4,7 +4,9 @@ import {
|
|||
GlTooltipDirective,
|
||||
GlDisclosureDropdownGroup,
|
||||
GlDisclosureDropdownItem,
|
||||
GlLink,
|
||||
} from '@gitlab/ui';
|
||||
import { isMetaClick } from '~/lib/utils/common_utils';
|
||||
import { visitUrl } from '~/lib/utils/url_utility';
|
||||
import InviteMembersTrigger from '~/invite_members/components/invite_members_trigger.vue';
|
||||
import { __, s__ } from '~/locale';
|
||||
|
@ -13,9 +15,9 @@ import {
|
|||
TRIGGER_ELEMENT_DISCLOSURE_DROPDOWN,
|
||||
} from '~/invite_members/constants';
|
||||
import {
|
||||
BASE_ALLOWED_CREATE_TYPES,
|
||||
WORK_ITEM_TYPE_NAME_EPIC,
|
||||
CREATE_NEW_WORK_ITEM_MODAL,
|
||||
CREATE_NEW_GROUP_WORK_ITEM_MODAL,
|
||||
NAME_TO_TEXT_LOWERCASE_MAP,
|
||||
sprintfWorkItem,
|
||||
} from '~/work_items/constants';
|
||||
|
@ -30,6 +32,7 @@ export default {
|
|||
GlDisclosureDropdown,
|
||||
GlDisclosureDropdownGroup,
|
||||
GlDisclosureDropdownItem,
|
||||
GlLink,
|
||||
InviteMembersTrigger,
|
||||
CreateWorkItemModal: () => import('~/work_items/components/create_work_item_modal.vue'),
|
||||
},
|
||||
|
@ -39,7 +42,7 @@ export default {
|
|||
i18n: {
|
||||
createNew: __('Create new…'),
|
||||
},
|
||||
inject: ['isImpersonating', 'fullPath', 'workItemPlanningViewEnabled'],
|
||||
inject: ['isGroup', 'isImpersonating', 'fullPath', 'workItemPlanningViewEnabled'],
|
||||
props: {
|
||||
groups: {
|
||||
type: Array,
|
||||
|
@ -49,17 +52,27 @@ export default {
|
|||
data() {
|
||||
return {
|
||||
dropdownOpen: false,
|
||||
showCreateGroupWorkItemModal: false,
|
||||
showCreateWorkItemModal: false,
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
allowedWorkItemTypes() {
|
||||
if (this.isGroup) {
|
||||
return [];
|
||||
}
|
||||
return BASE_ALLOWED_CREATE_TYPES;
|
||||
},
|
||||
dropdownOffset() {
|
||||
return {
|
||||
mainAxis: DROPDOWN_Y_OFFSET,
|
||||
crossAxis: this.isImpersonating ? DROPDOWN_X_OFFSET_IMPERSONATING : DROPDOWN_X_OFFSET_BASE,
|
||||
};
|
||||
},
|
||||
preselectedWorkItemType() {
|
||||
return !this.workItemPlanningViewEnabled && this.isGroup
|
||||
? WORK_ITEM_TYPE_NAME_EPIC
|
||||
: undefined;
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
isInvitedMembers(groupItem) {
|
||||
|
@ -68,15 +81,24 @@ export default {
|
|||
isCreateWorkItem(groupItem) {
|
||||
return groupItem.component === CREATE_NEW_WORK_ITEM_MODAL;
|
||||
},
|
||||
isCreateGroupWorkItem(groupItem) {
|
||||
return groupItem.component === CREATE_NEW_GROUP_WORK_ITEM_MODAL;
|
||||
getCreateWorkItemItem(groupItem) {
|
||||
// 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() {
|
||||
if (this.workItemPlanningViewEnabled) {
|
||||
this.showCreateWorkItemModal = true;
|
||||
} else {
|
||||
this.showCreateGroupWorkItemModal = true;
|
||||
getCreateWorkItemHref(groupItem) {
|
||||
return this.workItemPlanningViewEnabled ? undefined : groupItem.href;
|
||||
},
|
||||
handleCreateWorkItemClick(event) {
|
||||
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) {
|
||||
// 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
|
||||
// before we can capture the event data
|
||||
this.showCreateGroupWorkItemModal = false;
|
||||
this.showCreateWorkItemModal = false;
|
||||
|
||||
const workItemType = NAME_TO_TEXT_LOWERCASE_MAP[workItem?.workItemType?.name];
|
||||
|
@ -134,40 +155,37 @@ export default {
|
|||
trigger-source="top_nav"
|
||||
: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
|
||||
v-else-if="isCreateWorkItem(groupItem)"
|
||||
:key="`${groupItem.text}-modal-trigger`"
|
||||
:item="groupItem"
|
||||
:item="getCreateWorkItemItem(groupItem)"
|
||||
data-testid="new-work-item-trigger"
|
||||
@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" />
|
||||
</template>
|
||||
</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
|
||||
v-if="showCreateWorkItemModal"
|
||||
visible
|
||||
hide-button
|
||||
data-testid="new-work-item-modal"
|
||||
:allowed-work-item-types="allowedWorkItemTypes"
|
||||
:always-show-work-item-type-select="!isGroup"
|
||||
:full-path="fullPath"
|
||||
hide-button
|
||||
:is-group="isGroup"
|
||||
:preselected-work-item-type="preselectedWorkItemType"
|
||||
visible
|
||||
data-testid="new-work-item-modal"
|
||||
@hideModal="showCreateWorkItemModal = false"
|
||||
@workItemCreated="handleWorkItemCreated"
|
||||
/>
|
||||
|
|
|
@ -14,13 +14,18 @@ export const availableGraphQLGroupActions = ({
|
|||
isSelfDeletionInProgress,
|
||||
isSelfDeletionScheduled,
|
||||
}) => {
|
||||
// No actions available when group deletion is in progress
|
||||
if (isSelfDeletionInProgress) {
|
||||
return [];
|
||||
}
|
||||
|
||||
const baseActions = [];
|
||||
|
||||
if (userPermissions.viewEditPage) {
|
||||
baseActions.push(ACTION_EDIT);
|
||||
}
|
||||
|
||||
if (userPermissions.removeGroup && isSelfDeletionScheduled && !isSelfDeletionInProgress) {
|
||||
if (userPermissions.removeGroup && isSelfDeletionScheduled) {
|
||||
baseActions.push(ACTION_RESTORE);
|
||||
}
|
||||
|
||||
|
@ -33,7 +38,7 @@ export const availableGraphQLGroupActions = ({
|
|||
if (!markedForDeletion) {
|
||||
baseActions.push(ACTION_DELETE);
|
||||
// Groups with self deletion scheduled can be deleted immediately
|
||||
} else if (isSelfDeletionScheduled && !isSelfDeletionInProgress) {
|
||||
} else if (isSelfDeletionScheduled) {
|
||||
baseActions.push(ACTION_DELETE_IMMEDIATELY);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -17,7 +17,6 @@ import {
|
|||
} from '../../constants';
|
||||
import workItemBulkUpdateMutation from '../../graphql/list/work_item_bulk_update.mutation.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 WorkItemBulkEditDropdown from './work_item_bulk_edit_dropdown.vue';
|
||||
import WorkItemBulkEditLabels from './work_item_bulk_edit_labels.vue';
|
||||
|
@ -84,7 +83,6 @@ export default {
|
|||
assigneeId: undefined,
|
||||
confidentiality: undefined,
|
||||
healthStatus: undefined,
|
||||
parentNamespaceId: undefined,
|
||||
removeLabelIds: [],
|
||||
state: undefined,
|
||||
subscription: undefined,
|
||||
|
@ -94,22 +92,6 @@ export default {
|
|||
};
|
||||
},
|
||||
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: {
|
||||
query: getAvailableBulkEditWidgets,
|
||||
variables() {
|
||||
|
@ -196,7 +178,7 @@ export default {
|
|||
mutation: workItemBulkUpdateMutation,
|
||||
variables: {
|
||||
input: {
|
||||
parentId: this.parentNamespaceId,
|
||||
fullPath: this.fullPath,
|
||||
ids: this.checkedItems.map((item) => item.id),
|
||||
labelsWidget: hasLabelsToUpdate
|
||||
? {
|
||||
|
|
|
@ -270,7 +270,7 @@ export default {
|
|||
mounted() {
|
||||
const DEFAULT_TEMPLATE_NAME = 'default';
|
||||
const templateNameFromRoute =
|
||||
this.$route.query[paramName] || this.$route.query[oldParamNameFromPreWorkItems];
|
||||
this.$route?.query[paramName] || this.$route?.query[oldParamNameFromPreWorkItems];
|
||||
const templateName = !this.isNewWorkItemRoute
|
||||
? DEFAULT_TEMPLATE_NAME
|
||||
: templateNameFromRoute || DEFAULT_TEMPLATE_NAME;
|
||||
|
@ -459,7 +459,7 @@ export default {
|
|||
return;
|
||||
}
|
||||
|
||||
const params = new URLSearchParams(this.$route.query);
|
||||
const params = new URLSearchParams(this.$route?.query);
|
||||
params.delete(paramName);
|
||||
params.delete(oldParamNameFromPreWorkItems);
|
||||
if (this.selectedTemplate && this.isNewWorkItemRoute) {
|
||||
|
|
|
@ -206,7 +206,6 @@ export const DEFAULT_EPIC_COLORS = '#1068bf';
|
|||
export const MAX_FREQUENT_PROJECTS = 3;
|
||||
export const MAX_FREQUENT_ITEMS = 3;
|
||||
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 WORK_ITEM_REFERENCE_CHAR = '#';
|
||||
|
|
|
@ -8,6 +8,9 @@ class Admin::GroupsController < Admin::ApplicationController
|
|||
feature_category :groups_and_projects, [:create, :destroy, :edit, :index, :members_update, :new, :show, :update]
|
||||
|
||||
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.search(safe_params[:name]) if safe_params[:name].present?
|
||||
@groups = @groups.page(pagination_params[:page])
|
||||
|
|
|
@ -548,11 +548,15 @@ class ApplicationController < BaseActionController
|
|||
auth_user if strong_memoized?(:auth_user)
|
||||
end
|
||||
|
||||
# Used by `set_current_organization` in BaseActionController
|
||||
def organization_params
|
||||
params.permit(
|
||||
:controller, :namespace_id, :group_id, :id, :organization_path
|
||||
)
|
||||
def set_current_organization
|
||||
return if ::Current.organization_assigned
|
||||
|
||||
::Current.organization = Gitlab::Current::Organization.new(
|
||||
params: params.permit(
|
||||
:controller, :namespace_id, :group_id, :id, :organization_path
|
||||
),
|
||||
user: current_user
|
||||
).organization
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -30,21 +30,6 @@ class BaseActionController < ActionController::Base
|
|||
connect_src_values = Array.wrap(default_connect_src) | [Gitlab::CurrentSettings.snowplow_collector_hostname]
|
||||
p.connect_src(*connect_src_values)
|
||||
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
|
||||
# rubocop:enable Gitlab/NamespacedClass
|
||||
# rubocop:enable Rails/ApplicationController
|
||||
|
|
|
@ -148,9 +148,8 @@ class Oauth::AuthorizationsController < Doorkeeper::AuthorizationsController
|
|||
) && !doorkeeper_application&.trusted?
|
||||
end
|
||||
|
||||
# Used by `set_current_organization` in BaseActionController
|
||||
def organization_params
|
||||
{}
|
||||
def set_current_organization
|
||||
::Current.organization = Gitlab::Current::Organization.new(user: current_user).organization
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -47,7 +47,6 @@ class Projects::BlobController < Projects::ApplicationController
|
|||
|
||||
before_action do
|
||||
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_frontend_feature_flag(:directory_code_dropdown_updates, current_user)
|
||||
push_frontend_feature_flag(:repository_file_tree_browser, @project)
|
||||
|
|
|
@ -19,7 +19,6 @@ class Projects::TreeController < Projects::ApplicationController
|
|||
|
||||
before_action do
|
||||
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_frontend_feature_flag(:directory_code_dropdown_updates, current_user)
|
||||
push_frontend_feature_flag(:repository_file_tree_browser, @project)
|
||||
|
|
|
@ -42,7 +42,6 @@ class ProjectsController < Projects::ApplicationController
|
|||
push_frontend_feature_flag(:edit_branch_rules, @project)
|
||||
# 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(:filter_blob_path, current_user)
|
||||
push_licensed_feature(:file_locks) if @project.present? && @project.licensed_feature_available?(:file_locks)
|
||||
push_frontend_feature_flag(:directory_code_dropdown_updates, current_user)
|
||||
|
||||
|
|
|
@ -22,8 +22,6 @@ module ResolvesMergeRequests
|
|||
args[:include_subgroups] = true
|
||||
end
|
||||
|
||||
args.delete(:blob_path) if Feature.disabled?(:filter_blob_path, current_user)
|
||||
|
||||
validate_blob_path!(args)
|
||||
|
||||
rewrite_param_name(args, :reviewer_wildcard_id, :reviewer_id)
|
||||
|
|
|
@ -90,7 +90,6 @@ module Resolvers
|
|||
description: <<~DESC
|
||||
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.
|
||||
DESC
|
||||
|
||||
argument :created_after, Types::TimeType,
|
||||
|
|
|
@ -61,7 +61,7 @@ module Nav
|
|||
::Gitlab::Nav::TopNavMenuItem.build(
|
||||
id: 'new_group_work_item',
|
||||
title: _('New work item'),
|
||||
component: 'create_new_group_work_item_modal',
|
||||
component: 'create_new_work_item_modal',
|
||||
data: {
|
||||
track_action: 'click_link_new_group_work_item',
|
||||
track_label: 'plus_menu_dropdown',
|
||||
|
@ -109,6 +109,7 @@ module Nav
|
|||
id: 'new_issue',
|
||||
title: _('New issue'),
|
||||
href: new_project_issue_path(project),
|
||||
component: 'create_new_work_item_modal',
|
||||
data: {
|
||||
track_action: 'click_link_new_issue',
|
||||
track_label: 'plus_menu_dropdown',
|
||||
|
|
|
@ -81,6 +81,18 @@ module Emails
|
|||
)
|
||||
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 = {})
|
||||
@message =
|
||||
Gitlab::Email::Message::RepositoryPush.new(self, project_id, opts)
|
||||
|
|
|
@ -253,6 +253,22 @@ class NotifyPreview < ActionMailer::Preview
|
|||
Notify.pipeline_fixed_email(pipeline, pipeline.user.try(:email))
|
||||
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
|
||||
Notify.pipeline_schedule_owner_unavailable_email(pipeline_schedule, user)
|
||||
end
|
||||
|
|
|
@ -13,11 +13,14 @@ module Ci
|
|||
return ServiceResponse.error(message: 'You are not authorized to perform this action') unless authorized?
|
||||
|
||||
updated_count = 0
|
||||
total_projects_with_pipeline_variables = 0
|
||||
|
||||
parent_group.self_and_descendants.each_batch do |group_batch|
|
||||
all_projects_ci_cd_settings = ProjectCiCdSetting.for_namespace(group_batch)
|
||||
.with_pipeline_variables_enabled
|
||||
|
||||
total_projects_with_pipeline_variables += all_projects_ci_cd_settings.count
|
||||
|
||||
all_projects_ci_cd_settings
|
||||
.each_batch(of: PROJECTS_BATCH_SIZE) do |ci_cd_settings|
|
||||
batch_updated_count =
|
||||
|
@ -29,7 +32,12 @@ module Ci
|
|||
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
|
||||
|
||||
private
|
||||
|
|
|
@ -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)) } }
|
|
@ -3,26 +3,5 @@
|
|||
= render_dashboard_ultimate_trial(current_user)
|
||||
= render_product_usage_data_collection_changes(current_user)
|
||||
|
||||
- if Feature.enabled?(:your_work_groups_vue, current_user)
|
||||
= render 'dashboard/groups_head'
|
||||
#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.")
|
||||
= render 'dashboard/groups_head'
|
||||
#js-your-work-groups-app{ data: { app_data: groups_list_with_filtered_search_app_data(dashboard_groups_path(format: :json)) } }
|
||||
|
|
|
@ -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.')
|
|
@ -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.
|
|
@ -28,6 +28,13 @@ module Ci
|
|||
return unless result.success?
|
||||
|
||||
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
|
||||
|
|
|
@ -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
|
|
@ -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
|
|
@ -8,20 +8,29 @@
|
|||
module Rack
|
||||
class Request
|
||||
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
|
||||
false
|
||||
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)
|
||||
rescue IPAddr::InvalidAddressError
|
||||
end.compact
|
||||
end
|
||||
|
||||
Rails.application.config.action_dispatch.trusted_proxies = (
|
||||
['127.0.0.1', '::1'] + gitlab_trusted_proxies)
|
||||
# Default to private IPs if no proxies configured.
|
||||
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.
|
||||
# Inspired by https://github.com/rails/rails/issues/5223#issuecomment-263778719
|
||||
|
|
|
@ -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
|
|
@ -0,0 +1 @@
|
|||
322a14c59203133addd60adada1e77b5b81e6ab540186756ef1b72304cf25959
|
|
@ -23019,7 +23019,8 @@ CREATE TABLE sbom_graph_paths (
|
|||
project_id bigint NOT NULL,
|
||||
path_length integer 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
|
||||
|
|
|
@ -21650,7 +21650,7 @@ four standard [pagination arguments](#pagination-arguments):
|
|||
| <a id="addonuserassignedmergerequestsapprovedby"></a>`approvedBy` | [`[String!]`](#string) | Usernames of the 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="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="addonuserassignedmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before 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="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="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="addonuserauthoredmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before 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="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="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="addonuserreviewrequestedmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before 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="autocompleteduserassignedmergerequestsapprover"></a>`approver` | [`[String!]`](#string) | Usernames of possible approvers. |
|
||||
| <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="autocompleteduserassignedmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before 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="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="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="autocompleteduserauthoredmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before 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="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="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="autocompleteduserreviewrequestedmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before 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="currentuserassignedmergerequestsapprover"></a>`approver` | [`[String!]`](#string) | Usernames of possible approvers. |
|
||||
| <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="currentuserassignedmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before 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="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="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="currentuserassigneeorreviewermergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before 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="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="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="currentuserauthoredmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before 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="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="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="currentuserreviewrequestedmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before 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="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="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="groupmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before 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="mergerequestassigneeassignedmergerequestsapprover"></a>`approver` | [`[String!]`](#string) | Usernames of possible approvers. |
|
||||
| <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="mergerequestassigneeassignedmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before 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="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="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="mergerequestassigneeauthoredmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before 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="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="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="mergerequestassigneereviewrequestedmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before 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="mergerequestauthorassignedmergerequestsapprover"></a>`approver` | [`[String!]`](#string) | Usernames of possible approvers. |
|
||||
| <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="mergerequestauthorassignedmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before 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="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="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="mergerequestauthorauthoredmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before 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="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="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="mergerequestauthorreviewrequestedmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before 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="mergerequestparticipantassignedmergerequestsapprover"></a>`approver` | [`[String!]`](#string) | Usernames of possible approvers. |
|
||||
| <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="mergerequestparticipantassignedmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before 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="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="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="mergerequestparticipantauthoredmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before 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="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="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="mergerequestparticipantreviewrequestedmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before 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="mergerequestreviewerassignedmergerequestsapprover"></a>`approver` | [`[String!]`](#string) | Usernames of possible approvers. |
|
||||
| <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="mergerequestreviewerassignedmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before 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="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="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="mergerequestreviewerauthoredmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before 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="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="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="mergerequestreviewerreviewrequestedmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before 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="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="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="projectmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before 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="usercoreassignedmergerequestsapprover"></a>`approver` | [`[String!]`](#string) | Usernames of possible approvers. |
|
||||
| <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="usercoreassignedmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before 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="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="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="usercoreauthoredmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before 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="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="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="usercorereviewrequestedmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before 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="userassignedmergerequestsapprover"></a>`approver` | [`[String!]`](#string) | Usernames of possible approvers. |
|
||||
| <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="userassignedmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before 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="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="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="userauthoredmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before 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="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="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="userreviewrequestedmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. |
|
||||
| <a id="userreviewrequestedmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. |
|
||||
|
|
|
@ -377,6 +377,90 @@ To define the retry interval for failed namespaces:
|
|||
(for example, `30m` (30 minutes), `2h` (two hours), or `1d` (one day)).
|
||||
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
|
||||
|
||||
{{< history >}}
|
||||
|
|
|
@ -12,6 +12,7 @@ Choose and manage the subscription that's right for you and your organization.
|
|||
|
||||
- [GitLab plans](choosing_subscription.md)
|
||||
- [Manage subscription](manage_subscription.md)
|
||||
- [Manage users and seats](manage_users_and_seats.md)
|
||||
- [GitLab.com subscription](gitlab_com/_index.md)
|
||||
- [GitLab Self-Managed subscription](self_managed/_index.md)
|
||||
- [GitLab Dedicated](gitlab_dedicated/_index.md)
|
||||
|
|
|
@ -14,5 +14,6 @@ Use these examples to instruct GitLab Duo.
|
|||
- [Refactor legacy code](refactor_legacy_code.md)
|
||||
- [Generate tests](generate_tests.md)
|
||||
- [Debug failing code](debug_failing_code.md)
|
||||
- [Analyze security vulnerabilities](analyze_vulnerabilities.md)
|
||||
|
||||
{{< /cards >}}
|
||||
|
|
|
@ -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.
|
|
@ -110,6 +110,7 @@ To explore all public or internal groups:
|
|||
{{< 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.
|
||||
- [Generally available](https://gitlab.com/gitlab-org/gitlab/-/issues/542790) in GitLab 18.3. Feature flag `your_work_groups_vue` removed.
|
||||
|
||||
{{< /history >}}
|
||||
|
||||
|
@ -123,8 +124,6 @@ This page shows groups that you are a member of through:
|
|||
- Membership of a subgroup's parent group.
|
||||
- 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
|
||||
|
||||
{{< history >}}
|
||||
|
@ -283,18 +282,18 @@ the deletion job will instead restore and unarchive the group, so the group will
|
|||
{{< 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.
|
||||
- [Generally available](https://gitlab.com/gitlab-org/gitlab/-/issues/542790) in GitLab 18.3. Feature flag `your_work_groups_vue` removed.
|
||||
|
||||
{{< /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. 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**.
|
||||
|
||||
If the `your_work_groups_vue` feature flag is enabled, groups marked for deletion appear in the **Inactive** tab.
|
||||
|
||||
## Delete a group immediately
|
||||
|
||||
{{< history >}}
|
||||
|
|
|
@ -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`.
|
||||
- [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.
|
||||
- [Generally available](https://gitlab.com/gitlab-org/gitlab/-/issues/539215) in GitLab 18.2. Feature flag `filter_blob_path` removed.
|
||||
|
||||
{{< /history >}}
|
||||
|
||||
|
|
|
@ -136,6 +136,7 @@ module Banzai
|
|||
node['href'] = new_href
|
||||
|
||||
# the rich text editor needs to know what the original placeholders were
|
||||
node['data-canonical-src'] = href
|
||||
node['data-placeholder'] = href
|
||||
|
||||
sanitize_link(node)
|
||||
|
@ -174,9 +175,9 @@ module Banzai
|
|||
end
|
||||
|
||||
node['data-src'] = new_url
|
||||
node['data-canonical-src'] = url
|
||||
|
||||
# the rich text editor needs to know what the original placeholders were
|
||||
node['data-canonical-src'] = url
|
||||
node['data-placeholder'] = url
|
||||
|
||||
sanitize_link(node)
|
||||
|
|
|
@ -53,10 +53,14 @@ module Gitlab
|
|||
|
||||
def trusted_ips
|
||||
strong_memoize(:trusted_ips) do
|
||||
config.ip_whitelist.map do |proxy|
|
||||
trusted = config.ip_whitelist.map do |proxy|
|
||||
IPAddr.new(proxy)
|
||||
rescue IPAddr::InvalidAddressError
|
||||
end.compact
|
||||
end
|
||||
|
||||
trusted += trusted.compact.select(&:ipv4?).map(&:ipv4_mapped)
|
||||
|
||||
trusted.uniq
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -3,18 +3,15 @@
|
|||
module Gitlab
|
||||
module Current
|
||||
class Organization
|
||||
attr_reader :params, :user, :session
|
||||
attr_reader :params, :user
|
||||
|
||||
SESSION_KEY = :organization_id
|
||||
|
||||
def initialize(params: {}, session: nil, user: nil)
|
||||
def initialize(params: {}, user: nil)
|
||||
@params = params
|
||||
@user = user
|
||||
@session = session
|
||||
end
|
||||
|
||||
def organization
|
||||
from_params || from_session || from_user || fallback_organization
|
||||
from_params || from_user || fallback_organization
|
||||
end
|
||||
|
||||
private
|
||||
|
@ -29,12 +26,6 @@ module Gitlab
|
|||
::Organizations::Organization.with_user(user).first
|
||||
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
|
||||
path = params[:namespace_id] || params[:group_id]
|
||||
path ||= params[:id] if params[:controller] == 'groups'
|
||||
|
|
|
@ -6054,7 +6054,7 @@ msgstr ""
|
|||
msgid "AiPowered|Failed to disable GitLab Duo Workflow."
|
||||
msgstr ""
|
||||
|
||||
msgid "AiPowered|Failed to enable GitLab Duo Workflow."
|
||||
msgid "AiPowered|Failed to enable GitLab Duo Agent Platform."
|
||||
msgstr ""
|
||||
|
||||
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"
|
||||
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"
|
||||
msgstr ""
|
||||
|
||||
|
@ -6093,12 +6099,6 @@ msgstr ""
|
|||
msgid "AiPowered|GitLab Duo Workflow has successfully been turned off."
|
||||
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"
|
||||
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."
|
||||
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."
|
||||
msgstr ""
|
||||
|
||||
|
@ -42381,9 +42384,18 @@ msgstr ""
|
|||
msgid "Notify|%{updated_by_user_name} pushed new commits to merge request %{mr_link}"
|
||||
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."
|
||||
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:"
|
||||
msgstr ""
|
||||
|
||||
|
@ -42399,6 +42411,12 @@ msgstr ""
|
|||
msgid "Notify|All discussions on merge request %{mr_link} were resolved by %{name}"
|
||||
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"
|
||||
msgstr ""
|
||||
|
||||
|
@ -42564,6 +42582,9 @@ msgstr ""
|
|||
msgid "Notify|Project %{project_name} was exported successfully."
|
||||
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:"
|
||||
msgstr ""
|
||||
|
||||
|
@ -70873,6 +70894,9 @@ msgstr ""
|
|||
msgid "WorkItems|Fields"
|
||||
msgstr ""
|
||||
|
||||
msgid "WorkItems|How do I use statuses?"
|
||||
msgstr ""
|
||||
|
||||
msgid "WorkItems|Open items in side panel"
|
||||
msgstr ""
|
||||
|
||||
|
|
|
@ -64,7 +64,7 @@
|
|||
"@gitlab/favicon-overlay": "2.0.0",
|
||||
"@gitlab/fonts": "^1.3.0",
|
||||
"@gitlab/query-language-rust": "0.13.1",
|
||||
"@gitlab/svgs": "3.138.0",
|
||||
"@gitlab/svgs": "3.141.0",
|
||||
"@gitlab/ui": "115.5.0",
|
||||
"@gitlab/vue-router-vue3": "npm:vue-router@4.5.1",
|
||||
"@gitlab/vuex-vue3": "npm:vuex@4.1.0",
|
||||
|
|
|
@ -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 } },
|
||||
prometheus: { install: false },
|
||||
certmanager: { install: false },
|
||||
|
|
|
@ -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 } },
|
||||
prometheus: { install: false },
|
||||
certmanager: { install: false },
|
||||
|
|
|
@ -10,7 +10,7 @@ module QA
|
|||
element 'new-group-button'
|
||||
end
|
||||
|
||||
view 'app/views/dashboard/groups/index.html.haml' do
|
||||
view 'app/assets/javascripts/groups/your_work/constants.js' do
|
||||
element 'groups-empty-state'
|
||||
end
|
||||
|
||||
|
|
|
@ -12,6 +12,10 @@ module QA
|
|||
|
||||
base.class_eval do
|
||||
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
|
||||
|
||||
|
@ -19,6 +23,9 @@ module QA
|
|||
within_new_item_menu do
|
||||
click_element(:create_menu_item, create_menu_item: 'new_issue')
|
||||
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
|
||||
|
||||
def go_to_new_merge_request
|
||||
|
|
|
@ -92,16 +92,14 @@ module QA
|
|||
project.visit!
|
||||
Page::Project::Menu.perform(&:go_to_new_issue)
|
||||
work_item_view_enabled = Page::Project::Issue::Show.perform(&:work_item_enabled?)
|
||||
index_page_type = Page::Project::Issue::Index
|
||||
show_page_type = Page::Project::WorkItem::Show
|
||||
|
||||
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
|
||||
show_page_type = Page::Project::WorkItem::Show
|
||||
else
|
||||
resource = 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
|
||||
resource = if work_item_view_enabled
|
||||
Resource::WorkItem.fabricate_via_browser_ui! { |work_item| work_item.project = project }
|
||||
else
|
||||
Resource::Issue.fabricate_via_browser_ui! { |issue| issue.project = project }
|
||||
end
|
||||
|
||||
[resource, index_page_type, show_page_type]
|
||||
end
|
||||
|
|
|
@ -15,19 +15,6 @@ function update_tests_metadata() {
|
|||
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() {
|
||||
mkdir -p $(dirname "$FRONTEND_FIXTURES_MAPPING_PATH")
|
||||
|
||||
|
@ -526,22 +513,6 @@ function rspec_fail_fast() {
|
|||
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() {
|
||||
local pattern=""
|
||||
|
||||
|
|
|
@ -15,6 +15,11 @@ RSpec.describe Admin::GroupsController, :with_current_organization, feature_cate
|
|||
let!(:group_2) { create(:group, name: 'Ygroup') }
|
||||
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
|
||||
|
||||
it 'lists available groups' do
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
# frozen_string_literal: true
|
||||
require 'spec_helper'
|
||||
|
||||
RSpec.describe ApplicationController, :with_current_organization, feature_category: :shared do
|
||||
RSpec.describe ApplicationController, feature_category: :shared do
|
||||
include TermsHelper
|
||||
|
||||
let(:user) { create(:user) }
|
||||
|
@ -68,11 +68,10 @@ RSpec.describe ApplicationController, :with_current_organization, feature_catego
|
|||
def index; end
|
||||
end
|
||||
|
||||
it 'sets current organization and session' do
|
||||
it 'sets current organization' do
|
||||
get :index, format: :json
|
||||
|
||||
expect(Current.organization).to eq(current_organization)
|
||||
expect(session[Gitlab::Current::Organization::SESSION_KEY]).to eq(current_organization.id)
|
||||
end
|
||||
|
||||
context 'when multiple calls in one example are done' do
|
||||
|
|
|
@ -18,18 +18,6 @@ RSpec.describe 'Dashboard Group', :with_current_organization, :js, feature_categ
|
|||
sign_in(user)
|
||||
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
|
||||
visit dashboard_groups_path
|
||||
|
||||
|
@ -75,18 +63,6 @@ RSpec.describe 'Dashboard Group', :with_current_organization, :js, feature_categ
|
|||
group.add_developer(user)
|
||||
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
|
||||
visit dashboard_groups_path
|
||||
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue