aff5c9f3e5
This is an ID-less table with just three columns: an association to the merge request diff the commit belongs to, the relative order of the commit within the merge request diff, and the commit SHA itself. Previously we stored much more information about the commits, so that we could display them even when they were deleted from the repo. Since 8.0, we ensure that those commits are kept around for as long as the target repo itself is, so we don't need to duplicate that data in the database.
63 lines
1.7 KiB
Ruby
63 lines
1.7 KiB
Ruby
module Gitlab
|
|
module CycleAnalytics
|
|
class PlanEventFetcher < BaseEventFetcher
|
|
def initialize(*args)
|
|
@projections = [mr_diff_table[:id],
|
|
mr_diff_table[:st_commits],
|
|
issue_metrics_table[:first_mentioned_in_commit_at]]
|
|
|
|
super(*args)
|
|
end
|
|
|
|
def events_query
|
|
base_query
|
|
.join(mr_diff_table)
|
|
.on(mr_diff_table[:merge_request_id].eq(mr_table[:id]))
|
|
|
|
super
|
|
end
|
|
|
|
private
|
|
|
|
def merge_request_diff_commits
|
|
@merge_request_diff_commits ||=
|
|
MergeRequestDiffCommit
|
|
.where(merge_request_diff_id: event_result.map { |event| event['id'] })
|
|
.group_by(&:merge_request_diff_id)
|
|
end
|
|
|
|
def serialize(event)
|
|
commit = first_time_reference_commit(event)
|
|
|
|
return unless commit
|
|
|
|
serialize_commit(event, commit, query)
|
|
end
|
|
|
|
def first_time_reference_commit(event)
|
|
return nil unless event && merge_request_diff_commits
|
|
|
|
commits =
|
|
if event['st_commits'].present?
|
|
YAML.load(event['st_commits'])
|
|
else
|
|
merge_request_diff_commits[event['id'].to_i]
|
|
end
|
|
|
|
return nil if commits.blank?
|
|
|
|
commits.find do |commit|
|
|
next unless commit[:committed_date] && event['first_mentioned_in_commit_at']
|
|
|
|
commit[:committed_date].to_i == DateTime.parse(event['first_mentioned_in_commit_at'].to_s).to_i
|
|
end
|
|
end
|
|
|
|
def serialize_commit(event, commit, query)
|
|
commit = Commit.new(Gitlab::Git::Commit.new(commit.to_hash), @project)
|
|
|
|
AnalyticsCommitSerializer.new(project: @project, total_time: event['total_time']).represent(commit)
|
|
end
|
|
end
|
|
end
|
|
end
|