Commit 78235edda8009e7dcec3f15b3ec79a0c17d9d797

Authored by Riyad Preukschas
1 parent 847bba92

Renamed Gitlab::Merge to Gitlab::Satellite::MergeAction

app/models/merge_request.rb
@@ -60,7 +60,7 @@ class MergeRequest < ActiveRecord::Base @@ -60,7 +60,7 @@ class MergeRequest < ActiveRecord::Base
60 end 60 end
61 61
62 def check_if_can_be_merged 62 def check_if_can_be_merged
63 - self.state = if Gitlab::Merge.new(self, self.author).can_be_merged? 63 + self.state = if Gitlab::Satellite::MergeAction.new(self, self.author).can_be_merged?
64 CAN_BE_MERGED 64 CAN_BE_MERGED
65 else 65 else
66 CANNOT_BE_MERGED 66 CANNOT_BE_MERGED
@@ -167,7 +167,7 @@ class MergeRequest < ActiveRecord::Base @@ -167,7 +167,7 @@ class MergeRequest < ActiveRecord::Base
167 end 167 end
168 168
169 def automerge!(current_user) 169 def automerge!(current_user)
170 - if Gitlab::Merge.new(self, current_user).merge! && self.unmerged_commits.empty? 170 + if Gitlab::Satellite::MergeAction.new(self, current_user).merge! && self.unmerged_commits.empty?
171 self.merge!(current_user.id) 171 self.merge!(current_user.id)
172 true 172 true
173 end 173 end
lib/gitlab/merge.rb
@@ -1,106 +0,0 @@ @@ -1,106 +0,0 @@
1 -module Gitlab  
2 - class Merge  
3 - attr_accessor :merge_request, :project, :user  
4 -  
5 - def initialize(merge_request, user)  
6 - @merge_request = merge_request  
7 - @project = merge_request.project  
8 - @user = user  
9 - end  
10 -  
11 - def can_be_merged?  
12 - in_locked_and_timed_satellite do |merge_repo|  
13 - merge_in_satellite!(merge_repo)  
14 - end  
15 - end  
16 -  
17 - # Merges the source branch into the target branch in the satellite and  
18 - # pushes it back to Gitolite.  
19 - # It also removes the source branch if requested in the merge request.  
20 - #  
21 - # Returns false if the merge produced conflicts  
22 - # Returns false if pushing from the satellite to Gitolite failed or was rejected  
23 - # Returns true otherwise  
24 - def merge!  
25 - in_locked_and_timed_satellite do |merge_repo|  
26 - if merge_in_satellite!(merge_repo)  
27 - # push merge back to Gitolite  
28 - # will raise CommandFailed when push fails  
29 - merge_repo.git.push({raise: true}, :origin, merge_request.target_branch)  
30 -  
31 - # remove source branch  
32 - if merge_request.should_remove_source_branch && !project.root_ref?(merge_request.source_branch)  
33 - # will raise CommandFailed when push fails  
34 - merge_repo.git.push({raise: true}, :origin, ":#{merge_request.source_branch}")  
35 - end  
36 -  
37 - # merge, push and branch removal successful  
38 - true  
39 - end  
40 - end  
41 - rescue Grit::Git::CommandFailed  
42 - false  
43 - end  
44 -  
45 - private  
46 -  
47 - # * Sets a 30s timeout for Git  
48 - # * Locks the satellite repo  
49 - # * Yields the prepared satellite repo  
50 - def in_locked_and_timed_satellite  
51 - Grit::Git.with_timeout(30.seconds) do  
52 - lock_file = Rails.root.join("tmp", "#{project.path}.lock")  
53 -  
54 - File.open(lock_file, "w+") do |f|  
55 - f.flock(File::LOCK_EX)  
56 -  
57 - unless project.satellite.exists?  
58 - raise "Satellite doesn't exist"  
59 - end  
60 -  
61 - Dir.chdir(project.satellite.path) do  
62 - repo = Grit::Repo.new('.')  
63 -  
64 - return yield repo  
65 - end  
66 - end  
67 - end  
68 - rescue Errno::ENOMEM => ex  
69 - Gitlab::GitLogger.error(ex.message)  
70 - rescue Grit::Git::GitTimeout  
71 - return false  
72 - end  
73 -  
74 - # Merges the source_branch into the target_branch in the satellite.  
75 - #  
76 - # Note: it will clear out the satellite before doing anything  
77 - #  
78 - # Returns false if the merge produced conflicts  
79 - # Returns true otherwise  
80 - def merge_in_satellite!(repo)  
81 - prepare_satellite!(repo)  
82 -  
83 - # create target branch in satellite at the corresponding commit from Gitolite  
84 - repo.git.checkout({b: true}, merge_request.target_branch, "origin/#{merge_request.target_branch}")  
85 -  
86 - # merge the source branch from Gitolite into the satellite  
87 - # will raise CommandFailed when merge fails  
88 - repo.git.pull({no_ff: true, raise: true}, :origin, merge_request.source_branch)  
89 - rescue Grit::Git::CommandFailed  
90 - false  
91 - end  
92 -  
93 - # * Clears the satellite  
94 - # * Updates the satellite from Gitolite  
95 - # * Sets up Git variables for the user  
96 - def prepare_satellite!(repo)  
97 - project.satellite.clear  
98 -  
99 - repo.git.reset(hard: true)  
100 - repo.git.fetch({}, :origin)  
101 -  
102 - repo.git.config({}, "user.name", user.name)  
103 - repo.git.config({}, "user.email", user.email)  
104 - end  
105 - end  
106 -end  
lib/gitlab/satellite/merge_action.rb 0 → 100644
@@ -0,0 +1,83 @@ @@ -0,0 +1,83 @@
  1 +module Gitlab
  2 + module Satellite
  3 + class MergeAction < Action
  4 + attr_accessor :merge_request, :user
  5 +
  6 + def initialize(merge_request, user)
  7 + super merge_request.project
  8 + @merge_request = merge_request
  9 + @user = user
  10 + end
  11 +
  12 + def can_be_merged?
  13 + in_locked_and_timed_satellite do |merge_repo|
  14 + merge_in_satellite!(merge_repo)
  15 + end
  16 + end
  17 +
  18 + # Merges the source branch into the target branch in the satellite and
  19 + # pushes it back to Gitolite.
  20 + # It also removes the source branch if requested in the merge request.
  21 + #
  22 + # Returns false if the merge produced conflicts
  23 + # Returns false if pushing from the satellite to Gitolite failed or was rejected
  24 + # Returns true otherwise
  25 + def merge!
  26 + in_locked_and_timed_satellite do |merge_repo|
  27 + if merge_in_satellite!(merge_repo)
  28 + # push merge back to Gitolite
  29 + # will raise CommandFailed when push fails
  30 + merge_repo.git.push({raise: true}, :origin, merge_request.target_branch)
  31 +
  32 + # remove source branch
  33 + if merge_request.should_remove_source_branch && !project.root_ref?(merge_request.source_branch)
  34 + # will raise CommandFailed when push fails
  35 + merge_repo.git.push({raise: true}, :origin, ":#{merge_request.source_branch}")
  36 + end
  37 +
  38 + # merge, push and branch removal successful
  39 + true
  40 + end
  41 + end
  42 + rescue Grit::Git::CommandFailed => ex
  43 + Gitlab::GitLogger.error(ex.message)
  44 + false
  45 + end
  46 +
  47 + private
  48 +
  49 + # Merges the source_branch into the target_branch in the satellite.
  50 + #
  51 + # Note: it will clear out the satellite before doing anything
  52 + #
  53 + # Returns false if the merge produced conflicts
  54 + # Returns true otherwise
  55 + def merge_in_satellite!(repo)
  56 + prepare_satellite!(repo)
  57 +
  58 + # create target branch in satellite at the corresponding commit from Gitolite
  59 + repo.git.checkout({b: true}, merge_request.target_branch, "origin/#{merge_request.target_branch}")
  60 +
  61 + # merge the source branch from Gitolite into the satellite
  62 + # will raise CommandFailed when merge fails
  63 + repo.git.pull({no_ff: true, raise: true}, :origin, merge_request.source_branch)
  64 + rescue Grit::Git::CommandFailed => ex
  65 + Gitlab::GitLogger.error(ex.message)
  66 + false
  67 + end
  68 +
  69 + # * Clears the satellite
  70 + # * Updates the satellite from Gitolite
  71 + # * Sets up Git variables for the user
  72 + def prepare_satellite!(repo)
  73 + project.satellite.clear
  74 +
  75 + repo.git.reset(hard: true)
  76 + repo.git.fetch({}, :origin)
  77 +
  78 + repo.git.config({}, "user.name", user.name)
  79 + repo.git.config({}, "user.email", user.email)
  80 + end
  81 + end
  82 + end
  83 +end