diff_file_entity.rb 2.63 KB
Newer Older
1 2
# frozen_string_literal: true

3
class DiffFileEntity < DiffFileBaseEntity
Felipe Artur's avatar
Felipe Artur committed
4
  include CommitsHelper
5 6
  include IconsHelper

Felipe Artur's avatar
Felipe Artur committed
7 8 9
  expose :added_lines
  expose :removed_lines

10
  expose :load_collapsed_diff_url, if: -> (diff_file, options) { options[:merge_request] } do |diff_file|
Felipe Artur's avatar
Felipe Artur committed
11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
    merge_request = options[:merge_request]
    project = merge_request.target_project

    next unless project

    diff_for_path_namespace_project_merge_request_path(
      namespace_id: project.namespace.to_param,
      project_id: project.to_param,
      id: merge_request.iid,
      old_path: diff_file.old_path,
      new_path: diff_file.new_path,
      file_identifier: diff_file.file_identifier
    )
  end

  expose :view_path, if: -> (_, options) { options[:merge_request] } do |diff_file|
    merge_request = options[:merge_request]

    project = merge_request.target_project

    next unless project
32
    next unless diff_file.content_sha
Felipe Artur's avatar
Felipe Artur committed
33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49

    project_blob_path(project, tree_join(diff_file.content_sha, diff_file.new_path))
  end

  expose :replaced_view_path, if: -> (_, options) { options[:merge_request] } do |diff_file|
    image_diff = diff_file.rich_viewer && diff_file.rich_viewer.partial_name == 'image'
    image_replaced = diff_file.old_content_sha && diff_file.old_content_sha != diff_file.content_sha

    merge_request = options[:merge_request]
    project = merge_request.target_project

    next unless project

    project_blob_path(project, tree_join(diff_file.old_content_sha, diff_file.old_path)) if image_diff && image_replaced
  end

  expose :context_lines_path, if: -> (diff_file, _) { diff_file.text? } do |diff_file|
50 51
    next unless diff_file.content_sha

Felipe Artur's avatar
Felipe Artur committed
52 53 54 55
    project_blob_diff_path(diff_file.repository.project, tree_join(diff_file.content_sha, diff_file.file_path))
  end

  # Used for inline diffs
56
  expose :highlighted_diff_lines, using: DiffLineEntity, if: -> (diff_file, options) { inline_diff_view?(options) && diff_file.text? } do |diff_file|
Felipe Artur's avatar
Felipe Artur committed
57 58 59
    diff_file.diff_lines_for_serializer
  end

60
  expose :is_fully_expanded do |diff_file|
61 62 63
    diff_file.fully_expanded?
  end

Felipe Artur's avatar
Felipe Artur committed
64
  # Used for parallel diffs
65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
  expose :parallel_diff_lines, using: DiffLineParallelEntity, if: -> (diff_file, options) { parallel_diff_view?(options) && diff_file.text? }

  private

  def parallel_diff_view?(options)
    return true unless Feature.enabled?(:single_mr_diff_view)

    # If we're not rendering inline, we must be rendering parallel
    !inline_diff_view?(options)
  end

  def inline_diff_view?(options)
    return true unless Feature.enabled?(:single_mr_diff_view)

    # If nothing is present, inline will be the default.
    options.fetch(:diff_view, :inline).to_sym == :inline
  end
82
end