Commit 0a1b4ba259a0c8373bd3547f9e72ff6fa83ac2f4

Authored by Dmitriy Zaporozhets
2 parents f451a697 f6ee55aa

Merge branch 'remove-thread-var' into 'master'

Remove thread variables

Lets get rid of thread variables. It produces additional complexity and weird stack trace.

Also part of !1133

- - -

Also it fixes issue/merge_request close and reopen bug via API when no dashboard event and comment was created.
app/controllers/application_controller.rb
@@ -4,7 +4,6 @@ class ApplicationController < ActionController::Base @@ -4,7 +4,6 @@ class ApplicationController < ActionController::Base
4 before_filter :authenticate_user! 4 before_filter :authenticate_user!
5 before_filter :reject_blocked! 5 before_filter :reject_blocked!
6 before_filter :check_password_expiration 6 before_filter :check_password_expiration
7 - around_filter :set_current_user_for_thread  
8 before_filter :add_abilities 7 before_filter :add_abilities
9 before_filter :ldap_security_check 8 before_filter :ldap_security_check
10 before_filter :dev_tools if Rails.env == 'development' 9 before_filter :dev_tools if Rails.env == 'development'
@@ -53,15 +52,6 @@ class ApplicationController < ActionController::Base @@ -53,15 +52,6 @@ class ApplicationController < ActionController::Base
53 end 52 end
54 end 53 end
55 54
56 - def set_current_user_for_thread  
57 - Thread.current[:current_user] = current_user  
58 - begin  
59 - yield  
60 - ensure  
61 - Thread.current[:current_user] = nil  
62 - end  
63 - end  
64 -  
65 def abilities 55 def abilities
66 @abilities ||= Six.new 56 @abilities ||= Six.new
67 end 57 end
app/controllers/projects/milestones_controller.rb
@@ -37,7 +37,7 @@ class Projects::MilestonesController < Projects::ApplicationController @@ -37,7 +37,7 @@ class Projects::MilestonesController < Projects::ApplicationController
37 end 37 end
38 38
39 def create 39 def create
40 - @milestone = @project.milestones.new(params[:milestone]) 40 + @milestone = Milestones::CreateService.new(project, current_user, params[:milestone]).execute
41 41
42 if @milestone.save 42 if @milestone.save
43 redirect_to project_milestone_path(@project, @milestone) 43 redirect_to project_milestone_path(@project, @milestone)
@@ -47,7 +47,7 @@ class Projects::MilestonesController < Projects::ApplicationController @@ -47,7 +47,7 @@ class Projects::MilestonesController < Projects::ApplicationController
47 end 47 end
48 48
49 def update 49 def update
50 - @milestone.update_attributes(params[:milestone]) 50 + @milestone = Milestones::UpdateService.new(project, current_user, params[:milestone]).execute(milestone)
51 51
52 respond_to do |format| 52 respond_to do |format|
53 format.js 53 format.js
app/observers/base_observer.rb
@@ -10,12 +10,4 @@ class BaseObserver < ActiveRecord::Observer @@ -10,12 +10,4 @@ class BaseObserver < ActiveRecord::Observer
10 def log_info message 10 def log_info message
11 Gitlab::AppLogger.info message 11 Gitlab::AppLogger.info message
12 end 12 end
13 -  
14 - def current_user  
15 - Thread.current[:current_user]  
16 - end  
17 -  
18 - def current_commit  
19 - Thread.current[:current_commit]  
20 - end  
21 end 13 end
app/observers/milestone_observer.rb
@@ -1,13 +0,0 @@ @@ -1,13 +0,0 @@
1 -class MilestoneObserver < BaseObserver  
2 - def after_create(milestone)  
3 - event_service.open_milestone(milestone, current_user)  
4 - end  
5 -  
6 - def after_close(milestone, transition)  
7 - event_service.close_milestone(milestone, current_user)  
8 - end  
9 -  
10 - def after_reopen(milestone, transition)  
11 - event_service.reopen_milestone(milestone, current_user)  
12 - end  
13 -end  
app/observers/note_observer.rb
@@ -5,7 +5,7 @@ class NoteObserver &lt; BaseObserver @@ -5,7 +5,7 @@ class NoteObserver &lt; BaseObserver
5 # Skip system notes, like status changes and cross-references. 5 # Skip system notes, like status changes and cross-references.
6 # Skip wall notes to prevent spamming of dashboard 6 # Skip wall notes to prevent spamming of dashboard
7 if note.noteable_type.present? && !note.system 7 if note.noteable_type.present? && !note.system
8 - event_service.leave_note(note, current_user) 8 + event_service.leave_note(note, note.author)
9 end 9 end
10 10
11 unless note.system? 11 unless note.system?
@@ -18,6 +18,6 @@ class NoteObserver &lt; BaseObserver @@ -18,6 +18,6 @@ class NoteObserver &lt; BaseObserver
18 end 18 end
19 19
20 def after_update(note) 20 def after_update(note)
21 - note.notice_added_references(note.project, current_user) 21 + note.notice_added_references(note.project, note.author)
22 end 22 end
23 end 23 end
app/services/issues/update_service.rb
1 module Issues 1 module Issues
2 class UpdateService < Issues::BaseService 2 class UpdateService < Issues::BaseService
3 def execute(issue) 3 def execute(issue)
4 - state = params.delete('state_event') 4 + state = params.delete('state_event') || params.delete(:state_event)
5 5
6 case state 6 case state
7 when 'reopen' 7 when 'reopen'
app/services/merge_requests/update_service.rb
@@ -10,7 +10,7 @@ module MergeRequests @@ -10,7 +10,7 @@ module MergeRequests
10 params.delete(:source_project_id) 10 params.delete(:source_project_id)
11 params.delete(:target_project_id) 11 params.delete(:target_project_id)
12 12
13 - state = params.delete('state_event') 13 + state = params.delete('state_event') || params.delete(:state_event)
14 14
15 case state 15 case state
16 when 'reopen' 16 when 'reopen'
app/services/milestones/base_service.rb 0 → 100644
@@ -0,0 +1,4 @@ @@ -0,0 +1,4 @@
  1 +module Milestones
  2 + class BaseService < ::BaseService
  3 + end
  4 +end
app/services/milestones/close_service.rb 0 → 100644
@@ -0,0 +1,11 @@ @@ -0,0 +1,11 @@
  1 +module Milestones
  2 + class CloseService < Milestones::BaseService
  3 + def execute(milestone)
  4 + if milestone.close
  5 + event_service.close_milestone(milestone, current_user)
  6 + end
  7 +
  8 + milestone
  9 + end
  10 + end
  11 +end
app/services/milestones/create_service.rb 0 → 100644
@@ -0,0 +1,13 @@ @@ -0,0 +1,13 @@
  1 +module Milestones
  2 + class CreateService < Milestones::BaseService
  3 + def execute
  4 + milestone = project.milestones.new(params)
  5 +
  6 + if milestone.save
  7 + event_service.open_milestone(milestone, current_user)
  8 + end
  9 +
  10 + milestone
  11 + end
  12 + end
  13 +end
app/services/milestones/reopen_service.rb 0 → 100644
@@ -0,0 +1,11 @@ @@ -0,0 +1,11 @@
  1 +module Milestones
  2 + class ReopenService < Milestones::BaseService
  3 + def execute(milestone)
  4 + if milestone.activate
  5 + event_service.reopen_milestone(milestone, current_user)
  6 + end
  7 +
  8 + milestone
  9 + end
  10 + end
  11 +end
app/services/milestones/update_service.rb 0 → 100644
@@ -0,0 +1,20 @@ @@ -0,0 +1,20 @@
  1 +module Milestones
  2 + class UpdateService < Milestones::BaseService
  3 + def execute(milestone)
  4 + state = params.delete('state_event') || params.delete(:state_event)
  5 +
  6 + case state
  7 + when 'activate'
  8 + Milestones::ReopenService.new(project, current_user, {}).execute(milestone)
  9 + when 'close'
  10 + Milestones::CloseService.new(project, current_user, {}).execute(milestone)
  11 + end
  12 +
  13 + if params.present?
  14 + milestone.update_attributes(params)
  15 + end
  16 +
  17 + milestone
  18 + end
  19 + end
  20 +end
config/application.rb
@@ -19,8 +19,7 @@ module Gitlab @@ -19,8 +19,7 @@ module Gitlab
19 # config.plugins = [ :exception_notification, :ssl_requirement, :all ] 19 # config.plugins = [ :exception_notification, :ssl_requirement, :all ]
20 20
21 # Activate observers that should always be running. 21 # Activate observers that should always be running.
22 - config.active_record.observers = :milestone_observer,  
23 - :project_activity_cache_observer, 22 + config.active_record.observers = :project_activity_cache_observer,
24 :note_observer, 23 :note_observer,
25 :project_observer, 24 :project_observer,
26 :system_hook_observer, 25 :system_hook_observer,
lib/api/helpers.rb
@@ -36,16 +36,6 @@ module API @@ -36,16 +36,6 @@ module API
36 end 36 end
37 end 37 end
38 38
39 - def set_current_user_for_thread  
40 - Thread.current[:current_user] = current_user  
41 -  
42 - begin  
43 - yield  
44 - ensure  
45 - Thread.current[:current_user] = nil  
46 - end  
47 - end  
48 -  
49 def user_project 39 def user_project
50 @project ||= find_project(params[:id]) 40 @project ||= find_project(params[:id])
51 @project || not_found! 41 @project || not_found!
lib/api/merge_requests.rb
@@ -184,21 +184,18 @@ module API @@ -184,21 +184,18 @@ module API
184 # POST /projects/:id/merge_request/:merge_request_id/comments 184 # POST /projects/:id/merge_request/:merge_request_id/comments
185 # 185 #
186 post ":id/merge_request/:merge_request_id/comments" do 186 post ":id/merge_request/:merge_request_id/comments" do
187 - set_current_user_for_thread do  
188 - required_attributes! [:note] 187 + required_attributes! [:note]
189 188
190 - merge_request = user_project.merge_requests.find(params[:merge_request_id])  
191 - note = merge_request.notes.new(note: params[:note], project_id: user_project.id)  
192 - note.author = current_user 189 + merge_request = user_project.merge_requests.find(params[:merge_request_id])
  190 + note = merge_request.notes.new(note: params[:note], project_id: user_project.id)
  191 + note.author = current_user
193 192
194 - if note.save  
195 - present note, with: Entities::MRNote  
196 - else  
197 - not_found!  
198 - end 193 + if note.save
  194 + present note, with: Entities::MRNote
  195 + else
  196 + not_found!
199 end 197 end
200 end 198 end
201 -  
202 end 199 end
203 end 200 end
204 end 201 end
lib/api/milestones.rb
@@ -40,17 +40,15 @@ module API @@ -40,17 +40,15 @@ module API
40 # Example Request: 40 # Example Request:
41 # POST /projects/:id/milestones 41 # POST /projects/:id/milestones
42 post ":id/milestones" do 42 post ":id/milestones" do
43 - set_current_user_for_thread do  
44 - authorize! :admin_milestone, user_project  
45 - required_attributes! [:title] 43 + authorize! :admin_milestone, user_project
  44 + required_attributes! [:title]
  45 + attrs = attributes_for_keys [:title, :description, :due_date]
  46 + milestone = ::Milestones::CreateService.new(user_project, current_user, attrs).execute
46 47
47 - attrs = attributes_for_keys [:title, :description, :due_date]  
48 - @milestone = user_project.milestones.new attrs  
49 - if @milestone.save  
50 - present @milestone, with: Entities::Milestone  
51 - else  
52 - not_found!  
53 - end 48 + if milestone.valid?
  49 + present milestone, with: Entities::Milestone
  50 + else
  51 + not_found!
54 end 52 end
55 end 53 end
56 54
@@ -66,16 +64,15 @@ module API @@ -66,16 +64,15 @@ module API
66 # Example Request: 64 # Example Request:
67 # PUT /projects/:id/milestones/:milestone_id 65 # PUT /projects/:id/milestones/:milestone_id
68 put ":id/milestones/:milestone_id" do 66 put ":id/milestones/:milestone_id" do
69 - set_current_user_for_thread do  
70 - authorize! :admin_milestone, user_project 67 + authorize! :admin_milestone, user_project
  68 + attrs = attributes_for_keys [:title, :description, :due_date, :state_event]
  69 + milestone = user_project.milestones.find(params[:milestone_id])
  70 + milestone = ::Milestones::UpdateService.new(user_project, current_user, attrs).execute(milestone)
71 71
72 - @milestone = user_project.milestones.find(params[:milestone_id])  
73 - attrs = attributes_for_keys [:title, :description, :due_date, :state_event]  
74 - if @milestone.update_attributes attrs  
75 - present @milestone, with: Entities::Milestone  
76 - else  
77 - not_found!  
78 - end 72 + if milestone.valid?
  73 + present milestone, with: Entities::Milestone
  74 + else
  75 + not_found!
79 end 76 end
80 end 77 end
81 end 78 end
lib/api/notes.rb
@@ -41,19 +41,17 @@ module API @@ -41,19 +41,17 @@ module API
41 # Example Request: 41 # Example Request:
42 # POST /projects/:id/notes 42 # POST /projects/:id/notes
43 post ":id/notes" do 43 post ":id/notes" do
44 - set_current_user_for_thread do  
45 - required_attributes! [:body] 44 + required_attributes! [:body]
46 45
47 - @note = user_project.notes.new(note: params[:body])  
48 - @note.author = current_user 46 + @note = user_project.notes.new(note: params[:body])
  47 + @note.author = current_user
49 48
50 - if @note.save  
51 - present @note, with: Entities::Note  
52 - else  
53 - # :note is exposed as :body, but :note is set on error  
54 - bad_request!(:note) if @note.errors[:note].any?  
55 - not_found!  
56 - end 49 + if @note.save
  50 + present @note, with: Entities::Note
  51 + else
  52 + # :note is exposed as :body, but :note is set on error
  53 + bad_request!(:note) if @note.errors[:note].any?
  54 + not_found!
57 end 55 end
58 end 56 end
59 57
@@ -99,19 +97,17 @@ module API @@ -99,19 +97,17 @@ module API
99 # POST /projects/:id/issues/:noteable_id/notes 97 # POST /projects/:id/issues/:noteable_id/notes
100 # POST /projects/:id/snippets/:noteable_id/notes 98 # POST /projects/:id/snippets/:noteable_id/notes
101 post ":id/#{noteables_str}/:#{noteable_id_str}/notes" do 99 post ":id/#{noteables_str}/:#{noteable_id_str}/notes" do
102 - set_current_user_for_thread do  
103 - required_attributes! [:body] 100 + required_attributes! [:body]
104 101
105 - @noteable = user_project.send(:"#{noteables_str}").find(params[:"#{noteable_id_str}"])  
106 - @note = @noteable.notes.new(note: params[:body])  
107 - @note.author = current_user  
108 - @note.project = user_project 102 + @noteable = user_project.send(:"#{noteables_str}").find(params[:"#{noteable_id_str}"])
  103 + @note = @noteable.notes.new(note: params[:body])
  104 + @note.author = current_user
  105 + @note.project = user_project
109 106
110 - if @note.save  
111 - present @note, with: Entities::Note  
112 - else  
113 - not_found!  
114 - end 107 + if @note.save
  108 + present @note, with: Entities::Note
  109 + else
  110 + not_found!
115 end 111 end
116 end 112 end
117 end 113 end
lib/gitlab/seeder.rb
@@ -9,12 +9,7 @@ module Gitlab @@ -9,12 +9,7 @@ module Gitlab
9 end 9 end
10 10
11 def self.by_user(user) 11 def self.by_user(user)
12 - begin  
13 - Thread.current[:current_user] = user  
14 - yield  
15 - ensure  
16 - Thread.current[:current_user] = nil  
17 - end 12 + yield
18 end 13 end
19 14
20 def self.mute_mailer 15 def self.mute_mailer