Fixed and improved enable_naamespace migration task

This commit is contained in:
Dmitriy Zaporozhets 2012-12-28 06:14:05 +03:00
parent 779e95b503
commit 708a0d421e
3 changed files with 84 additions and 25 deletions

View file

@ -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

View file

@ -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

View file

@ -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
next
end
User.transaction do username = if user.username.present?
username = user.email.match(/^[^@]*/)[0] # if user already has username filled
if user.update_attributes!(username: username) user.username
print '.'.green
else else
build_username(user)
end
begin
User.transaction do
user.update_attributes!(username: username)
print '.'.green
end
rescue
print 'F'.red print 'F'.red
end end
end end
puts "\nDone"
end end
print "\n\nDirs for groups:".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| Group.find_each(batch_size: 500) do |group|
begin
if group.dir_exists?
print '-'.cyan
else
if group.ensure_dir_exist if group.ensure_dir_exist
print '.'.green print '.'.green
else else
print 'F'.red print 'F'.red
end end
end end
rescue
print 'F'.red
end
end
puts "\nDone"
end
print "\n\nMove projects from groups under groups dirs:".yellow 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