Skip to content

Commit 0517c85

Browse files
author
GitLab Bot
committed
Add latest changes from gitlab-org/gitlab@master
1 parent 5bb3cef commit 0517c85

File tree

43 files changed

+746
-408
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+746
-408
lines changed

Gemfile.checksum

+11-11
Original file line numberDiff line numberDiff line change
@@ -427,17 +427,17 @@
427427
{"name":"nkf","version":"0.2.0","platform":"java","checksum":"3e6f022d1743a863bf05e936c7c2110be07ba1c593ea974df75d89e8bf7cc967"},
428428
{"name":"nkf","version":"0.2.0","platform":"ruby","checksum":"fbc151bda025451f627fafdfcb3f4f13d0b22ae11f58c6d3a2939c76c5f5f126"},
429429
{"name":"no_proxy_fix","version":"0.1.2","platform":"ruby","checksum":"4e9b4c31bb146de7fcf347dc1087bb13ac2039b56d50aa019e61036256abcd00"},
430-
{"name":"nokogiri","version":"1.18.6","platform":"aarch64-linux-gnu","checksum":"1b11f9a814068282cc2b47ebe61395b2a69d1918092d2ca3bd664074f72540e9"},
431-
{"name":"nokogiri","version":"1.18.6","platform":"aarch64-linux-musl","checksum":"797662f201c37a8feac3bd5b0c0e3447053bc71e6633d273fefd4c68b03e6a54"},
432-
{"name":"nokogiri","version":"1.18.6","platform":"arm-linux-gnu","checksum":"2da07a07ef4c9d9e9da809b3dc0937ed90b031e32c2c658d9918941b85d68b95"},
433-
{"name":"nokogiri","version":"1.18.6","platform":"arm-linux-musl","checksum":"e8ae1c9a4d8cfa7a92d632a6f596a88235ebe66d4b70418543378ba16c601f70"},
434-
{"name":"nokogiri","version":"1.18.6","platform":"arm64-darwin","checksum":"727a441d179d934b4b7c73e0e28e6723ee46463d96bb0cc6e2e33a13540962c4"},
435-
{"name":"nokogiri","version":"1.18.6","platform":"java","checksum":"bf16c53446987007ff3e1deb29d65d20444073ba112cb5bddbd2671135ba293c"},
436-
{"name":"nokogiri","version":"1.18.6","platform":"ruby","checksum":"4d283431d7829719ea1287ca388f24c6ce343af736bbcbd1365cbdb83bce41a4"},
437-
{"name":"nokogiri","version":"1.18.6","platform":"x64-mingw-ucrt","checksum":"134f6d54f56edd46cb6db77c9d9de1704b3f83b3981a6763671e3cfbeba221f5"},
438-
{"name":"nokogiri","version":"1.18.6","platform":"x86_64-darwin","checksum":"fb72568c97ccd90a8d68cb765b0ff0720b109bd62e3babbf372e854ef8fef995"},
439-
{"name":"nokogiri","version":"1.18.6","platform":"x86_64-linux-gnu","checksum":"df065db6ba6e1e80f76ef04f860fcf260cc24685125fe33cdc3d1572a1c66b71"},
440-
{"name":"nokogiri","version":"1.18.6","platform":"x86_64-linux-musl","checksum":"75ec7a93cec54687aa63b2eaf830dc4ac5b4f3d8c969f20c035e67c9e6a30cef"},
430+
{"name":"nokogiri","version":"1.18.7","platform":"aarch64-linux-gnu","checksum":"57a064ab5440814a69a0e040817bd8154adea68a30d2ff2b3aa515a6a06dbb5f"},
431+
{"name":"nokogiri","version":"1.18.7","platform":"aarch64-linux-musl","checksum":"3e442dc5b69376e84288295fe37cbb890a21ad816a7e571e5e9967b3c1e30cd3"},
432+
{"name":"nokogiri","version":"1.18.7","platform":"arm-linux-gnu","checksum":"337d9149deb5ae01022dff7c90f97bed81715fd586aacab0c5809ef933994c5e"},
433+
{"name":"nokogiri","version":"1.18.7","platform":"arm-linux-musl","checksum":"97a26edcc975f780a0822aaf7f7d7427c561067c1c9ee56bd3542960f0c28a6e"},
434+
{"name":"nokogiri","version":"1.18.7","platform":"arm64-darwin","checksum":"083abb2e9ed2646860f6b481a981485a658c6064caafaa81bf1cda1bada2e9d5"},
435+
{"name":"nokogiri","version":"1.18.7","platform":"java","checksum":"2cb83666f35619ec59d24d831bf492e49cfe27b112c222330ee929737f42f2eb"},
436+
{"name":"nokogiri","version":"1.18.7","platform":"ruby","checksum":"6b63ff5defe48f30d1d3b3122f65255ca91df2caf5378c6e0482ce73ff46fb31"},
437+
{"name":"nokogiri","version":"1.18.7","platform":"x64-mingw-ucrt","checksum":"681148fbc918aa5d54933d8b48aeb9462ab708d23409797ed750af961107f72b"},
438+
{"name":"nokogiri","version":"1.18.7","platform":"x86_64-darwin","checksum":"081d1aa517454ba3415304e2ea51fe411d6a3a809490d0c4aa42799cada417b7"},
439+
{"name":"nokogiri","version":"1.18.7","platform":"x86_64-linux-gnu","checksum":"3a0bf946eb2defde13d760f869b61bc8b0c18875afdd3cffa96543cfa3a18005"},
440+
{"name":"nokogiri","version":"1.18.7","platform":"x86_64-linux-musl","checksum":"9d83f8ec1fc37a305fa835d7ee61a4f37899e6ccc6dcb05be6645fa9797605af"},
441441
{"name":"notiffany","version":"0.1.3","platform":"ruby","checksum":"d37669605b7f8dcb04e004e6373e2a780b98c776f8eb503ac9578557d7808738"},
442442
{"name":"numerizer","version":"0.2.0","platform":"ruby","checksum":"e58076d5ee5370417b7e52d9cb25836d62acd1b8d9a194c308707986c1705d7b"},
443443
{"name":"oauth","version":"0.5.6","platform":"ruby","checksum":"4085fe28e0c5e2434135e00a6555294fd2a4ff96a98d1bdecdcd619fc6368dff"},

Gemfile.lock

+1-1
Original file line numberDiff line numberDiff line change
@@ -1217,7 +1217,7 @@ GEM
12171217
nio4r (2.7.0)
12181218
nkf (0.2.0)
12191219
no_proxy_fix (0.1.2)
1220-
nokogiri (1.18.6)
1220+
nokogiri (1.18.7)
12211221
mini_portile2 (~> 2.8.2)
12221222
racc (~> 1.4)
12231223
notiffany (0.1.3)

Gemfile.next.checksum

+11-11
Original file line numberDiff line numberDiff line change
@@ -430,17 +430,17 @@
430430
{"name":"nkf","version":"0.2.0","platform":"java","checksum":"3e6f022d1743a863bf05e936c7c2110be07ba1c593ea974df75d89e8bf7cc967"},
431431
{"name":"nkf","version":"0.2.0","platform":"ruby","checksum":"fbc151bda025451f627fafdfcb3f4f13d0b22ae11f58c6d3a2939c76c5f5f126"},
432432
{"name":"no_proxy_fix","version":"0.1.2","platform":"ruby","checksum":"4e9b4c31bb146de7fcf347dc1087bb13ac2039b56d50aa019e61036256abcd00"},
433-
{"name":"nokogiri","version":"1.18.6","platform":"aarch64-linux-gnu","checksum":"1b11f9a814068282cc2b47ebe61395b2a69d1918092d2ca3bd664074f72540e9"},
434-
{"name":"nokogiri","version":"1.18.6","platform":"aarch64-linux-musl","checksum":"797662f201c37a8feac3bd5b0c0e3447053bc71e6633d273fefd4c68b03e6a54"},
435-
{"name":"nokogiri","version":"1.18.6","platform":"arm-linux-gnu","checksum":"2da07a07ef4c9d9e9da809b3dc0937ed90b031e32c2c658d9918941b85d68b95"},
436-
{"name":"nokogiri","version":"1.18.6","platform":"arm-linux-musl","checksum":"e8ae1c9a4d8cfa7a92d632a6f596a88235ebe66d4b70418543378ba16c601f70"},
437-
{"name":"nokogiri","version":"1.18.6","platform":"arm64-darwin","checksum":"727a441d179d934b4b7c73e0e28e6723ee46463d96bb0cc6e2e33a13540962c4"},
438-
{"name":"nokogiri","version":"1.18.6","platform":"java","checksum":"bf16c53446987007ff3e1deb29d65d20444073ba112cb5bddbd2671135ba293c"},
439-
{"name":"nokogiri","version":"1.18.6","platform":"ruby","checksum":"4d283431d7829719ea1287ca388f24c6ce343af736bbcbd1365cbdb83bce41a4"},
440-
{"name":"nokogiri","version":"1.18.6","platform":"x64-mingw-ucrt","checksum":"134f6d54f56edd46cb6db77c9d9de1704b3f83b3981a6763671e3cfbeba221f5"},
441-
{"name":"nokogiri","version":"1.18.6","platform":"x86_64-darwin","checksum":"fb72568c97ccd90a8d68cb765b0ff0720b109bd62e3babbf372e854ef8fef995"},
442-
{"name":"nokogiri","version":"1.18.6","platform":"x86_64-linux-gnu","checksum":"df065db6ba6e1e80f76ef04f860fcf260cc24685125fe33cdc3d1572a1c66b71"},
443-
{"name":"nokogiri","version":"1.18.6","platform":"x86_64-linux-musl","checksum":"75ec7a93cec54687aa63b2eaf830dc4ac5b4f3d8c969f20c035e67c9e6a30cef"},
433+
{"name":"nokogiri","version":"1.18.7","platform":"aarch64-linux-gnu","checksum":"57a064ab5440814a69a0e040817bd8154adea68a30d2ff2b3aa515a6a06dbb5f"},
434+
{"name":"nokogiri","version":"1.18.7","platform":"aarch64-linux-musl","checksum":"3e442dc5b69376e84288295fe37cbb890a21ad816a7e571e5e9967b3c1e30cd3"},
435+
{"name":"nokogiri","version":"1.18.7","platform":"arm-linux-gnu","checksum":"337d9149deb5ae01022dff7c90f97bed81715fd586aacab0c5809ef933994c5e"},
436+
{"name":"nokogiri","version":"1.18.7","platform":"arm-linux-musl","checksum":"97a26edcc975f780a0822aaf7f7d7427c561067c1c9ee56bd3542960f0c28a6e"},
437+
{"name":"nokogiri","version":"1.18.7","platform":"arm64-darwin","checksum":"083abb2e9ed2646860f6b481a981485a658c6064caafaa81bf1cda1bada2e9d5"},
438+
{"name":"nokogiri","version":"1.18.7","platform":"java","checksum":"2cb83666f35619ec59d24d831bf492e49cfe27b112c222330ee929737f42f2eb"},
439+
{"name":"nokogiri","version":"1.18.7","platform":"ruby","checksum":"6b63ff5defe48f30d1d3b3122f65255ca91df2caf5378c6e0482ce73ff46fb31"},
440+
{"name":"nokogiri","version":"1.18.7","platform":"x64-mingw-ucrt","checksum":"681148fbc918aa5d54933d8b48aeb9462ab708d23409797ed750af961107f72b"},
441+
{"name":"nokogiri","version":"1.18.7","platform":"x86_64-darwin","checksum":"081d1aa517454ba3415304e2ea51fe411d6a3a809490d0c4aa42799cada417b7"},
442+
{"name":"nokogiri","version":"1.18.7","platform":"x86_64-linux-gnu","checksum":"3a0bf946eb2defde13d760f869b61bc8b0c18875afdd3cffa96543cfa3a18005"},
443+
{"name":"nokogiri","version":"1.18.7","platform":"x86_64-linux-musl","checksum":"9d83f8ec1fc37a305fa835d7ee61a4f37899e6ccc6dcb05be6645fa9797605af"},
444444
{"name":"notiffany","version":"0.1.3","platform":"ruby","checksum":"d37669605b7f8dcb04e004e6373e2a780b98c776f8eb503ac9578557d7808738"},
445445
{"name":"numerizer","version":"0.2.0","platform":"ruby","checksum":"e58076d5ee5370417b7e52d9cb25836d62acd1b8d9a194c308707986c1705d7b"},
446446
{"name":"oauth","version":"0.5.6","platform":"ruby","checksum":"4085fe28e0c5e2434135e00a6555294fd2a4ff96a98d1bdecdcd619fc6368dff"},

Gemfile.next.lock

+1-1
Original file line numberDiff line numberDiff line change
@@ -1234,7 +1234,7 @@ GEM
12341234
nio4r (2.7.0)
12351235
nkf (0.2.0)
12361236
no_proxy_fix (0.1.2)
1237-
nokogiri (1.18.6)
1237+
nokogiri (1.18.7)
12381238
mini_portile2 (~> 2.8.2)
12391239
racc (~> 1.4)
12401240
notiffany (0.1.3)

app/assets/javascripts/work_items/components/create_work_item.vue

+1-1
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import TitleSuggestions from '~/issues/new/components/title_suggestions.vue';
2424
import { addShortcutsExtension } from '~/behaviors/shortcuts';
2525
import ZenMode from '~/zen_mode';
2626
import ShortcutsWorkItems from '~/behaviors/shortcuts/shortcuts_work_items';
27+
import WorkItemDates from 'ee_else_ce/work_items/components/work_item_dates.vue';
2728
import {
2829
getDisplayReference,
2930
getNewWorkItemAutoSaveKey,
@@ -69,7 +70,6 @@ import WorkItemMilestone from './work_item_milestone.vue';
6970
import WorkItemParent from './work_item_parent.vue';
7071
import WorkItemLoading from './work_item_loading.vue';
7172
import WorkItemCrmContacts from './work_item_crm_contacts.vue';
72-
import WorkItemDates from './work_item_dates.vue';
7373
7474
export default {
7575
components: {

app/assets/javascripts/work_items/components/work_item_attributes_wrapper.vue

+2-1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
44
import { ListType } from '~/boards/constants';
55
import * as Sentry from '~/sentry/sentry_browser_wrapper';
66
7+
import WorkItemDates from 'ee_else_ce/work_items/components/work_item_dates.vue';
8+
79
import {
810
WIDGET_TYPE_ASSIGNEES,
911
WIDGET_TYPE_HEALTH_STATUS,
@@ -32,7 +34,6 @@ import WorkItemMilestone from './work_item_milestone.vue';
3234
import WorkItemParent from './work_item_parent.vue';
3335
import WorkItemTimeTracking from './work_item_time_tracking.vue';
3436
import WorkItemCrmContacts from './work_item_crm_contacts.vue';
35-
import WorkItemDates from './work_item_dates.vue';
3637
3738
export default {
3839
ListType,

app/assets/javascripts/work_items/components/work_item_dates.vue

+2-74
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<script>
2-
import { GlDatepicker, GlFormGroup, GlFormRadio } from '@gitlab/ui';
2+
import { GlDatepicker, GlFormGroup } from '@gitlab/ui';
33
import * as Sentry from '~/sentry/sentry_browser_wrapper';
44
import { findStartAndDueDateWidget, newWorkItemId } from '~/work_items/utils';
55
import { s__ } from '~/locale';
@@ -26,7 +26,6 @@ export default {
2626
components: {
2727
GlDatepicker,
2828
GlFormGroup,
29-
GlFormRadio,
3029
WorkItemSidebarWidget,
3130
},
3231
mixins: [Tracking.mixin()],
@@ -98,7 +97,7 @@ export default {
9897
tracking() {
9998
return {
10099
category: TRACKING_CATEGORY_SHOW,
101-
label: 'item_rolledup_dates',
100+
label: 'item_dates',
102101
property: `type_${this.workItemType}`,
103102
};
104103
},
@@ -165,57 +164,6 @@ export default {
165164
this.localDueDate = this.localStartDate;
166165
}
167166
},
168-
updateRollupType() {
169-
this.isUpdating = true;
170-
171-
this.track('updated_rollup_type');
172-
173-
if (this.workItemId === newWorkItemId(this.workItemType)) {
174-
this.$apollo.mutate({
175-
mutation: updateNewWorkItemMutation,
176-
variables: {
177-
input: {
178-
workItemType: this.workItemType,
179-
fullPath: this.fullPath,
180-
rolledUpDates: {
181-
isFixed: this.rollupType === ROLLUP_TYPE_FIXED,
182-
rollUp: this.shouldRollUp,
183-
},
184-
},
185-
},
186-
});
187-
188-
this.isUpdating = false;
189-
return;
190-
}
191-
192-
this.$apollo
193-
.mutate({
194-
mutation: updateWorkItemMutation,
195-
variables: {
196-
input: {
197-
id: this.workItemId,
198-
startAndDueDateWidget: {
199-
isFixed: this.rollupType === ROLLUP_TYPE_FIXED,
200-
},
201-
},
202-
},
203-
optimisticResponse: this.optimisticResponse,
204-
})
205-
.then(({ data }) => {
206-
if (data.workItemUpdate.errors.length) {
207-
throw new Error(data.workItemUpdate.errors.join('; '));
208-
}
209-
})
210-
.catch((error) => {
211-
const message = sprintfWorkItem(I18N_WORK_ITEM_ERROR_UPDATING, this.workItemType);
212-
this.$emit('error', message);
213-
Sentry.captureException(error);
214-
})
215-
.finally(() => {
216-
this.isUpdating = false;
217-
});
218-
},
219167
updateDates() {
220168
if (this.datesUnchanged) {
221169
return;
@@ -254,7 +202,6 @@ export default {
254202
input: {
255203
id: this.workItemId,
256204
startAndDueDateWidget: {
257-
isFixed: true,
258205
dueDate: this.localDueDate ? toISODateFormat(this.localDueDate) : null,
259206
startDate: this.localStartDate ? toISODateFormat(this.localStartDate) : null,
260207
},
@@ -291,25 +238,6 @@ export default {
291238
{{ s__('WorkItem|Dates') }}
292239
</template>
293240
<template #content>
294-
<fieldset v-if="shouldRollUp" class="gl-mt-2 gl-flex gl-gap-5">
295-
<legend class="gl-sr-only">{{ s__('WorkItem|Dates') }}</legend>
296-
<gl-form-radio
297-
v-model="rollupType"
298-
value="fixed"
299-
:disabled="!canUpdate || isUpdating"
300-
@change="updateRollupType"
301-
>
302-
{{ s__('WorkItem|Fixed') }}
303-
</gl-form-radio>
304-
<gl-form-radio
305-
v-model="rollupType"
306-
value="inherited"
307-
:disabled="!canUpdate || isUpdating"
308-
@change="updateRollupType"
309-
>
310-
{{ s__('WorkItem|Inherited') }}
311-
</gl-form-radio>
312-
</fieldset>
313241
<p class="gl-m-0 gl-py-1">
314242
<span class="gl-inline-block gl-min-w-8">{{ s__('WorkItem|Start') }}:</span>
315243
<span data-testid="start-date-value" :class="{ 'gl-text-subtle': !startDate }">

app/finders/ci/build_source_finder.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ def array_scope
6363
Ci::BuildSource
6464
.where(project_id: project.id)
6565
.loose_index_scan(column: :source)
66-
.select(:source).where(source: sources)
66+
.where(source: sources)
6767
end
6868

6969
def array_mapping_scope

app/models/concerns/loose_index_scan.rb

+26-10
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,15 @@ module LooseIndexScan
2828
# > User.where(id: distinct_authors)
2929
def loose_index_scan(column:, order: :asc)
3030
arel_table = self.arel_table
31-
arel_column = arel_table[column.to_s]
31+
32+
# Handle different column types
33+
arel_column, column_alias, column_for_select = extract_column_and_alias_and_select(column, arel_table)
3234

3335
cte = Gitlab::SQL::RecursiveCTE.new(:loose_index_scan_cte, union_args: { remove_order: false })
3436

3537
cte_query = except(:select)
36-
.select(column)
37-
.order(column => order)
38+
.select(column_for_select)
39+
.order(column_alias => order)
3840
.limit(1)
3941

4042
inner_query = except(:select)
@@ -43,24 +45,38 @@ def loose_index_scan(column:, order: :asc)
4345
cte << cte_query
4446

4547
inner_query = if order == :asc
46-
inner_query.where(arel_column.gt(cte.table[column.to_s]))
48+
inner_query.where(arel_column.gt(cte.table[column_alias]))
4749
else
48-
inner_query.where(arel_column.lt(cte.table[column.to_s]))
50+
inner_query.where(arel_column.lt(cte.table[column_alias]))
4951
end
5052

51-
inner_query = inner_query.order(column => order)
52-
.select(column)
53+
inner_query = inner_query
54+
.select(column_for_select)
55+
.order(column_alias => order)
5356
.limit(1)
5457

5558
cte << cte.table
56-
.project(Arel::Nodes::Grouping.new(Arel.sql(inner_query.to_sql)).as(column.to_s))
59+
.project(Arel::Nodes::Grouping.new(Arel.sql(inner_query.to_sql)).as(column_alias))
5760

5861
unscoped do
59-
select(column)
62+
select(column_alias)
6063
.with
6164
.recursive(cte.to_arel)
6265
.from(cte.alias_to(arel_table))
63-
.where(arel_column.not_eq(nil)) # filtering out the last NULL value
66+
.where.not(column_alias => nil) # filtering out the last NULL value
67+
end
68+
end
69+
70+
private
71+
72+
def extract_column_and_alias_and_select(column, arel_table)
73+
case column
74+
when Arel::Nodes::As
75+
[column.left, column.right, column]
76+
when Arel::Attributes::Attribute
77+
[column, column.name, column.name]
78+
else
79+
[arel_table[column.to_s], column.to_s, column.to_s]
6480
end
6581
end
6682
end

app/services/groups/update_service.rb

+5-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ def execute
2828
handle_changes
2929
handle_namespace_settings
3030
handle_hierarchy_cache_update
31-
group.assign_attributes(params)
31+
group.assign_attributes(params.except(*non_assignable_group_params))
3232

3333
return false if group.errors.present?
3434

@@ -225,6 +225,10 @@ def publish_event
225225

226226
Gitlab::EventStore.publish(event)
227227
end
228+
229+
def non_assignable_group_params
230+
[]
231+
end
228232
end
229233
end
230234

app/validators/json_schemas/application_setting_service_ping_settings.json

+4
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@
77
"gitlab_environment_toolkit_instance": {
88
"type": "boolean",
99
"description": "Indicates whether the instance was provisioned with the GitLab Environment Toolkit for Service Ping reporting."
10+
},
11+
"gitlab_product_usage_data_enabled": {
12+
"type": "boolean",
13+
"description": "Indicates whether the instance was provisioned with product usage data tracking."
1014
}
1115
}
1216
}

doc/administration/gitlab_duo_self_hosted/_index.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -62,9 +62,9 @@ The following table lists the GitLab Duo features, and whether they are availabl
6262
| [Root Cause Analysis](../../user/gitlab_duo_chat/examples.md#troubleshoot-failed-cicd-jobs-with-root-cause-analysis) | {{< icon name="check-circle-dashed" >}} Beta | GitLab 17.10 and later |
6363
| [Merge Commit Message Generation](../../user/project/merge_requests/duo_in_merge_requests.md#generate-a-merge-commit-message) | {{< icon name="check-circle-dashed" >}} Beta | GitLab 17.11 and later |
6464
| [Summarize New Merge Request](../../user/project/merge_requests/duo_in_merge_requests.md#generate-a-description-by-summarizing-code-changes) | {{< icon name="check-circle-dashed" >}} Beta | GitLab 17.11 and later |
65+
| [Vulnerability Explanation](../../user/application_security/vulnerabilities/_index.md#explaining-a-vulnerability) | {{< icon name="check-circle-dashed" >}} Beta | GitLab 17.11 and later |
6566
| [Discussion Summary](../../user/discussions/_index.md#summarize-issue-discussions-with-duo-chat) | {{< icon name="dash-circle" >}} No | Not applicable |
6667
| [GitLab Duo for the CLI](../../editor_extensions/gitlab_cli/_index.md#gitlab-duo-for-the-cli) | {{< icon name="dash-circle" >}} No | Not applicable |
67-
| [Vulnerability Explanation](../../user/application_security/vulnerabilities/_index.md#explaining-a-vulnerability) | {{< icon name="dash-circle" >}} No | Not applicable |
6868
| [Vulnerability Resolution](../../user/application_security/vulnerabilities/_index.md#vulnerability-resolution) | {{< icon name="dash-circle" >}} No | Not applicable |
6969

7070
#### Supported Duo Chat features

0 commit comments

Comments
 (0)