Commit 56318a24b1f7c07f7fe5d3fd23bf7d26c0240a87

Authored by Dmitriy Zaporozhets
2 parents cc57a25c e6ceec9d

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

Add web hooks on tag
app/models/project_hook.rb
... ... @@ -17,9 +17,10 @@
17 17 class ProjectHook < WebHook
18 18 belongs_to :project
19 19  
20   - attr_accessible :push_events, :issues_events, :merge_requests_events
  20 + attr_accessible :push_events, :issues_events, :merge_requests_events, :tag_push_events
21 21  
22 22 scope :push_hooks, -> { where(push_events: true) }
  23 + scope :tag_push_hooks, -> { where(tag_push_events: true) }
23 24 scope :issue_hooks, -> { where(issues_events: true) }
24 25 scope :merge_request_hooks, -> { where(merge_requests_events: true) }
25 26 end
... ...
app/services/git_tag_push_service.rb 0 → 100644
... ... @@ -0,0 +1,27 @@
  1 +class GitTagPushService
  2 + attr_accessor :project, :user, :push_data
  3 + def execute(project, user, oldrev, newrev, ref)
  4 + @project, @user = project, user
  5 + @push_data = create_push_data(oldrev, newrev, ref)
  6 + project.execute_hooks(@push_data.dup, :tag_push_hooks)
  7 + end
  8 +
  9 + private
  10 +
  11 + def create_push_data(oldrev, newrev, ref)
  12 + data = {
  13 + ref: ref,
  14 + before: oldrev,
  15 + after: newrev,
  16 + user_id: user.id,
  17 + user_name: user.name,
  18 + project_id: project.id,
  19 + repository: {
  20 + name: project.name,
  21 + url: project.url_to_repo,
  22 + description: project.description,
  23 + homepage: project.web_url
  24 + }
  25 + }
  26 + end
  27 +end
... ...
app/views/projects/hooks/index.html.haml
... ... @@ -27,6 +27,13 @@
27 27 %p.light
28 28 This url will be triggered by a push to the repository
29 29 %div
  30 + = f.check_box :tag_push_events, class: 'pull-left'
  31 + .prepend-left-20
  32 + = f.label :tag_push_events, class: 'list-label' do
  33 + %strong Tag push events
  34 + %p.light
  35 + This url will be triggered when a new tag is pushed to the repository
  36 + %div
30 37 = f.check_box :issues_events, class: 'pull-left'
31 38 .prepend-left-20
32 39 = f.label :issues_events, class: 'list-label' do
... ... @@ -56,6 +63,6 @@
56 63 .clearfix
57 64 %span.monospace= hook.url
58 65 %p
59   - - %w(push_events issues_events merge_requests_events).each do |trigger|
  66 + - %w(push_events tag_push_events issues_events merge_requests_events).each do |trigger|
60 67 - if hook.send(trigger)
61 68 %span.label.label-gray= trigger.titleize
... ...
app/workers/post_receive.rb
... ... @@ -29,10 +29,20 @@ class PostReceive
29 29 return false
30 30 end
31 31  
32   - GitPushService.new.execute(project, user, oldrev, newrev, ref)
  32 + if tag?(ref)
  33 + GitTagPushService.new.execute(project, user, oldrev, newrev, ref)
  34 + else
  35 + GitPushService.new.execute(project, user, oldrev, newrev, ref)
  36 + end
33 37 end
34 38  
35 39 def log(message)
36 40 Gitlab::GitLogger.error("POST-RECEIVE: #{message}")
37 41 end
  42 +
  43 + private
  44 +
  45 + def tag?(ref)
  46 + !!(/refs\/tags\/(.*)/.match(ref))
  47 + end
38 48 end
... ...
db/migrate/20140305193308_add_tag_push_hooks_to_project_hook.rb 0 → 100644
... ... @@ -0,0 +1,5 @@
  1 +class AddTagPushHooksToProjectHook < ActiveRecord::Migration
  2 + def change
  3 + add_column :web_hooks, :tag_push_events, :boolean, default: false
  4 + end
  5 +end
... ...
db/schema.rb
... ... @@ -11,15 +11,18 @@
11 11 #
12 12 # It's strongly recommended that you check this file into your version control system.
13 13  
14   -ActiveRecord::Schema.define(version: 20140304005354) do
  14 +ActiveRecord::Schema.define(version: 20140305193308) do
  15 +
  16 + # These are extensions that must be enabled in order to support this database
  17 + enable_extension "plpgsql"
15 18  
16 19 create_table "broadcast_messages", force: true do |t|
17 20 t.text "message", null: false
18 21 t.datetime "starts_at"
19 22 t.datetime "ends_at"
20 23 t.integer "alert_type"
21   - t.datetime "created_at", null: false
22   - t.datetime "updated_at", null: false
  24 + t.datetime "created_at"
  25 + t.datetime "updated_at"
23 26 t.string "color"
24 27 t.string "font"
25 28 end
... ... @@ -27,8 +30,8 @@ ActiveRecord::Schema.define(version: 20140304005354) do
27 30 create_table "deploy_keys_projects", force: true do |t|
28 31 t.integer "deploy_key_id", null: false
29 32 t.integer "project_id", null: false
30   - t.datetime "created_at", null: false
31   - t.datetime "updated_at", null: false
  33 + t.datetime "created_at"
  34 + t.datetime "updated_at"
32 35 end
33 36  
34 37 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 52 t.string "title"
50 53 t.text "data"
51 54 t.integer "project_id"
52   - t.datetime "created_at", null: false
53   - t.datetime "updated_at", null: false
  55 + t.datetime "created_at"
  56 + t.datetime "updated_at"
54 57 t.integer "action"
55 58 t.integer "author_id"
56 59 end
... ... @@ -65,8 +68,8 @@ ActiveRecord::Schema.define(version: 20140304005354) do
65 68 create_table "forked_project_links", force: true do |t|
66 69 t.integer "forked_to_project_id", null: false
67 70 t.integer "forked_from_project_id", null: false
68   - t.datetime "created_at", null: false
69   - t.datetime "updated_at", null: false
  71 + t.datetime "created_at"
  72 + t.datetime "updated_at"
70 73 end
71 74  
72 75 add_index "forked_project_links", ["forked_to_project_id"], name: "index_forked_project_links_on_forked_to_project_id", unique: true, using: :btree
... ... @@ -106,10 +109,10 @@ ActiveRecord::Schema.define(version: 20140304005354) do
106 109 add_index "keys", ["user_id"], name: "index_keys_on_user_id", using: :btree
107 110  
108 111 create_table "merge_request_diffs", force: true do |t|
109   - t.string "state", default: "collected", null: false
110   - t.text "st_commits", limit: 2147483647
111   - t.text "st_diffs", limit: 2147483647
112   - t.integer "merge_request_id", null: false
  112 + t.string "state", default: "collected", null: false
  113 + t.text "st_commits"
  114 + t.text "st_diffs"
  115 + t.integer "merge_request_id", null: false
113 116 t.datetime "created_at"
114 117 t.datetime "updated_at"
115 118 end
... ... @@ -138,7 +141,7 @@ ActiveRecord::Schema.define(version: 20140304005354) do
138 141 add_index "merge_requests", ["created_at"], name: "index_merge_requests_on_created_at", using: :btree
139 142 add_index "merge_requests", ["milestone_id"], name: "index_merge_requests_on_milestone_id", using: :btree
140 143 add_index "merge_requests", ["source_branch"], name: "index_merge_requests_on_source_branch", using: :btree
141   - add_index "merge_requests", ["source_project_id"], name: "index_merge_requests_on_project_id", using: :btree
  144 + add_index "merge_requests", ["source_project_id"], name: "index_merge_requests_on_source_project_id", using: :btree
142 145 add_index "merge_requests", ["target_branch"], name: "index_merge_requests_on_target_branch", using: :btree
143 146 add_index "merge_requests", ["title"], name: "index_merge_requests_on_title", using: :btree
144 147  
... ... @@ -147,8 +150,8 @@ ActiveRecord::Schema.define(version: 20140304005354) do
147 150 t.integer "project_id", null: false
148 151 t.text "description"
149 152 t.date "due_date"
150   - t.datetime "created_at", null: false
151   - t.datetime "updated_at", null: false
  153 + t.datetime "created_at"
  154 + t.datetime "updated_at"
152 155 t.string "state"
153 156 t.integer "iid"
154 157 end
... ... @@ -160,8 +163,8 @@ ActiveRecord::Schema.define(version: 20140304005354) do
160 163 t.string "name", null: false
161 164 t.string "path", null: false
162 165 t.integer "owner_id"
163   - t.datetime "created_at", null: false
164   - t.datetime "updated_at", null: false
  166 + t.datetime "created_at"
  167 + t.datetime "updated_at"
165 168 t.string "type"
166 169 t.string "description", default: "", null: false
167 170 t.string "avatar"
... ... @@ -183,8 +186,8 @@ ActiveRecord::Schema.define(version: 20140304005354) do
183 186 t.string "line_code"
184 187 t.string "commit_id"
185 188 t.integer "noteable_id"
186   - t.text "st_diff"
187 189 t.boolean "system", default: false, null: false
  190 + t.text "st_diff"
188 191 end
189 192  
190 193 add_index "notes", ["author_id"], name: "index_notes_on_author_id", using: :btree
... ... @@ -217,15 +220,15 @@ ActiveRecord::Schema.define(version: 20140304005354) do
217 220 t.boolean "archived", default: false, null: false
218 221 end
219 222  
220   - add_index "projects", ["creator_id"], name: "index_projects_on_owner_id", using: :btree
  223 + add_index "projects", ["creator_id"], name: "index_projects_on_creator_id", using: :btree
221 224 add_index "projects", ["last_activity_at"], name: "index_projects_on_last_activity_at", using: :btree
222 225 add_index "projects", ["namespace_id"], name: "index_projects_on_namespace_id", using: :btree
223 226  
224 227 create_table "protected_branches", force: true do |t|
225 228 t.integer "project_id", null: false
226 229 t.string "name", null: false
227   - t.datetime "created_at", null: false
228   - t.datetime "updated_at", null: false
  230 + t.datetime "created_at"
  231 + t.datetime "updated_at"
229 232 end
230 233  
231 234 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 238 t.string "title"
236 239 t.string "token"
237 240 t.integer "project_id", null: false
238   - t.datetime "created_at", null: false
239   - t.datetime "updated_at", null: false
  241 + t.datetime "created_at"
  242 + t.datetime "updated_at"
240 243 t.boolean "active", default: false, null: false
241 244 t.string "project_url"
242 245 t.string "subdomain"
... ... @@ -249,14 +252,14 @@ ActiveRecord::Schema.define(version: 20140304005354) do
249 252  
250 253 create_table "snippets", force: true do |t|
251 254 t.string "title"
252   - t.text "content", limit: 2147483647
253   - t.integer "author_id", null: false
  255 + t.text "content"
  256 + t.integer "author_id", null: false
254 257 t.integer "project_id"
255 258 t.datetime "created_at"
256 259 t.datetime "updated_at"
257 260 t.string "file_name"
258 261 t.datetime "expires_at"
259   - t.boolean "private", default: true, null: false
  262 + t.boolean "private", default: true, null: false
260 263 t.string "type"
261 264 end
262 265  
... ... @@ -335,8 +338,8 @@ ActiveRecord::Schema.define(version: 20140304005354) do
335 338 t.integer "group_access", null: false
336 339 t.integer "group_id", null: false
337 340 t.integer "user_id", null: false
338   - t.datetime "created_at", null: false
339   - t.datetime "updated_at", null: false
  341 + t.datetime "created_at"
  342 + t.datetime "updated_at"
340 343 t.integer "notification_level", default: 3, null: false
341 344 end
342 345  
... ... @@ -365,6 +368,7 @@ ActiveRecord::Schema.define(version: 20140304005354) do
365 368 t.boolean "push_events", default: true, null: false
366 369 t.boolean "issues_events", default: false, null: false
367 370 t.boolean "merge_requests_events", default: false, null: false
  371 + t.boolean "tag_push_events", default: false
368 372 end
369 373  
370 374 add_index "web_hooks", ["project_id"], name: "index_web_hooks_on_project_id", using: :btree
... ...
spec/models/project_hook_spec.rb 0 → 100644
... ... @@ -0,0 +1,19 @@
  1 +require 'spec_helper'
  2 +
  3 +describe ProjectHook do
  4 + describe '.push_hooks' do
  5 + it 'should return hooks for push events only' do
  6 + hook = create(:project_hook, push_events: true)
  7 + hook2 = create(:project_hook, push_events: false)
  8 + expect(ProjectHook.push_hooks).to eq([hook])
  9 + end
  10 + end
  11 +
  12 + describe '.tag_push_hooks' do
  13 + it 'should return hooks for tag push events only' do
  14 + hook = create(:project_hook, tag_push_events: true)
  15 + hook2 = create(:project_hook, tag_push_events: false)
  16 + expect(ProjectHook.tag_push_hooks).to eq([hook])
  17 + end
  18 + end
  19 +end
... ...
spec/services/git_tag_push_service_spec.rb 0 → 100644
... ... @@ -0,0 +1,47 @@
  1 +require 'spec_helper'
  2 +
  3 +describe GitTagPushService do
  4 + let (:user) { create :user }
  5 + let (:project) { create :project }
  6 + let (:service) { GitTagPushService.new }
  7 +
  8 + before do
  9 + @ref = 'refs/tags/super-tag'
  10 + @oldrev = 'b98a310def241a6fd9c9a9a3e7934c48e498fe81'
  11 + @newrev = 'b19a04f53caeebf4fe5ec2327cb83e9253dc91bb'
  12 + end
  13 +
  14 + describe 'Git Tag Push Data' do
  15 + before do
  16 + service.execute(project, user, @oldrev, @newrev, @ref)
  17 + @push_data = service.push_data
  18 + end
  19 +
  20 + subject { @push_data }
  21 +
  22 + it { should include(ref: @ref) }
  23 + it { should include(before: @oldrev) }
  24 + it { should include(after: @newrev) }
  25 + it { should include(user_id: user.id) }
  26 + it { should include(user_name: user.name) }
  27 + it { should include(project_id: project.id) }
  28 +
  29 + context 'With repository data' do
  30 + subject { @push_data[:repository] }
  31 +
  32 + it { should include(name: project.name) }
  33 + it { should include(url: project.url_to_repo) }
  34 + it { should include(description: project.description) }
  35 + it { should include(homepage: project.web_url) }
  36 + end
  37 + end
  38 +
  39 + describe "Web Hooks" do
  40 + context "execute web hooks" do
  41 + it "when pushing tags" do
  42 + project.should_receive(:execute_hooks)
  43 + service.execute(project, user, 'oldrev', 'newrev', 'refs/tags/v1.0.0')
  44 + end
  45 + end
  46 + end
  47 +end
... ...