diff options
author | Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com> | 2012-11-19 21:44:05 +0300 |
---|---|---|
committer | Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com> | 2012-11-19 21:44:05 +0300 |
commit | 85007434645c817e7674003bbdda0674287dd106 (patch) | |
tree | 416fa2c5278af126a72055a11db4b0f8c02771dc /app | |
parent | 95c23b2f974ec15e89cd7e762c80af0fa0ce57a5 (diff) | |
download | gitlab-ce-85007434645c817e7674003bbdda0674287dd106.tar.gz |
Post Receive Refactored. Service hooks also triggered now
Diffstat (limited to 'app')
-rw-r--r-- | app/roles/push_observer.rb | 115 |
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 |