Commit cfcf24dce53d79c950de12eca0353b890ad95508

Authored by Dmitriy Zaporozhets
1 parent 25951b91

Execute project hooks when issue or merge request created

Signed-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
app/observers/issue_observer.rb
1 class IssueObserver < BaseObserver 1 class IssueObserver < BaseObserver
2 def after_create(issue) 2 def after_create(issue)
3 notification.new_issue(issue, current_user) 3 notification.new_issue(issue, current_user)
4 -  
5 issue.create_cross_references!(issue.project, current_user) 4 issue.create_cross_references!(issue.project, current_user)
  5 + execute_hooks(issue)
6 end 6 end
7 7
8 def after_close(issue, transition) 8 def after_close(issue, transition)
9 notification.close_issue(issue, current_user) 9 notification.close_issue(issue, current_user)
10 -  
11 create_note(issue) 10 create_note(issue)
  11 + execute_hooks(issue)
12 end 12 end
13 13
14 def after_reopen(issue, transition) 14 def after_reopen(issue, transition)
@@ -29,4 +29,8 @@ class IssueObserver &lt; BaseObserver @@ -29,4 +29,8 @@ class IssueObserver &lt; BaseObserver
29 def create_note(issue) 29 def create_note(issue)
30 Note.create_status_change_note(issue, issue.project, current_user, issue.state, current_commit) 30 Note.create_status_change_note(issue, issue.project, current_user, issue.state, current_commit)
31 end 31 end
  32 +
  33 + def execute_hooks(issue)
  34 + issue.project.execute_hooks(issue.to_hook_data, :issue_hooks)
  35 + end
32 end 36 end
app/observers/merge_request_observer.rb
@@ -7,15 +7,15 @@ class MergeRequestObserver &lt; ActivityObserver @@ -7,15 +7,15 @@ class MergeRequestObserver &lt; ActivityObserver
7 end 7 end
8 8
9 notification.new_merge_request(merge_request, current_user) 9 notification.new_merge_request(merge_request, current_user)
10 -  
11 merge_request.create_cross_references!(merge_request.project, current_user) 10 merge_request.create_cross_references!(merge_request.project, current_user)
  11 + execute_hooks(merge_request)
12 end 12 end
13 13
14 def after_close(merge_request, transition) 14 def after_close(merge_request, transition)
15 create_event(merge_request, Event::CLOSED) 15 create_event(merge_request, Event::CLOSED)
16 - Note.create_status_change_note(merge_request, merge_request.target_project, current_user, merge_request.state, nil)  
17 -  
18 notification.close_mr(merge_request, current_user) 16 notification.close_mr(merge_request, current_user)
  17 + create_note(merge_request)
  18 + execute_hooks(merge_request)
19 end 19 end
20 20
21 def after_merge(merge_request, transition) 21 def after_merge(merge_request, transition)
@@ -31,11 +31,13 @@ class MergeRequestObserver &lt; ActivityObserver @@ -31,11 +31,13 @@ class MergeRequestObserver &lt; ActivityObserver
31 action: Event::MERGED, 31 action: Event::MERGED,
32 author_id: merge_request.author_id_of_changes 32 author_id: merge_request.author_id_of_changes
33 ) 33 )
  34 +
  35 + execute_hooks(merge_request)
34 end 36 end
35 37
36 def after_reopen(merge_request, transition) 38 def after_reopen(merge_request, transition)
37 create_event(merge_request, Event::REOPENED) 39 create_event(merge_request, Event::REOPENED)
38 - Note.create_status_change_note(merge_request, merge_request.target_project, current_user, merge_request.state, nil) 40 + create_note(merge_request)
39 end 41 end
40 42
41 def after_update(merge_request) 43 def after_update(merge_request)
@@ -53,4 +55,15 @@ class MergeRequestObserver &lt; ActivityObserver @@ -53,4 +55,15 @@ class MergeRequestObserver &lt; ActivityObserver
53 author_id: current_user.id 55 author_id: current_user.id
54 ) 56 )
55 end 57 end
  58 +
  59 + private
  60 +
  61 + # Create merge request note with service comment like 'Status changed to closed'
  62 + def create_note(merge_request)
  63 + Note.create_status_change_note(merge_request, merge_request.target_project, current_user, merge_request.state, nil)
  64 + end
  65 +
  66 + def execute_hooks(merge_request)
  67 + merge_request.project.execute_hooks(merge_request.to_hook_data, :merge_request_hooks)
  68 + end
56 end 69 end
app/services/git_push_service.rb
@@ -32,7 +32,7 @@ class GitPushService @@ -32,7 +32,7 @@ class GitPushService
32 end 32 end
33 33
34 if push_to_branch?(ref) 34 if push_to_branch?(ref)
35 - project.execute_hooks(@push_data.dup) 35 + project.execute_hooks(@push_data.dup, :push_hooks)
36 project.execute_services(@push_data.dup) 36 project.execute_services(@push_data.dup)
37 end 37 end
38 38
spec/services/git_push_service_spec.rb
@@ -74,38 +74,19 @@ describe GitPushService do @@ -74,38 +74,19 @@ describe GitPushService do
74 end 74 end
75 75
76 describe "Web Hooks" do 76 describe "Web Hooks" do
77 - context "with web hooks" do  
78 - before do  
79 - @project_hook = create(:project_hook)  
80 - @project_hook_2 = create(:project_hook)  
81 - project.hooks << [@project_hook, @project_hook_2]  
82 -  
83 - stub_request(:post, @project_hook.url)  
84 - stub_request(:post, @project_hook_2.url)  
85 - end  
86 -  
87 - it "executes multiple web hook" do  
88 - @project_hook.should_receive(:async_execute).once  
89 - @project_hook_2.should_receive(:async_execute).once  
90 -  
91 - service.execute(project, user, @oldrev, @newrev, @ref)  
92 - end  
93 - end  
94 -  
95 context "execute web hooks" do 77 context "execute web hooks" do
96 - before do  
97 - @project_hook = create(:project_hook)  
98 - project.hooks << [@project_hook]  
99 - stub_request(:post, @project_hook.url)  
100 - end  
101 -  
102 it "when pushing a branch for the first time" do 78 it "when pushing a branch for the first time" do
103 - @project_hook.should_receive(:async_execute) 79 + project.should_receive(:execute_hooks)
104 service.execute(project, user, @blankrev, 'newrev', 'refs/heads/master') 80 service.execute(project, user, @blankrev, 'newrev', 'refs/heads/master')
105 end 81 end
106 82
  83 + it "when pushing new commits to existing branch" do
  84 + project.should_receive(:execute_hooks)
  85 + service.execute(project, user, 'oldrev', 'newrev', 'refs/heads/master')
  86 + end
  87 +
107 it "when pushing tags" do 88 it "when pushing tags" do
108 - @project_hook.should_not_receive(:async_execute) 89 + project.should_not_receive(:execute_hooks)
109 service.execute(project, user, 'newrev', 'newrev', 'refs/tags/v1.0.0') 90 service.execute(project, user, 'newrev', 'newrev', 'refs/tags/v1.0.0')
110 end 91 end
111 end 92 end