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 60 end
61 61  
62 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 64 CAN_BE_MERGED
65 65 else
66 66 CANNOT_BE_MERGED
... ... @@ -167,7 +167,7 @@ class MergeRequest < ActiveRecord::Base
167 167 end
168 168  
169 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 171 self.merge!(current_user.id)
172 172 true
173 173 end
... ...
lib/gitlab/merge.rb
... ... @@ -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 @@
  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
... ...