2012-12-30 15:19:31 +01:00
|
|
|
# == NamespacedProject role
|
|
|
|
#
|
|
|
|
# Provides extra functionality for Project related to namespaces like:
|
|
|
|
# - transfer project between namespaces
|
|
|
|
# - name, path including namespece
|
|
|
|
# - project owner based on namespace
|
|
|
|
#
|
|
|
|
# Used by Project
|
|
|
|
#
|
2012-12-14 06:14:05 +01:00
|
|
|
module NamespacedProject
|
|
|
|
def transfer(new_namespace)
|
|
|
|
Project.transaction do
|
|
|
|
old_namespace = namespace
|
|
|
|
self.namespace = new_namespace
|
|
|
|
|
|
|
|
old_dir = old_namespace.try(:path) || ''
|
|
|
|
new_dir = new_namespace.try(:path) || ''
|
|
|
|
|
|
|
|
old_repo = if old_dir.present?
|
|
|
|
File.join(old_dir, self.path)
|
|
|
|
else
|
|
|
|
self.path
|
|
|
|
end
|
|
|
|
|
|
|
|
if Project.where(path: self.path, namespace_id: new_namespace.try(:id)).present?
|
|
|
|
raise TransferError.new("Project with same path in target namespace already exists")
|
|
|
|
end
|
|
|
|
|
|
|
|
Gitlab::ProjectMover.new(self, old_dir, new_dir).execute
|
|
|
|
|
|
|
|
git_host.move_repository(old_repo, self)
|
|
|
|
|
|
|
|
save!
|
|
|
|
end
|
|
|
|
rescue Gitlab::ProjectMover::ProjectMoveError => ex
|
2012-12-24 19:01:49 +01:00
|
|
|
raise Project::TransferError.new(ex.message)
|
2012-12-14 06:14:05 +01:00
|
|
|
end
|
|
|
|
|
|
|
|
def name_with_namespace
|
|
|
|
@name_with_namespace ||= begin
|
|
|
|
if namespace
|
|
|
|
namespace.human_name + " / " + name
|
|
|
|
else
|
|
|
|
name
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def namespace_owner
|
|
|
|
namespace.try(:owner)
|
|
|
|
end
|
|
|
|
|
|
|
|
def path_with_namespace
|
|
|
|
if namespace
|
|
|
|
namespace.path + '/' + path
|
|
|
|
else
|
|
|
|
path
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|