Commit d9833890 authored by Nick Thomas's avatar Nick Thomas

Bulk-render commit titles in the tree view to improve performance

parent 228d819b
...@@ -59,13 +59,18 @@ class Projects::RefsController < Projects::ApplicationController ...@@ -59,13 +59,18 @@ class Projects::RefsController < Projects::ApplicationController
commit_path = project_commit_path(@project, last_commit) if last_commit commit_path = project_commit_path(@project, last_commit) if last_commit
{ {
file_name: content.name, file_name: content.name,
commit: last_commit, # TODO: deduplicate commits so we don't render the same one multiple times
commit: (Commit.new(last_commit, project) if last_commit),
type: content.type, type: content.type,
commit_path: commit_path commit_path: commit_path
} }
end end
end end
# The commit titles must be passed through Banzai before being shown.
# Doing this here in bulk allows significant database work to be skipped.
prerender_commits!(@logs.map { |log| log[:commit] })
offset = (@offset + @limit) offset = (@offset + @limit)
if contents.size > offset if contents.size > offset
@more_log_url = logs_file_project_ref_path(@project, @ref, @path || '', offset: offset) @more_log_url = logs_file_project_ref_path(@project, @ref, @path || '', offset: offset)
...@@ -84,6 +89,11 @@ class Projects::RefsController < Projects::ApplicationController ...@@ -84,6 +89,11 @@ class Projects::RefsController < Projects::ApplicationController
private private
def prerender_commits!(commits)
renderer = Banzai::ObjectRenderer.new(user: current_user, default_project: @project)
renderer.render(commits, :full_title) # modifies the commit objects inplace
end
def validate_ref_id def validate_ref_id
return not_found! if params[:id].present? && params[:id] !~ Gitlab::PathRegex.git_reference_regex return not_found! if params[:id].present? && params[:id] !~ Gitlab::PathRegex.git_reference_regex
end end
......
...@@ -22,6 +22,7 @@ class Commit ...@@ -22,6 +22,7 @@ class Commit
attr_accessor :project, :author attr_accessor :project, :author
attr_accessor :redacted_description_html attr_accessor :redacted_description_html
attr_accessor :redacted_title_html attr_accessor :redacted_title_html
attr_accessor :redacted_full_title_html
attr_reader :gpg_commit attr_reader :gpg_commit
DIFF_SAFE_LINES = Gitlab::Git::DiffCollection::DEFAULT_LIMITS[:max_lines] DIFF_SAFE_LINES = Gitlab::Git::DiffCollection::DEFAULT_LIMITS[:max_lines]
...@@ -38,7 +39,12 @@ class Commit ...@@ -38,7 +39,12 @@ class Commit
def banzai_render_context(field) def banzai_render_context(field)
pipeline = field == :description ? :commit_description : :single_line pipeline = field == :description ? :commit_description : :single_line
context = { pipeline: pipeline, project: self.project } context = { pipeline: pipeline, project: self.project }
context[:author] = self.author if self.author
# The author is only needed when rendering the description
if field == :description
author = self.author
context[:author] = author if author
end
context context
end end
......
%span.str-truncated %span.str-truncated
= link_to_markdown commit.full_title, project_commit_path(@project, commit.id), class: "tree-commit-link" = link_to_html commit.redacted_full_title_html, project_commit_path(@project, commit.id), class: 'tree-commit-link'
...@@ -4,16 +4,30 @@ describe 'Projects tree', :js do ...@@ -4,16 +4,30 @@ describe 'Projects tree', :js do
let(:user) { create(:user) } let(:user) { create(:user) }
let(:project) { create(:project, :repository) } let(:project) { create(:project, :repository) }
# This commit has a known state on the master branch of gitlab-test
let(:test_sha) { '7975be0116940bf2ad4321f79d02a55c5f7779aa' }
before do before do
project.add_maintainer(user) project.add_maintainer(user)
sign_in(user) sign_in(user)
end end
it 'renders tree table without errors' do it 'renders tree table without errors' do
visit project_tree_path(project, 'master') visit project_tree_path(project, test_sha)
wait_for_requests
expect(page).to have_selector('.tree-item')
expect(page).to have_content('add tests for .gitattributes custom highlighting')
expect(page).not_to have_selector('.flash-alert')
expect(page).not_to have_selector('.label-lfs', text: 'LFS')
end
it 'renders tree table for a subtree without errors' do
visit project_tree_path(project, File.join(test_sha, 'files'))
wait_for_requests wait_for_requests
expect(page).to have_selector('.tree-item') expect(page).to have_selector('.tree-item')
expect(page).to have_content('add spaces in whitespace file')
expect(page).not_to have_selector('.label-lfs', text: 'LFS') expect(page).not_to have_selector('.label-lfs', text: 'LFS')
expect(page).not_to have_selector('.flash-alert') expect(page).not_to have_selector('.flash-alert')
end end
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment