debian-mirror-gitlab/lib/gitlab/diff/diff_refs.rb

59 lines
2 KiB
Ruby
Raw Normal View History

2019-02-15 15:39:39 +05:30
# frozen_string_literal: true
2016-08-24 12:49:21 +05:30
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) &&
2018-03-17 18:26:18 +05:30
Git.shas_eql?(base_sha, other.base_sha) &&
Git.shas_eql?(start_sha, other.start_sha) &&
Git.shas_eql?(head_sha, other.head_sha)
2016-08-24 12:49:21 +05:30
end
2017-08-17 22:00:37 +05:30
alias_method :eql?, :==
def hash
2019-02-15 15:39:39 +05:30
[self.class, base_sha, start_sha, head_sha].hash
2017-08-17 22:00:37 +05:30
end
2016-08-24 12:49:21 +05:30
# There is only one case in which we will have `start_sha` and `head_sha`,
# but not `base_sha`, which is when a diff is generated between an
# orphaned branch and another branch, which means there _is_ no base, but
# we're still able to highlight it, and to create diff notes, which are
# the primary things `DiffRefs` are used for.
# `DiffRefs` are "complete" when they have `start_sha` and `head_sha`,
# because `base_sha` can always be derived from this, to return an actual
# sha, or `nil`.
# We have `base_sha` directly available on `DiffRefs` because it's faster#
# than having to look it up in the repo every time.
def complete?
2020-03-13 15:44:24 +05:30
start_sha.present? && head_sha.present?
2016-08-24 12:49:21 +05:30
end
2017-09-10 17:25:29 +05:30
def compare_in(project)
# We're at the initial commit, so just get that as we can't compare to anything.
if Gitlab::Git.blank_ref?(start_sha)
project.commit(head_sha)
else
straight = start_sha == base_sha
2018-03-27 19:54:05 +05:30
CompareService.new(project, head_sha).execute(project,
start_sha,
base_sha: base_sha,
straight: straight)
2017-09-10 17:25:29 +05:30
end
end
2016-08-24 12:49:21 +05:30
end
end
end