Move blame group logic to dedicated class
This commit is contained in:
parent
4be80f8aa3
commit
b636f83e59
5 changed files with 81 additions and 43 deletions
|
@ -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
|
||||
|
|
|
@ -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
54
lib/gitlab/blame.rb
Normal 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
|
|
@ -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
|
||||
|
|
24
spec/lib/gitlab/blame_spec.rb
Normal file
24
spec/lib/gitlab/blame_spec.rb
Normal 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
|
Loading…
Reference in a new issue