Commit 671c3134 authored by Douwe Maan's avatar Douwe Maan

Merge branch 'add-more-hipchat-notifications' into 'master'

Add merge and issue event notification for HipChat

This adds merge and issue event notification for HipChat. This depends on the MR used for Slack:

https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/237

This should also address #1085.

Before:

![Screen Shot 2015-02-23 at 8.55.08 AM](https://gitlab.com/uploads/gitlab-org/gitlab-ce/6123e3251b/Screen_Shot_2015-02-23_at_8.55.08_AM.png)

After:

![Screen Shot 2015-02-23 at 8.54.22 AM](https://gitlab.com/uploads/gitlab-org/gitlab-ce/19eabc8bf6/Screen_Shot_2015-02-23_at_8.54.22_AM.png)

![Screen Shot 2015-02-23 at 9.25.51 PM](https://gitlab.com/uploads/gitlab-org/gitlab-ce/0ea6229ddc/Screen_Shot_2015-02-23_at_9.25.51_PM.png)

See merge request !350
parents 119ebe30 f12ec5f4
Please view this file on the master branch, on stable branches it's out of date. Please view this file on the master branch, on stable branches it's out of date.
v 7.9.0 (unreleased) v 7.9.0 (unreleased)
- Added issue and merge request events to HipChat and Slack service (Stan Hu)
- Fix merge request URL passed to Webhooks. (Stan Hu) - Fix merge request URL passed to Webhooks. (Stan Hu)
- Fix bug that caused a server error when editing a comment to "+1" or "-1" (Stan Hu) - Fix bug that caused a server error when editing a comment to "+1" or "-1" (Stan Hu)
- Move labels/milestones tabs to sidebar - Move labels/milestones tabs to sidebar
......
...@@ -45,7 +45,7 @@ class HipchatService < Service ...@@ -45,7 +45,7 @@ class HipchatService < Service
end end
def supported_events def supported_events
%w(push) %w(push issue merge_request)
end end
def execute(data) def execute(data)
...@@ -62,7 +62,21 @@ class HipchatService < Service ...@@ -62,7 +62,21 @@ class HipchatService < Service
@gate ||= HipChat::Client.new(token, options) @gate ||= HipChat::Client.new(token, options)
end end
def create_message(push) def create_message(data)
object_kind = data[:object_kind]
message = \
case object_kind
when "push"
create_push_message(data)
when "issue"
create_issue_message(data) unless is_update?(data)
when "merge_request"
create_merge_request_message(data) unless is_update?(data)
end
end
def create_push_message(push)
ref = push[:ref].gsub("refs/heads/", "") ref = push[:ref].gsub("refs/heads/", "")
before = push[:before] before = push[:before]
after = push[:after] after = push[:after]
...@@ -71,9 +85,9 @@ class HipchatService < Service ...@@ -71,9 +85,9 @@ class HipchatService < Service
message << "#{push[:user_name]} " message << "#{push[:user_name]} "
if before.include?('000000') if before.include?('000000')
message << "pushed new branch <a href=\""\ message << "pushed new branch <a href=\""\
"#{project.web_url}/commits/#{URI.escape(ref)}\">#{ref}</a>"\ "#{project_url}/commits/#{URI.escape(ref)}\">#{ref}</a>"\
" to <a href=\"#{project.web_url}\">"\ " to <a href=\"#{project_url}\">"\
"#{project.name_with_namespace.gsub!(/\s/, "")}</a>\n" "#{project_url}</a>\n"
elsif after.include?('000000') elsif after.include?('000000')
message << "removed branch #{ref} from <a href=\"#{project.web_url}\">#{project.name_with_namespace.gsub!(/\s/,'')}</a> \n" message << "removed branch #{ref} from <a href=\"#{project.web_url}\">#{project.name_with_namespace.gsub!(/\s/,'')}</a> \n"
else else
...@@ -93,4 +107,67 @@ class HipchatService < Service ...@@ -93,4 +107,67 @@ class HipchatService < Service
message message
end end
def create_issue_message(data)
username = data[:user][:username]
obj_attr = data[:object_attributes]
obj_attr = HashWithIndifferentAccess.new(obj_attr)
title = obj_attr[:title]
state = obj_attr[:state]
issue_iid = obj_attr[:iid]
issue_url = obj_attr[:url]
description = obj_attr[:description]
issue_link = "<a href=\"#{issue_url}\">##{issue_iid}</a>"
message = "#{username} #{state} issue #{issue_link} in #{project_link}: <b>#{title}</b>"
if description
description = description.truncate(200, separator: ' ', omission: '...')
message << "<pre>#{description}</pre>"
end
message
end
def create_merge_request_message(data)
username = data[:user][:username]
obj_attr = data[:object_attributes]
obj_attr = HashWithIndifferentAccess.new(obj_attr)
merge_request_id = obj_attr[:iid]
source_branch = obj_attr[:source_branch]
target_branch = obj_attr[:target_branch]
state = obj_attr[:state]
description = obj_attr[:description]
title = obj_attr[:title]
merge_request_url = "#{project_url}/merge_requests/#{merge_request_id}"
merge_request_link = "<a href=\"#{merge_request_url}\">##{merge_request_id}</a>"
message = "#{username} #{state} merge request #{merge_request_link} in " \
"#{project_link}: <b>#{title}</b>"
if description
description = description.truncate(200, separator: ' ', omission: '...')
message << "<pre>#{description}</pre>"
end
message
end
def project_name
project.name_with_namespace.gsub(/\s/, '')
end
def project_url
project.web_url
end
def project_link
"<a href=\"#{project_url}\">#{project_name}</a>"
end
def is_update?(data)
data[:object_attributes][:action] == 'update'
end
end end
# == Schema Information
#
# Table name: services
#
# id :integer not null, primary key
# type :string(255)
# title :string(255)
# project_id :integer not null
# created_at :datetime
# updated_at :datetime
# active :boolean default(FALSE), not null
# properties :text
# push_events :boolean default(TRUE)
# issues_events :boolean default(TRUE)
# merge_requests_events :boolean default(TRUE)
# tag_push_events :boolean default(TRUE)
#
require 'spec_helper'
describe HipchatService do
describe "Associations" do
it { is_expected.to belong_to :project }
it { is_expected.to have_one :service_hook }
end
describe "Execute" do
let(:hipchat) { HipchatService.new }
let(:user) { create(:user, username: 'username') }
let(:project) { create(:project, name: 'project') }
let(:api_url) { 'https://hipchat.example.com/v2/room/123456/notification?auth_token=verySecret' }
let(:project_name) { project.name_with_namespace.gsub(/\s/, '') }
before(:each) do
hipchat.stub(
project_id: project.id,
project: project,
room: 123456,
server: 'https://hipchat.example.com',
token: 'verySecret'
)
WebMock.stub_request(:post, api_url)
end
context 'push events' do
let(:push_sample_data) { Gitlab::PushDataBuilder.build_sample(project, user) }
it "should call Hipchat API for push events" do
hipchat.execute(push_sample_data)
expect(WebMock).to have_requested(:post, api_url).once
end
end
context 'issue events' do
let(:issue) { create(:issue, title: 'Awesome issue', description: 'please fix') }
let(:issue_service) { Issues::CreateService.new(project, user) }
let(:issues_sample_data) { issue_service.hook_data(issue, 'open') }
it "should call Hipchat API for issue events" do
hipchat.execute(issues_sample_data)
expect(WebMock).to have_requested(:post, api_url).once
end
it "should create an issue message" do
message = hipchat.send(:create_issue_message, issues_sample_data)
obj_attr = issues_sample_data[:object_attributes]
expect(message).to eq("#{user.username} opened issue " \
"<a href=\"#{obj_attr[:url]}\">##{obj_attr["iid"]}</a> in " \
"<a href=\"#{project.web_url}\">#{project_name}</a>: " \
"<b>Awesome issue</b>" \
"<pre>please fix</pre>")
end
end
context 'merge request events' do
let(:merge_request) { create(:merge_request, description: 'please fix', title: 'Awesome merge request', target_project: project, source_project: project) }
let(:merge_service) { MergeRequests::CreateService.new(project, user) }
let(:merge_sample_data) { merge_service.hook_data(merge_request, 'open') }
it "should call Hipchat API for merge requests events" do
hipchat.execute(merge_sample_data)
expect(WebMock).to have_requested(:post, api_url).once
end
it "should create a merge request message" do
message = hipchat.send(:create_merge_request_message,
merge_sample_data)
obj_attr = merge_sample_data[:object_attributes]
expect(message).to eq("#{user.username} opened merge request " \
"<a href=\"#{obj_attr[:url]}\">##{obj_attr["iid"]}</a> in " \
"<a href=\"#{project.web_url}\">#{project_name}</a>: " \
"<b>Awesome merge request</b>" \
"<pre>please fix</pre>")
end
end
end
end
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment