-
-
-
-
-
-
-
-
-
-
-
+
+
+
diff --git a/app/assets/javascripts/vue_shared/components/sidebar/labels_select_vue/dropdown_button.vue b/app/assets/javascripts/vue_shared/components/sidebar/labels_select_vue/dropdown_button.vue
index 2730e8ee1da..f45c14f8344 100644
--- a/app/assets/javascripts/vue_shared/components/sidebar/labels_select_vue/dropdown_button.vue
+++ b/app/assets/javascripts/vue_shared/components/sidebar/labels_select_vue/dropdown_button.vue
@@ -27,9 +27,9 @@ export default {
class="labels-select-dropdown-button js-dropdown-button w-100 text-left"
@click="handleButtonClick"
>
-
{{
- dropdownButtonText
- }}
+
+ {{ dropdownButtonText }}
+
diff --git a/app/assets/javascripts/vue_shared/components/sidebar/labels_select_vue/dropdown_contents_labels_view.vue b/app/assets/javascripts/vue_shared/components/sidebar/labels_select_vue/dropdown_contents_labels_view.vue
index a548ef4ac86..1ef2e8b3bed 100644
--- a/app/assets/javascripts/vue_shared/components/sidebar/labels_select_vue/dropdown_contents_labels_view.vue
+++ b/app/assets/javascripts/vue_shared/components/sidebar/labels_select_vue/dropdown_contents_labels_view.vue
@@ -1,16 +1,18 @@
+
+
+
+
+
+
+ {{ label.title }}
+
+
diff --git a/app/assets/javascripts/vue_shared/components/sidebar/labels_select_vue/store/mutations.js b/app/assets/javascripts/vue_shared/components/sidebar/labels_select_vue/store/mutations.js
index b55a58850a1..54f8c78b4e1 100644
--- a/app/assets/javascripts/vue_shared/components/sidebar/labels_select_vue/store/mutations.js
+++ b/app/assets/javascripts/vue_shared/components/sidebar/labels_select_vue/store/mutations.js
@@ -58,29 +58,13 @@ export default {
},
[types.UPDATE_SELECTED_LABELS](state, { labels }) {
- // Iterate over all the labels and update
- // `set` prop value to represent their current state.
- const labelIds = labels.map(label => label.id);
- state.labels = state.labels.reduce((allLabels, label) => {
- if (labelIds.includes(label.id)) {
- allLabels.push({
- ...label,
- touched: true,
- set: !label.set,
- });
- } else {
- // In case multiselect is not allowed
- // we unselect any existing selected label
- const unchangedLabel = state.allowMultiselect
- ? label
- : {
- ...label,
- touched: true,
- set: false,
- };
- allLabels.push(unchangedLabel);
- }
- return allLabels;
- }, []);
+ // Find the label to update from all the labels
+ // and change `set` prop value to represent their current state.
+ const labelId = labels.pop()?.id;
+ const candidateLabel = state.labels.find(label => labelId === label.id);
+ if (candidateLabel) {
+ candidateLabel.touched = true;
+ candidateLabel.set = !candidateLabel.set;
+ }
},
};
diff --git a/app/controllers/projects/merge_requests_controller.rb b/app/controllers/projects/merge_requests_controller.rb
index 9e6c42ea2be..ae7965a2eae 100644
--- a/app/controllers/projects/merge_requests_controller.rb
+++ b/app/controllers/projects/merge_requests_controller.rb
@@ -26,7 +26,6 @@ class Projects::MergeRequestsController < Projects::MergeRequests::ApplicationCo
push_frontend_feature_flag(:code_navigation, @project)
push_frontend_feature_flag(:widget_visibility_polling, @project, default_enabled: true)
push_frontend_feature_flag(:merge_ref_head_comments, @project)
- push_frontend_feature_flag(:diff_compare_with_head, @project)
push_frontend_feature_flag(:accessibility_merge_request_widget, @project)
end
diff --git a/app/helpers/application_settings_helper.rb b/app/helpers/application_settings_helper.rb
index f36a638555a..df8009c3d00 100644
--- a/app/helpers/application_settings_helper.rb
+++ b/app/helpers/application_settings_helper.rb
@@ -367,7 +367,7 @@ module ApplicationSettingsHelper
end
end
-ApplicationSettingsHelper.prepend_if_ee('EE::ApplicationSettingsHelper') # rubocop: disable Cop/InjectEnterpriseEditionModule
+ApplicationSettingsHelper.prepend_if_ee('EE::ApplicationSettingsHelper')
# The methods in `EE::ApplicationSettingsHelper` should be available as both
# instance and class methods.
diff --git a/app/helpers/auth_helper.rb b/app/helpers/auth_helper.rb
index 12f75217a8a..a57e27d23c8 100644
--- a/app/helpers/auth_helper.rb
+++ b/app/helpers/auth_helper.rb
@@ -152,7 +152,7 @@ module AuthHelper
extend self
end
-AuthHelper.prepend_if_ee('EE::AuthHelper') # rubocop: disable Cop/InjectEnterpriseEditionModule
+AuthHelper.prepend_if_ee('EE::AuthHelper')
# The methods added in EE should be available as both class and instance
# methods, just like the methods provided by `AuthHelper` itself.
diff --git a/app/helpers/milestones_helper.rb b/app/helpers/milestones_helper.rb
index 2f5aac892ab..df1ee54c5ac 100644
--- a/app/helpers/milestones_helper.rb
+++ b/app/helpers/milestones_helper.rb
@@ -249,7 +249,7 @@ module MilestonesHelper
if milestone.legacy_group_milestone?
group_milestone_path(@group, milestone.safe_title, title: milestone.title, milestone: params)
else
- group_milestone_path(@group, milestone.iid, milestone: params)
+ group_milestone_path(milestone.group, milestone.iid, milestone: params)
end
end
diff --git a/app/helpers/projects_helper.rb b/app/helpers/projects_helper.rb
index 2151d1a85d7..5c7c128da90 100644
--- a/app/helpers/projects_helper.rb
+++ b/app/helpers/projects_helper.rb
@@ -1,8 +1,6 @@
# frozen_string_literal: true
module ProjectsHelper
- prepend_if_ee('::EE::ProjectsHelper') # rubocop: disable Cop/InjectEnterpriseEditionModule
-
def project_incident_management_setting
@project_incident_management_setting ||= @project.incident_management_setting ||
@project.build_incident_management_setting
diff --git a/app/helpers/services_helper.rb b/app/helpers/services_helper.rb
index dcdf6bbd3da..b13cc93436f 100644
--- a/app/helpers/services_helper.rb
+++ b/app/helpers/services_helper.rb
@@ -101,7 +101,7 @@ module ServicesHelper
extend self
end
-ServicesHelper.prepend_if_ee('EE::ServicesHelper') # rubocop: disable Cop/InjectEnterpriseEditionModule
+ServicesHelper.prepend_if_ee('EE::ServicesHelper')
# The methods in `EE::ServicesHelper` should be available as both instance and
# class methods.
diff --git a/app/helpers/system_note_helper.rb b/app/helpers/system_note_helper.rb
index d3b6ecf2bd7..33268b5dbc9 100644
--- a/app/helpers/system_note_helper.rb
+++ b/app/helpers/system_note_helper.rb
@@ -42,7 +42,7 @@ module SystemNoteHelper
extend self
end
-SystemNoteHelper.prepend_if_ee('EE::SystemNoteHelper') # rubocop: disable Cop/InjectEnterpriseEditionModule
+SystemNoteHelper.prepend_if_ee('EE::SystemNoteHelper')
# The methods in `EE::SystemNoteHelper` should be available as both instance and
# class methods.
diff --git a/app/models/concerns/noteable.rb b/app/models/concerns/noteable.rb
index d1e54d46d40..247ba0822fe 100644
--- a/app/models/concerns/noteable.rb
+++ b/app/models/concerns/noteable.rb
@@ -150,5 +150,5 @@ end
Noteable.extend(Noteable::ClassMethods)
-Noteable::ClassMethods.prepend_if_ee('EE::Noteable::ClassMethods') # rubocop: disable Cop/InjectEnterpriseEditionModule
+Noteable::ClassMethods.prepend_if_ee('EE::Noteable::ClassMethods')
Noteable.prepend_if_ee('EE::Noteable')
diff --git a/app/models/concerns/protected_ref_access.rb b/app/models/concerns/protected_ref_access.rb
index 7373f006d64..d1e3d9b2aff 100644
--- a/app/models/concerns/protected_ref_access.rb
+++ b/app/models/concerns/protected_ref_access.rb
@@ -50,8 +50,8 @@ module ProtectedRefAccess
end
end
-ProtectedRefAccess.include_if_ee('EE::ProtectedRefAccess::Scopes') # rubocop: disable Cop/InjectEnterpriseEditionModule
-ProtectedRefAccess.prepend_if_ee('EE::ProtectedRefAccess') # rubocop: disable Cop/InjectEnterpriseEditionModule
+ProtectedRefAccess.include_if_ee('EE::ProtectedRefAccess::Scopes')
+ProtectedRefAccess.prepend_if_ee('EE::ProtectedRefAccess')
# When using `prepend` (or `include` for that matter), the `ClassMethods`
# constants are not merged. This means that `class_methods` in
diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb
index 3270c7c131f..7d7788c7e23 100644
--- a/app/models/merge_request.rb
+++ b/app/models/merge_request.rb
@@ -875,7 +875,7 @@ class MergeRequest < ApplicationRecord
# rubocop: enable CodeReuse/ServiceClass
def diffable_merge_ref?
- Feature.enabled?(:diff_compare_with_head, target_project) && can_be_merged? && merge_ref_head.present?
+ can_be_merged? && merge_ref_head.present?
end
# Returns boolean indicating the merge_status should be rechecked in order to
diff --git a/app/models/sent_notification.rb b/app/models/sent_notification.rb
index 1bfcad02f38..4165d3b753f 100644
--- a/app/models/sent_notification.rb
+++ b/app/models/sent_notification.rb
@@ -82,6 +82,8 @@ class SentNotification < ApplicationRecord
if new_position.is_a?(Hash)
new_position = new_position.with_indifferent_access
new_position = Gitlab::Diff::Position.new(new_position)
+ else
+ new_position = nil
end
super(new_position)
diff --git a/app/policies/ci/build_policy.rb b/app/policies/ci/build_policy.rb
index ebb99270b9a..12892a69257 100644
--- a/app/policies/ci/build_policy.rb
+++ b/app/policies/ci/build_policy.rb
@@ -12,6 +12,14 @@ module Ci
end
end
+ condition(:unprotected_ref) do
+ if @subject.tag?
+ !ProtectedTag.protected?(@subject.project, @subject.ref)
+ else
+ !ProtectedBranch.protected?(@subject.project, @subject.ref)
+ end
+ end
+
condition(:owner_of_job) do
@subject.triggered_by?(@user)
end
@@ -34,7 +42,7 @@ module Ci
prevent :erase_build
end
- rule { can?(:admin_build) | (can?(:update_build) & owner_of_job) }.enable :erase_build
+ rule { can?(:admin_build) | (can?(:update_build) & owner_of_job & unprotected_ref) }.enable :erase_build
rule { can?(:public_access) & branch_allows_collaboration }.policy do
enable :update_build
diff --git a/app/serializers/analytics_summary_entity.rb b/app/serializers/analytics_summary_entity.rb
index 57e9225e2da..62828fc1428 100644
--- a/app/serializers/analytics_summary_entity.rb
+++ b/app/serializers/analytics_summary_entity.rb
@@ -8,8 +8,6 @@ class AnalyticsSummaryEntity < Grape::Entity
private
def value
- return object.value if object.value.is_a? String
-
- object.value&.nonzero? ? object.value.to_s : '-'
+ object.value.to_s
end
end
diff --git a/app/services/branches/create_service.rb b/app/services/branches/create_service.rb
index c8afd97e6bf..958dd5c9965 100644
--- a/app/services/branches/create_service.rb
+++ b/app/services/branches/create_service.rb
@@ -14,7 +14,7 @@ module Branches
if new_branch
success(new_branch)
else
- error("Invalid reference name: #{branch_name}")
+ error("Invalid reference name: #{ref}")
end
rescue Gitlab::Git::PreReceiveError => ex
error(ex.message)
diff --git a/app/workers/all_queues.yml b/app/workers/all_queues.yml
index 33a20afc0ba..1f9a53d64d9 100644
--- a/app/workers/all_queues.yml
+++ b/app/workers/all_queues.yml
@@ -10,6 +10,13 @@
:resource_boundary: :unknown
:weight: 1
:idempotent: true
+- :name: authorized_project_update:authorized_project_update_user_refresh_with_low_urgency
+ :feature_category: :authentication_and_authorization
+ :has_external_dependencies:
+ :urgency: :low
+ :resource_boundary: :unknown
+ :weight: 1
+ :idempotent: true
- :name: auto_devops:auto_devops_disable
:feature_category: :auto_devops
:has_external_dependencies:
@@ -934,13 +941,6 @@
:resource_boundary: :unknown
:weight: 2
:idempotent: true
-- :name: authorized_project_update_user_refresh_with_low_urgency
- :feature_category: :authentication_and_authorization
- :has_external_dependencies:
- :urgency: :low
- :resource_boundary: :unknown
- :weight: 1
- :idempotent: true
- :name: authorized_projects
:feature_category: :authentication_and_authorization
:has_external_dependencies:
diff --git a/app/workers/authorized_project_update/user_refresh_with_low_urgency_worker.rb b/app/workers/authorized_project_update/user_refresh_with_low_urgency_worker.rb
index 54025422874..19038cb8900 100644
--- a/app/workers/authorized_project_update/user_refresh_with_low_urgency_worker.rb
+++ b/app/workers/authorized_project_update/user_refresh_with_low_urgency_worker.rb
@@ -4,6 +4,7 @@ module AuthorizedProjectUpdate
class UserRefreshWithLowUrgencyWorker < ::AuthorizedProjectsWorker
feature_category :authentication_and_authorization
urgency :low
+ queue_namespace :authorized_project_update
idempotent!
end
diff --git a/changelogs/unreleased/35069-protect-builds.yml b/changelogs/unreleased/35069-protect-builds.yml
new file mode 100644
index 00000000000..7efe4ab529c
--- /dev/null
+++ b/changelogs/unreleased/35069-protect-builds.yml
@@ -0,0 +1,5 @@
+---
+title: Disallow developers to delete builds of protected branches
+merge_request: 28881
+author: Alexander Kutelev
+type: changed
diff --git a/changelogs/unreleased/ac-backfill-environment_id-on-deployment_merge_requests.yml b/changelogs/unreleased/ac-backfill-environment_id-on-deployment_merge_requests.yml
deleted file mode 100644
index ac9ae44b958..00000000000
--- a/changelogs/unreleased/ac-backfill-environment_id-on-deployment_merge_requests.yml
+++ /dev/null
@@ -1,5 +0,0 @@
----
-title: backfill environment_id on deployment_merge_requests
-merge_request: 27219
-author:
-type: other
diff --git a/changelogs/unreleased/fix-cop-inject-multiple.yml b/changelogs/unreleased/fix-cop-inject-multiple.yml
new file mode 100644
index 00000000000..8fe1556abac
--- /dev/null
+++ b/changelogs/unreleased/fix-cop-inject-multiple.yml
@@ -0,0 +1,5 @@
+---
+title: Allow multiple usage of EE extension/inclusion on last lines
+merge_request: 31183
+author: Rajendra Kadam
+type: fixed
diff --git a/changelogs/unreleased/fix-subgroup-milestone-links.yml b/changelogs/unreleased/fix-subgroup-milestone-links.yml
new file mode 100644
index 00000000000..dab14b33f9e
--- /dev/null
+++ b/changelogs/unreleased/fix-subgroup-milestone-links.yml
@@ -0,0 +1,5 @@
+---
+title: Link to subgroup milestones correctly from group milestones page
+merge_request: 31383
+author:
+type: fixed
diff --git a/changelogs/unreleased/id-remove-diff-compare-with-head-feature-flag.yml b/changelogs/unreleased/id-remove-diff-compare-with-head-feature-flag.yml
new file mode 100644
index 00000000000..c7222c6583d
--- /dev/null
+++ b/changelogs/unreleased/id-remove-diff-compare-with-head-feature-flag.yml
@@ -0,0 +1,5 @@
+---
+title: Allow showing merge request diffs compared to current version of target branch
+merge_request: 31325
+author:
+type: added
diff --git a/config/initializers/rack_attack_new.rb b/config/initializers/rack_attack_new.rb
index 38e581f188f..51b49bec864 100644
--- a/config/initializers/rack_attack_new.rb
+++ b/config/initializers/rack_attack_new.rb
@@ -160,5 +160,5 @@ class Rack::Attack
end
end
-::Rack::Attack.extend_if_ee('::EE::Gitlab::Rack::Attack') # rubocop: disable Cop/InjectEnterpriseEditionModule
+::Rack::Attack.extend_if_ee('::EE::Gitlab::Rack::Attack')
::Rack::Attack::Request.prepend_if_ee('::EE::Gitlab::Rack::Attack::Request')
diff --git a/config/sidekiq_queues.yml b/config/sidekiq_queues.yml
index 960a2eeae10..e6e0b4b4409 100644
--- a/config/sidekiq_queues.yml
+++ b/config/sidekiq_queues.yml
@@ -34,8 +34,6 @@
- 2
- - authorized_project_update
- 1
-- - authorized_project_update_user_refresh_with_low_urgency
- - 1
- - authorized_projects
- 2
- - auto_devops
diff --git a/db/post_migrate/20200312134637_backfill_environment_id_on_deployment_merge_requests.rb b/db/post_migrate/20200312134637_backfill_environment_id_on_deployment_merge_requests.rb
index 24b652a3299..77cb1ae8508 100644
--- a/db/post_migrate/20200312134637_backfill_environment_id_on_deployment_merge_requests.rb
+++ b/db/post_migrate/20200312134637_backfill_environment_id_on_deployment_merge_requests.rb
@@ -4,46 +4,19 @@ class BackfillEnvironmentIdOnDeploymentMergeRequests < ActiveRecord::Migration[6
include Gitlab::Database::MigrationHelpers
DOWNTIME = false
- BATCH_SIZE = 400
- DELAY = 1.minute
disable_ddl_transaction!
def up
- max_mr_id = DeploymentMergeRequest
- .select(:merge_request_id)
- .distinct
- .order(merge_request_id: :desc)
- .limit(1)
- .pluck(:merge_request_id)
- .first || 0
+ # no-op
- last_mr_id = 0
- step = 0
-
- while last_mr_id < max_mr_id
- stop =
- DeploymentMergeRequest
- .select(:merge_request_id)
- .distinct
- .where('merge_request_id > ?', last_mr_id)
- .order(:merge_request_id)
- .offset(BATCH_SIZE)
- .limit(1)
- .pluck(:merge_request_id)
- .first
-
- stop ||= max_mr_id
-
- migrate_in(
- step * DELAY,
- 'BackfillEnvironmentIdDeploymentMergeRequests',
- [last_mr_id + 1, stop]
- )
-
- last_mr_id = stop
- step += 1
- end
+ # this migration is deleted because there is no foreign key for
+ # deployments.environment_id and this caused a failure upgrading
+ # deployments_merge_requests.environment_id
+ #
+ # Details on the following issues:
+ # * https://gitlab.com/gitlab-org/gitlab/-/issues/217191
+ # * https://gitlab.com/gitlab-org/gitlab/-/issues/26229
end
def down
diff --git a/doc/api/labels.md b/doc/api/labels.md
index eb8ec906ec1..3ced7da8ed5 100644
--- a/doc/api/labels.md
+++ b/doc/api/labels.md
@@ -7,6 +7,8 @@ The `description_html` - was added to response JSON in [GitLab 12.7](https://git
Get all labels for a given project.
+By default, this request returns 20 results at a time because the API results [are paginated](README.md#pagination).
+
```plaintext
GET /projects/:id/labels
```
diff --git a/doc/ci/caching/index.md b/doc/ci/caching/index.md
index 12267b4ab9f..16cabae353e 100644
--- a/doc/ci/caching/index.md
+++ b/doc/ci/caching/index.md
@@ -39,8 +39,9 @@ runtime dependencies needed to compile the project:
- `artifacts`: **Use for stage results that will be passed between stages.**
Artifacts are files generated by a job which are stored and uploaded, and can then
- be fetched and used by jobs in later stages of the **same pipeline**. This data
- will not be available in different pipelines, but is available to be downloaded
+ be fetched and used by jobs in later stages of the **same pipeline**. In other words,
+ [you can't create an artifact in job-A in stage-1, and then use this artifact in job-B in stage-1](https://gitlab.com/gitlab-org/gitlab/-/issues/25837).
+ This data will not be available in different pipelines, but is available to be downloaded
from the UI.
The name `artifacts` sounds like it's only useful outside of the job, like for downloading
diff --git a/doc/user/permissions.md b/doc/user/permissions.md
index f23f1858883..e54063e3eed 100644
--- a/doc/user/permissions.md
+++ b/doc/user/permissions.md
@@ -403,7 +403,9 @@ instance and project. In addition, all admins can use the admin interface under
| See events in the system | | | | ✓ |
| Admin interface | | | | ✓ |
-1. Only if the job was triggered by the user
+1. Only if the job was:
+ - Triggered by the user
+ - [Since GitLab 13.0](https://gitlab.com/gitlab-org/gitlab/-/issues/35069), not run for a protected branch
### Job permissions
diff --git a/doc/user/project/merge_requests/versions.md b/doc/user/project/merge_requests/versions.md
index 2f51af24a95..84934148bdc 100644
--- a/doc/user/project/merge_requests/versions.md
+++ b/doc/user/project/merge_requests/versions.md
@@ -57,7 +57,7 @@ source and target branch can be shown mixed together making it hard to
understand which changes are being added and which already exist in the
target branch.
-In GitLab 12.10, we added an **experimental** comparison mode, which
+In GitLab 12.10, we added a comparison mode, which
shows a diff calculated by simulating how it would look like once merged - a more accurate
representation of the changes rather than using the base of the two
branches. The new mode is available from the comparison target drop down
@@ -67,26 +67,6 @@ current default comparison.

-### Enable or disable `HEAD` comparison mode **(CORE ONLY)**
-
-`HEAD` comparison mode is under development and not ready for production use. It is
-deployed behind a feature flag that is **disabled by default**.
-[GitLab administrators with access to the GitLab Rails console](../../../administration/troubleshooting/navigating_gitlab_via_rails_console.md#starting-a-rails-console-session)
-can enable it for your instance. You're welcome to test it, but use it at your
-own risk.
-
-To enable it:
-
-```ruby
-Feature.enable(:diff_compare_with_head)
-```
-
-To disable it:
-
-```ruby
-Feature.disable(:diff_compare_with_head)
-```
-