summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>2012-10-03 02:03:32 -0700
committerDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>2012-10-03 02:03:32 -0700
commit4cbfe9427ba84a05a444373809a6b7aa7906db34 (patch)
tree3366e026075f8f783087b0668fb59cd2a5c36bd0
parentdc53a4f73229c879e6fc4ce6a37c57520bb5288d (diff)
parent5e3be9cda0e23e2c62a3e3b08791357ce572d998 (diff)
downloadgitlab-ce-4cbfe9427ba84a05a444373809a6b7aa7906db34.tar.gz
Merge pull request #1613 from tsigo/performance
Improve performance of Commits#show
-rw-r--r--app/decorators/commit_decorator.rb22
-rw-r--r--app/models/commit.rb2
-rw-r--r--app/views/commits/_head.html.haml4
-rw-r--r--spec/models/commit_spec.rb37
4 files changed, 53 insertions, 12 deletions
diff --git a/app/decorators/commit_decorator.rb b/app/decorators/commit_decorator.rb
index c85f740027e..777580a6d5e 100644
--- a/app/decorators/commit_decorator.rb
+++ b/app/decorators/commit_decorator.rb
@@ -16,13 +16,15 @@ class CommitDecorator < ApplicationDecorator
# In case this first line is longer than 80 characters, it is cut off
# after 70 characters and ellipses (`&hellp;`) are appended.
def title
- return no_commit_message if safe_message.blank?
+ title = safe_message
- title_end = safe_message.index(/\n/)
- if (!title_end && safe_message.length > 80) || (title_end && title_end > 80)
- safe_message[0..69] << "&hellip;".html_safe
+ return no_commit_message if title.blank?
+
+ title_end = title.index(/\n/)
+ if (!title_end && title.length > 80) || (title_end && title_end > 80)
+ title[0..69] << "&hellip;".html_safe
else
- safe_message.split(/\n/, 2).first
+ title.split(/\n/, 2).first
end
end
@@ -30,11 +32,13 @@ class CommitDecorator < ApplicationDecorator
#
# cut off, ellipses (`&hellp;`) are prepended to the commit message.
def description
- title_end = safe_message.index(/\n/)
- if (!title_end && safe_message.length > 80) || (title_end && title_end > 80)
- "&hellip;".html_safe << safe_message[70..-1]
+ description = safe_message
+
+ title_end = description.index(/\n/)
+ if (!title_end && description.length > 80) || (title_end && title_end > 80)
+ "&hellip;".html_safe << description[70..-1]
else
- safe_message.split(/\n/, 2)[1].try(:chomp)
+ description.split(/\n/, 2)[1].try(:chomp)
end
end
diff --git a/app/models/commit.rb b/app/models/commit.rb
index aba21762126..a070e830680 100644
--- a/app/models/commit.rb
+++ b/app/models/commit.rb
@@ -107,7 +107,7 @@ class Commit
end
def safe_message
- utf8 message
+ @safe_message ||= utf8 message
end
def created_at
diff --git a/app/views/commits/_head.html.haml b/app/views/commits/_head.html.haml
index 26ae32ed144..c001c2f70ce 100644
--- a/app/views/commits/_head.html.haml
+++ b/app/views/commits/_head.html.haml
@@ -9,12 +9,12 @@
= nav_link(html_options: {class: branches_tab_class}) do
= link_to project_repository_path(@project) do
Branches
- %span.badge= @project.repo.branch_count
+ %span.badge= @project.branches.length
= nav_link(controller: :repositories, action: :tags) do
= link_to tags_project_repository_path(@project) do
Tags
- %span.badge= @project.repo.tag_count
+ %span.badge= @project.tags.length
- if current_controller?(:commits) && current_user.private_token
%li.right
diff --git a/spec/models/commit_spec.rb b/spec/models/commit_spec.rb
new file mode 100644
index 00000000000..e4bc1936839
--- /dev/null
+++ b/spec/models/commit_spec.rb
@@ -0,0 +1,37 @@
+require 'spec_helper'
+
+describe Commit do
+ let(:commit) { create(:project).commit }
+
+ describe CommitDecorator do
+ let(:decorator) { CommitDecorator.new(commit) }
+
+ describe '#title' do
+ it "returns no_commit_message when safe_message is blank" do
+ decorator.stub(:safe_message).and_return('')
+ decorator.title.should == "--no commit message"
+ end
+
+ it "truncates a message without a newline at 70 characters" do
+ message = commit.safe_message * 10
+
+ decorator.stub(:safe_message).and_return(message)
+ decorator.title.should == "#{message[0..69]}&hellip;"
+ end
+
+ it "truncates a message with a newline before 80 characters at the newline" do
+ message = commit.safe_message.split(" ").first
+
+ decorator.stub(:safe_message).and_return(message + "\n" + message)
+ decorator.title.should == message
+ end
+
+ it "truncates a message with a newline after 80 characters at 70 characters" do
+ message = (commit.safe_message * 10) + "\n"
+
+ decorator.stub(:safe_message).and_return(message)
+ decorator.title.should == "#{message[0..69]}&hellip;"
+ end
+ end
+ end
+end