75 lines
1.7 KiB
Ruby
75 lines
1.7 KiB
Ruby
|
# frozen_string_literal: true
|
||
|
|
||
|
module Gitlab
|
||
|
class GlRepository
|
||
|
class Identifier
|
||
|
attr_reader :gl_repository, :repo_type
|
||
|
|
||
|
def initialize(gl_repository)
|
||
|
@gl_repository = gl_repository
|
||
|
@segments = gl_repository.split('-')
|
||
|
|
||
|
raise_error if segments.size > 3
|
||
|
|
||
|
@repo_type = find_repo_type
|
||
|
@container_id = find_container_id
|
||
|
@container_class = find_container_class
|
||
|
end
|
||
|
|
||
|
def fetch_container!
|
||
|
container_class.find_by_id(container_id)
|
||
|
end
|
||
|
|
||
|
private
|
||
|
|
||
|
attr_reader :segments, :container_class, :container_id
|
||
|
|
||
|
def find_repo_type
|
||
|
type_name = three_segments_format? ? segments.last : segments.first
|
||
|
type = Gitlab::GlRepository.types[type_name]
|
||
|
|
||
|
raise_error unless type
|
||
|
|
||
|
type
|
||
|
end
|
||
|
|
||
|
def find_container_class
|
||
|
if three_segments_format?
|
||
|
case segments[0]
|
||
|
when 'project'
|
||
|
Project
|
||
|
when 'group'
|
||
|
Group
|
||
|
else
|
||
|
raise_error
|
||
|
end
|
||
|
else
|
||
|
repo_type.container_class
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def find_container_id
|
||
|
id = Integer(segments[1], 10, exception: false)
|
||
|
|
||
|
raise_error unless id
|
||
|
|
||
|
id
|
||
|
end
|
||
|
|
||
|
# gl_repository can either have 2 or 3 segments:
|
||
|
# "wiki-1" is the older 2-segment format, where container is implied.
|
||
|
# "group-1-wiki" is the newer 3-segment format, including container information.
|
||
|
#
|
||
|
# TODO: convert all 2-segment format to 3-segment:
|
||
|
# https://gitlab.com/gitlab-org/gitlab/-/issues/219192
|
||
|
def three_segments_format?
|
||
|
segments.size == 3
|
||
|
end
|
||
|
|
||
|
def raise_error
|
||
|
raise ArgumentError, "Invalid GL Repository \"#{gl_repository}\""
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|