summaryrefslogtreecommitdiff
path: root/lib/gitlab/satellite/compare_action.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/gitlab/satellite/compare_action.rb')
-rw-r--r--lib/gitlab/satellite/compare_action.rb44
1 files changed, 44 insertions, 0 deletions
diff --git a/lib/gitlab/satellite/compare_action.rb b/lib/gitlab/satellite/compare_action.rb
new file mode 100644
index 00000000000..46c98a8f4ca
--- /dev/null
+++ b/lib/gitlab/satellite/compare_action.rb
@@ -0,0 +1,44 @@
+module Gitlab
+ module Satellite
+ class BranchesWithoutParent < StandardError; end
+
+ class CompareAction < Action
+ def initialize(user, target_project, target_branch, source_project, source_branch)
+ super user, target_project
+
+ @target_project, @target_branch = target_project, target_branch
+ @source_project, @source_branch = source_project, source_branch
+ end
+
+ # Compare 2 repositories and return Gitlab::CompareResult object
+ def result
+ in_locked_and_timed_satellite do |target_repo|
+ prepare_satellite!(target_repo)
+ update_satellite_source_and_target!(target_repo)
+
+ Gitlab::CompareResult.new(compare(target_repo))
+ end
+ rescue Grit::Git::CommandFailed => ex
+ raise BranchesWithoutParent
+ end
+
+ private
+
+ # Assumes a satellite exists that is a fresh clone of the projects repo, prepares satellite for diffs
+ def update_satellite_source_and_target!(target_repo)
+ target_repo.remote_add('source', @source_project.repository.path_to_repo)
+ target_repo.remote_fetch('source')
+ rescue Grit::Git::CommandFailed => ex
+ handle_exception(ex)
+ end
+
+ def compare(repo)
+ @compare ||= Gitlab::Git::Compare.new(
+ Gitlab::Git::Repository.new(repo.path),
+ "origin/#{@target_branch}",
+ "source/#{@source_branch}"
+ )
+ end
+ end
+ end
+end