summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitriy Zaporozhets <dzaporozhets@sphereconsultinginc.com>2012-07-20 08:39:34 +0300
committerDmitriy Zaporozhets <dzaporozhets@sphereconsultinginc.com>2012-07-20 08:39:34 +0300
commit3063af5adcf1c0331681fbbc13e679de1eb96487 (patch)
tree3c3b7459bcdf8c2f52ba05ea0cc68d88c9e62a90
parent3c6daec4b1194f5a2c43fcc5b7e370cd5c8add1e (diff)
downloadgitlab-ce-3063af5adcf1c0331681fbbc13e679de1eb96487.tar.gz
BaseContext
Controllers refactoring with contexts Move commit compare logic to model
-rw-r--r--app/contexts/base_context.rb8
-rw-r--r--app/contexts/commit_load.rb26
-rw-r--r--app/contexts/merge_requests_load.rb16
-rw-r--r--app/contexts/notes_load.rb30
-rw-r--r--app/controllers/commits_controller.rb46
-rw-r--r--app/controllers/dashboard_controller.rb7
-rw-r--r--app/controllers/merge_requests_controller.rb11
-rw-r--r--app/controllers/notes_controller.rb21
-rw-r--r--app/models/commit.rb23
-rw-r--r--app/models/event.rb4
-rw-r--r--app/roles/account.rb4
11 files changed, 132 insertions, 64 deletions
diff --git a/app/contexts/base_context.rb b/app/contexts/base_context.rb
new file mode 100644
index 00000000000..6eb8ee46c80
--- /dev/null
+++ b/app/contexts/base_context.rb
@@ -0,0 +1,8 @@
+class BaseContext
+ attr_accessor :project, :current_user, :params
+
+ def initialize(project, user, params)
+ @project, @current_user, @params = project, user, params.dup
+ end
+end
+
diff --git a/app/contexts/commit_load.rb b/app/contexts/commit_load.rb
new file mode 100644
index 00000000000..bab30d61007
--- /dev/null
+++ b/app/contexts/commit_load.rb
@@ -0,0 +1,26 @@
+class CommitLoad < BaseContext
+ def execute
+ result = {
+ :commit => nil,
+ :suppress_diff => false,
+ :line_notes => [],
+ :notes_count => 0,
+ :note => nil
+ }
+
+ commit = project.commit(params[:id])
+
+ if commit
+ commit = CommitDecorator.decorate(commit)
+ line_notes = project.commit_line_notes(commit)
+
+ result[:suppress_diff] = true if commit.diffs.size > 200 && !params[:force_show_diff]
+ result[:commit] = commit
+ result[:note] = project.build_commit_note(commit)
+ result[:line_notes] = line_notes
+ result[:notes_count] = line_notes.count + project.commit_notes(commit).count
+ end
+
+ result
+ end
+end
diff --git a/app/contexts/merge_requests_load.rb b/app/contexts/merge_requests_load.rb
new file mode 100644
index 00000000000..6778db3bce5
--- /dev/null
+++ b/app/contexts/merge_requests_load.rb
@@ -0,0 +1,16 @@
+class MergeRequestsLoad < BaseContext
+ def execute
+ type = params[:f].to_i
+
+ merge_requests = project.merge_requests
+
+ merge_requests = case type
+ when 1 then merge_requests
+ when 2 then merge_requests.closed
+ when 3 then merge_requests.opened.assigned(current_user)
+ else merge_requests.opened
+ end.page(params[:page]).per(20)
+
+ merge_requests.includes(:author, :project).order("closed, created_at desc")
+ end
+end
diff --git a/app/contexts/notes_load.rb b/app/contexts/notes_load.rb
new file mode 100644
index 00000000000..d1f8da9ce12
--- /dev/null
+++ b/app/contexts/notes_load.rb
@@ -0,0 +1,30 @@
+class NotesLoad < BaseContext
+ def execute
+ target_type = params[:target_type]
+ target_id = params[:target_id]
+ first_id = params[:first_id]
+ last_id = params[:last_id]
+
+
+ @notes = case target_type
+ when "commit"
+ then project.commit_notes(project.commit(target_id)).fresh.limit(20)
+ when "snippet"
+ then project.snippets.find(target_id).notes
+ when "wall"
+ then project.common_notes.order("created_at DESC").fresh.limit(50)
+ when "issue"
+ then project.issues.find(target_id).notes.inc_author.order("created_at DESC").limit(20)
+ when "merge_request"
+ then project.merge_requests.find(target_id).notes.inc_author.order("created_at DESC").limit(20)
+ end
+
+ @notes = if last_id
+ @notes.where("id > ?", last_id)
+ elsif first_id
+ @notes.where("id < ?", first_id)
+ else
+ @notes
+ end
+ end
+end
diff --git a/app/controllers/commits_controller.rb b/app/controllers/commits_controller.rb
index 25e980e017b..cb1f74527a1 100644
--- a/app/controllers/commits_controller.rb
+++ b/app/controllers/commits_controller.rb
@@ -26,43 +26,31 @@ class CommitsController < ApplicationController
end
def show
- @commit = project.commit(params[:id])
-
- git_not_found! and return unless @commit
-
- @commit = CommitDecorator.decorate(@commit)
-
- @note = @project.build_commit_note(@commit)
- @comments_allowed = true
- @line_notes = project.commit_line_notes(@commit)
-
- @notes_count = @line_notes.count + project.commit_notes(@commit).count
-
- if @commit.diffs.size > 200 && !params[:force_show_diff]
- @suppress_diff = true
+ result = CommitLoad.new(project, current_user, params).execute
+
+ @commit = result[:commit]
+
+ if @commit
+ @suppress_diff = result[:suppress_diff]
+ @note = result[:note]
+ @line_notes = result[:line_notes]
+ @notes_count = result[:notes_count]
+ @comments_allowed = true
+ else
+ return git_not_found!
end
+
rescue Grit::Git::GitTimeout
render "huge_commit"
end
def compare
- first = project.commit(params[:to].try(:strip))
- last = project.commit(params[:from].try(:strip))
+ result = Commit.compare(project, params[:from], params[:to])
- @diffs = []
- @commits = []
+ @commits = result[:commits]
+ @commit = result[:commit]
+ @diffs = result[:diffs]
@line_notes = []
-
- if first && last
- commits = [first, last].sort_by(&:created_at)
- younger = commits.first
- older = commits.last
-
-
- @commits = project.repo.commits_between(younger.id, older.id).map {|c| Commit.new(c)}
- @diffs = project.repo.diff(younger.id, older.id) rescue []
- @commit = Commit.new(older)
- end
end
def patch
diff --git a/app/controllers/dashboard_controller.rb b/app/controllers/dashboard_controller.rb
index a054940738e..14f6ab1c31a 100644
--- a/app/controllers/dashboard_controller.rb
+++ b/app/controllers/dashboard_controller.rb
@@ -2,11 +2,8 @@ class DashboardController < ApplicationController
respond_to :html
def index
- @projects = current_user.projects.includes(:events).order("events.created_at DESC")
- @projects = @projects.page(params[:page]).per(40)
-
- @events = Event.where(:project_id => current_user.projects.map(&:id)).recent.limit(20)
-
+ @projects = current_user.projects_with_events.page(params[:page]).per(40)
+ @events = Event.recent_for_user(current_user).limit(20)
@last_push = current_user.recent_push
respond_to do |format|
diff --git a/app/controllers/merge_requests_controller.rb b/app/controllers/merge_requests_controller.rb
index ec4ed45fedf..1cb1d388465 100644
--- a/app/controllers/merge_requests_controller.rb
+++ b/app/controllers/merge_requests_controller.rb
@@ -24,16 +24,7 @@ class MergeRequestsController < ApplicationController
def index
- @merge_requests = @project.merge_requests
-
- @merge_requests = case params[:f].to_i
- when 1 then @merge_requests
- when 2 then @merge_requests.closed
- when 3 then @merge_requests.opened.assigned(current_user)
- else @merge_requests.opened
- end.page(params[:page]).per(20)
-
- @merge_requests = @merge_requests.includes(:author, :project).order("closed, created_at desc")
+ @merge_requests = MergeRequestsLoad.new(project, current_user, params).execute
end
def show
diff --git a/app/controllers/notes_controller.rb b/app/controllers/notes_controller.rb
index a2638d9597c..1c997e380a0 100644
--- a/app/controllers/notes_controller.rb
+++ b/app/controllers/notes_controller.rb
@@ -40,25 +40,6 @@ class NotesController < ApplicationController
protected
def notes
- @notes = case params[:target_type]
- when "commit"
- then project.commit_notes(project.commit((params[:target_id]))).fresh.limit(20)
- when "snippet"
- then project.snippets.find(params[:target_id]).notes
- when "wall"
- then project.common_notes.order("created_at DESC").fresh.limit(50)
- when "issue"
- then project.issues.find(params[:target_id]).notes.inc_author.order("created_at DESC").limit(20)
- when "merge_request"
- then project.merge_requests.find(params[:target_id]).notes.inc_author.order("created_at DESC").limit(20)
- end
-
- @notes = if params[:last_id]
- @notes.where("id > ?", params[:last_id])
- elsif params[:first_id]
- @notes.where("id < ?", params[:first_id])
- else
- @notes
- end
+ @notes = NotesLoad.new(project, current_user, params).execute
end
end
diff --git a/app/models/commit.rb b/app/models/commit.rb
index 800ad19b9f1..859bee29fa5 100644
--- a/app/models/commit.rb
+++ b/app/models/commit.rb
@@ -80,6 +80,29 @@ class Commit
def commits_between(repo, from, to)
repo.commits_between(from, to).map { |c| Commit.new(c) }
end
+
+ def compare(project, from, to)
+ first = project.commit(to.try(:strip))
+ last = project.commit(from.try(:strip))
+
+ result = {
+ :commits => [],
+ :diffs => [],
+ :commit => nil
+ }
+
+ if first && last
+ commits = [first, last].sort_by(&:created_at)
+ younger = commits.first
+ older = commits.last
+
+ result[:commits] = project.repo.commits_between(younger.id, older.id).map {|c| Commit.new(c)}
+ result[:diffs] = project.repo.diff(younger.id, older.id) rescue []
+ result[:commit] = Commit.new(older)
+ end
+
+ result
+ end
end
def persisted?
diff --git a/app/models/event.rb b/app/models/event.rb
index dc7dfa16dd5..c75924e7500 100644
--- a/app/models/event.rb
+++ b/app/models/event.rb
@@ -28,6 +28,10 @@ class Event < ActiveRecord::Base
end
end
+ def self.recent_for_user user
+ where(:project_id => user.projects.map(&:id)).recent
+ end
+
# Next events currently enabled for system
# - push
# - new issue
diff --git a/app/roles/account.rb b/app/roles/account.rb
index afa1f8a347d..e86dc5939e0 100644
--- a/app/roles/account.rb
+++ b/app/roles/account.rb
@@ -55,4 +55,8 @@ module Account
# Take only latest one
events = events.recent.limit(1).first
end
+
+ def projects_with_events
+ projects.includes(:events).order("events.created_at DESC")
+ end
end