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 1 class IssueObserver < BaseObserver
2 2 def after_create(issue)
3 3 notification.new_issue(issue, current_user)
4   -
5 4 issue.create_cross_references!(issue.project, current_user)
  5 + execute_hooks(issue)
6 6 end
7 7  
8 8 def after_close(issue, transition)
9 9 notification.close_issue(issue, current_user)
10   -
11 10 create_note(issue)
  11 + execute_hooks(issue)
12 12 end
13 13  
14 14 def after_reopen(issue, transition)
... ... @@ -29,4 +29,8 @@ class IssueObserver &lt; BaseObserver
29 29 def create_note(issue)
30 30 Note.create_status_change_note(issue, issue.project, current_user, issue.state, current_commit)
31 31 end
  32 +
  33 + def execute_hooks(issue)
  34 + issue.project.execute_hooks(issue.to_hook_data, :issue_hooks)
  35 + end
32 36 end
... ...
app/observers/merge_request_observer.rb
... ... @@ -7,15 +7,15 @@ class MergeRequestObserver &lt; ActivityObserver
7 7 end
8 8  
9 9 notification.new_merge_request(merge_request, current_user)
10   -
11 10 merge_request.create_cross_references!(merge_request.project, current_user)
  11 + execute_hooks(merge_request)
12 12 end
13 13  
14 14 def after_close(merge_request, transition)
15 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 16 notification.close_mr(merge_request, current_user)
  17 + create_note(merge_request)
  18 + execute_hooks(merge_request)
19 19 end
20 20  
21 21 def after_merge(merge_request, transition)
... ... @@ -31,11 +31,13 @@ class MergeRequestObserver &lt; ActivityObserver
31 31 action: Event::MERGED,
32 32 author_id: merge_request.author_id_of_changes
33 33 )
  34 +
  35 + execute_hooks(merge_request)
34 36 end
35 37  
36 38 def after_reopen(merge_request, transition)
37 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 41 end
40 42  
41 43 def after_update(merge_request)
... ... @@ -53,4 +55,15 @@ class MergeRequestObserver &lt; ActivityObserver
53 55 author_id: current_user.id
54 56 )
55 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 69 end
... ...
app/services/git_push_service.rb
... ... @@ -32,7 +32,7 @@ class GitPushService
32 32 end
33 33  
34 34 if push_to_branch?(ref)
35   - project.execute_hooks(@push_data.dup)
  35 + project.execute_hooks(@push_data.dup, :push_hooks)
36 36 project.execute_services(@push_data.dup)
37 37 end
38 38  
... ...
spec/services/git_push_service_spec.rb
... ... @@ -74,38 +74,19 @@ describe GitPushService do
74 74 end
75 75  
76 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 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 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 80 service.execute(project, user, @blankrev, 'newrev', 'refs/heads/master')
105 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 88 it "when pushing tags" do
108   - @project_hook.should_not_receive(:async_execute)
  89 + project.should_not_receive(:execute_hooks)
109 90 service.execute(project, user, 'newrev', 'newrev', 'refs/tags/v1.0.0')
110 91 end
111 92 end
... ...