Refactor Parallel Diff feature and add scrollbars
Also now removed lines relating to unused comments feature
This commit is contained in:
parent
ad7cd8fb35
commit
83f811fff5
4 changed files with 147 additions and 71 deletions
|
@ -62,6 +62,29 @@
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.text-file-parallel div {
|
||||||
|
display: inline-block;
|
||||||
|
padding-bottom: 16px;
|
||||||
|
}
|
||||||
|
.diff-side {
|
||||||
|
overflow-x: scroll;
|
||||||
|
width: 508px;
|
||||||
|
height: 700px;
|
||||||
|
}
|
||||||
|
.diff-side.diff-side-left{
|
||||||
|
overflow-y:hidden;
|
||||||
|
}
|
||||||
|
.diff-side table, td.diff-middle table {
|
||||||
|
height: 700px;
|
||||||
|
}
|
||||||
|
.diff-middle {
|
||||||
|
width: 114px;
|
||||||
|
vertical-align: top;
|
||||||
|
height: 700px;
|
||||||
|
overflow: hidden
|
||||||
|
}
|
||||||
|
|
||||||
.old_line, .new_line, .diff_line {
|
.old_line, .new_line, .diff_line {
|
||||||
margin: 0px;
|
margin: 0px;
|
||||||
padding: 0px;
|
padding: 0px;
|
||||||
|
@ -125,8 +148,6 @@
|
||||||
}
|
}
|
||||||
&.parallel {
|
&.parallel {
|
||||||
display: table-cell;
|
display: table-cell;
|
||||||
overflow: hidden;
|
|
||||||
width: 50%;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -105,8 +105,80 @@ module CommitsHelper
|
||||||
branches.sort.map { |branch| link_to(branch, project_tree_path(project, branch)) }.join(", ").html_safe
|
branches.sort.map { |branch| link_to(branch, project_tree_path(project, branch)) }.join(", ").html_safe
|
||||||
end
|
end
|
||||||
|
|
||||||
def get_old_file(project, commit, diff)
|
def parallel_diff_lines(project, commit, diff, file)
|
||||||
project.repository.blob_at(commit.parent_id, diff.old_path) if commit.parent_id
|
old_file = project.repository.blob_at(commit.parent_id, diff.old_path) if commit.parent_id
|
||||||
|
deleted_lines = {}
|
||||||
|
added_lines = {}
|
||||||
|
each_diff_line(diff, 0) do |line, type, line_code, line_new, line_old|
|
||||||
|
if type == "old"
|
||||||
|
deleted_lines[line_old] = { line_code: line_code, type: type, line: line }
|
||||||
|
elsif type == "new"
|
||||||
|
added_lines[line_new] = { line_code: line_code, type: type, line: line }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
max_length = old_file ? old_file.sloc + added_lines.length : file.sloc
|
||||||
|
|
||||||
|
offset1 = 0
|
||||||
|
offset2 = 0
|
||||||
|
old_lines = []
|
||||||
|
new_lines = []
|
||||||
|
|
||||||
|
max_length.times do |line_index|
|
||||||
|
line_index1 = line_index - offset1
|
||||||
|
line_index2 = line_index - offset2
|
||||||
|
deleted_line = deleted_lines[line_index1 + 1]
|
||||||
|
added_line = added_lines[line_index2 + 1]
|
||||||
|
old_line = old_file.lines[line_index1] if old_file
|
||||||
|
new_line = file.lines[line_index2]
|
||||||
|
|
||||||
|
if deleted_line && added_line
|
||||||
|
elsif deleted_line
|
||||||
|
new_line = nil
|
||||||
|
offset2 += 1
|
||||||
|
elsif added_line
|
||||||
|
old_line = nil
|
||||||
|
offset1 += 1
|
||||||
|
end
|
||||||
|
|
||||||
|
old_lines[line_index] = DiffLine.new
|
||||||
|
new_lines[line_index] = DiffLine.new
|
||||||
|
|
||||||
|
# old
|
||||||
|
if line_index == 0 && diff.new_file
|
||||||
|
old_lines[line_index].type = :file_created
|
||||||
|
old_lines[line_index].content = 'File was created'
|
||||||
|
elsif deleted_line
|
||||||
|
old_lines[line_index].type = :deleted
|
||||||
|
old_lines[line_index].content = old_line
|
||||||
|
old_lines[line_index].num = line_index1 + 1
|
||||||
|
old_lines[line_index].code = deleted_line[:line_code]
|
||||||
|
elsif old_line
|
||||||
|
old_lines[line_index].type = :no_change
|
||||||
|
old_lines[line_index].content = old_line
|
||||||
|
old_lines[line_index].num = line_index1 + 1
|
||||||
|
else
|
||||||
|
old_lines[line_index].type = :added
|
||||||
|
end
|
||||||
|
|
||||||
|
# new
|
||||||
|
if line_index == 0 && diff.deleted_file
|
||||||
|
new_lines[line_index].type = :file_deleted
|
||||||
|
new_lines[line_index].content = "File was deleted"
|
||||||
|
elsif added_line
|
||||||
|
new_lines[line_index].type = :added
|
||||||
|
new_lines[line_index].num = line_index2 + 1
|
||||||
|
new_lines[line_index].content = new_line
|
||||||
|
new_lines[line_index].code = added_line[:line_code]
|
||||||
|
elsif new_line
|
||||||
|
new_lines[line_index].type = :no_change
|
||||||
|
new_lines[line_index].num = line_index2 + 1
|
||||||
|
new_lines[line_index].content = new_line
|
||||||
|
else
|
||||||
|
new_lines[line_index].type = :deleted
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return old_lines, new_lines
|
||||||
end
|
end
|
||||||
|
|
||||||
protected
|
protected
|
||||||
|
|
3
app/models/diff_line.rb
Normal file
3
app/models/diff_line.rb
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
class DiffLine
|
||||||
|
attr_accessor :type, :content, :num, :code
|
||||||
|
end
|
|
@ -1,75 +1,55 @@
|
||||||
/ Side-by-side diff view
|
/ Side-by-side diff view
|
||||||
- old_file = get_old_file(project, @commit, diff)
|
- old_lines, new_lines = parallel_diff_lines(project, @commit, diff, file)
|
||||||
- deleted_lines = {}
|
- num_lines = old_lines.length
|
||||||
- added_lines = {}
|
|
||||||
- each_diff_line(diff, index) do |line, type, line_code, line_new, line_old, raw_line|
|
|
||||||
- if type == "old"
|
|
||||||
- deleted_lines[line_old] = { line_code: line_code, type: type, line: line }
|
|
||||||
- elsif type == "new"
|
|
||||||
- added_lines[line_new] = { line_code: line_code, type: type, line: line }
|
|
||||||
|
|
||||||
- max_length = old_file.sloc + added_lines.length if old_file
|
|
||||||
- max_length ||= file.sloc
|
|
||||||
- offset1 = 0
|
|
||||||
- offset2 = 0
|
|
||||||
|
|
||||||
%div.text-file-parallel
|
%div.text-file-parallel
|
||||||
%table{ style: "table-layout: fixed;" }
|
%div.diff-side.diff-side-left
|
||||||
- max_length.times do |line_index|
|
%table
|
||||||
- line_index1 = line_index - offset1
|
- old_lines.each do |line|
|
||||||
- line_index2 = line_index - offset2
|
|
||||||
- deleted_line = deleted_lines[line_index1 + 1]
|
|
||||||
- added_line = added_lines[line_index2 + 1]
|
|
||||||
- old_line = old_file.lines[line_index1] if old_file
|
|
||||||
- new_line = file.lines[line_index2]
|
|
||||||
|
|
||||||
- if deleted_line && added_line
|
%tr.line_holder.parallel
|
||||||
- elsif deleted_line
|
- if line.type == :file_created
|
||||||
- new_line = nil
|
%td.line_content.parallel= "File was created"
|
||||||
- offset2 += 1
|
- elsif line.type == :deleted
|
||||||
- elsif added_line
|
%td.line_content{class: "parallel noteable_line old #{line.code}", "line_code" => line.code }= line.content
|
||||||
- old_line = nil
|
- else line.type == :no_change
|
||||||
- offset1 += 1
|
%td.line_content.parallel= line.content
|
||||||
|
|
||||||
%tr.line_holder.parallel
|
%div.diff-middle
|
||||||
- if line_index == 0 && diff.new_file
|
%table
|
||||||
%td.line_content.parallel= "File was created"
|
- num_lines.times do |index|
|
||||||
%td.old_line= ""
|
%tr
|
||||||
- elsif deleted_line
|
- if old_lines[index].type == :deleted
|
||||||
%td.line_content{class: "parallel noteable_line old #{deleted_line[:line_code]}", "line_code" => deleted_line[:line_code] }= old_line
|
%td.old_line.old= old_lines[index].num
|
||||||
%td.old_line.old
|
- else
|
||||||
= line_index1 + 1
|
%td.old_line= old_lines[index].num
|
||||||
- if @comments_allowed
|
|
||||||
=# render "projects/notes/diff_note_link", line_code: deleted_line[:line_code]
|
|
||||||
- elsif old_line
|
|
||||||
%td.line_content.parallel= old_line
|
|
||||||
%td.old_line= line_index1 + 1
|
|
||||||
- else
|
|
||||||
%td.line_content.parallel= ""
|
|
||||||
%td.old_line= ""
|
|
||||||
|
|
||||||
%td.diff_line= ""
|
%td.diff_line=""
|
||||||
|
|
||||||
- if diff.deleted_file && line_index == 0
|
- if new_lines[index].type == :added
|
||||||
%td.new_line= ""
|
%td.new_line.new= new_lines[index].num
|
||||||
%td.line_content.parallel= "File was deleted"
|
- else
|
||||||
- elsif added_line
|
%td.new_line= new_lines[index].num
|
||||||
%td.new_line.new
|
|
||||||
= line_index2 + 1
|
|
||||||
- if @comments_allowed
|
|
||||||
=# render "projects/notes/diff_note_link", line_code: added_line[:line_code]
|
|
||||||
%td.line_content{class: "parallel noteable_line new #{added_line[:line_code]}", "line_code" => added_line[:line_code] }= new_line
|
|
||||||
- elsif new_line
|
|
||||||
%td.new_line= line_index2 + 1
|
|
||||||
%td.line_content.parallel= new_line
|
|
||||||
- else
|
|
||||||
%td.new_line= ""
|
|
||||||
%td.line_content.parallel= ""
|
|
||||||
|
|
||||||
- if @reply_allowed
|
%div.diff-side.diff-side-right
|
||||||
- comments1 = []
|
%table
|
||||||
- comments2 = []
|
- new_lines.each do |line|
|
||||||
- comments1 = @line_notes.select { |n| n.line_code == deleted_line[:line_code] }.sort_by(&:created_at) if deleted_line
|
|
||||||
- comments2 = @line_notes.select { |n| n.line_code == added_line[:line_code] }.sort_by(&:created_at) if added_line
|
%tr.line_holder.parallel
|
||||||
- unless comments1.empty? && comments2.empty?
|
- if line.type == :file_deleted
|
||||||
= render "projects/notes/diff_notes_with_reply_parallel", notes1: comments1, notes2: comments2, line1: deleted_line, line2: added_line
|
%td.line_content.parallel= "File was deleted"
|
||||||
|
- elsif line.type == :added
|
||||||
|
%td.line_content{class: "parallel noteable_line new #{line.code}", "line_code" => line.code }= line.content
|
||||||
|
- else line.type == :no_change
|
||||||
|
%td.line_content.parallel= line.content
|
||||||
|
|
||||||
|
:javascript
|
||||||
|
$('.diff-side-right').on('scroll', function(){
|
||||||
|
$('.diff-side-left, .diff-middle').scrollTop($(this).scrollTop());
|
||||||
|
$('.diff-side-left').scrollLeft($(this).scrollLeft());
|
||||||
|
});
|
||||||
|
|
||||||
|
$('.diff-side-left').on('scroll', function(){
|
||||||
|
$('.diff-side-right, .diff-middle').scrollTop($(this).scrollTop()); // might never be relevant
|
||||||
|
$('.diff-side-right').scrollLeft($(this).scrollLeft());
|
||||||
|
});
|
||||||
|
|
Loading…
Reference in a new issue