From 78235edda8009e7dcec3f15b3ec79a0c17d9d797 Mon Sep 17 00:00:00 2001 From: Riyad Preukschas Date: Fri, 26 Oct 2012 00:19:01 +0200 Subject: [PATCH] Renamed Gitlab::Merge to Gitlab::Satellite::MergeAction --- app/models/merge_request.rb | 4 +- lib/gitlab/merge.rb | 106 --------------------------- lib/gitlab/satellite/merge_action.rb | 83 +++++++++++++++++++++ 3 files changed, 85 insertions(+), 108 deletions(-) delete mode 100644 lib/gitlab/merge.rb create mode 100644 lib/gitlab/satellite/merge_action.rb diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb index 70780b75d45..9a79be12758 100644 --- a/app/models/merge_request.rb +++ b/app/models/merge_request.rb @@ -60,7 +60,7 @@ class MergeRequest < ActiveRecord::Base end def check_if_can_be_merged - self.state = if Gitlab::Merge.new(self, self.author).can_be_merged? + self.state = if Gitlab::Satellite::MergeAction.new(self, self.author).can_be_merged? CAN_BE_MERGED else CANNOT_BE_MERGED @@ -167,7 +167,7 @@ class MergeRequest < ActiveRecord::Base end def automerge!(current_user) - if Gitlab::Merge.new(self, current_user).merge! && self.unmerged_commits.empty? + if Gitlab::Satellite::MergeAction.new(self, current_user).merge! && self.unmerged_commits.empty? self.merge!(current_user.id) true end diff --git a/lib/gitlab/merge.rb b/lib/gitlab/merge.rb deleted file mode 100644 index 28c206896df..00000000000 --- a/lib/gitlab/merge.rb +++ /dev/null @@ -1,106 +0,0 @@ -module Gitlab - class Merge - attr_accessor :merge_request, :project, :user - - def initialize(merge_request, user) - @merge_request = merge_request - @project = merge_request.project - @user = user - end - - def can_be_merged? - in_locked_and_timed_satellite do |merge_repo| - merge_in_satellite!(merge_repo) - end - end - - # Merges the source branch into the target branch in the satellite and - # pushes it back to Gitolite. - # It also removes the source branch if requested in the merge request. - # - # Returns false if the merge produced conflicts - # Returns false if pushing from the satellite to Gitolite failed or was rejected - # Returns true otherwise - def merge! - in_locked_and_timed_satellite do |merge_repo| - if merge_in_satellite!(merge_repo) - # push merge back to Gitolite - # will raise CommandFailed when push fails - merge_repo.git.push({raise: true}, :origin, merge_request.target_branch) - - # remove source branch - if merge_request.should_remove_source_branch && !project.root_ref?(merge_request.source_branch) - # will raise CommandFailed when push fails - merge_repo.git.push({raise: true}, :origin, ":#{merge_request.source_branch}") - end - - # merge, push and branch removal successful - true - end - end - rescue Grit::Git::CommandFailed - false - end - - private - - # * Sets a 30s timeout for Git - # * Locks the satellite repo - # * Yields the prepared satellite repo - def in_locked_and_timed_satellite - Grit::Git.with_timeout(30.seconds) do - lock_file = Rails.root.join("tmp", "#{project.path}.lock") - - File.open(lock_file, "w+") do |f| - f.flock(File::LOCK_EX) - - unless project.satellite.exists? - raise "Satellite doesn't exist" - end - - Dir.chdir(project.satellite.path) do - repo = Grit::Repo.new('.') - - return yield repo - end - end - end - rescue Errno::ENOMEM => ex - Gitlab::GitLogger.error(ex.message) - rescue Grit::Git::GitTimeout - return false - end - - # Merges the source_branch into the target_branch in the satellite. - # - # Note: it will clear out the satellite before doing anything - # - # Returns false if the merge produced conflicts - # Returns true otherwise - def merge_in_satellite!(repo) - prepare_satellite!(repo) - - # create target branch in satellite at the corresponding commit from Gitolite - repo.git.checkout({b: true}, merge_request.target_branch, "origin/#{merge_request.target_branch}") - - # merge the source branch from Gitolite into the satellite - # will raise CommandFailed when merge fails - repo.git.pull({no_ff: true, raise: true}, :origin, merge_request.source_branch) - rescue Grit::Git::CommandFailed - false - end - - # * Clears the satellite - # * Updates the satellite from Gitolite - # * Sets up Git variables for the user - def prepare_satellite!(repo) - project.satellite.clear - - repo.git.reset(hard: true) - repo.git.fetch({}, :origin) - - repo.git.config({}, "user.name", user.name) - repo.git.config({}, "user.email", user.email) - end - end -end diff --git a/lib/gitlab/satellite/merge_action.rb b/lib/gitlab/satellite/merge_action.rb new file mode 100644 index 00000000000..067a9ce85f2 --- /dev/null +++ b/lib/gitlab/satellite/merge_action.rb @@ -0,0 +1,83 @@ +module Gitlab + module Satellite + class MergeAction < Action + attr_accessor :merge_request, :user + + def initialize(merge_request, user) + super merge_request.project + @merge_request = merge_request + @user = user + end + + def can_be_merged? + in_locked_and_timed_satellite do |merge_repo| + merge_in_satellite!(merge_repo) + end + end + + # Merges the source branch into the target branch in the satellite and + # pushes it back to Gitolite. + # It also removes the source branch if requested in the merge request. + # + # Returns false if the merge produced conflicts + # Returns false if pushing from the satellite to Gitolite failed or was rejected + # Returns true otherwise + def merge! + in_locked_and_timed_satellite do |merge_repo| + if merge_in_satellite!(merge_repo) + # push merge back to Gitolite + # will raise CommandFailed when push fails + merge_repo.git.push({raise: true}, :origin, merge_request.target_branch) + + # remove source branch + if merge_request.should_remove_source_branch && !project.root_ref?(merge_request.source_branch) + # will raise CommandFailed when push fails + merge_repo.git.push({raise: true}, :origin, ":#{merge_request.source_branch}") + end + + # merge, push and branch removal successful + true + end + end + rescue Grit::Git::CommandFailed => ex + Gitlab::GitLogger.error(ex.message) + false + end + + private + + # Merges the source_branch into the target_branch in the satellite. + # + # Note: it will clear out the satellite before doing anything + # + # Returns false if the merge produced conflicts + # Returns true otherwise + def merge_in_satellite!(repo) + prepare_satellite!(repo) + + # create target branch in satellite at the corresponding commit from Gitolite + repo.git.checkout({b: true}, merge_request.target_branch, "origin/#{merge_request.target_branch}") + + # merge the source branch from Gitolite into the satellite + # will raise CommandFailed when merge fails + repo.git.pull({no_ff: true, raise: true}, :origin, merge_request.source_branch) + rescue Grit::Git::CommandFailed => ex + Gitlab::GitLogger.error(ex.message) + false + end + + # * Clears the satellite + # * Updates the satellite from Gitolite + # * Sets up Git variables for the user + def prepare_satellite!(repo) + project.satellite.clear + + repo.git.reset(hard: true) + repo.git.fetch({}, :origin) + + repo.git.config({}, "user.name", user.name) + repo.git.config({}, "user.email", user.email) + end + end + end +end -- GitLab