Commit 2cbdfbfd authored by Dmitriy Zaporozhets's avatar Dmitriy Zaporozhets

Merge branch 'master' of github.com:gitlabhq/gitlabhq

parents 817d93e8 38e2ae5a
...@@ -10,6 +10,7 @@ v 7.11.0 (unreleased) ...@@ -10,6 +10,7 @@ v 7.11.0 (unreleased)
- Add "Reply quoting selected text" shortcut key (`r`) - Add "Reply quoting selected text" shortcut key (`r`)
- Fix bug causing `@whatever` inside an issue's first code block to be picked up as a user mention. - Fix bug causing `@whatever` inside an issue's first code block to be picked up as a user mention.
- Fix bug causing `@whatever` inside an inline code snippet (backtick-style) to be picked up as a user mention. - Fix bug causing `@whatever` inside an inline code snippet (backtick-style) to be picked up as a user mention.
- Added GitLab Event header for project hooks
- -
- Show Atom feed buttons everywhere where applicable. - Show Atom feed buttons everywhere where applicable.
- Add project activity atom feed. - Add project activity atom feed.
...@@ -23,8 +24,9 @@ v 7.11.0 (unreleased) ...@@ -23,8 +24,9 @@ v 7.11.0 (unreleased)
- Improve new project command options (Ben Bodenmiller) - Improve new project command options (Ben Bodenmiller)
- Prevent sending empty messages to HipChat (Chulki Lee) - Prevent sending empty messages to HipChat (Chulki Lee)
- Improve UI for mobile phones on dashboard and project pages - Improve UI for mobile phones on dashboard and project pages
- Add room notification and message color option for HipChat
v 7.10.0 (unreleased) v 7.10.0
- Ignore submodules that are defined in .gitmodules but are checked in as directories. - Ignore submodules that are defined in .gitmodules but are checked in as directories.
- Allow projects to be imported from Google Code. - Allow projects to be imported from Google Code.
- Remove access control for uploaded images to fix broken images in emails (Hannes Rosenögger) - Remove access control for uploaded images to fix broken images in emails (Hannes Rosenögger)
......
7.10.0.pre 7.11.0.pre
...@@ -33,7 +33,7 @@ class Admin::HooksController < Admin::ApplicationController ...@@ -33,7 +33,7 @@ class Admin::HooksController < Admin::ApplicationController
owner_name: "Someone", owner_name: "Someone",
owner_email: "example@gitlabhq.com" owner_email: "example@gitlabhq.com"
} }
@hook.execute(data) @hook.execute(data, 'system_hooks')
redirect_to :back redirect_to :back
end end
......
...@@ -6,7 +6,8 @@ class Projects::ServicesController < Projects::ApplicationController ...@@ -6,7 +6,8 @@ class Projects::ServicesController < Projects::ApplicationController
:description, :issues_url, :new_issue_url, :restrict_to_branch, :channel, :description, :issues_url, :new_issue_url, :restrict_to_branch, :channel,
:colorize_messages, :channels, :colorize_messages, :channels,
:push_events, :issues_events, :merge_requests_events, :tag_push_events, :push_events, :issues_events, :merge_requests_events, :tag_push_events,
:note_events, :send_from_committer_email, :disable_diffs, :external_wiki_url] :note_events, :send_from_committer_email, :disable_diffs, :external_wiki_url,
:notify, :color]
# Authorize # Authorize
before_action :authorize_admin_project! before_action :authorize_admin_project!
before_action :service, only: [:edit, :update, :test] before_action :service, only: [:edit, :update, :test]
......
...@@ -30,12 +30,15 @@ class WebHook < ActiveRecord::Base ...@@ -30,12 +30,15 @@ class WebHook < ActiveRecord::Base
validates :url, presence: true, validates :url, presence: true,
format: { with: /\A#{URI.regexp(%w(http https))}\z/, message: "should be a valid url" } format: { with: /\A#{URI.regexp(%w(http https))}\z/, message: "should be a valid url" }
def execute(data) def execute(data, hook_name)
parsed_url = URI.parse(url) parsed_url = URI.parse(url)
if parsed_url.userinfo.blank? if parsed_url.userinfo.blank?
WebHook.post(url, WebHook.post(url,
body: data.to_json, body: data.to_json,
headers: { "Content-Type" => "application/json" }, headers: {
"Content-Type" => "application/json",
"X-Gitlab-Event" => hook_name.singularize.titleize
},
verify: false) verify: false)
else else
post_url = url.gsub("#{parsed_url.userinfo}@", "") post_url = url.gsub("#{parsed_url.userinfo}@", "")
...@@ -45,7 +48,10 @@ class WebHook < ActiveRecord::Base ...@@ -45,7 +48,10 @@ class WebHook < ActiveRecord::Base
} }
WebHook.post(post_url, WebHook.post(post_url,
body: data.to_json, body: data.to_json,
headers: { "Content-Type" => "application/json" }, headers: {
"Content-Type" => "application/json",
"X-Gitlab-Event" => hook_name.singularize.titleize
},
verify: false, verify: false,
basic_auth: auth) basic_auth: auth)
end end
...@@ -54,7 +60,7 @@ class WebHook < ActiveRecord::Base ...@@ -54,7 +60,7 @@ class WebHook < ActiveRecord::Base
false false
end end
def async_execute(data) def async_execute(data, hook_name)
Sidekiq::Client.enqueue(ProjectWebHookWorker, id, data) Sidekiq::Client.enqueue(ProjectWebHookWorker, id, data, hook_name)
end end
end end
...@@ -483,7 +483,7 @@ class Project < ActiveRecord::Base ...@@ -483,7 +483,7 @@ class Project < ActiveRecord::Base
def execute_hooks(data, hooks_scope = :push_hooks) def execute_hooks(data, hooks_scope = :push_hooks)
hooks.send(hooks_scope).each do |hook| hooks.send(hooks_scope).each do |hook|
hook.async_execute(data) hook.async_execute(data, hooks_scope.to_s)
end end
end end
......
...@@ -20,7 +20,7 @@ ...@@ -20,7 +20,7 @@
class HipchatService < Service class HipchatService < Service
MAX_COMMITS = 3 MAX_COMMITS = 3
prop_accessor :token, :room, :server prop_accessor :token, :room, :server, :notify, :color
validates :token, presence: true, if: :activated? validates :token, presence: true, if: :activated?
def title def title
...@@ -39,6 +39,8 @@ class HipchatService < Service ...@@ -39,6 +39,8 @@ class HipchatService < Service
[ [
{ type: 'text', name: 'token', placeholder: 'Room token' }, { type: 'text', name: 'token', placeholder: 'Room token' },
{ type: 'text', name: 'room', placeholder: 'Room name or ID' }, { type: 'text', name: 'room', placeholder: 'Room name or ID' },
{ type: 'checkbox', name: 'notify' },
{ type: 'select', name: 'color', choices: ['yellow', 'red', 'green', 'purple', 'gray', 'random'] },
{ type: 'text', name: 'server', { type: 'text', name: 'server',
placeholder: 'Leave blank for default. https://hipchat.example.com' } placeholder: 'Leave blank for default. https://hipchat.example.com' }
] ]
...@@ -52,7 +54,7 @@ class HipchatService < Service ...@@ -52,7 +54,7 @@ class HipchatService < Service
return unless supported_events.include?(data[:object_kind]) return unless supported_events.include?(data[:object_kind])
message = create_message(data) message = create_message(data)
return unless message.present? return unless message.present?
gate[room].send('GitLab', message) gate[room].send('GitLab', message, message_options)
end end
private private
...@@ -63,6 +65,10 @@ class HipchatService < Service ...@@ -63,6 +65,10 @@ class HipchatService < Service
@gate ||= HipChat::Client.new(token, options) @gate ||= HipChat::Client.new(token, options)
end end
def message_options
{ notify: notify.present? && notify == '1', color: color || 'yellow' }
end
def create_message(data) def create_message(data)
object_kind = data[:object_kind] object_kind = data[:object_kind]
......
...@@ -7,12 +7,12 @@ class SystemHooksService ...@@ -7,12 +7,12 @@ class SystemHooksService
def execute_hooks(data) def execute_hooks(data)
SystemHook.all.each do |sh| SystemHook.all.each do |sh|
async_execute_hook sh, data async_execute_hook(sh, data, 'system_hooks')
end end
end end
def async_execute_hook(hook, data) def async_execute_hook(hook, data, hook_name)
Sidekiq::Client.enqueue(SystemHookWorker, hook.id, data) Sidekiq::Client.enqueue(SystemHookWorker, hook.id, data, hook_name)
end end
def build_event_data(model, event) def build_event_data(model, event)
......
class TestHookService class TestHookService
def execute(hook, current_user) def execute(hook, current_user)
data = Gitlab::PushDataBuilder.build_sample(hook.project, current_user) data = Gitlab::PushDataBuilder.build_sample(hook.project, current_user)
hook.execute(data) hook.execute(data, 'push_hooks')
end end
end end
...@@ -3,8 +3,8 @@ class ProjectWebHookWorker ...@@ -3,8 +3,8 @@ class ProjectWebHookWorker
sidekiq_options queue: :project_web_hook sidekiq_options queue: :project_web_hook
def perform(hook_id, data) def perform(hook_id, data, hook_name)
data = data.with_indifferent_access data = data.with_indifferent_access
WebHook.find(hook_id).execute(data) WebHook.find(hook_id).execute(data, hook_name)
end end
end end
...@@ -3,7 +3,7 @@ class SystemHookWorker ...@@ -3,7 +3,7 @@ class SystemHookWorker
sidekiq_options queue: :system_hook sidekiq_options queue: :system_hook
def perform(hook_id, data) def perform(hook_id, data, hook_name)
SystemHook.find(hook_id).execute data SystemHook.find(hook_id).execute(data, hook_name)
end end
end end
...@@ -7,11 +7,11 @@ If correctly setup, emails that require an action will be marked in Gmail. ...@@ -7,11 +7,11 @@ If correctly setup, emails that require an action will be marked in Gmail.
![gitlab_actions](gitlab_actions.png) ![gitlab_actions](gitlab_actions.png)
To get this functioning, you need to be registered with Google. To get this functioning, you need to be registered with Google.
[See how to register with google in this document.](https://developers.google.com/gmail/markup/registering-with-google) [See how to register with Google in this document.](https://developers.google.com/gmail/markup/registering-with-google)
To aid the registering with google, GitLab offers a rake task that will send an email to google whitelisting email address from your GitLab server. To aid the registering with Google, GitLab offers a rake task that will send an email to Google whitelisting email address from your GitLab server.
To check what would be sent to the google email address, run the rake task: To check what would be sent to the Google email address, run the rake task:
```bash ```bash
bundle exec rake gitlab:mail_google_schema_whitelisting RAILS_ENV=production bundle exec rake gitlab:mail_google_schema_whitelisting RAILS_ENV=production
...@@ -19,7 +19,7 @@ bundle exec rake gitlab:mail_google_schema_whitelisting RAILS_ENV=production ...@@ -19,7 +19,7 @@ bundle exec rake gitlab:mail_google_schema_whitelisting RAILS_ENV=production
**This will not send the email but give you the output of how the mail will look.** **This will not send the email but give you the output of how the mail will look.**
Copy the output of the rake task to [google email markup tester](https://www.google.com/webmasters/markup-tester/u/0/) and press "Validate". Copy the output of the rake task to [Google email markup tester](https://www.google.com/webmasters/markup-tester/u/0/) and press "Validate".
If you receive "No errors detected" message from the tester you can send the email using: If you receive "No errors detected" message from the tester you can send the email using:
......
...@@ -47,7 +47,7 @@ module API ...@@ -47,7 +47,7 @@ module API
owner_name: "Someone", owner_name: "Someone",
owner_email: "example@gitlabhq.com" owner_email: "example@gitlabhq.com"
} }
@hook.execute(data) @hook.execute(data, 'system_hooks')
data data
end end
......
...@@ -17,7 +17,7 @@ module Gitlab ...@@ -17,7 +17,7 @@ module Gitlab
events = Event.reorder(nil).contributions.where(author_id: user.id). events = Event.reorder(nil).contributions.where(author_id: user.id).
where("created_at > ?", date_from).where(project_id: projects). where("created_at > ?", date_from).where(project_id: projects).
group('date(created_at)'). group('date(created_at)').
select('date(created_at), count(id) as total_amount'). select('date(created_at) as date, count(id) as total_amount').
map(&:attributes) map(&:attributes)
dates = (1.year.ago.to_date..(Date.today + 1.day)).to_a dates = (1.year.ago.to_date..(Date.today + 1.day)).to_a
......
...@@ -282,7 +282,8 @@ namespace :gitlab do ...@@ -282,7 +282,8 @@ namespace :gitlab do
def check_redis_version def check_redis_version
print "Redis version >= 2.0.0? ... " print "Redis version >= 2.0.0? ... "
if run_and_match(%W(redis-cli --version), /redis-cli 2.\d.\d/) redis_version = run(%W(redis-cli --version))
if redis_version.try(:match, /redis-cli 2.\d.\d/) || redis_version.try(:match, /redis-cli 3.\d.\d/)
puts "yes".green puts "yes".green
else else
puts "no".red puts "no".red
......
...@@ -52,22 +52,26 @@ describe ProjectHook do ...@@ -52,22 +52,26 @@ describe ProjectHook do
end end
it "POSTs to the web hook URL" do it "POSTs to the web hook URL" do
@project_hook.execute(@data) @project_hook.execute(@data, 'push_hooks')
expect(WebMock).to have_requested(:post, @project_hook.url).once expect(WebMock).to have_requested(:post, @project_hook.url).
with(headers: {'Content-Type'=>'application/json', 'X-Gitlab-Event'=>'Push Hook'}).
once
end end
it "POSTs the data as JSON" do it "POSTs the data as JSON" do
json = @data.to_json json = @data.to_json
@project_hook.execute(@data) @project_hook.execute(@data, 'push_hooks')
expect(WebMock).to have_requested(:post, @project_hook.url).with(body: json).once expect(WebMock).to have_requested(:post, @project_hook.url).
with(headers: {'Content-Type'=>'application/json', 'X-Gitlab-Event'=>'Push Hook'}).
once
end end
it "catches exceptions" do it "catches exceptions" do
expect(WebHook).to receive(:post).and_raise("Some HTTP Post error") expect(WebHook).to receive(:post).and_raise("Some HTTP Post error")
expect { expect {
@project_hook.execute(@data) @project_hook.execute(@data, 'push_hooks')
}.to raise_error }.to raise_error
end end
end end
......
...@@ -213,5 +213,21 @@ describe HipchatService do ...@@ -213,5 +213,21 @@ describe HipchatService do
"<pre>snippet note</pre>") "<pre>snippet note</pre>")
end end
end end
context "#message_options" do
it "should be set to the defaults" do
expect(hipchat.send(:message_options)).to eq({notify: false, color: 'yellow'})
end
it "should set notfiy to true" do
hipchat.stub(notify: '1')
expect(hipchat.send(:message_options)).to eq({notify: true, color: 'yellow'})
end
it "should set the color" do
hipchat.stub(color: 'red')
expect(hipchat.send(:message_options)).to eq({notify: false, color: 'red'})
end
end
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