Commit 37ae8623 authored by Valery Sizov's avatar Valery Sizov

Refactoring

parent 5879bf07
...@@ -293,16 +293,11 @@ class Projects::MergeRequestsController < Projects::ApplicationController ...@@ -293,16 +293,11 @@ class Projects::MergeRequestsController < Projects::ApplicationController
end end
def set_suggested_approvers def set_suggested_approvers
if @target_project.approvals_before_merge.nonzero? if @merge_request.requires_approve?
@suggested_approvers = Gitlab::AuthorityAnalyzer.new( @suggested_approvers = Gitlab::AuthorityAnalyzer.new(
{ @merge_request,
source_branch: @merge_request.source_branch,
source_project: @merge_request.source_project,
target_branch: @merge_request.target_branch,
target_project: @merge_request.target_project
},
current_user current_user
).calculate(@target_project.approvals_before_merge) ).calculate(@merge_request.approvals_required)
end end
end end
......
...@@ -14,5 +14,5 @@ class Approver < ActiveRecord::Base ...@@ -14,5 +14,5 @@ class Approver < ActiveRecord::Base
belongs_to :target, polymorphic: true belongs_to :target, polymorphic: true
belongs_to :user belongs_to :user
validates :user_id, presence: true validates :user, presence: true
end end
...@@ -107,7 +107,7 @@ ...@@ -107,7 +107,7 @@
%li.no-approvers There are no approvers %li.no-approvers There are no approvers
- else - else
- @merge_request.approvers.each do |approver| - @merge_request.approvers.each do |approver|
%li %li{id: dom_id(approver.user)}
= link_to approver.user.name, approver.user = link_to approver.user.name, approver.user
.pull-right .pull-right
= link_to namespace_project_merge_request_approver_path(@project.namespace, @project, @merge_request, approver), data: { confirm: "Are you sure you want to remove approver #{approver.user.name}"}, method: :delete, class: "btn-xs btn btn-remove", title: 'Remove approver' do = link_to namespace_project_merge_request_approver_path(@project.namespace, @project, @merge_request, approver), data: { confirm: "Are you sure you want to remove approver #{approver.user.name}"}, method: :delete, class: "btn-xs btn btn-remove", title: 'Remove approver' do
...@@ -160,30 +160,30 @@ ...@@ -160,30 +160,30 @@
= link_to "#", data: { confirm: "Are you sure you want to remove approver {approver_name}"}, class: "btn-xs btn btn-remove", title: 'Remove approver' do = link_to "#", data: { confirm: "Are you sure you want to remove approver {approver_name}"}, class: "btn-xs btn btn-remove", title: 'Remove approver' do
= icon("sign-out") = icon("sign-out")
Remove Remove
- if issuable.is_a?(MergeRequest)
:coffeescript
$(".approver-list").on "click", ".project-approvers .btn-remove", ->
$(this).closest("li").remove()
return false
$("form.merge-request-form").submit ->
if $("input#merge_request_approver_ids").length
approver_ids = $.map $("li.project-approvers").not(".approver-template"), (li, i) ->
li.id.replace("user_", "")
approvers_input = $(this).find("input#merge_request_approver_ids")
approver_ids = approver_ids.concat(approvers_input.val().split(","))
approvers_input.val(_.compact(approver_ids).join(","))
$(".suggested-approvers a").click ->
user_id = this.id.replace("user_", "")
user_name = this.text
return false if $(".approver-list #user_" + user_id).length
:coffeescript approver_item_html = $(".project-approvers.approver-template").clone().
$(".approver-list").on "click", ".project-approvers .btn-remove", -> removeClass("hide approver-template")[0].
$(this).closest("li").remove() outerHTML.
return false replace(/\{approver_name\}/g, user_name).
$("form.merge-request-form").submit -> replace(/\{user_id\}/g, user_id)
if $("input#merge_request_approver_ids").length $(".no-approvers").remove()
approver_ids = $.map $("li.project-approvers").not(".approver-template"), (li, i) -> $(".approver-list").append(approver_item_html)
li.id.replace("user_", "") return false
approvers_input = $(this).find("input#merge_request_approver_ids")
approver_ids = approver_ids.concat(approvers_input.val().split(","))
approvers_input.val(_.compact(approver_ids).join(","))
$(".suggested-approvers a").click ->
user_id = this.id.replace("user_", "")
user_name = this.text
return false if $(".approver-list #user_" + user_id).length
approver_item_html = $(".project-approvers.approver-template").clone().
removeClass("hide approver-template")[0].
outerHTML.
replace(/\{approver_name\}/g, user_name).
replace(/\{user_id\}/g, user_id)
$(".no-approvers").remove()
$(".approver-list").append(approver_item_html)
return false
module Gitlab module Gitlab
class AuthorityAnalyzer class AuthorityAnalyzer
COMMITS_TO_CONSIDERATION = 5 COMMITS_TO_CONSIDER = 5
def initialize(data, current_user) def initialize(merge_request, current_user)
@source_branch = data[:source_branch] @merge_request = merge_request
@source_project = data[:source_project]
@target_branch = data[:target_branch]
@target_project = data[:target_project]
@current_user = current_user @current_user = current_user
@users = {} @users = Hash.new(0)
end end
def calculate(number_of_approvers) def calculate(number_of_approvers)
involved_users involved_users
# Picks most active users from hash like: {user1: 2, user2: 6} # Picks most active users from hash like: {user1: 2, user2: 6}
@users.to_a.sort{|a, b| b.last <=> a.last }[0..number_of_approvers].map(&:first) @users.sort_by { |user, count| count }.map(&:first).take(number_of_approvers)
end end
private private
def involved_users def involved_users
@repo = @target_project.repository @repo = @merge_request.target_project.repository
list_of_involved_files.each do |path| list_of_involved_files.each do |path|
@repo.commits(@target_branch, path, COMMITS_TO_CONSIDERATION).each do |commit| @repo.commits(@merge_request.target_branch, path, COMMITS_TO_CONSIDER).each do |commit|
add_user_to_list(commit.author) unless commit.author.nil? @users[commit.author] += 1 if commit.author
end end
end end
end end
def add_user_to_list(user)
@users[user] = @users[user].nil? ? 1 : (@users[user] + 1)
end
def list_of_involved_files def list_of_involved_files
compare_result = CompareService.new.execute( compare_diffs = @merge_request.compare_diffs || @merge_request.diffs
@current_user,
@source_project, return [] unless compare_diffs.present?
@source_branch,
@target_project, compare_diffs.map do |diff|
@target_branch, if diff.deleted_file || diff.renamed_file
) diff.old_path
else
commits = compare_result.commits diff.new_path
if commits.present? && compare_result.diffs.present?
return compare_result.diffs.map do |diff|
case true
when diff.deleted_file, diff.renamed_file
diff.old_path
else
diff.new_path
end
end end
end end
[]
end end
end end
end end
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment