summaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
authorDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>2012-11-19 21:44:05 +0300
committerDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>2012-11-19 21:44:05 +0300
commit85007434645c817e7674003bbdda0674287dd106 (patch)
tree416fa2c5278af126a72055a11db4b0f8c02771dc /app
parent95c23b2f974ec15e89cd7e762c80af0fa0ce57a5 (diff)
downloadgitlab-ce-85007434645c817e7674003bbdda0674287dd106.tar.gz
Post Receive Refactored. Service hooks also triggered now
Diffstat (limited to 'app')
-rw-r--r--app/roles/push_observer.rb115
1 files changed, 73 insertions, 42 deletions
diff --git a/app/roles/push_observer.rb b/app/roles/push_observer.rb
index 947ed42345d..f8a8df2376a 100644
--- a/app/roles/push_observer.rb
+++ b/app/roles/push_observer.rb
@@ -2,45 +2,83 @@
#
# Triggered by PostReceive job
module PushObserver
- def observe_push(oldrev, newrev, ref, user)
+ # This method will be called after each post receive and only if the provided
+ # user is present in GitLab.
+ #
+ # All callbacks for post receive should be placed here.
+ def trigger_post_receive(oldrev, newrev, ref, user)
data = post_receive_data(oldrev, newrev, ref, user)
- Event.create(
- project: self,
- action: Event::Pushed,
- data: data,
- author_id: data[:user_id]
- )
- end
+ # Create push event
+ self.observe_push(data)
- def update_merge_requests(oldrev, newrev, ref, user)
- return true unless ref =~ /heads/
- branch_name = ref.gsub("refs/heads/", "")
- c_ids = self.commits_between(oldrev, newrev).map(&:id)
+ if push_to_branch? ref, oldrev
+ # Close merged MR
+ self.update_merge_requests(oldrev, newrev, ref, user)
- # Update code for merge requests
- mrs = self.merge_requests.opened.find_all_by_branch(branch_name).all
- mrs.each { |merge_request| merge_request.reload_code; merge_request.mark_as_unchecked }
+ # Execute web hooks
+ self.execute_hooks(data.dup)
- # Close merge requests
- mrs = self.merge_requests.opened.where(target_branch: branch_name).all
- mrs = mrs.select(&:last_commit).select { |mr| c_ids.include?(mr.last_commit.id) }
- mrs.each { |merge_request| merge_request.merge!(user.id) }
+ # Execute project services
+ self.execute_services(data.dup)
+ end
- true
+ # Create satellite
+ self.satellite.create unless self.satellite.exists?
+
+ # Discover the default branch, but only if it hasn't already been set to
+ # something else
+ if default_branch.nil?
+ update_attributes(default_branch: discover_default_branch)
+ end
end
- def execute_hooks(oldrev, newrev, ref, user)
+ def push_to_branch? ref, oldrev
ref_parts = ref.split('/')
# Return if this is not a push to a branch (e.g. new commits)
- return if ref_parts[1] !~ /heads/ || oldrev == "00000000000000000000000000000000"
+ !(ref_parts[1] !~ /heads/ || oldrev == "00000000000000000000000000000000")
+ end
- data = post_receive_data(oldrev, newrev, ref, user)
+ def observe_push(data)
+ Event.create(
+ project: self,
+ action: Event::Pushed,
+ data: data,
+ author_id: data[:user_id]
+ )
+ end
+ def execute_hooks(data)
hooks.each { |hook| hook.execute(data) }
end
+ def execute_services(data)
+ services.each do |service|
+
+ # Call service hook for service if it has one
+ service.service_hook.execute if service.service_hook
+ end
+ end
+
+ # Produce a hash of post-receive data
+ #
+ # data = {
+ # before: String,
+ # after: String,
+ # ref: String,
+ # user_id: String,
+ # user_name: String,
+ # repository: {
+ # name: String,
+ # url: String,
+ # description: String,
+ # homepage: String,
+ # },
+ # commits: Array,
+ # total_commits_count: Fixnum
+ # }
+ #
def post_receive_data(oldrev, newrev, ref, user)
push_commits = commits_between(oldrev, newrev)
@@ -87,27 +125,20 @@ module PushObserver
data
end
- # This method will be called after each post receive and only if the provided
- # user is present in GitLab.
- #
- # All callbacks for post receive should be placed here.
- def trigger_post_receive(oldrev, newrev, ref, user)
- # Create push event
- self.observe_push(oldrev, newrev, ref, user)
-
- # Close merged MR
- self.update_merge_requests(oldrev, newrev, ref, user)
+ def update_merge_requests(oldrev, newrev, ref, user)
+ return true unless ref =~ /heads/
+ branch_name = ref.gsub("refs/heads/", "")
+ c_ids = self.commits_between(oldrev, newrev).map(&:id)
- # Execute web hooks
- self.execute_hooks(oldrev, newrev, ref, user)
+ # Update code for merge requests
+ mrs = self.merge_requests.opened.find_all_by_branch(branch_name).all
+ mrs.each { |merge_request| merge_request.reload_code; merge_request.mark_as_unchecked }
- # Create satellite
- self.satellite.create unless self.satellite.exists?
+ # Close merge requests
+ mrs = self.merge_requests.opened.where(target_branch: branch_name).all
+ mrs = mrs.select(&:last_commit).select { |mr| c_ids.include?(mr.last_commit.id) }
+ mrs.each { |merge_request| merge_request.merge!(user.id) }
- # Discover the default branch, but only if it hasn't already been set to
- # something else
- if default_branch.nil?
- update_attributes(default_branch: discover_default_branch)
- end
+ true
end
end