diff --git a/app/assets/javascripts/ci/runner/components/cells/runner_summary_field.vue b/app/assets/javascripts/ci/runner/components/cells/runner_summary_field.vue index 5ed987d28e7..23ea9e735b9 100644 --- a/app/assets/javascripts/ci/runner/components/cells/runner_summary_field.vue +++ b/app/assets/javascripts/ci/runner/components/cells/runner_summary_field.vue @@ -27,7 +27,7 @@ export default {
{{ prompt }} {{ line }}+ >{{ prompt }} {{ line }}
'.html_safe, code_close: ''.html_safe }
diff --git a/app/views/shared/doorkeeper/applications/_form.html.haml b/app/views/shared/doorkeeper/applications/_form.html.haml
index f24606317ff..5f1571fa166 100644
--- a/app/views/shared/doorkeeper/applications/_form.html.haml
+++ b/app/views/shared/doorkeeper/applications/_form.html.haml
@@ -1,6 +1,6 @@
- show_cancel_button = local_assigns.fetch(:cancel, false)
-= gitlab_ui_form_for @application, url: url, html: { role: 'form', class: 'doorkeeper-app-form gl-max-w-80' } do |f|
+= gitlab_ui_form_for @application, url: url, html: { role: 'form', class: 'doorkeeper-app-form gl-max-w-80 gl-display-inline-block' } do |f|
= form_errors(@application)
.form-group
diff --git a/app/views/shared/doorkeeper/applications/_index.html.haml b/app/views/shared/doorkeeper/applications/_index.html.haml
index c1aeff9acee..c4d4e46b578 100644
--- a/app/views/shared/doorkeeper/applications/_index.html.haml
+++ b/app/views/shared/doorkeeper/applications/_index.html.haml
@@ -16,7 +16,7 @@
- else
= _("Manage applications that you've authorized to use your account.")
- if oauth_applications_enabled
- = render Pajamas::CardComponent.new(card_options: { class: 'gl-new-card oauth-applications js-toggle-container' }, header_options: { class: 'gl-new-card-header' }, body_options: { class: 'gl-new-card-body gl-px-0' }) do |c|
+ = render Pajamas::CardComponent.new(card_options: { class: 'gl-new-card js-toggle-container', data: { testid: 'oauth-applications' }}, header_options: { class: 'gl-new-card-header' }, body_options: { class: 'gl-new-card-body gl-px-0' }) do |c|
- c.with_header do
.gl-new-card-title-wrapper
%h3.gl-new-card-title
@@ -41,7 +41,7 @@
%th= _('Name')
%th= _('Callback URL')
%th= _('Clients')
- %th.last-heading
+ %th.gl-w-4
%tbody
- @applications.each do |application|
%tr{ id: "application_#{application.id}" }
diff --git a/config/metrics/counts_28d/20220922042106_users_updating_work_item_iteration_monthly.yml b/config/metrics/counts_28d/20220922042106_users_updating_work_item_iteration_monthly.yml
index 8ab0b5b4065..7925b7d38ac 100644
--- a/config/metrics/counts_28d/20220922042106_users_updating_work_item_iteration_monthly.yml
+++ b/config/metrics/counts_28d/20220922042106_users_updating_work_item_iteration_monthly.yml
@@ -3,7 +3,7 @@ key_path: redis_hll_counters.work_items.users_updating_work_item_iteration_month
description: Unique users updating a work item's iteration
product_section: team planning
product_stage: dev
-product_group: plan
+product_group: project_management
value_type: number
status: active
milestone: "15.5"
diff --git a/config/metrics/counts_7d/20220922042528_users_updating_work_item_iteration_weekly.yml b/config/metrics/counts_7d/20220922042528_users_updating_work_item_iteration_weekly.yml
index bef6622bfdd..aed26e847f1 100644
--- a/config/metrics/counts_7d/20220922042528_users_updating_work_item_iteration_weekly.yml
+++ b/config/metrics/counts_7d/20220922042528_users_updating_work_item_iteration_weekly.yml
@@ -3,7 +3,7 @@ key_path: redis_hll_counters.work_items.users_updating_work_item_iteration_weekl
description: Unique users updating a work item's iteration
product_section: team planning
product_stage: dev
-product_group: plan
+product_group: project_management
value_type: number
status: active
milestone: "15.5"
diff --git a/config/tailwind.config.js b/config/tailwind.config.js
index 489220dff13..7748837a620 100644
--- a/config/tailwind.config.js
+++ b/config/tailwind.config.js
@@ -11,7 +11,7 @@ module.exports = {
'./node_modules/@gitlab/ui/dist/**/*.{vue,js}',
],
presets: [tailwindDefaults],
- corePlugins: ['isolation'],
+ corePlugins: ['appearance', 'content', 'isolation', 'mixBlendMode', 'tableLayout', 'userSelect'],
blocklist: [
// Prevents an irrelevant util from being generated.
// In the long run, we'll look into disabling arbitrary values altogether, which should prevent
diff --git a/doc/api/group_relations_export.md b/doc/api/group_relations_export.md
index 675c4ebca68..1903276f199 100644
--- a/doc/api/group_relations_export.md
+++ b/doc/api/group_relations_export.md
@@ -16,10 +16,10 @@ The group relations export API partially exports a group's structure as separate
top-level
relation (for example, milestones, boards, and labels).
-The group relations export API is primarily used in
-[group migration by direct transfer](../user/group/import/index.md)
-and
-can't be used with the [group import and export API](group_import_export.md).
+The group relations export API is primarily used in [group migration by direct transfer](../user/group/import/index.md)
+and your GitLab instance must meet [certain prerequisites](../user/group/import/index.md#prerequisites).
+
+This API can't be used with the [group import and export API](group_import_export.md).
## Schedule new export
diff --git a/doc/user/application_security/index.md b/doc/user/application_security/index.md
index 7cf83f9b521..b9ecdd83a2e 100644
--- a/doc/user/application_security/index.md
+++ b/doc/user/application_security/index.md
@@ -181,15 +181,15 @@ the instructions for
### Use security scanning tools with merge request pipelines
-By default, the application security jobs are configured to run for branch pipelines only.
-To use them with [merge request pipelines](../../ci/pipelines/merge_request_pipelines.md),
+From GitLab 16.0 and later, all `stable` security templates support merge request pipelines.
+
+From GitLab 15.11 and earlier, the application security jobs were configured to run for branch pipelines only.
+To use them with [merge request pipelines](../../ci/pipelines/merge_request_pipelines.md) on these versions,
you must reference the [`latest` templates](../../development/cicd/templates.md).
The latest version of the template may include breaking changes. Use the stable template unless you
need a feature provided only in the latest template.
-All `latest` security templates support merge request pipelines.
-
For example, to run both SAST and Dependency Scanning, the following template is used:
```yaml
diff --git a/lib/gitlab/cleanup/orphan_job_artifact_final_objects/batch.rb b/lib/gitlab/cleanup/orphan_job_artifact_final_objects/batch.rb
index af284998780..537580505e9 100644
--- a/lib/gitlab/cleanup/orphan_job_artifact_final_objects/batch.rb
+++ b/lib/gitlab/cleanup/orphan_job_artifact_final_objects/batch.rb
@@ -18,15 +18,19 @@ module Gitlab
objects[path_without_bucket_prefix(fog_file.key)] = fog_file
end
+ return [] unless objects.any?
+
# First we exclude all objects that have matching existing job artifact record in the DB
paths_with_job_artifact_records(objects.keys).each do |non_orphan_path|
objects.delete(non_orphan_path)
end
+ return [] unless objects.any?
+
# Next, if there were no matching job artifact record for the remaining paths, we want to
# check if there is a pending direct upload for the given path, if found, they are not considered orphans.
- objects.delete_if do |path, _|
- pending_direct_upload?(path)
+ paths_with_pending_direct_uploads(objects.keys).each do |non_orphan_path|
+ objects.delete(non_orphan_path)
end
# Just to keep the lexicographic order of objects
@@ -62,8 +66,8 @@ module Gitlab
::Ci::JobArtifact.where(file_final_path: paths).pluck(:file_final_path) # rubocop:disable CodeReuse/ActiveRecord -- intentionally used pluck directly to keep it simple.
end
- def pending_direct_upload?(path)
- ::ObjectStorage::PendingDirectUpload.exists?(:artifacts, path) # rubocop:disable CodeReuse/ActiveRecord -- `exists?` here is not the same as the AR method
+ def paths_with_pending_direct_uploads(paths)
+ ::ObjectStorage::PendingDirectUpload.with_pending_only(:artifacts, paths)
end
end
end
diff --git a/lib/object_storage/pending_direct_upload.rb b/lib/object_storage/pending_direct_upload.rb
index 3a930e0e0af..95ed9984152 100644
--- a/lib/object_storage/pending_direct_upload.rb
+++ b/lib/object_storage/pending_direct_upload.rb
@@ -18,6 +18,21 @@ module ObjectStorage
end
end
+ def self.with_pending_only(location_identifier, object_storage_paths)
+ with_redis do |redis|
+ keys = object_storage_paths.map do |path|
+ redis_key(location_identifier, path)
+ end
+
+ matches = redis.hmget(KEY, keys)
+ index = -1
+ object_storage_paths.select do
+ index += 1
+ matches[index].present?
+ end
+ end
+ end
+
def self.exists?(location_identifier, object_storage_path)
with_redis do |redis|
redis.hexists(KEY, redis_key(location_identifier, object_storage_path))
diff --git a/package.json b/package.json
index d7cd66405de..175a580cf56 100644
--- a/package.json
+++ b/package.json
@@ -62,7 +62,7 @@
"@gitlab/favicon-overlay": "2.0.0",
"@gitlab/fonts": "^1.3.0",
"@gitlab/svgs": "3.84.0",
- "@gitlab/ui": "^74.9.3",
+ "@gitlab/ui": "^76.0.0",
"@gitlab/visual-review-tools": "1.7.3",
"@gitlab/web-ide": "^0.0.1-dev-20240214084918",
"@mattiasbuelens/web-streams-adapter": "^0.1.0",
diff --git a/spec/features/profiles/oauth_applications_spec.rb b/spec/features/profiles/oauth_applications_spec.rb
index c201239262e..cdd1187cdf4 100644
--- a/spec/features/profiles/oauth_applications_spec.rb
+++ b/spec/features/profiles/oauth_applications_spec.rb
@@ -24,7 +24,7 @@ RSpec.describe 'Profile > Applications', feature_category: :user_profile do
create(:oauth_application, owner: user)
visit oauth_applications_path
- page.within('.oauth-applications') do
+ within_testid('oauth-applications') do
page.within('.gl-new-card-count') do
expect(page).to have_content('1')
end
@@ -34,7 +34,7 @@ RSpec.describe 'Profile > Applications', feature_category: :user_profile do
accept_gl_confirm(button_text: 'Destroy')
expect(page).to have_content('The application was deleted successfully')
- page.within('.oauth-applications .gl-new-card-count') do
+ page.within('[data-testid="oauth-applications"] .gl-new-card-count') do
expect(page).to have_content('0')
end
page.within('.oauth-authorized-applications .gl-new-card-count') do
diff --git a/spec/frontend/custom_emoji/components/__snapshots__/list_spec.js.snap b/spec/frontend/custom_emoji/components/__snapshots__/list_spec.js.snap
index a43b4aae586..ce10e8a96f8 100644
--- a/spec/frontend/custom_emoji/components/__snapshots__/list_spec.js.snap
+++ b/spec/frontend/custom_emoji/components/__snapshots__/list_spec.js.snap
@@ -68,7 +68,7 @@ exports[`Custom emoji settings list component renders table of custom emoji 1`]