Fixed and improved enable_naamespace migration task
This commit is contained in:
parent
779e95b503
commit
708a0d421e
|
@ -51,8 +51,17 @@ class Namespace < ActiveRecord::Base
|
||||||
end
|
end
|
||||||
|
|
||||||
def ensure_dir_exist
|
def ensure_dir_exist
|
||||||
namespace_dir_path = File.join(Gitlab.config.gitolite.repos_path, path)
|
unless dir_exists?
|
||||||
system("mkdir -m 770 #{namespace_dir_path}") unless File.exists?(namespace_dir_path)
|
system("mkdir -m 770 #{namespace_full_path}")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def dir_exists?
|
||||||
|
File.exists?(namespace_full_path)
|
||||||
|
end
|
||||||
|
|
||||||
|
def namespace_full_path
|
||||||
|
@namespace_full_path ||= File.join(Gitlab.config.gitolite.repos_path, path)
|
||||||
end
|
end
|
||||||
|
|
||||||
def move_dir
|
def move_dir
|
||||||
|
|
|
@ -14,7 +14,7 @@ class UserObserver < ActiveRecord::Observer
|
||||||
if user.namespace
|
if user.namespace
|
||||||
user.namespace.update_attributes(path: user.username)
|
user.namespace.update_attributes(path: user.username)
|
||||||
else
|
else
|
||||||
user.create_namespace!(path: user.username, name: user.name)
|
user.create_namespace!(path: user.username, name: user.username)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,34 +1,87 @@
|
||||||
namespace :gitlab do
|
namespace :gitlab do
|
||||||
desc "GITLAB | Enable usernames and namespaces for user projects"
|
desc "GITLAB | Enable usernames and namespaces for user projects"
|
||||||
task enable_namespaces: :environment do
|
task enable_namespaces: :environment do
|
||||||
print "\nUsernames for users:".yellow
|
warn_user_is_not_gitlab
|
||||||
|
|
||||||
|
migrate_user_namespaces
|
||||||
|
migrate_groups
|
||||||
|
migrate_projects
|
||||||
|
|
||||||
|
puts "Rebuild Gitolite ... "
|
||||||
|
gitolite = Gitlab::Gitolite.new
|
||||||
|
gitolite.update_repositories(Project.where('namespace_id IS NOT NULL'))
|
||||||
|
puts "... #{"done".green}"
|
||||||
|
end
|
||||||
|
|
||||||
|
def migrate_user_namespaces
|
||||||
|
puts "\nGenerate usernames for users without one: ".blue
|
||||||
User.find_each(batch_size: 500) do |user|
|
User.find_each(batch_size: 500) do |user|
|
||||||
next if user.namespace
|
if user.namespace
|
||||||
|
print '-'.cyan
|
||||||
User.transaction do
|
next
|
||||||
username = user.email.match(/^[^@]*/)[0]
|
|
||||||
if user.update_attributes!(username: username)
|
|
||||||
print '.'.green
|
|
||||||
else
|
|
||||||
print 'F'.red
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
|
||||||
|
|
||||||
print "\n\nDirs for groups:".yellow
|
username = if user.username.present?
|
||||||
|
# if user already has username filled
|
||||||
|
user.username
|
||||||
|
else
|
||||||
|
build_username(user)
|
||||||
|
end
|
||||||
|
|
||||||
Group.find_each(batch_size: 500) do |group|
|
begin
|
||||||
if group.ensure_dir_exist
|
User.transaction do
|
||||||
print '.'.green
|
user.update_attributes!(username: username)
|
||||||
else
|
print '.'.green
|
||||||
|
end
|
||||||
|
rescue
|
||||||
print 'F'.red
|
print 'F'.red
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
puts "\nDone"
|
||||||
|
end
|
||||||
|
|
||||||
print "\n\nMove projects from groups under groups dirs:".yellow
|
def build_username(user)
|
||||||
|
username = nil
|
||||||
|
|
||||||
|
# generate username
|
||||||
|
username = user.email.match(/^[^@]*/)[0]
|
||||||
|
username.gsub!("+", ".")
|
||||||
|
|
||||||
|
# return username if no mathes
|
||||||
|
return username unless User.find_by_username(username)
|
||||||
|
|
||||||
|
# look for same username
|
||||||
|
(1..10).each do |i|
|
||||||
|
suffixed_username = "#{username}#{i}"
|
||||||
|
|
||||||
|
return suffixed_username unless User.find_by_username(suffixed_username)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def migrate_groups
|
||||||
|
puts "\nCreate directories for groups: ".blue
|
||||||
|
|
||||||
|
Group.find_each(batch_size: 500) do |group|
|
||||||
|
begin
|
||||||
|
if group.dir_exists?
|
||||||
|
print '-'.cyan
|
||||||
|
else
|
||||||
|
if group.ensure_dir_exist
|
||||||
|
print '.'.green
|
||||||
|
else
|
||||||
|
print 'F'.red
|
||||||
|
end
|
||||||
|
end
|
||||||
|
rescue
|
||||||
|
print 'F'.red
|
||||||
|
end
|
||||||
|
end
|
||||||
|
puts "\nDone"
|
||||||
|
end
|
||||||
|
|
||||||
|
def migrate_projects
|
||||||
git_path = Gitlab.config.gitolite.repos_path
|
git_path = Gitlab.config.gitolite.repos_path
|
||||||
|
puts "\nMove projects in groups into respective directories ... ".blue
|
||||||
Project.where('namespace_id IS NOT NULL').find_each(batch_size: 500) do |project|
|
Project.where('namespace_id IS NOT NULL').find_each(batch_size: 500) do |project|
|
||||||
next unless project.group
|
next unless project.group
|
||||||
|
|
||||||
|
@ -59,9 +112,6 @@ namespace :gitlab do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
print "\n\nRebuild gitolite:".yellow
|
puts "\nDone"
|
||||||
gitolite = Gitlab::Gitolite.new
|
|
||||||
gitolite.update_repositories(Project.where('namespace_id IS NOT NULL'))
|
|
||||||
puts "\n"
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in a new issue