From b757ab471dbfaa9c7af92f184cd7a2eefaa6df9b Mon Sep 17 00:00:00 2001 From: Stanislav Lashmanov Date: Thu, 3 Jul 2025 00:20:53 +0400 Subject: [PATCH] Add disable_syntax_highlight param to Rapid Diffs Add DiffFile presenter --- .../rapid_diffs/diff_file_component.rb | 2 +- .../text/inline_view_component.html.haml | 2 +- .../text/parallel_view_component.html.haml | 2 +- .../rapid_diffs/streaming_resource.rb | 12 ++++++- app/controllers/projects/commit_controller.rb | 4 ++- .../projects/compare_controller.rb | 2 ++ .../merge_requests/creations_controller.rb | 2 ++ .../projects/merge_requests_controller.rb | 4 ++- app/presenters/rapid_diffs/base_presenter.rb | 16 ++++++++-- .../rapid_diffs/commit_presenter.rb | 1 + .../rapid_diffs/compare_presenter.rb | 1 + .../rapid_diffs/diff_file_presenter.rb | 32 +++++++++++++++++++ .../merge_request_creation_presenter.rb | 5 +-- .../rapid_diffs/merge_request_presenter.rb | 1 + lib/gitlab/diff/file.rb | 5 +-- 15 files changed, 78 insertions(+), 13 deletions(-) create mode 100644 app/presenters/rapid_diffs/diff_file_presenter.rb diff --git a/app/components/rapid_diffs/diff_file_component.rb b/app/components/rapid_diffs/diff_file_component.rb index c51e3b3bfea04c..85716269d5e64a 100644 --- a/app/components/rapid_diffs/diff_file_component.rb +++ b/app/components/rapid_diffs/diff_file_component.rb @@ -47,7 +47,7 @@ def total_rows return 0 unless !@diff_file.no_preview? && @diff_file.diffable_text? count = 0 - @diff_file.viewer_hunks.each do |hunk| + @diff_file.hunks.each do |hunk| count += 1 if hunk.header count += @parallel_view ? hunk.parallel_lines.count : hunk.lines.count end diff --git a/app/components/rapid_diffs/viewers/text/inline_view_component.html.haml b/app/components/rapid_diffs/viewers/text/inline_view_component.html.haml index 1d9fba886a0d26..944f128e66b33b 100644 --- a/app/components/rapid_diffs/viewers/text/inline_view_component.html.haml +++ b/app/components/rapid_diffs/viewers/text/inline_view_component.html.haml @@ -4,5 +4,5 @@ - column_titles.each do |title| %th= title %tbody.rd-text-view-content - - @diff_file.viewer_hunks.each do |hunk| + - @diff_file.hunks.each do |hunk| = render RapidDiffs::Viewers::Text::InlineHunkComponent.new(diff_hunk: hunk, file_hash: @diff_file.file_hash, file_path: @diff_file.file_path) diff --git a/app/components/rapid_diffs/viewers/text/parallel_view_component.html.haml b/app/components/rapid_diffs/viewers/text/parallel_view_component.html.haml index 2149fdedb45a4e..cf190a51ee5981 100644 --- a/app/components/rapid_diffs/viewers/text/parallel_view_component.html.haml +++ b/app/components/rapid_diffs/viewers/text/parallel_view_component.html.haml @@ -4,5 +4,5 @@ - column_titles.each do |title| %th= title %tbody.rd-text-view-content - - @diff_file.viewer_hunks.each do |hunk| + - @diff_file.hunks.each do |hunk| = render RapidDiffs::Viewers::Text::ParallelHunkComponent.new(diff_hunk: hunk, file_hash: @diff_file.file_hash, file_path: @diff_file.file_path) diff --git a/app/controllers/concerns/rapid_diffs/streaming_resource.rb b/app/controllers/concerns/rapid_diffs/streaming_resource.rb index bcc8f883787aaf..9a0277b94cdeff 100644 --- a/app/controllers/concerns/rapid_diffs/streaming_resource.rb +++ b/app/controllers/concerns/rapid_diffs/streaming_resource.rb @@ -71,6 +71,7 @@ def stream_diff_files(options, view_context) def stream_diff_collection(options, view_context) diff_files = resource.diffs_for_streaming(options).diff_files(sorted: sorted?) + .map { |diff_file| decorate_diff_file(diff_file) } return render_empty_state if diff_files.empty? @@ -103,7 +104,8 @@ def stream_diff_blobs(options, view_context) return render_empty_state if resource.diffs_for_streaming(options).count == 0 resource.diffs_for_streaming(options) do |diff_files_batch| - response.stream.write(diff_files_collection(diff_files_batch).render_in(view_context)) + diffs = diff_files_batch.map { |file| decorate_diff_file(file) } + response.stream.write(diff_files_collection(diffs).render_in(view_context)) end end @@ -115,6 +117,14 @@ def sorted? false end + def decorate_diff_file(diff_file) + DiffFilePresenter.new( + diff_file, + ActionController::Parameters.new(request.query_parameters), + current_user: current_user + ) + end + class Request < SimpleDelegator def format Mime::Type.lookup("text/html") diff --git a/app/controllers/projects/commit_controller.rb b/app/controllers/projects/commit_controller.rb index 43fdeb9e0c5ce5..e25ddd6cec37c6 100644 --- a/app/controllers/projects/commit_controller.rb +++ b/app/controllers/projects/commit_controller.rb @@ -153,7 +153,9 @@ def rapid_diffs @rapid_diffs_presenter = RapidDiffs::CommitPresenter.new( @commit, diff_view, - commit_diff_options + commit_diff_options, + ActionController::Parameters.new(request.query_parameters), + current_user ) show diff --git a/app/controllers/projects/compare_controller.rb b/app/controllers/projects/compare_controller.rb index 81357243e13a8d..041edf7d1c0a99 100644 --- a/app/controllers/projects/compare_controller.rb +++ b/app/controllers/projects/compare_controller.rb @@ -85,6 +85,8 @@ def rapid_diffs compare, diff_view, diff_options, + ActionController::Parameters.new(request.query_parameters), + current_user, compare_params ) diff --git a/app/controllers/projects/merge_requests/creations_controller.rb b/app/controllers/projects/merge_requests/creations_controller.rb index 5f437994659684..9e5ff73d83f7c6 100644 --- a/app/controllers/projects/merge_requests/creations_controller.rb +++ b/app/controllers/projects/merge_requests/creations_controller.rb @@ -38,6 +38,8 @@ def new project, diff_view, diff_options, + ActionController::Parameters.new(request.query_parameters), + current_user, { merge_request: merge_request_params } ) render action: :rapid_diffs diff --git a/app/controllers/projects/merge_requests_controller.rb b/app/controllers/projects/merge_requests_controller.rb index 64a4ae0793453f..9e477727e6c2df 100644 --- a/app/controllers/projects/merge_requests_controller.rb +++ b/app/controllers/projects/merge_requests_controller.rb @@ -108,7 +108,9 @@ def rapid_diffs @rapid_diffs_presenter = ::RapidDiffs::MergeRequestPresenter.new( @merge_request, diff_view, - diff_options + diff_options, + ActionController::Parameters.new(request.query_parameters), + current_user ) show_merge_request diff --git a/app/presenters/rapid_diffs/base_presenter.rb b/app/presenters/rapid_diffs/base_presenter.rb index cd23cff2f9342c..4e07f367a28de0 100644 --- a/app/presenters/rapid_diffs/base_presenter.rb +++ b/app/presenters/rapid_diffs/base_presenter.rb @@ -2,11 +2,13 @@ module RapidDiffs class BasePresenter < Gitlab::View::Presenter::Delegated - def initialize(subject, diff_view, diff_options, request_params = nil) + def initialize(subject, diff_view, diff_options, query_params, current_user, request_params = nil) super(subject) @diff_view = diff_view @diff_options = diff_options @request_params = request_params + @query_params = query_params + @current_user = current_user end def diffs_stream_url @@ -22,7 +24,11 @@ def reload_stream_url(offset: nil, diff_view: nil) def diffs_slice return if offset.nil? - @diffs_slice ||= resource.first_diffs_slice(offset, @diff_options) + @diffs_slice ||= resource.first_diffs_slice(offset, @diff_options).map do |diff_file| + # rubocop: disable CodeReuse/Presenter -- diff file presenter abstraction simplifies data handling for ViewComponents + DiffFilePresenter.new(diff_file, diff_view_params, current_user: current_user) + # rubocop: enable CodeReuse/Presenter + end end def diffs_stats_endpoint @@ -47,7 +53,7 @@ def lazy? protected - attr_reader :request_params + attr_reader :query_params, :request_params, :current_user def offset 5 @@ -55,6 +61,10 @@ def offset private + def diff_view_params + query_params.permit(:disable_syntax_highlighting) + end + def diffs_count @diffs_count ||= resource.diffs_for_streaming.diff_files.count end diff --git a/app/presenters/rapid_diffs/commit_presenter.rb b/app/presenters/rapid_diffs/commit_presenter.rb index ca9c724e5b6a04..ab220ceec74e74 100644 --- a/app/presenters/rapid_diffs/commit_presenter.rb +++ b/app/presenters/rapid_diffs/commit_presenter.rb @@ -23,6 +23,7 @@ def reload_stream_url(offset: nil, diff_view: nil) diffs_stream_project_commit_path( resource.project, resource.id, + **diff_view_params, offset: offset, view: diff_view ) diff --git a/app/presenters/rapid_diffs/compare_presenter.rb b/app/presenters/rapid_diffs/compare_presenter.rb index 89b78567920cb2..e2af08782d5f13 100644 --- a/app/presenters/rapid_diffs/compare_presenter.rb +++ b/app/presenters/rapid_diffs/compare_presenter.rb @@ -23,6 +23,7 @@ def reload_stream_url(offset: nil, diff_view: nil) diffs_stream_project_compare_index_path( resource.project, **request_params, + **diff_view_params, offset: offset, view: diff_view ) diff --git a/app/presenters/rapid_diffs/diff_file_presenter.rb b/app/presenters/rapid_diffs/diff_file_presenter.rb new file mode 100644 index 00000000000000..ec59e01fd3e6e3 --- /dev/null +++ b/app/presenters/rapid_diffs/diff_file_presenter.rb @@ -0,0 +1,32 @@ +# frozen_string_literal: true + +module RapidDiffs + class DiffFilePresenter < Gitlab::View::Presenter::Delegated + include GitlabRoutingHelper + include Gitlab::Utils::StrongMemoize + + presents Gitlab::Diff::File, as: :resource + + def initialize(diff_file, query_params, **rest) + super(diff_file, **rest) + @query_params = query_params + end + + def hunks + resource.viewer_hunks(disable_syntax_highlighting) + end + strong_memoize_attr :hunks + + protected + + attr_reader :query_params + + private + + def disable_syntax_highlighting + return unless Feature.enabled?(:rapid_diffs_debug, current_user, type: :ops) + + query_params[:disable_syntax_highlighting] == 'true' + end + end +end diff --git a/app/presenters/rapid_diffs/merge_request_creation_presenter.rb b/app/presenters/rapid_diffs/merge_request_creation_presenter.rb index 69c5f634721b42..808751b529e958 100644 --- a/app/presenters/rapid_diffs/merge_request_creation_presenter.rb +++ b/app/presenters/rapid_diffs/merge_request_creation_presenter.rb @@ -6,8 +6,8 @@ class MergeRequestCreationPresenter < BasePresenter presents ::MergeRequest, as: :resource - def initialize(subject, project, diff_view, diff_options, request_params = nil) - super(subject, diff_view, diff_options, request_params) + def initialize(subject, project, diff_view, diff_options, query_params, current_user, request_params) + super(subject, diff_view, diff_options, query_params, current_user, request_params) @project = project end @@ -28,6 +28,7 @@ def reload_stream_url(offset: nil, diff_view: nil) project_new_merge_request_diffs_stream_path( @project, **request_params, + **diff_view_params, offset: offset, view: diff_view ) diff --git a/app/presenters/rapid_diffs/merge_request_presenter.rb b/app/presenters/rapid_diffs/merge_request_presenter.rb index 1c76dfff90ac81..9e82e5d266b60e 100644 --- a/app/presenters/rapid_diffs/merge_request_presenter.rb +++ b/app/presenters/rapid_diffs/merge_request_presenter.rb @@ -23,6 +23,7 @@ def reload_stream_url(offset: nil, diff_view: nil) diffs_stream_project_merge_request_path( resource.project, resource, + **diff_view_params, offset: offset, view: diff_view ) diff --git a/lib/gitlab/diff/file.rb b/lib/gitlab/diff/file.rb index e5a9f002fa9c69..4270ad0236fcbb 100644 --- a/lib/gitlab/diff/file.rb +++ b/lib/gitlab/diff/file.rb @@ -177,8 +177,9 @@ def diff_lines Gitlab::Diff::Parser.new.parse(raw_diff.each_line, diff_file: self).to_a end - def viewer_hunks - ViewerHunk.init_from_diff_lines(diff_lines_with_match_tail) + def viewer_hunks(disable_highlighting = false) + lines = disable_highlighting ? diff_lines : highlighted_diff_lines + ViewerHunk.init_from_diff_lines(lines) end # Changes diff_lines according to the given position. That is, -- GitLab