2019-05-03 19:53:19 +05:30
|
|
|
# frozen_string_literal: true
|
|
|
|
|
|
|
|
# NOTE: This code is legacy. Do not add/modify code here unless you have
|
|
|
|
# discussed with the Gitaly team. See
|
|
|
|
# https://docs.gitlab.com/ee/development/gitaly.html#legacy-rugged-code
|
|
|
|
# for more details.
|
|
|
|
|
|
|
|
# rubocop:disable Gitlab/ModuleWithInstanceVariables
|
|
|
|
module Gitlab
|
|
|
|
module Git
|
|
|
|
module RuggedImpl
|
|
|
|
module Repository
|
|
|
|
extend ::Gitlab::Utils::Override
|
2019-09-30 21:07:59 +05:30
|
|
|
include Gitlab::Git::RuggedImpl::UseRugged
|
2019-05-03 19:53:19 +05:30
|
|
|
|
|
|
|
FEATURE_FLAGS = %i(rugged_find_commit rugged_tree_entries rugged_tree_entry rugged_commit_is_ancestor rugged_commit_tree_entry rugged_list_commits_by_oid).freeze
|
|
|
|
|
|
|
|
def alternate_object_directories
|
|
|
|
relative_object_directories.map { |d| File.join(path, d) }
|
|
|
|
end
|
|
|
|
|
|
|
|
ALLOWED_OBJECT_RELATIVE_DIRECTORIES_VARIABLES = %w[
|
|
|
|
GIT_OBJECT_DIRECTORY_RELATIVE
|
|
|
|
GIT_ALTERNATE_OBJECT_DIRECTORIES_RELATIVE
|
|
|
|
].freeze
|
|
|
|
|
|
|
|
def relative_object_directories
|
|
|
|
Gitlab::Git::HookEnv.all(gl_repository).values_at(*ALLOWED_OBJECT_RELATIVE_DIRECTORIES_VARIABLES).flatten.compact
|
|
|
|
end
|
|
|
|
|
|
|
|
def rugged
|
|
|
|
@rugged ||= ::Rugged::Repository.new(path, alternates: alternate_object_directories)
|
|
|
|
rescue ::Rugged::RepositoryError, ::Rugged::OSError
|
2021-06-08 01:23:25 +05:30
|
|
|
raise ::Gitlab::Git::Repository::NoRepository, 'no repository for such path'
|
2019-05-03 19:53:19 +05:30
|
|
|
end
|
|
|
|
|
|
|
|
def cleanup
|
|
|
|
@rugged&.close
|
|
|
|
end
|
|
|
|
|
|
|
|
# Return the object that +revspec+ points to. If +revspec+ is an
|
|
|
|
# annotated tag, then return the tag's target instead.
|
|
|
|
def rev_parse_target(revspec)
|
|
|
|
obj = rugged.rev_parse(revspec)
|
|
|
|
Ref.dereference_object(obj)
|
|
|
|
end
|
|
|
|
|
|
|
|
override :ancestor?
|
|
|
|
def ancestor?(from, to)
|
2019-09-30 21:07:59 +05:30
|
|
|
if use_rugged?(self, :rugged_commit_is_ancestor)
|
2019-10-12 21:52:04 +05:30
|
|
|
execute_rugged_call(:rugged_is_ancestor?, from, to)
|
2019-05-03 19:53:19 +05:30
|
|
|
else
|
|
|
|
super
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def rugged_is_ancestor?(ancestor_id, descendant_id)
|
|
|
|
return false if ancestor_id.nil? || descendant_id.nil?
|
|
|
|
|
|
|
|
rugged_merge_base(ancestor_id, descendant_id) == ancestor_id
|
|
|
|
rescue Rugged::OdbError
|
|
|
|
false
|
|
|
|
end
|
|
|
|
|
|
|
|
def rugged_merge_base(from, to)
|
|
|
|
rugged.merge_base(from, to)
|
|
|
|
rescue Rugged::ReferenceError
|
|
|
|
nil
|
|
|
|
end
|
|
|
|
|
|
|
|
# Lookup for rugged object by oid or ref name
|
|
|
|
def lookup(oid_or_ref_name)
|
2020-03-13 15:44:24 +05:30
|
|
|
rev_parse_target(oid_or_ref_name)
|
2019-05-03 19:53:19 +05:30
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
# rubocop:enable Gitlab/ModuleWithInstanceVariables
|