Commit d03964d6 authored by Dmitriy Zaporozhets's avatar Dmitriy Zaporozhets

Fixed and improved enable_naamespace migration task

parent d991ce63
...@@ -51,8 +51,12 @@ class Namespace < ActiveRecord::Base ...@@ -51,8 +51,12 @@ class Namespace < ActiveRecord::Base
end end
def ensure_dir_exist def ensure_dir_exist
dir_exists? || system("mkdir -m 770 #{namespace_dir_path}")
end
def dir_exists?
namespace_dir_path = File.join(Gitlab.config.gitolite.repos_path, path) namespace_dir_path = File.join(Gitlab.config.gitolite.repos_path, path)
system("mkdir -m 770 #{namespace_dir_path}") unless File.exists?(namespace_dir_path) File.exists?(namespace_dir_path)
end end
def move_dir def move_dir
......
...@@ -14,7 +14,7 @@ class UserObserver < ActiveRecord::Observer ...@@ -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
......
...@@ -3,36 +3,85 @@ namespace :gitlab do ...@@ -3,36 +3,85 @@ namespace :gitlab do
task enable_namespaces: :environment do task enable_namespaces: :environment do
warn_user_is_not_gitlab warn_user_is_not_gitlab
print "Generate usernames for users without one: " 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
username = if user.username.present?
# if user already has username filled
user.username
else
build_username(user)
end
begin
User.transaction do User.transaction do
username = user.email.match(/^[^@]*/)[0] user.update_attributes!(username: username)
if user.update_attributes!(username: username)
print '.'.green print '.'.green
else end
rescue
print 'F'.red print 'F'.red
end end
end end
puts "\nDone"
end end
puts "" def build_username(user)
print "Create directories for groups: " 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
puts "" 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 "" puts "\nMove projects in groups into respective directories ... ".blue
puts "Move projects in groups into respective directories ... "
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
...@@ -62,10 +111,6 @@ namespace :gitlab do ...@@ -62,10 +111,6 @@ namespace :gitlab do
end end
end end
puts "" puts "\nDone"
puts "Rebuild Gitolite ... "
gitolite = Gitlab::Gitolite.new
gitolite.update_repositories(Project.where('namespace_id IS NOT NULL'))
puts "... #{"done".green}"
end end
end end
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment