summaryrefslogtreecommitdiff
path: root/app/models/merge_request_context_commit.rb
blob: 0f2a7515462c2cf4861e476b0e5e86bca88ba5cb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# frozen_string_literal: true

class MergeRequestContextCommit < ApplicationRecord
  include CachedCommit
  include ShaAttribute

  belongs_to :merge_request
  has_many :diff_files, class_name: 'MergeRequestContextCommitDiffFile'

  sha_attribute :sha

  validates :sha, presence: true
  validates :sha, uniqueness: { message: 'has already been added' }

  serialize :trailers, Serializers::Json # rubocop:disable Cop/ActiveRecordSerialize
  validates :trailers, json_schema: { filename: 'git_trailers' }

  # Sort by committed date in descending order to ensure latest commits comes on the top
  scope :order_by_committed_date_desc, -> { order('committed_date DESC') }

  # delete all MergeRequestContextCommit & MergeRequestContextCommitDiffFile for given merge_request & commit SHAs
  def self.delete_bulk(merge_request, commits)
    commit_ids = commits.map(&:sha)
    merge_request.merge_request_context_commits.where(sha: commit_ids).delete_all
  end

  # create MergeRequestContextCommit by given commit sha and it's diff file record
  def self.bulk_insert(rows, **args)
    Gitlab::Database.bulk_insert('merge_request_context_commits', rows, **args) # rubocop:disable Gitlab/BulkInsert
  end

  def to_commit
    # Here we are storing the commit sha because to_hash removes the sha parameter and we lose
    # the reference, this happens because we are storing the ID in db and the Commit class replaces
    # id with sha and removes it, so in our case it will be some incremented integer which is not
    # what we want
    commit_hash = attributes.except('id').to_hash
    commit_hash['id'] = sha
    Commit.from_hash(commit_hash, merge_request.target_project)
  end
end