7d23a2bfdf
Storage shards should only be used, the exact paths are the responsibilty of Gitaly. This will create deprecation warning, and in this instance the path is initialized, but never used so it could be removed.
87 lines
2.8 KiB
Ruby
87 lines
2.8 KiB
Ruby
module Gitlab
|
|
module Git
|
|
#
|
|
# When a Gitaly call involves two repositories instead of one we cannot
|
|
# assume that both repositories are on the same Gitaly server. In this
|
|
# case we need to make a distinction between the repository that the
|
|
# call is being made on (a Repository instance), and the "other"
|
|
# repository (a RemoteRepository instance). This is the reason why we
|
|
# have the RemoteRepository class in Gitlab::Git.
|
|
#
|
|
# When you make changes, be aware that gitaly-ruby sub-classes this
|
|
# class.
|
|
#
|
|
class RemoteRepository
|
|
attr_reader :relative_path, :gitaly_repository
|
|
|
|
def initialize(repository)
|
|
@relative_path = repository.relative_path
|
|
@gitaly_repository = repository.gitaly_repository
|
|
|
|
# These instance variables will not be available in gitaly-ruby, where
|
|
# we have no disk access to this repository.
|
|
@repository = repository
|
|
end
|
|
|
|
def empty?
|
|
# We will override this implementation in gitaly-ruby because we cannot
|
|
# use '@repository' there.
|
|
#
|
|
# Caches and memoization used on the Rails side
|
|
!@repository.exists? || @repository.empty?
|
|
end
|
|
|
|
def commit_id(revision)
|
|
# We will override this implementation in gitaly-ruby because we cannot
|
|
# use '@repository' there.
|
|
@repository.commit(revision)&.sha
|
|
end
|
|
|
|
def branch_exists?(name)
|
|
# We will override this implementation in gitaly-ruby because we cannot
|
|
# use '@repository' there.
|
|
@repository.branch_exists?(name)
|
|
end
|
|
|
|
# Compares self to a Gitlab::Git::Repository. This implementation uses
|
|
# 'self.gitaly_repository' so that it will also work in the
|
|
# GitalyRemoteRepository subclass defined in gitaly-ruby.
|
|
def same_repository?(other_repository)
|
|
gitaly_repository.storage_name == other_repository.storage &&
|
|
gitaly_repository.relative_path == other_repository.relative_path
|
|
end
|
|
|
|
def fetch_env
|
|
gitaly_ssh = File.absolute_path(File.join(Gitlab.config.gitaly.client_path, 'gitaly-ssh'))
|
|
gitaly_address = gitaly_client.address(storage)
|
|
gitaly_token = gitaly_client.token(storage)
|
|
|
|
request = Gitaly::SSHUploadPackRequest.new(repository: gitaly_repository)
|
|
env = {
|
|
'GITALY_ADDRESS' => gitaly_address,
|
|
'GITALY_PAYLOAD' => request.to_json,
|
|
'GITALY_WD' => Dir.pwd,
|
|
'GIT_SSH_COMMAND' => "#{gitaly_ssh} upload-pack"
|
|
}
|
|
env['GITALY_TOKEN'] = gitaly_token if gitaly_token.present?
|
|
|
|
env
|
|
end
|
|
|
|
def path
|
|
@repository.path
|
|
end
|
|
|
|
private
|
|
|
|
# Must return an object that responds to 'address' and 'storage'.
|
|
def gitaly_client
|
|
Gitlab::GitalyClient
|
|
end
|
|
|
|
def storage
|
|
gitaly_repository.storage_name
|
|
end
|
|
end
|
|
end
|
|
end
|