Skip to content
Snippets Groups Projects
Commit a9fa45f0 authored by Douwe Maan's avatar Douwe Maan
Browse files

Represent DiffRefs as proper class instead of tuple array

parent 6ce25e7b
No related branches found
No related tags found
No related merge requests found
Showing
with 111 additions and 57 deletions
Loading
Loading
@@ -57,7 +57,7 @@ class Projects::BlobController < Projects::ApplicationController
diffy = Diffy::Diff.new(@blob.data, @content, diff: '-U 3', include_diff_info: true)
diff_lines = diffy.diff.scan(/.*\n/)[2..-1]
diff_lines = Gitlab::Diff::Parser.new.parse(diff_lines)
@diff_lines = Gitlab::Diff::Highlight.new(diff_lines).highlight
@diff_lines = Gitlab::Diff::Highlight.new(diff_lines, repository: @repository).highlight
 
render layout: false
end
Loading
Loading
Loading
Loading
@@ -121,7 +121,6 @@ class Projects::CommitController < Projects::ApplicationController
opts[:ignore_whitespace_change] = true if params[:format] == 'diff'
 
@diffs = commit.diffs(opts)
@diff_refs = [commit.parent || commit, commit]
@notes_count = commit.notes.count
 
@statuses = CommitStatus.where(pipeline: pipelines)
Loading
Loading
Loading
Loading
@@ -14,14 +14,22 @@ class Projects::CompareController < Projects::ApplicationController
 
def show
compare = CompareService.new.
execute(@project, @head_ref, @project, @base_ref, diff_options)
execute(@project, @head_ref, @project, @start_ref, diff_options)
 
if compare
@commits = Commit.decorate(compare.commits, @project)
@start_commit = @project.commit(@start_ref)
@commit = @project.commit(@head_ref)
@base_commit = @project.merge_base_commit(@base_ref, @head_ref)
@base_commit = @project.merge_base_commit(@start_ref, @head_ref)
@diffs = compare.diffs(diff_options)
@diff_refs = [@base_commit, @commit]
@diff_refs = Gitlab::Diff::DiffRefs.new(
base_sha: @base_commit.try(:sha),
start_sha: @start_commit.try(:sha),
head_sha: @commit.try(:sha)
)
@diff_notes_disabled = true
@grouped_diff_notes = {}
end
Loading
Loading
@@ -35,12 +43,12 @@ class Projects::CompareController < Projects::ApplicationController
private
 
def assign_ref_vars
@base_ref = Addressable::URI.unescape(params[:from])
@start_ref = Addressable::URI.unescape(params[:from])
@ref = @head_ref = Addressable::URI.unescape(params[:to])
end
 
def merge_request
@merge_request ||= @project.merge_requests.opened.
find_by(source_project: @project, source_branch: @head_ref, target_branch: @base_ref)
find_by(source_project: @project, source_branch: @head_ref, target_branch: @start_ref)
end
end
Loading
Loading
@@ -30,8 +30,8 @@ module DiffHelper
options
end
 
def safe_diff_files(diffs, diff_refs)
diffs.decorate! { |diff| Gitlab::Diff::File.new(diff, diff_refs) }
def safe_diff_files(diffs, diff_refs: nil, repository: nil)
diffs.decorate! { |diff| Gitlab::Diff::File.new(diff, diff_refs: diff_refs, repository: repository) }
end
 
def generate_line_code(file_path, line)
Loading
Loading
Loading
Loading
@@ -214,6 +214,13 @@ class Commit
@raw.short_id(7)
end
 
def diff_refs
Gitlab::Diff::DiffRefs.new(
base_sha: self.parent_id || self.sha,
head_sha: self.sha
)
end
def pipelines
@pipeline ||= project.pipelines.where(sha: sha)
end
Loading
Loading
Loading
Loading
@@ -249,6 +249,16 @@ class MergeRequest < ActiveRecord::Base
source_branch_head.try(:sha)
end
 
def diff_refs
return nil unless diff_start_commit || diff_base_commit
Gitlab::Diff::DiffRefs.new(
base_sha: diff_base_sha,
start_sha: diff_start_sha,
head_sha: diff_head_sha
)
end
def validate_branches
if target_project == source_project && target_branch == source_branch
errors.add :branch_conflict, "You can not use same project/branch for source and target"
Loading
Loading
@@ -622,12 +632,6 @@ class MergeRequest < ActiveRecord::Base
end
 
def pipeline
end
def diff_refs
return nil unless diff_base_commit
[diff_base_commit, last_commit]
@pipeline ||= source_project.pipeline(diff_head_sha, source_branch) if diff_head_sha && source_project
end
 
Loading
Loading
Loading
Loading
@@ -7,8 +7,7 @@
= render "ci_menu"
- else
%div.block-connector
= render "projects/diffs/diffs", diffs: @diffs, project: @project,
diff_refs: @diff_refs
= render "projects/diffs/diffs", diffs: @diffs, project: @project, diff_refs: @commit.diff_refs
= render "projects/notes/notes_with_form"
- if can_collaborate_with_project?
- %w(revert cherry-pick).each do |type|
Loading
Loading
Loading
Loading
@@ -2,7 +2,7 @@
- if diff_view == 'parallel'
- fluid_layout true
 
- diff_files = safe_diff_files(diffs, diff_refs)
- diff_files = safe_diff_files(diffs, diff_refs: diff_refs, repository: project.repository)
 
.content-block.oneline-block.files-changed
.inline-parallel-buttons
Loading
Loading
- diff = diff_file.diff
- file_raw_path = namespace_project_raw_path(@project.namespace, @project, tree_join(@commit.id, diff.new_path))
- file_raw_path = namespace_project_raw_path(@project.namespace, @project, tree_join(diff_file.new_ref, diff.new_path))
// diff_refs will be nil for orphaned commits (e.g. first commit in repo)
- if diff_refs
- old_commit_id = diff_refs.first.id
- old_file_raw_path = namespace_project_raw_path(@project.namespace, @project, tree_join(old_commit_id, diff.old_path))
- if diff_file.old_ref
- old_file_raw_path = namespace_project_raw_path(@project.namespace, @project, tree_join(diff_file.old_ref, diff.old_path))
 
- if diff.renamed_file || diff.new_file || diff.deleted_file
.image
Loading
Loading
@@ -16,7 +15,7 @@
%div.two-up.view
%span.wrap
.frame.deleted
%a{href: namespace_project_blob_path(@project.namespace, @project, tree_join(old_commit_id, diff.old_path))}
%a{href: namespace_project_blob_path(@project.namespace, @project, tree_join(diff_file.old_ref, diff.old_path))}
%img{src: old_file_raw_path}
%p.image-info.hide
%span.meta-filesize= "#{number_to_human_size old_file.size}"
Loading
Loading
@@ -28,7 +27,7 @@
%span.meta-height
%span.wrap
.frame.added
%a{href: namespace_project_blob_path(@project.namespace, @project, tree_join(@commit.id, diff.new_path))}
%a{href: namespace_project_blob_path(@project.namespace, @project, tree_join(diff_file.new_ref, diff.new_path))}
%img{src: file_raw_path}
%p.image-info.hide
%span.meta-filesize= "#{number_to_human_size file.size}"
Loading
Loading
Loading
Loading
@@ -28,18 +28,30 @@ class EmailsOnPushWorker
:push
end
 
merge_base_sha = project.merge_base_commit(before_sha, after_sha).try(:sha)
diff_refs = nil
compare = nil
reverse_compare = false
if action == :push
compare = Gitlab::Git::Compare.new(project.repository.raw_repository, before_sha, after_sha)
diff_refs = [project.merge_base_commit(before_sha, after_sha), project.commit(after_sha)]
diff_refs = Gitlab::Diff::DiffRefs.new(
base_sha: merge_base_sha,
start_sha: before_sha,
head_sha: after_sha
)
 
return false if compare.same
 
if compare.commits.empty?
compare = Gitlab::Git::Compare.new(project.repository.raw_repository, after_sha, before_sha)
diff_refs = [project.merge_base_commit(after_sha, before_sha), project.commit(before_sha)]
diff_refs = Gitlab::Diff::DiffRefs.new(
base_sha: merge_base_sha,
start_sha: after_sha,
head_sha: before_sha
)
 
reverse_compare = true
 
Loading
Loading
module Gitlab
module Diff
class DiffRefs
attr_reader :base_sha
attr_reader :start_sha
attr_reader :head_sha
def initialize(base_sha:, start_sha: base_sha, head_sha:)
@base_sha = base_sha
@start_sha = start_sha
@head_sha = head_sha
end
def ==(other)
other.is_a?(self.class) &&
base_sha == other.base_sha &&
start_sha == other.start_sha &&
head_sha == other.head_sha
end
def complete?
start_sha && head_sha
end
end
end
end
module Gitlab
module Diff
class File
attr_reader :diff, :diff_refs
attr_reader :diff, :repository, :diff_refs
 
delegate :new_file, :deleted_file, :renamed_file,
:old_path, :new_path, to: :diff, prefix: false
 
def initialize(diff, diff_refs)
def initialize(diff, repository:, diff_refs: nil)
@diff = diff
@repository = repository
@diff_refs = diff_refs
end
 
def old_ref
diff_refs[0] if diff_refs
diff_refs.try(:base_sha)
end
 
def new_ref
diff_refs[1] if diff_refs
diff_refs.try(:head_sha)
end
 
# Array of Gitlab::DIff::Line objects
# Array of Gitlab::Diff::Line objects
def diff_lines
@lines ||= parser.parse(raw_diff.each_line).to_a
end
def too_large?
diff.too_large?
@lines ||= Gitlab::Diff::Parser.new.parse(raw_diff.each_line).to_a
end
 
def highlighted_diff_lines
Gitlab::Diff::Highlight.new(self).highlight
@highlighted_diff_lines ||= Gitlab::Diff::Highlight.new(self, repository: self.repository).highlight
end
 
def parallel_diff_lines
Gitlab::Diff::ParallelDiff.new(self).parallelize
@parallel_diff_lines ||= Gitlab::Diff::ParallelDiff.new(self).parallelize
end
 
def mode_changed?
Loading
Loading
module Gitlab
module Diff
class Highlight
attr_reader :diff_file, :diff_lines, :raw_lines
attr_reader :diff_file, :diff_lines, :raw_lines, :repository
 
delegate :old_path, :new_path, :old_ref, :new_ref, to: :diff_file, prefix: :diff
 
def initialize(diff_lines)
def initialize(diff_lines, repository: nil)
@repository = repository
if diff_lines.is_a?(Gitlab::Diff::File)
@diff_file = diff_lines
@diff_lines = @diff_file.diff_lines
Loading
Loading
@@ -19,7 +21,7 @@ module Gitlab
@diff_lines.map.with_index do |diff_line, i|
diff_line = diff_line.dup
# ignore highlighting for "match" lines
next diff_line if diff_line.type == 'match' || diff_line.type == 'nonewline'
next diff_line if diff_line.meta?
 
rich_line = highlight_line(diff_line) || diff_line.text
 
Loading
Loading
@@ -70,7 +72,7 @@ module Gitlab
ref = send("diff_#{version}_ref")
path = send("diff_#{version}_path")
 
[ref.project.repository, ref.id, path]
[self.repository, ref, path]
end
end
end
Loading
Loading
Loading
Loading
@@ -33,11 +33,15 @@ module Gitlab
end
 
def commits
@commits ||= (Commit.decorate(compare.commits, project) if compare)
return unless compare
@commits ||= Commit.decorate(compare.commits, project)
end
 
def diffs
@diffs ||= (safe_diff_files(compare.diffs(max_files: 30), diff_refs) if compare)
return unless compare
@diffs ||= safe_diff_files(compare.diffs(max_files: 30), diff_refs: diff_refs, repository: project.repository)
end
 
def diffs_count
Loading
Loading
Loading
Loading
@@ -38,12 +38,10 @@ module Gitlab
end
 
def send_git_diff(repository, diff_refs)
from, to = diff_refs
params = {
'RepoPath' => repository.path_to_repo,
'ShaFrom' => from.sha,
'ShaTo' => to.sha
'ShaFrom' => diff_refs.start_sha,
'ShaTo' => diff_refs.head_sha
}
 
[
Loading
Loading
Loading
Loading
@@ -9,7 +9,7 @@ describe DiffHelper do
let(:diffs) { commit.diffs }
let(:diff) { diffs.first }
let(:diff_refs) { [commit.parent, commit] }
let(:diff_file) { Gitlab::Diff::File.new(diff, diff_refs) }
let(:diff_file) { Gitlab::Diff::File.new(diff, diff_refs: diff_refs, repository: repository) }
 
describe 'diff_view' do
it 'returns a valid value when cookie is set' do
Loading
Loading
Loading
Loading
@@ -6,7 +6,7 @@ describe Gitlab::Diff::File, lib: true do
let(:project) { create(:project) }
let(:commit) { project.commit(sample_commit.id) }
let(:diff) { commit.diffs.first }
let(:diff_file) { Gitlab::Diff::File.new(diff, [commit.parent, commit]) }
let(:diff_file) { Gitlab::Diff::File.new(diff, diff_refs: commit.diff_refs, repository: project.repository) }
 
describe :diff_lines do
let(:diff_lines) { diff_file.diff_lines }
Loading
Loading
Loading
Loading
@@ -6,11 +6,11 @@ describe Gitlab::Diff::Highlight, lib: true do
let(:project) { create(:project) }
let(:commit) { project.commit(sample_commit.id) }
let(:diff) { commit.diffs.first }
let(:diff_file) { Gitlab::Diff::File.new(diff, [commit.parent, commit]) }
let(:diff_file) { Gitlab::Diff::File.new(diff, diff_refs: commit.diff_refs, repository: project.repository) }
 
describe '#highlight' do
context "with a diff file" do
let(:subject) { Gitlab::Diff::Highlight.new(diff_file).highlight }
let(:subject) { Gitlab::Diff::Highlight.new(diff_file, repository: project.repository).highlight }
 
it 'should return Gitlab::Diff::Line elements' do
expect(subject.first).to be_an_instance_of(Gitlab::Diff::Line)
Loading
Loading
@@ -41,7 +41,7 @@ describe Gitlab::Diff::Highlight, lib: true do
end
 
context "with diff lines" do
let(:subject) { Gitlab::Diff::Highlight.new(diff_file.diff_lines).highlight }
let(:subject) { Gitlab::Diff::Highlight.new(diff_file.diff_lines, repository: project.repository).highlight }
 
it 'should return Gitlab::Diff::Line elements' do
expect(subject.first).to be_an_instance_of(Gitlab::Diff::Line)
Loading
Loading
Loading
Loading
@@ -8,8 +8,7 @@ describe Gitlab::Diff::ParallelDiff, lib: true do
let(:commit) { project.commit(sample_commit.id) }
let(:diffs) { commit.diffs }
let(:diff) { diffs.first }
let(:diff_refs) { [commit.parent, commit] }
let(:diff_file) { Gitlab::Diff::File.new(diff, diff_refs) }
let(:diff_file) { Gitlab::Diff::File.new(diff, diff_refs: commit.diff_refs, repository: repository) }
subject { described_class.new(diff_file) }
 
let(:parallel_diff_result_array) { YAML.load_file("#{Rails.root}/spec/fixtures/parallel_diff_result.yml") }
Loading
Loading
Loading
Loading
@@ -948,7 +948,7 @@ describe Notify do
let(:commits) { Commit.decorate(compare.commits, nil) }
let(:diff_path) { namespace_project_compare_path(project.namespace, project, from: Commit.new(compare.base, project), to: Commit.new(compare.head, project)) }
let(:send_from_committer_email) { false }
let(:diff_refs) { [project.merge_base_commit(sample_image_commit.id, sample_commit.id), project.commit(sample_commit.id)] }
let(:diff_refs) { Gitlab::Diff::DiffRefs.new(base_sha: project.merge_base_commit(sample_image_commit.id, sample_commit.id).id, head_sha: sample_commit.id) }
 
subject { Notify.repository_push_email(project.id, author_id: user.id, ref: 'refs/heads/master', action: :push, compare: compare, reverse_compare: false, diff_refs: diff_refs, send_from_committer_email: send_from_committer_email) }
 
Loading
Loading
@@ -1049,7 +1049,7 @@ describe Notify do
let(:compare) { Gitlab::Git::Compare.new(project.repository.raw_repository, sample_commit.parent_id, sample_commit.id) }
let(:commits) { Commit.decorate(compare.commits, nil) }
let(:diff_path) { namespace_project_commit_path(project.namespace, project, commits.first) }
let(:diff_refs) { [project.merge_base_commit(sample_commit.parent_id, sample_commit.id), project.commit(sample_commit.id)] }
let(:diff_refs) { Gitlab::Diff::DiffRefs.new(base_sha: project.merge_base_commit(sample_image_commit.id, sample_commit.id).id, head_sha: sample_commit.id) }
 
subject { Notify.repository_push_email(project.id, author_id: user.id, ref: 'refs/heads/master', action: :push, compare: compare, diff_refs: diff_refs) }
 
Loading
Loading
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment