mirror of
https://github.com/wahyd4/gitlabhq.git
synced 2026-08-09 12:46:07 +10:00
45 lines
1.1 KiB
Ruby
45 lines
1.1 KiB
Ruby
module Gitlab
|
|
class AuthorityAnalyzer
|
|
COMMITS_TO_CONSIDER = 5
|
|
|
|
def initialize(merge_request, current_user)
|
|
@merge_request = merge_request
|
|
@current_user = current_user
|
|
@users = Hash.new(0)
|
|
end
|
|
|
|
def calculate(number_of_approvers)
|
|
involved_users
|
|
|
|
# Picks most active users from hash like: {user1: 2, user2: 6}
|
|
@users.sort_by { |user, count| count }.map(&:first).take(number_of_approvers)
|
|
end
|
|
|
|
private
|
|
|
|
def involved_users
|
|
@repo = @merge_request.target_project.repository
|
|
|
|
list_of_involved_files.each do |path|
|
|
@repo.commits(@merge_request.target_branch, path, COMMITS_TO_CONSIDER).each do |commit|
|
|
@users[commit.author] += 1 if commit.author
|
|
end
|
|
end
|
|
end
|
|
|
|
def list_of_involved_files
|
|
compare_diffs = @merge_request.compare_diffs || @merge_request.diffs
|
|
|
|
return [] unless compare_diffs.present?
|
|
|
|
compare_diffs.map do |diff|
|
|
if diff.deleted_file || diff.renamed_file
|
|
diff.old_path
|
|
else
|
|
diff.new_path
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|