diff --git a/app/assets/javascripts/diffs/store/getters_versions_dropdowns.js b/app/assets/javascripts/diffs/store/getters_versions_dropdowns.js index acc8874dad8..1e8e736c028 100644 --- a/app/assets/javascripts/diffs/store/getters_versions_dropdowns.js +++ b/app/assets/javascripts/diffs/store/getters_versions_dropdowns.js @@ -40,10 +40,7 @@ export const diffCompareDropdownTargetVersions = (state, getters) => { }; }; - if (gon.features?.diffCompareWithHead) { - return [...state.mergeRequestDiffs.slice(1).map(formatVersion), baseVersion, headVersion]; - } - return [...state.mergeRequestDiffs.slice(1).map(formatVersion), baseVersion]; + return [...state.mergeRequestDiffs.slice(1).map(formatVersion), baseVersion, headVersion]; }; export const diffCompareDropdownSourceVersions = (state, getters) => { diff --git a/app/assets/javascripts/monitoring/components/dashboard.vue b/app/assets/javascripts/monitoring/components/dashboard.vue index 2b5a10907f5..0a6329fbdfb 100644 --- a/app/assets/javascripts/monitoring/components/dashboard.vue +++ b/app/assets/javascripts/monitoring/components/dashboard.vue @@ -440,7 +440,6 @@ export default { class="flex-grow-1" toggle-class="dropdown-menu-toggle" :default-branch="defaultBranch" - :selected-dashboard="selectedDashboard" @selectDashboard="selectDashboard($event)" /> diff --git a/app/assets/javascripts/monitoring/components/dashboards_dropdown.vue b/app/assets/javascripts/monitoring/components/dashboards_dropdown.vue index 9ef4b93d543..8b86890715f 100644 --- a/app/assets/javascripts/monitoring/components/dashboards_dropdown.vue +++ b/app/assets/javascripts/monitoring/components/dashboards_dropdown.vue @@ -1,5 +1,5 @@ diff --git a/app/assets/javascripts/static_site_editor/components/skeleton_loader.vue b/app/assets/javascripts/static_site_editor/components/skeleton_loader.vue new file mode 100644 index 00000000000..1b6179883aa --- /dev/null +++ b/app/assets/javascripts/static_site_editor/components/skeleton_loader.vue @@ -0,0 +1,19 @@ + + diff --git a/app/assets/javascripts/static_site_editor/pages/home.vue b/app/assets/javascripts/static_site_editor/pages/home.vue index 9003c381456..e48e8b5d23c 100644 --- a/app/assets/javascripts/static_site_editor/pages/home.vue +++ b/app/assets/javascripts/static_site_editor/pages/home.vue @@ -1,13 +1,9 @@ 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 @@ + + 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. ![Merge request versions compare HEAD](img/versions_compare_head_v12_10.png) -### 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) -``` -