Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2023-12-19 14:01:45 +0300
committerGitLab Bot <gitlab-bot@gitlab.com>2023-12-19 14:01:45 +0300
commit9297025d0b7ddf095eb618dfaaab2ff8f2018d8b (patch)
tree865198c01d1824a9b098127baa3ab980c9cd2c06 /app/controllers/projects
parent6372471f43ee03c05a7c1f8b0c6ac6b8a7431dbe (diff)
Add latest changes from gitlab-org/gitlab@16-7-stable-eev16.7.0-rc42
Diffstat (limited to 'app/controllers/projects')
-rw-r--r--app/controllers/projects/autocomplete_sources_controller.rb7
-rw-r--r--app/controllers/projects/blob_controller.rb1
-rw-r--r--app/controllers/projects/boards_controller.rb1
-rw-r--r--app/controllers/projects/ci/pipeline_editor_controller.rb1
-rw-r--r--app/controllers/projects/clusters_controller.rb5
-rw-r--r--app/controllers/projects/deploy_keys_controller.rb41
-rw-r--r--app/controllers/projects/environments_controller.rb4
-rw-r--r--app/controllers/projects/gcp/artifact_registry/base_controller.rb43
-rw-r--r--app/controllers/projects/gcp/artifact_registry/docker_images_controller.rb131
-rw-r--r--app/controllers/projects/gcp/artifact_registry/setup_controller.rb11
-rw-r--r--app/controllers/projects/group_links_controller.rb12
-rw-r--r--app/controllers/projects/integrations/shimos_controller.rb19
-rw-r--r--app/controllers/projects/issues_controller.rb2
-rw-r--r--app/controllers/projects/jobs_controller.rb5
-rw-r--r--app/controllers/projects/merge_requests/diffs_controller.rb6
-rw-r--r--app/controllers/projects/merge_requests_controller.rb53
-rw-r--r--app/controllers/projects/ml/candidates_controller.rb4
-rw-r--r--app/controllers/projects/pipelines_controller.rb10
-rw-r--r--app/controllers/projects/service_desk/custom_email_controller.rb5
-rw-r--r--app/controllers/projects/service_desk_controller.rb9
-rw-r--r--app/controllers/projects/settings/merge_requests_controller.rb1
-rw-r--r--app/controllers/projects/tree_controller.rb1
22 files changed, 288 insertions, 84 deletions
diff --git a/app/controllers/projects/autocomplete_sources_controller.rb b/app/controllers/projects/autocomplete_sources_controller.rb
index 60c8fe97e81..ff3484d3020 100644
--- a/app/controllers/projects/autocomplete_sources_controller.rb
+++ b/app/controllers/projects/autocomplete_sources_controller.rb
@@ -1,6 +1,8 @@
# frozen_string_literal: true
class Projects::AutocompleteSourcesController < Projects::ApplicationController
+ include AutocompleteSources::ExpiresIn
+
before_action :authorize_read_milestone!, only: :milestones
before_action :authorize_read_crm_contact!, only: :contacts
@@ -13,11 +15,6 @@ class Projects::AutocompleteSourcesController < Projects::ApplicationController
urgency :low, [:issues, :labels, :milestones, :commands, :contacts]
def members
- if Feature.enabled?(:cache_autocomplete_sources_members, current_user)
- # Cache the response on the frontend
- expires_in 3.minutes
- end
-
render json: ::Projects::ParticipantsService.new(@project, current_user).execute(target)
end
diff --git a/app/controllers/projects/blob_controller.rb b/app/controllers/projects/blob_controller.rb
index 7371902a6bd..7851e2ac80b 100644
--- a/app/controllers/projects/blob_controller.rb
+++ b/app/controllers/projects/blob_controller.rb
@@ -52,6 +52,7 @@ class Projects::BlobController < Projects::ApplicationController
push_frontend_feature_flag(:blob_blame_info, @project)
push_frontend_feature_flag(:highlight_js_worker, @project)
push_frontend_feature_flag(:explain_code_chat, current_user)
+ push_frontend_feature_flag(:encoding_logs_tree)
push_licensed_feature(:file_locks) if @project.licensed_feature_available?(:file_locks)
end
diff --git a/app/controllers/projects/boards_controller.rb b/app/controllers/projects/boards_controller.rb
index 84872d1e978..fd853b5aaed 100644
--- a/app/controllers/projects/boards_controller.rb
+++ b/app/controllers/projects/boards_controller.rb
@@ -8,6 +8,7 @@ class Projects::BoardsController < Projects::ApplicationController
before_action do
push_frontend_feature_flag(:board_multi_select, project)
push_frontend_feature_flag(:apollo_boards, project)
+ push_frontend_feature_flag(:display_work_item_epic_issue_sidebar, project)
experiment(:prominent_create_board_btn, subject: current_user) do |e|
e.control {}
e.candidate {}
diff --git a/app/controllers/projects/ci/pipeline_editor_controller.rb b/app/controllers/projects/ci/pipeline_editor_controller.rb
index 6e7f764c5c1..62a5baccc62 100644
--- a/app/controllers/projects/ci/pipeline_editor_controller.rb
+++ b/app/controllers/projects/ci/pipeline_editor_controller.rb
@@ -4,7 +4,6 @@ class Projects::Ci::PipelineEditorController < Projects::ApplicationController
before_action :check_can_collaborate!
before_action do
push_frontend_feature_flag(:ci_job_assistant_drawer, @project)
- push_frontend_feature_flag(:ai_ci_config_generator, @user)
push_frontend_feature_flag(:ci_graphql_pipeline_mini_graph, @project)
end
diff --git a/app/controllers/projects/clusters_controller.rb b/app/controllers/projects/clusters_controller.rb
index b781365b3c3..dd969efa49b 100644
--- a/app/controllers/projects/clusters_controller.rb
+++ b/app/controllers/projects/clusters_controller.rb
@@ -1,7 +1,6 @@
# frozen_string_literal: true
-class Projects::ClustersController < Clusters::ClustersController
- prepend_before_action :project
+class Projects::ClustersController < ::Clusters::ClustersController
before_action :repository
before_action do
@@ -13,7 +12,7 @@ class Projects::ClustersController < Clusters::ClustersController
private
def clusterable
- @clusterable ||= ClusterablePresenter.fabricate(project, current_user: current_user)
+ @clusterable ||= project && ClusterablePresenter.fabricate(project, current_user: current_user)
end
def project
diff --git a/app/controllers/projects/deploy_keys_controller.rb b/app/controllers/projects/deploy_keys_controller.rb
index 9cdbd2a30f6..66ce501f9f0 100644
--- a/app/controllers/projects/deploy_keys_controller.rb
+++ b/app/controllers/projects/deploy_keys_controller.rb
@@ -22,6 +22,34 @@ class Projects::DeployKeysController < Projects::ApplicationController
end
end
+ def enabled_keys
+ respond_to do |format|
+ format.json do
+ enabled_keys = find_keys(filter: :enabled_keys)
+ render json: { keys: serialize(enabled_keys) }
+ end
+ end
+ end
+
+ def available_project_keys
+ respond_to do |format|
+ format.json do
+ available_project_keys = find_keys(filter: :available_project_keys)
+ render json: { keys: serialize(available_project_keys) }
+ end
+ end
+ end
+
+ def available_public_keys
+ respond_to do |format|
+ format.json do
+ available_public_keys = find_keys(filter: :available_public_keys)
+
+ render json: { keys: serialize(available_public_keys) }
+ end
+ end
+ end
+
def new
redirect_to_repository
end
@@ -108,4 +136,17 @@ class Projects::DeployKeysController < Projects::ApplicationController
def redirect_to_repository
redirect_to_repository_settings(@project, anchor: 'js-deploy-keys-settings')
end
+
+ def find_keys(params)
+ DeployKeys::DeployKeysFinder.new(@project, current_user, params)
+ .execute
+ end
+
+ def serialize(keys)
+ opts = { user: current_user, project: project }
+
+ DeployKeys::DeployKeySerializer.new
+ .with_pagination(request, response)
+ .represent(keys, opts)
+ end
end
diff --git a/app/controllers/projects/environments_controller.rb b/app/controllers/projects/environments_controller.rb
index 4b2749dc716..8cdd6efa7c5 100644
--- a/app/controllers/projects/environments_controller.rb
+++ b/app/controllers/projects/environments_controller.rb
@@ -14,6 +14,10 @@ class Projects::EnvironmentsController < Projects::ApplicationController
push_frontend_feature_flag(:k8s_watch_api, project)
end
+ before_action only: [:folder] do
+ push_frontend_feature_flag(:environments_folder_new_look, project)
+ end
+
before_action :authorize_read_environment!
before_action :authorize_create_environment!, only: [:new, :create]
before_action :authorize_stop_environment!, only: [:stop]
diff --git a/app/controllers/projects/gcp/artifact_registry/base_controller.rb b/app/controllers/projects/gcp/artifact_registry/base_controller.rb
new file mode 100644
index 00000000000..4084427f3e5
--- /dev/null
+++ b/app/controllers/projects/gcp/artifact_registry/base_controller.rb
@@ -0,0 +1,43 @@
+# frozen_string_literal: true
+
+module Projects
+ module Gcp
+ module ArtifactRegistry
+ class BaseController < ::Projects::ApplicationController
+ before_action :ensure_feature_flag
+ before_action :ensure_saas
+ before_action :authorize_read_container_image!
+ before_action :ensure_private_project
+
+ feature_category :container_registry
+ urgency :low
+
+ private
+
+ def ensure_feature_flag
+ return if Feature.enabled?(:gcp_technical_demo, project)
+
+ @error = 'Feature flag disabled'
+
+ render
+ end
+
+ def ensure_saas
+ return if Gitlab.com_except_jh? # rubocop: disable Gitlab/AvoidGitlabInstanceChecks -- demo requirement
+
+ @error = "Can't run here"
+
+ render
+ end
+
+ def ensure_private_project
+ return if project.private?
+
+ @error = 'Can only run on private projects'
+
+ render
+ end
+ end
+ end
+ end
+end
diff --git a/app/controllers/projects/gcp/artifact_registry/docker_images_controller.rb b/app/controllers/projects/gcp/artifact_registry/docker_images_controller.rb
new file mode 100644
index 00000000000..b88b86975a4
--- /dev/null
+++ b/app/controllers/projects/gcp/artifact_registry/docker_images_controller.rb
@@ -0,0 +1,131 @@
+# frozen_string_literal: true
+
+module Projects
+ module Gcp
+ module ArtifactRegistry
+ class DockerImagesController < Projects::Gcp::ArtifactRegistry::BaseController
+ before_action :require_gcp_params
+ before_action :handle_pagination
+
+ REPO_NAME_REGEX = %r{/repositories/(.*)/dockerImages/}
+
+ def index
+ result = service.execute(page_token: params[:page_token])
+
+ if result.success?
+ @docker_images = process_docker_images(result.payload[:images] || [])
+ @next_page_token = result.payload[:next_page_token]
+ @artifact_repository_name = artifact_repository_name
+ @error = @docker_images.blank? ? 'No docker images' : false
+ else
+ @error = result.message
+ end
+ end
+
+ private
+
+ def service
+ ::Integrations::GoogleCloudPlatform::ArtifactRegistry::ListDockerImagesService.new(
+ project: @project,
+ current_user: current_user,
+ params: {
+ gcp_project_id: gcp_project_id,
+ gcp_location: gcp_location,
+ gcp_repository: gcp_ar_repository,
+ gcp_wlif: gcp_wlif_url
+ }
+ )
+ end
+
+ def process_docker_images(raw_images)
+ raw_images.map { |r| process_docker_image(r) }
+ end
+
+ def process_docker_image(raw_image)
+ DockerImage.new(
+ name: raw_image[:name],
+ uri: raw_image[:uri],
+ tags: raw_image[:tags],
+ image_size_bytes: raw_image[:size_bytes],
+ media_type: raw_image[:media_type],
+ upload_time: raw_image[:uploaded_at],
+ build_time: raw_image[:built_at],
+ update_time: raw_image[:updated_at]
+ )
+ end
+
+ def artifact_repository_name
+ return unless @docker_images.present?
+
+ (@docker_images.first.name || '')[REPO_NAME_REGEX, 1]
+ end
+
+ def handle_pagination
+ @page = Integer(params[:page] || 1)
+ @page_tokens = {}
+ @previous_page_token = nil
+
+ if params[:page_tokens]
+ @page_tokens = ::Gitlab::Json.parse(Base64.decode64(params[:page_tokens]))
+ @previous_page_token = @page_tokens[(@page - 1).to_s]
+ end
+
+ @page_tokens[@page.to_s] = params[:page_token]
+ @page_tokens = Base64.encode64(::Gitlab::Json.dump(@page_tokens.compact))
+ end
+
+ def require_gcp_params
+ return unless gcp_project_id.blank? || gcp_location.blank? || gcp_ar_repository.blank? || gcp_wlif_url.blank?
+
+ redirect_to new_namespace_project_gcp_artifact_registry_setup_path
+ end
+
+ def gcp_project_id
+ params[:gcp_project_id]
+ end
+
+ def gcp_location
+ params[:gcp_location]
+ end
+
+ def gcp_ar_repository
+ params[:gcp_ar_repository]
+ end
+
+ def gcp_wlif_url
+ params[:gcp_wlif_url]
+ end
+
+ class DockerImage
+ include ActiveModel::API
+
+ attr_accessor :name, :uri, :tags, :image_size_bytes, :upload_time, :media_type, :build_time, :update_time
+
+ SHORT_NAME_REGEX = %r{dockerImages/(.*)$}
+
+ def short_name
+ (name || '')[SHORT_NAME_REGEX, 1]
+ end
+
+ def updated_at
+ return unless update_time
+
+ Time.zone.parse(update_time)
+ end
+
+ def built_at
+ return unless build_time
+
+ Time.zone.parse(build_time)
+ end
+
+ def uploaded_at
+ return unless upload_time
+
+ Time.zone.parse(upload_time)
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/app/controllers/projects/gcp/artifact_registry/setup_controller.rb b/app/controllers/projects/gcp/artifact_registry/setup_controller.rb
new file mode 100644
index 00000000000..e90304ce593
--- /dev/null
+++ b/app/controllers/projects/gcp/artifact_registry/setup_controller.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+module Projects
+ module Gcp
+ module ArtifactRegistry
+ class SetupController < ::Projects::Gcp::ArtifactRegistry::BaseController
+ def new; end
+ end
+ end
+ end
+end
diff --git a/app/controllers/projects/group_links_controller.rb b/app/controllers/projects/group_links_controller.rb
index 5f8bf423219..855b9824cf2 100644
--- a/app/controllers/projects/group_links_controller.rb
+++ b/app/controllers/projects/group_links_controller.rb
@@ -3,7 +3,7 @@
class Projects::GroupLinksController < Projects::ApplicationController
layout 'project_settings'
before_action :authorize_admin_project!, except: [:destroy]
- before_action :authorize_admin_project_group_link!, only: [:destroy]
+ before_action :authorize_manage_destroy!, only: [:destroy]
before_action :authorize_admin_project_member!, only: [:update]
feature_category :groups_and_projects
@@ -20,8 +20,8 @@ class Projects::GroupLinksController < Projects::ApplicationController
else
render json: {}
end
- elsif result.reason == :not_found
- render json: { message: result.message }, status: :not_found
+ else
+ render json: { message: result.message }, status: result.reason
end
end
@@ -47,7 +47,7 @@ class Projects::GroupLinksController < Projects::ApplicationController
end
format.js do
- render json: { message: result.message }, status: :not_found if result.reason == :not_found
+ render json: { message: result.message }, status: result.reason
end
end
end
@@ -55,8 +55,8 @@ class Projects::GroupLinksController < Projects::ApplicationController
protected
- def authorize_admin_project_group_link!
- render_404 unless can?(current_user, :admin_project_group_link, group_link)
+ def authorize_manage_destroy!
+ render_404 unless can?(current_user, :manage_destroy, group_link)
end
def group_link
diff --git a/app/controllers/projects/integrations/shimos_controller.rb b/app/controllers/projects/integrations/shimos_controller.rb
deleted file mode 100644
index 6c8313d0805..00000000000
--- a/app/controllers/projects/integrations/shimos_controller.rb
+++ /dev/null
@@ -1,19 +0,0 @@
-# frozen_string_literal: true
-
-module Projects
- module Integrations
- class ShimosController < Projects::ApplicationController
- feature_category :integrations
-
- before_action :ensure_renderable
-
- def show; end
-
- private
-
- def ensure_renderable
- render_404 unless project.has_shimo? && project.shimo_integration&.render?
- end
- end
- end
-end
diff --git a/app/controllers/projects/issues_controller.rb b/app/controllers/projects/issues_controller.rb
index a6444dc038c..d0eabf8d837 100644
--- a/app/controllers/projects/issues_controller.rb
+++ b/app/controllers/projects/issues_controller.rb
@@ -49,6 +49,7 @@ class Projects::IssuesController < Projects::ApplicationController
push_frontend_feature_flag(:service_desk_ticket)
push_frontend_feature_flag(:issues_list_drawer, project)
push_frontend_feature_flag(:linked_work_items, project)
+ push_frontend_feature_flag(:display_work_item_epic_issue_sidebar, project)
end
before_action only: [:index, :show] do
@@ -67,6 +68,7 @@ class Projects::IssuesController < Projects::ApplicationController
push_force_frontend_feature_flag(:work_items_mvc_2, project&.work_items_mvc_2_feature_flag_enabled?)
push_frontend_feature_flag(:epic_widget_edit_confirmation, project)
push_frontend_feature_flag(:moved_mr_sidebar, project)
+ push_frontend_feature_flag(:display_work_item_epic_issue_sidebar, project)
push_force_frontend_feature_flag(:linked_work_items, project.linked_work_items_feature_flag_enabled?)
push_frontend_feature_flag(:notifications_todos_buttons, current_user)
end
diff --git a/app/controllers/projects/jobs_controller.rb b/app/controllers/projects/jobs_controller.rb
index d5a7f25d4ce..4062e625e07 100644
--- a/app/controllers/projects/jobs_controller.rb
+++ b/app/controllers/projects/jobs_controller.rb
@@ -21,7 +21,6 @@ class Projects::JobsController < Projects::ApplicationController
before_action :verify_api_request!, only: :terminal_websocket_authorize
before_action :authorize_create_proxy_build!, only: :proxy_websocket_authorize
before_action :verify_proxy_request!, only: :proxy_websocket_authorize
- before_action :push_job_log_jump_to_failures, only: [:show]
before_action :reject_if_build_artifacts_size_refreshing!, only: [:erase]
before_action :push_ai_build_failure_cause, only: [:show]
layout 'project'
@@ -277,10 +276,6 @@ class Projects::JobsController < Projects::ApplicationController
::Gitlab::Workhorse.channel_websocket(service)
end
- def push_job_log_jump_to_failures
- push_frontend_feature_flag(:job_log_jump_to_failures, @project)
- end
-
def push_ai_build_failure_cause
push_frontend_feature_flag(:ai_build_failure_cause, @project)
end
diff --git a/app/controllers/projects/merge_requests/diffs_controller.rb b/app/controllers/projects/merge_requests/diffs_controller.rb
index 5bd0063ab95..b269d41fa77 100644
--- a/app/controllers/projects/merge_requests/diffs_controller.rb
+++ b/app/controllers/projects/merge_requests/diffs_controller.rb
@@ -32,8 +32,11 @@ class Projects::MergeRequests::DiffsController < Projects::MergeRequests::Applic
# rubocop: disable Metrics/AbcSize
def diffs_batch
+ collapse_generated = Feature.enabled?(:collapse_generated_diff_files, project)
+
diff_options_hash = diff_options
diff_options_hash[:paths] = params[:paths] if params[:paths]
+ diff_options_hash[:collapse_generated] = collapse_generated
diffs = @compare.diffs_in_batch(params[:page], params[:per_page], diff_options: diff_options_hash)
@@ -59,7 +62,8 @@ class Projects::MergeRequests::DiffsController < Projects::MergeRequests::Applic
params[:expanded],
params[:page],
params[:per_page],
- options[:merge_ref_head_diff]
+ options[:merge_ref_head_diff],
+ collapse_generated
]
expires_in(1.day) if cache_with_max_age?
diff --git a/app/controllers/projects/merge_requests_controller.rb b/app/controllers/projects/merge_requests_controller.rb
index eb7505bd81f..0899e303305 100644
--- a/app/controllers/projects/merge_requests_controller.rb
+++ b/app/controllers/projects/merge_requests_controller.rb
@@ -41,18 +41,11 @@ class Projects::MergeRequestsController < Projects::MergeRequests::ApplicationCo
push_frontend_feature_flag(:moved_mr_sidebar, project)
push_frontend_feature_flag(:sast_reports_in_inline_diff, project)
push_frontend_feature_flag(:mr_experience_survey, project)
- push_force_frontend_feature_flag(:summarize_my_code_review, summarize_my_code_review_enabled?)
push_frontend_feature_flag(:ci_job_failures_in_mr, project)
push_frontend_feature_flag(:mr_pipelines_graphql, project)
push_frontend_feature_flag(:notifications_todos_buttons, current_user)
- push_frontend_feature_flag(:widget_pipeline_pass_subscription_update, project)
push_frontend_feature_flag(:mr_request_changes, current_user)
- end
-
- before_action only: [:edit] do
- if can?(current_user, :fill_in_merge_request_template, project)
- push_frontend_feature_flag(:fill_in_mr_template, project)
- end
+ push_frontend_feature_flag(:merge_blocked_component, current_user)
end
around_action :allow_gitaly_ref_name_caching, only: [:index, :show, :diffs, :discussions]
@@ -345,15 +338,9 @@ class Projects::MergeRequestsController < Projects::MergeRequests::ApplicationCo
end
def discussions
- if Feature.enabled?(:only_highlight_discussions_requested, project)
- super do |discussion_notes|
- note_ids = discussion_notes.flat_map { |x| x.notes.collect(&:id) }
- merge_request.discussions_diffs.load_highlight(diff_note_ids: note_ids)
- end
- else
- merge_request.discussions_diffs.load_highlight
-
- super
+ super do |discussion_notes|
+ note_ids = discussion_notes.flat_map { |x| x.notes.collect(&:id) }
+ merge_request.discussions_diffs.load_highlight(diff_note_ids: note_ids)
end
end
@@ -461,7 +448,10 @@ class Projects::MergeRequestsController < Projects::MergeRequests::ApplicationCo
@update_current_user_path = expose_path(api_v4_user_preferences_path)
@endpoint_metadata_url = endpoint_metadata_url(@project, @merge_request)
@endpoint_diff_batch_url = endpoint_diff_batch_url(@project, @merge_request)
- @diffs_batch_cache_key = @merge_request.merge_head_diff&.id if merge_request.diffs_batch_cache_with_max_age?
+
+ if merge_request.diffs_batch_cache_with_max_age?
+ @diffs_batch_cache_key = @merge_request.merge_head_diff&.patch_id_sha
+ end
set_pipeline_variables
@@ -471,11 +461,10 @@ class Projects::MergeRequestsController < Projects::MergeRequests::ApplicationCo
end
def get_diffs_count
- if show_only_context_commits?
- @merge_request.context_commits_diff.raw_diffs.size
- else
- @merge_request.diff_size
- end
+ return @merge_request.context_commits_diff.raw_diffs.size if show_only_context_commits?
+ return @merge_request.merge_request_diffs.find_by_id(params[:diff_id])&.size if params[:diff_id]
+
+ @merge_request.diff_size
end
def merge_request_update_params
@@ -598,7 +587,11 @@ class Projects::MergeRequestsController < Projects::MergeRequests::ApplicationCo
when :parsed
render json: Gitlab::Json.dump(report_comparison[:data]), status: :ok
when :error
- render json: { status_reason: report_comparison[:status_reason] }, status: :bad_request
+ render json: {
+ errors: [report_comparison[:status_reason]],
+ status_reason: report_comparison[:status_reason]
+ },
+ status: :bad_request
else
raise "Failed to build comparison response as comparison yielded unknown status '#{report_comparison[:status]}'"
end
@@ -629,7 +622,7 @@ class Projects::MergeRequestsController < Projects::MergeRequests::ApplicationCo
params = request
.query_parameters
.merge(view: 'inline', diff_head: true, w: show_whitespace, page: '0', per_page: per_page)
- params[:ck] = merge_request.merge_head_diff&.id if merge_request.diffs_batch_cache_with_max_age?
+ params[:ck] = merge_request.merge_head_diff&.patch_id_sha if merge_request.diffs_batch_cache_with_max_age?
diffs_batch_project_json_merge_request_path(project, merge_request, 'json', params)
end
@@ -638,16 +631,6 @@ class Projects::MergeRequestsController < Projects::MergeRequests::ApplicationCo
Date.strptime(date, "%Y-%m-%d")&.to_time&.to_i if date
rescue Date::Error, TypeError
end
-
- def summarize_my_code_review_enabled?
- namespace = project&.group&.root_ancestor
- return false if namespace.nil?
-
- Feature.enabled?(:summarize_my_code_review, current_user) &&
- namespace.group_namespace? &&
- namespace.licensed_feature_available?(:summarize_my_mr_code_review) &&
- Gitlab::Llm::StageCheck.available?(namespace, :summarize_my_mr_code_review)
- end
end
Projects::MergeRequestsController.prepend_mod_with('Projects::MergeRequestsController')
diff --git a/app/controllers/projects/ml/candidates_controller.rb b/app/controllers/projects/ml/candidates_controller.rb
index 12111c45fde..9905e454acb 100644
--- a/app/controllers/projects/ml/candidates_controller.rb
+++ b/app/controllers/projects/ml/candidates_controller.rb
@@ -9,9 +9,7 @@ module Projects
feature_category :mlops
- def show
- @include_ci_info = @candidate.from_ci? && can?(current_user, :read_build, @candidate.ci_build)
- end
+ def show; end
def destroy
@experiment = @candidate.experiment
diff --git a/app/controllers/projects/pipelines_controller.rb b/app/controllers/projects/pipelines_controller.rb
index cd2db2dad2c..516aa70cf89 100644
--- a/app/controllers/projects/pipelines_controller.rb
+++ b/app/controllers/projects/pipelines_controller.rb
@@ -166,6 +166,8 @@ class Projects::PipelinesController < Projects::ApplicationController
@stage = pipeline.stage(params[:stage])
return not_found unless @stage
+ return unless stage_stale?
+
render json: StageSerializer
.new(project: @project, current_user: @current_user)
.represent(@stage, details: true, retried: params[:retried])
@@ -263,6 +265,14 @@ class Projects::PipelinesController < Projects::ApplicationController
redirect_to url_for(safe_params.except(:scope).merge(status: safe_params[:scope])), status: :moved_permanently
end
+ def stage_stale?
+ return true if Feature.disabled?(:pipeline_stage_set_last_modified, @current_user)
+
+ last_modified = [@stage.updated_at.utc, @stage.statuses.maximum(:updated_at)].max
+
+ stale?(last_modified: last_modified, etag: @stage)
+ end
+
# rubocop: disable CodeReuse/ActiveRecord
def pipeline
return @pipeline if defined?(@pipeline)
diff --git a/app/controllers/projects/service_desk/custom_email_controller.rb b/app/controllers/projects/service_desk/custom_email_controller.rb
index fb5e87f9a97..7c1623cfcd1 100644
--- a/app/controllers/projects/service_desk/custom_email_controller.rb
+++ b/app/controllers/projects/service_desk/custom_email_controller.rb
@@ -3,7 +3,6 @@
module Projects
module ServiceDesk
class CustomEmailController < Projects::ApplicationController
- before_action :check_feature_flag_enabled
before_action :authorize_admin_project!
feature_category :service_desk
@@ -75,10 +74,6 @@ module Projects
error_message: error_message
}
end
-
- def check_feature_flag_enabled
- render_404 unless Feature.enabled?(:service_desk_custom_email, @project)
- end
end
end
end
diff --git a/app/controllers/projects/service_desk_controller.rb b/app/controllers/projects/service_desk_controller.rb
index 70cb439c4f3..a53e8859ee6 100644
--- a/app/controllers/projects/service_desk_controller.rb
+++ b/app/controllers/projects/service_desk_controller.rb
@@ -29,7 +29,13 @@ class Projects::ServiceDeskController < Projects::ApplicationController
end
def allowed_update_attributes
- %i[issue_template_key outgoing_name project_key add_external_participants_from_cc]
+ %i[
+ issue_template_key
+ outgoing_name
+ project_key
+ reopen_issue_on_external_participant_note
+ add_external_participants_from_cc
+ ]
end
def service_desk_attributes
@@ -42,6 +48,7 @@ class Projects::ServiceDeskController < Projects::ApplicationController
template_file_missing: service_desk_settings&.issue_template_missing?,
outgoing_name: service_desk_settings&.outgoing_name,
project_key: service_desk_settings&.project_key,
+ reopen_issue_on_external_participant_note: service_desk_settings&.reopen_issue_on_external_participant_note,
add_external_participants_from_cc: service_desk_settings&.add_external_participants_from_cc
}
end
diff --git a/app/controllers/projects/settings/merge_requests_controller.rb b/app/controllers/projects/settings/merge_requests_controller.rb
index f09e324f574..2724e2d9eec 100644
--- a/app/controllers/projects/settings/merge_requests_controller.rb
+++ b/app/controllers/projects/settings/merge_requests_controller.rb
@@ -52,6 +52,7 @@ module Projects
:resolve_outdated_diff_discussions,
:only_allow_merge_if_all_discussions_are_resolved,
:only_allow_merge_if_pipeline_succeeds,
+ :allow_merge_without_pipeline,
:printing_merge_request_link_enabled,
:remove_source_branch_after_merge,
:merge_method,
diff --git a/app/controllers/projects/tree_controller.rb b/app/controllers/projects/tree_controller.rb
index cfcc27edf3e..1bbf272e8f9 100644
--- a/app/controllers/projects/tree_controller.rb
+++ b/app/controllers/projects/tree_controller.rb
@@ -22,6 +22,7 @@ class Projects::TreeController < Projects::ApplicationController
push_frontend_feature_flag(:blob_blame_info, @project)
push_frontend_feature_flag(:highlight_js_worker, @project)
push_frontend_feature_flag(:explain_code_chat, current_user)
+ push_frontend_feature_flag(:encoding_logs_tree)
push_licensed_feature(:file_locks) if @project.licensed_feature_available?(:file_locks)
end