diff --git a/app/contexts/base_context.rb b/app/contexts/base_context.rb new file mode 100644 index 00000000..6eb8ee46 --- /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 00000000..bab30d61 --- /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 00000000..6778db3b --- /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 00000000..d1f8da9c --- /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 25e980e0..cb1f7452 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]) + result = CommitLoad.new(project, current_user, params).execute - git_not_found! and return unless @commit + @commit = result[: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 + 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 a0549407..14f6ab1c 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 ec4ed45f..1cb1d388 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 a2638d95..1c997e38 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 800ad19b..859bee29 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 dc7dfa16..c75924e7 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 afa1f8a3..e86dc593 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