Move blame group logic to dedicated class

This commit is contained in:
Douwe Maan 2016-01-28 14:49:21 +01:00
parent 4be80f8aa3
commit b636f83e59
5 changed files with 81 additions and 43 deletions

View file

@ -8,32 +8,6 @@ class Projects::BlameController < Projects::ApplicationController
def show
@blob = @repository.blob_at(@commit.id, @path)
@blame = group_blame_lines
end
def group_blame_lines
blame = Gitlab::Git::Blame.new(@repository, @commit.id, @path)
prev_sha = nil
groups = []
current_group = nil
highlighted_lines = Gitlab::Highlight.highlight(@blob.name, @blob.data).lines
i = 0
blame.each do |commit, line|
line = highlighted_lines[i].html_safe
if prev_sha && prev_sha == commit.sha
current_group[:lines] << line
else
groups << current_group if current_group.present?
current_group = { commit: commit, lines: [line] }
end
prev_sha = commit.sha
i += 1
end
groups << current_group if current_group.present?
groups
@blame_groups = Gitlab::Blame.new(@blob, @commit).groups
end
end

View file

@ -15,11 +15,11 @@
.file-content.blame.code.js-syntax-highlight
%table
- current_line = 1
- @blame.each do |blame_group|
- @blame_groups.each do |blame_group|
%tr
%td.blame-commit
.commit
- commit = Commit.new(blame_group[:commit], @project)
- commit = blame_group[:commit]
.commit-row-title
%strong
= link_to_gfm truncate(commit.title, length: 35), namespace_project_commit_path(@project.namespace, @project, commit.id), class: "cdark"

54
lib/gitlab/blame.rb Normal file
View file

@ -0,0 +1,54 @@
module Gitlab
class Blame
attr_accessor :blob, :commit
def initialize(blob, commit)
@blob = blob
@commit = commit
end
def groups(highlight: true)
prev_sha = nil
groups = []
current_group = nil
i = 0
blame.each do |commit, line|
commit = Commit.new(commit, project)
sha = commit.sha
if prev_sha != sha
groups << current_group if current_group
current_group = { commit: commit, lines: [] }
end
line = highlighted_lines[i].html_safe if highlight
current_group[:lines] << line
prev_sha = sha
i += 1
end
groups << current_group if current_group
groups
end
private
def blame
@blame ||= Gitlab::Git::Blame.new(repository, @commit.id, @blob.path)
end
def highlighted_lines
@highlighted_lines ||= Gitlab::Highlight.highlight(@blob.name, @blob.data).lines
end
def project
commit.project
end
def repository
project.repository
end
end
end

View file

@ -24,20 +24,6 @@ describe Projects::BlameController do
context "valid file" do
let(:id) { 'master/files/ruby/popen.rb' }
it { is_expected.to respond_with(:success) }
it 'groups blames properly' do
blame = assigns(:blame)
# Sanity check a few items
expect(blame.count).to eq(18)
expect(blame[0][:commit].sha).to eq('913c66a37b4a45b9769037c55c2d238bd0942d2e')
expect(blame[0][:lines]).to eq(["require 'fileutils'", "require 'open3'", ""])
expect(blame[1][:commit].sha).to eq('874797c3a73b60d2187ed6e2fcabd289ff75171e')
expect(blame[1][:lines]).to eq(["module Popen", " extend self"])
expect(blame[-1][:commit].sha).to eq('913c66a37b4a45b9769037c55c2d238bd0942d2e')
expect(blame[-1][:lines]).to eq([" end", "end"])
end
end
end
end

View file

@ -0,0 +1,24 @@
require 'spec_helper'
describe Gitlab::Blame, lib: true do
let(:project) { create(:project) }
let(:path) { 'files/ruby/popen.rb' }
let(:commit) { project.commit('master') }
let(:blob) { project.repository.blob_at(commit.id, path) }
describe "#groups" do
let(:subject) { described_class.new(blob, commit).groups(highlight: false) }
it 'groups lines properly' do
expect(subject.count).to eq(18)
expect(subject[0][:commit].sha).to eq('913c66a37b4a45b9769037c55c2d238bd0942d2e')
expect(subject[0][:lines]).to eq(["require 'fileutils'", "require 'open3'", ""])
expect(subject[1][:commit].sha).to eq('874797c3a73b60d2187ed6e2fcabd289ff75171e')
expect(subject[1][:lines]).to eq(["module Popen", " extend self"])
expect(subject[-1][:commit].sha).to eq('913c66a37b4a45b9769037c55c2d238bd0942d2e')
expect(subject[-1][:lines]).to eq([" end", "end"])
end
end
end