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 4 before_filter :authenticate_user!
5 5 before_filter :reject_blocked!
6 6 before_filter :check_password_expiration
7   - around_filter :set_current_user_for_thread
8 7 before_filter :add_abilities
9 8 before_filter :ldap_security_check
10 9 before_filter :dev_tools if Rails.env == 'development'
... ... @@ -53,15 +52,6 @@ class ApplicationController < ActionController::Base
53 52 end
54 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 55 def abilities
66 56 @abilities ||= Six.new
67 57 end
... ...
app/controllers/projects/milestones_controller.rb
... ... @@ -37,7 +37,7 @@ class Projects::MilestonesController < Projects::ApplicationController
37 37 end
38 38  
39 39 def create
40   - @milestone = @project.milestones.new(params[:milestone])
  40 + @milestone = Milestones::CreateService.new(project, current_user, params[:milestone]).execute
41 41  
42 42 if @milestone.save
43 43 redirect_to project_milestone_path(@project, @milestone)
... ... @@ -47,7 +47,7 @@ class Projects::MilestonesController < Projects::ApplicationController
47 47 end
48 48  
49 49 def update
50   - @milestone.update_attributes(params[:milestone])
  50 + @milestone = Milestones::UpdateService.new(project, current_user, params[:milestone]).execute(milestone)
51 51  
52 52 respond_to do |format|
53 53 format.js
... ...
app/observers/base_observer.rb
... ... @@ -10,12 +10,4 @@ class BaseObserver < ActiveRecord::Observer
10 10 def log_info message
11 11 Gitlab::AppLogger.info message
12 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 13 end
... ...
app/observers/milestone_observer.rb
... ... @@ -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 5 # Skip system notes, like status changes and cross-references.
6 6 # Skip wall notes to prevent spamming of dashboard
7 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 9 end
10 10  
11 11 unless note.system?
... ... @@ -18,6 +18,6 @@ class NoteObserver &lt; BaseObserver
18 18 end
19 19  
20 20 def after_update(note)
21   - note.notice_added_references(note.project, current_user)
  21 + note.notice_added_references(note.project, note.author)
22 22 end
23 23 end
... ...
app/services/issues/update_service.rb
1 1 module Issues
2 2 class UpdateService < Issues::BaseService
3 3 def execute(issue)
4   - state = params.delete('state_event')
  4 + state = params.delete('state_event') || params.delete(:state_event)
5 5  
6 6 case state
7 7 when 'reopen'
... ...
app/services/merge_requests/update_service.rb
... ... @@ -10,7 +10,7 @@ module MergeRequests
10 10 params.delete(:source_project_id)
11 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 15 case state
16 16 when 'reopen'
... ...
app/services/milestones/base_service.rb 0 → 100644
... ... @@ -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 @@
  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 @@
  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 @@
  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 @@
  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 19 # config.plugins = [ :exception_notification, :ssl_requirement, :all ]
20 20  
21 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 23 :note_observer,
25 24 :project_observer,
26 25 :system_hook_observer,
... ...
lib/api/helpers.rb
... ... @@ -36,16 +36,6 @@ module API
36 36 end
37 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 39 def user_project
50 40 @project ||= find_project(params[:id])
51 41 @project || not_found!
... ...
lib/api/merge_requests.rb
... ... @@ -184,21 +184,18 @@ module API
184 184 # POST /projects/:id/merge_request/:merge_request_id/comments
185 185 #
186 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 197 end
200 198 end
201   -
202 199 end
203 200 end
204 201 end
... ...
lib/api/milestones.rb
... ... @@ -40,17 +40,15 @@ module API
40 40 # Example Request:
41 41 # POST /projects/:id/milestones
42 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 52 end
55 53 end
56 54  
... ... @@ -66,16 +64,15 @@ module API
66 64 # Example Request:
67 65 # PUT /projects/:id/milestones/:milestone_id
68 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 76 end
80 77 end
81 78 end
... ...
lib/api/notes.rb
... ... @@ -41,19 +41,17 @@ module API
41 41 # Example Request:
42 42 # POST /projects/:id/notes
43 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 55 end
58 56 end
59 57  
... ... @@ -99,19 +97,17 @@ module API
99 97 # POST /projects/:id/issues/:noteable_id/notes
100 98 # POST /projects/:id/snippets/:noteable_id/notes
101 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 111 end
116 112 end
117 113 end
... ...
lib/gitlab/seeder.rb
... ... @@ -9,12 +9,7 @@ module Gitlab
9 9 end
10 10  
11 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 13 end
19 14  
20 15 def self.mute_mailer
... ...