diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2023-07-19 17:16:28 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2023-07-19 17:16:28 +0300 |
commit | e4384360a16dd9a19d4d2d25d0ef1f2b862ed2a6 (patch) | |
tree | 2fcdfa7dcdb9db8f5208b2562f4b4e803d671243 /lib/extracts_ref | |
parent | ffda4e7bcac36987f936b4ba515995a6698698f0 (diff) |
Add latest changes from gitlab-org/gitlab@16-2-stable-eev16.2.0-rc42
Diffstat (limited to 'lib/extracts_ref')
-rw-r--r-- | lib/extracts_ref/requested_ref.rb | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/lib/extracts_ref/requested_ref.rb b/lib/extracts_ref/requested_ref.rb new file mode 100644 index 00000000000..f20018b5ef4 --- /dev/null +++ b/lib/extracts_ref/requested_ref.rb @@ -0,0 +1,61 @@ +# frozen_string_literal: true + +module ExtractsRef + class RequestedRef + include Gitlab::Utils::StrongMemoize + + SYMBOLIC_REF_PREFIX = %r{((refs/)?(heads|tags)/)+} + def initialize(repository, ref_type:, ref:) + @ref_type = ref_type + @ref = ref + @repository = repository + end + + attr_reader :repository, :ref_type, :ref + + def find + case ref_type + when 'tags' + { ref_type: ref_type, commit: tag } + when 'heads' + { ref_type: ref_type, commit: branch } + else + commit_without_ref_type + end + end + + private + + def commit_without_ref_type + if commit.nil? + { ref_type: nil, commit: nil } + elsif commit.id == ref + # ref is probably complete 40 character sha + { ref_type: nil, commit: commit } + elsif tag.present? + { ref_type: 'tags', commit: tag, ambiguous: branch.present? } + elsif branch.present? + { ref_type: 'heads', commit: branch } + else + { ref_type: nil, commit: commit, ambiguous: ref.match?(SYMBOLIC_REF_PREFIX) } + end + end + + def commit + repository.commit(ref) + end + strong_memoize_attr :commit + + def tag + raw_commit = repository.find_tag(ref)&.dereferenced_target + ::Commit.new(raw_commit, repository.container) if raw_commit + end + strong_memoize_attr :tag + + def branch + raw_commit = repository.find_branch(ref)&.dereferenced_target + ::Commit.new(raw_commit, repository.container) if raw_commit + end + strong_memoize_attr :branch + end +end |