Commit 56318a24 authored by Dmitriy Zaporozhets's avatar Dmitriy Zaporozhets

Merge pull request #6474 from jvanbaarsen/post-tag-hook

Add web hooks on tag
parents cc57a25c e6ceec9d
...@@ -17,9 +17,10 @@ ...@@ -17,9 +17,10 @@
class ProjectHook < WebHook class ProjectHook < WebHook
belongs_to :project belongs_to :project
attr_accessible :push_events, :issues_events, :merge_requests_events attr_accessible :push_events, :issues_events, :merge_requests_events, :tag_push_events
scope :push_hooks, -> { where(push_events: true) } scope :push_hooks, -> { where(push_events: true) }
scope :tag_push_hooks, -> { where(tag_push_events: true) }
scope :issue_hooks, -> { where(issues_events: true) } scope :issue_hooks, -> { where(issues_events: true) }
scope :merge_request_hooks, -> { where(merge_requests_events: true) } scope :merge_request_hooks, -> { where(merge_requests_events: true) }
end end
class GitTagPushService
attr_accessor :project, :user, :push_data
def execute(project, user, oldrev, newrev, ref)
@project, @user = project, user
@push_data = create_push_data(oldrev, newrev, ref)
project.execute_hooks(@push_data.dup, :tag_push_hooks)
end
private
def create_push_data(oldrev, newrev, ref)
data = {
ref: ref,
before: oldrev,
after: newrev,
user_id: user.id,
user_name: user.name,
project_id: project.id,
repository: {
name: project.name,
url: project.url_to_repo,
description: project.description,
homepage: project.web_url
}
}
end
end
...@@ -26,6 +26,13 @@ ...@@ -26,6 +26,13 @@
%strong Push events %strong Push events
%p.light %p.light
This url will be triggered by a push to the repository This url will be triggered by a push to the repository
%div
= f.check_box :tag_push_events, class: 'pull-left'
.prepend-left-20
= f.label :tag_push_events, class: 'list-label' do
%strong Tag push events
%p.light
This url will be triggered when a new tag is pushed to the repository
%div %div
= f.check_box :issues_events, class: 'pull-left' = f.check_box :issues_events, class: 'pull-left'
.prepend-left-20 .prepend-left-20
...@@ -56,6 +63,6 @@ ...@@ -56,6 +63,6 @@
.clearfix .clearfix
%span.monospace= hook.url %span.monospace= hook.url
%p %p
- %w(push_events issues_events merge_requests_events).each do |trigger| - %w(push_events tag_push_events issues_events merge_requests_events).each do |trigger|
- if hook.send(trigger) - if hook.send(trigger)
%span.label.label-gray= trigger.titleize %span.label.label-gray= trigger.titleize
...@@ -29,10 +29,20 @@ class PostReceive ...@@ -29,10 +29,20 @@ class PostReceive
return false return false
end end
if tag?(ref)
GitTagPushService.new.execute(project, user, oldrev, newrev, ref)
else
GitPushService.new.execute(project, user, oldrev, newrev, ref) GitPushService.new.execute(project, user, oldrev, newrev, ref)
end end
end
def log(message) def log(message)
Gitlab::GitLogger.error("POST-RECEIVE: #{message}") Gitlab::GitLogger.error("POST-RECEIVE: #{message}")
end end
private
def tag?(ref)
!!(/refs\/tags\/(.*)/.match(ref))
end
end end
class AddTagPushHooksToProjectHook < ActiveRecord::Migration
def change
add_column :web_hooks, :tag_push_events, :boolean, default: false
end
end
...@@ -11,15 +11,18 @@ ...@@ -11,15 +11,18 @@
# #
# It's strongly recommended that you check this file into your version control system. # It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema.define(version: 20140304005354) do ActiveRecord::Schema.define(version: 20140305193308) do
# These are extensions that must be enabled in order to support this database
enable_extension "plpgsql"
create_table "broadcast_messages", force: true do |t| create_table "broadcast_messages", force: true do |t|
t.text "message", null: false t.text "message", null: false
t.datetime "starts_at" t.datetime "starts_at"
t.datetime "ends_at" t.datetime "ends_at"
t.integer "alert_type" t.integer "alert_type"
t.datetime "created_at", null: false t.datetime "created_at"
t.datetime "updated_at", null: false t.datetime "updated_at"
t.string "color" t.string "color"
t.string "font" t.string "font"
end end
...@@ -27,8 +30,8 @@ ActiveRecord::Schema.define(version: 20140304005354) do ...@@ -27,8 +30,8 @@ ActiveRecord::Schema.define(version: 20140304005354) do
create_table "deploy_keys_projects", force: true do |t| create_table "deploy_keys_projects", force: true do |t|
t.integer "deploy_key_id", null: false t.integer "deploy_key_id", null: false
t.integer "project_id", null: false t.integer "project_id", null: false
t.datetime "created_at", null: false t.datetime "created_at"
t.datetime "updated_at", null: false t.datetime "updated_at"
end end
add_index "deploy_keys_projects", ["project_id"], name: "index_deploy_keys_projects_on_project_id", using: :btree add_index "deploy_keys_projects", ["project_id"], name: "index_deploy_keys_projects_on_project_id", using: :btree
...@@ -49,8 +52,8 @@ ActiveRecord::Schema.define(version: 20140304005354) do ...@@ -49,8 +52,8 @@ ActiveRecord::Schema.define(version: 20140304005354) do
t.string "title" t.string "title"
t.text "data" t.text "data"
t.integer "project_id" t.integer "project_id"
t.datetime "created_at", null: false t.datetime "created_at"
t.datetime "updated_at", null: false t.datetime "updated_at"
t.integer "action" t.integer "action"
t.integer "author_id" t.integer "author_id"
end end
...@@ -65,8 +68,8 @@ ActiveRecord::Schema.define(version: 20140304005354) do ...@@ -65,8 +68,8 @@ ActiveRecord::Schema.define(version: 20140304005354) do
create_table "forked_project_links", force: true do |t| create_table "forked_project_links", force: true do |t|
t.integer "forked_to_project_id", null: false t.integer "forked_to_project_id", null: false
t.integer "forked_from_project_id", null: false t.integer "forked_from_project_id", null: false
t.datetime "created_at", null: false t.datetime "created_at"
t.datetime "updated_at", null: false t.datetime "updated_at"
end end
add_index "forked_project_links", ["forked_to_project_id"], name: "index_forked_project_links_on_forked_to_project_id", unique: true, using: :btree add_index "forked_project_links", ["forked_to_project_id"], name: "index_forked_project_links_on_forked_to_project_id", unique: true, using: :btree
...@@ -107,8 +110,8 @@ ActiveRecord::Schema.define(version: 20140304005354) do ...@@ -107,8 +110,8 @@ ActiveRecord::Schema.define(version: 20140304005354) do
create_table "merge_request_diffs", force: true do |t| create_table "merge_request_diffs", force: true do |t|
t.string "state", default: "collected", null: false t.string "state", default: "collected", null: false
t.text "st_commits", limit: 2147483647 t.text "st_commits"
t.text "st_diffs", limit: 2147483647 t.text "st_diffs"
t.integer "merge_request_id", null: false t.integer "merge_request_id", null: false
t.datetime "created_at" t.datetime "created_at"
t.datetime "updated_at" t.datetime "updated_at"
...@@ -138,7 +141,7 @@ ActiveRecord::Schema.define(version: 20140304005354) do ...@@ -138,7 +141,7 @@ ActiveRecord::Schema.define(version: 20140304005354) do
add_index "merge_requests", ["created_at"], name: "index_merge_requests_on_created_at", using: :btree add_index "merge_requests", ["created_at"], name: "index_merge_requests_on_created_at", using: :btree
add_index "merge_requests", ["milestone_id"], name: "index_merge_requests_on_milestone_id", using: :btree add_index "merge_requests", ["milestone_id"], name: "index_merge_requests_on_milestone_id", using: :btree
add_index "merge_requests", ["source_branch"], name: "index_merge_requests_on_source_branch", using: :btree add_index "merge_requests", ["source_branch"], name: "index_merge_requests_on_source_branch", using: :btree
add_index "merge_requests", ["source_project_id"], name: "index_merge_requests_on_project_id", using: :btree add_index "merge_requests", ["source_project_id"], name: "index_merge_requests_on_source_project_id", using: :btree
add_index "merge_requests", ["target_branch"], name: "index_merge_requests_on_target_branch", using: :btree add_index "merge_requests", ["target_branch"], name: "index_merge_requests_on_target_branch", using: :btree
add_index "merge_requests", ["title"], name: "index_merge_requests_on_title", using: :btree add_index "merge_requests", ["title"], name: "index_merge_requests_on_title", using: :btree
...@@ -147,8 +150,8 @@ ActiveRecord::Schema.define(version: 20140304005354) do ...@@ -147,8 +150,8 @@ ActiveRecord::Schema.define(version: 20140304005354) do
t.integer "project_id", null: false t.integer "project_id", null: false
t.text "description" t.text "description"
t.date "due_date" t.date "due_date"
t.datetime "created_at", null: false t.datetime "created_at"
t.datetime "updated_at", null: false t.datetime "updated_at"
t.string "state" t.string "state"
t.integer "iid" t.integer "iid"
end end
...@@ -160,8 +163,8 @@ ActiveRecord::Schema.define(version: 20140304005354) do ...@@ -160,8 +163,8 @@ ActiveRecord::Schema.define(version: 20140304005354) do
t.string "name", null: false t.string "name", null: false
t.string "path", null: false t.string "path", null: false
t.integer "owner_id" t.integer "owner_id"
t.datetime "created_at", null: false t.datetime "created_at"
t.datetime "updated_at", null: false t.datetime "updated_at"
t.string "type" t.string "type"
t.string "description", default: "", null: false t.string "description", default: "", null: false
t.string "avatar" t.string "avatar"
...@@ -183,8 +186,8 @@ ActiveRecord::Schema.define(version: 20140304005354) do ...@@ -183,8 +186,8 @@ ActiveRecord::Schema.define(version: 20140304005354) do
t.string "line_code" t.string "line_code"
t.string "commit_id" t.string "commit_id"
t.integer "noteable_id" t.integer "noteable_id"
t.text "st_diff"
t.boolean "system", default: false, null: false t.boolean "system", default: false, null: false
t.text "st_diff"
end end
add_index "notes", ["author_id"], name: "index_notes_on_author_id", using: :btree add_index "notes", ["author_id"], name: "index_notes_on_author_id", using: :btree
...@@ -217,15 +220,15 @@ ActiveRecord::Schema.define(version: 20140304005354) do ...@@ -217,15 +220,15 @@ ActiveRecord::Schema.define(version: 20140304005354) do
t.boolean "archived", default: false, null: false t.boolean "archived", default: false, null: false
end end
add_index "projects", ["creator_id"], name: "index_projects_on_owner_id", using: :btree add_index "projects", ["creator_id"], name: "index_projects_on_creator_id", using: :btree
add_index "projects", ["last_activity_at"], name: "index_projects_on_last_activity_at", using: :btree add_index "projects", ["last_activity_at"], name: "index_projects_on_last_activity_at", using: :btree
add_index "projects", ["namespace_id"], name: "index_projects_on_namespace_id", using: :btree add_index "projects", ["namespace_id"], name: "index_projects_on_namespace_id", using: :btree
create_table "protected_branches", force: true do |t| create_table "protected_branches", force: true do |t|
t.integer "project_id", null: false t.integer "project_id", null: false
t.string "name", null: false t.string "name", null: false
t.datetime "created_at", null: false t.datetime "created_at"
t.datetime "updated_at", null: false t.datetime "updated_at"
end end
add_index "protected_branches", ["project_id"], name: "index_protected_branches_on_project_id", using: :btree add_index "protected_branches", ["project_id"], name: "index_protected_branches_on_project_id", using: :btree
...@@ -235,8 +238,8 @@ ActiveRecord::Schema.define(version: 20140304005354) do ...@@ -235,8 +238,8 @@ ActiveRecord::Schema.define(version: 20140304005354) do
t.string "title" t.string "title"
t.string "token" t.string "token"
t.integer "project_id", null: false t.integer "project_id", null: false
t.datetime "created_at", null: false t.datetime "created_at"
t.datetime "updated_at", null: false t.datetime "updated_at"
t.boolean "active", default: false, null: false t.boolean "active", default: false, null: false
t.string "project_url" t.string "project_url"
t.string "subdomain" t.string "subdomain"
...@@ -249,7 +252,7 @@ ActiveRecord::Schema.define(version: 20140304005354) do ...@@ -249,7 +252,7 @@ ActiveRecord::Schema.define(version: 20140304005354) do
create_table "snippets", force: true do |t| create_table "snippets", force: true do |t|
t.string "title" t.string "title"
t.text "content", limit: 2147483647 t.text "content"
t.integer "author_id", null: false t.integer "author_id", null: false
t.integer "project_id" t.integer "project_id"
t.datetime "created_at" t.datetime "created_at"
...@@ -335,8 +338,8 @@ ActiveRecord::Schema.define(version: 20140304005354) do ...@@ -335,8 +338,8 @@ ActiveRecord::Schema.define(version: 20140304005354) do
t.integer "group_access", null: false t.integer "group_access", null: false
t.integer "group_id", null: false t.integer "group_id", null: false
t.integer "user_id", null: false t.integer "user_id", null: false
t.datetime "created_at", null: false t.datetime "created_at"
t.datetime "updated_at", null: false t.datetime "updated_at"
t.integer "notification_level", default: 3, null: false t.integer "notification_level", default: 3, null: false
end end
...@@ -365,6 +368,7 @@ ActiveRecord::Schema.define(version: 20140304005354) do ...@@ -365,6 +368,7 @@ ActiveRecord::Schema.define(version: 20140304005354) do
t.boolean "push_events", default: true, null: false t.boolean "push_events", default: true, null: false
t.boolean "issues_events", default: false, null: false t.boolean "issues_events", default: false, null: false
t.boolean "merge_requests_events", default: false, null: false t.boolean "merge_requests_events", default: false, null: false
t.boolean "tag_push_events", default: false
end end
add_index "web_hooks", ["project_id"], name: "index_web_hooks_on_project_id", using: :btree add_index "web_hooks", ["project_id"], name: "index_web_hooks_on_project_id", using: :btree
......
require 'spec_helper'
describe ProjectHook do
describe '.push_hooks' do
it 'should return hooks for push events only' do
hook = create(:project_hook, push_events: true)
hook2 = create(:project_hook, push_events: false)
expect(ProjectHook.push_hooks).to eq([hook])
end
end
describe '.tag_push_hooks' do
it 'should return hooks for tag push events only' do
hook = create(:project_hook, tag_push_events: true)
hook2 = create(:project_hook, tag_push_events: false)
expect(ProjectHook.tag_push_hooks).to eq([hook])
end
end
end
require 'spec_helper'
describe GitTagPushService do
let (:user) { create :user }
let (:project) { create :project }
let (:service) { GitTagPushService.new }
before do
@ref = 'refs/tags/super-tag'
@oldrev = 'b98a310def241a6fd9c9a9a3e7934c48e498fe81'
@newrev = 'b19a04f53caeebf4fe5ec2327cb83e9253dc91bb'
end
describe 'Git Tag Push Data' do
before do
service.execute(project, user, @oldrev, @newrev, @ref)
@push_data = service.push_data
end
subject { @push_data }
it { should include(ref: @ref) }
it { should include(before: @oldrev) }
it { should include(after: @newrev) }
it { should include(user_id: user.id) }
it { should include(user_name: user.name) }
it { should include(project_id: project.id) }
context 'With repository data' do
subject { @push_data[:repository] }
it { should include(name: project.name) }
it { should include(url: project.url_to_repo) }
it { should include(description: project.description) }
it { should include(homepage: project.web_url) }
end
end
describe "Web Hooks" do
context "execute web hooks" do
it "when pushing tags" do
project.should_receive(:execute_hooks)
service.execute(project, user, 'oldrev', 'newrev', 'refs/tags/v1.0.0')
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