Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJosh Frye <joshfng@gmail.com>2016-07-06 18:06:57 +0300
committerJosh Frye <joshfng@gmail.com>2016-07-14 17:02:59 +0300
commitc9a12b1d92ac946a15fca66fd28e8f4364282149 (patch)
tree1e65f98253444afe8d096bb7ea718f2aec4ca913
parentbc7fd405dc7b0a36808c093332016e54f047699e (diff)
Start of MR confict resolver serviceresolver-service
-rw-r--r--app/models/merge_request.rb12
-rw-r--r--app/models/repository.rb39
-rw-r--r--app/services/merge_requests/conflicts/formatter_service.rb16
-rw-r--r--app/services/merge_requests/conflicts/resolver_service.rb27
4 files changed, 91 insertions, 3 deletions
diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb
index 157901378d3..d3a611414cb 100644
--- a/app/models/merge_request.rb
+++ b/app/models/merge_request.rb
@@ -321,6 +321,18 @@ class MergeRequest < ActiveRecord::Base
end
end
+ def conflicts?
+ project.repository.conflicts?(diff_head_sha, target_branch)
+ end
+
+ def conflicts
+ project.repository.conflicts(diff_head_sha, target_branch)
+ end
+
+ def conflict_diff(conflict)
+ project.repository.conflict_diff(diff_head_sha, target_branch, conflict[:ancestor][:path])
+ end
+
def merge_event
@merge_event ||= target_project.events.where(target_id: self.id, target_type: "MergeRequest", action: Event::MERGED).last
end
diff --git a/app/models/repository.rb b/app/models/repository.rb
index 5b670cb4b8f..edcfe401340 100644
--- a/app/models/repository.rb
+++ b/app/models/repository.rb
@@ -637,11 +637,11 @@ class Repository
def contributors
commits = self.commits(nil, limit: 2000, offset: 0, skip_merges: true)
- commits.group_by(&:author_email).map do |email, commits|
+ commits.group_by(&:author_email).map do |author_email, author_commits|
contributor = Gitlab::Contributor.new
- contributor.email = email
+ contributor.email = author_email
- commits.each do |commit|
+ author_commits.each do |commit|
if contributor.name.blank?
contributor.name = commit.author_name
end
@@ -769,6 +769,39 @@ class Repository
end
end
+ def conflicts?(source_sha, target_branch)
+ our_commit = rugged.branches[target_branch].target
+ their_commit = rugged.lookup(source_sha)
+
+ if our_commit && their_commit
+ rugged.merge_commits(our_commit, their_commit).conflicts?
+ else
+ false
+ end
+ end
+
+ def conflicts(source_sha, target_branch)
+ our_commit = rugged.branches[target_branch].target
+ their_commit = rugged.lookup(source_sha)
+
+ if our_commit && their_commit
+ rugged.merge_commits(our_commit, their_commit).conflicts
+ else
+ []
+ end
+ end
+
+ def conflict_diff(source_sha, target_branch, path)
+ our_commit = rugged.branches[target_branch].target
+ their_commit = rugged.lookup(source_sha)
+
+ if our_commit && their_commit && path
+ rugged.diff(our_commit, their_commit, { paths: [path], context_lines: 3 })
+ else
+ []
+ end
+ end
+
def merge(user, source_sha, target_branch, options = {})
our_commit = rugged.branches[target_branch].target
their_commit = rugged.lookup(source_sha)
diff --git a/app/services/merge_requests/conflicts/formatter_service.rb b/app/services/merge_requests/conflicts/formatter_service.rb
new file mode 100644
index 00000000000..4c7aba2cdab
--- /dev/null
+++ b/app/services/merge_requests/conflicts/formatter_service.rb
@@ -0,0 +1,16 @@
+module MergeRequests
+ module Conflicts
+ class FormatterService
+ attr_accessor :rugged_input
+
+ def initialize(rugged_input)
+ @rugged_input = rugged_input
+ end
+
+ def format_from_rugged
+ # TODO: format!
+ @rugged_input
+ end
+ end
+ end
+end
diff --git a/app/services/merge_requests/conflicts/resolver_service.rb b/app/services/merge_requests/conflicts/resolver_service.rb
new file mode 100644
index 00000000000..1c17df771c9
--- /dev/null
+++ b/app/services/merge_requests/conflicts/resolver_service.rb
@@ -0,0 +1,27 @@
+module MergeRequests
+ module Conflicts
+ class ResolverService
+ attr_accessor :merge_request
+
+ def initialize(merge_request)
+ @merge_request = merge_request
+ end
+
+ def conflicts
+ return [] unless @merge_request.conflicts?
+
+ diff_lines = []
+
+ @merge_request.conflicts.each do |c|
+ diff_lines.push(
+ Gitlab::Diff::Parser.new.parse(
+ @merge_request.conflict_diff(c).each_line.collect { |el| el.content }
+ ).to_a
+ )
+ end
+
+ diff_lines
+ end
+ end
+ end
+end