Skip to content

Commit

Permalink
Fixed and improved enable_naamespace migration task
Browse files Browse the repository at this point in the history
  • Loading branch information
dzaporozhets committed Dec 28, 2012
1 parent d991ce6 commit d03964d
Show file tree
Hide file tree
Showing 3 changed files with 71 additions and 22 deletions.
6 changes: 5 additions & 1 deletion app/models/namespace.rb
Original file line number Diff line number Diff line change
Expand Up @@ -51,8 +51,12 @@ def human_name
end

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)
system("mkdir -m 770 #{namespace_dir_path}") unless File.exists?(namespace_dir_path)
File.exists?(namespace_dir_path)
end

def move_dir
Expand Down
2 changes: 1 addition & 1 deletion app/observers/user_observer.rb
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ def after_save user
if user.namespace
user.namespace.update_attributes(path: user.username)
else
user.create_namespace!(path: user.username, name: user.name)
user.create_namespace!(path: user.username, name: user.username)
end
end
end
Expand Down
85 changes: 65 additions & 20 deletions lib/tasks/gitlab/enable_namespaces.rake
Original file line number Diff line number Diff line change
Expand Up @@ -3,36 +3,85 @@ namespace :gitlab do
task enable_namespaces: :environment do
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|
next if user.namespace
if user.namespace
print '-'.cyan
next
end

User.transaction do
username = user.email.match(/^[^@]*/)[0]
if user.update_attributes!(username: username)
username = if user.username.present?
# if user already has username filled
user.username
else
build_username(user)
end

begin
User.transaction do
user.update_attributes!(username: username)
print '.'.green
else
print 'F'.red
end
rescue
print 'F'.red
end
end
puts "\nDone"
end

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

puts ""
print "Create directories for groups: "
def migrate_groups
puts "\nCreate directories for groups: ".blue

Group.find_each(batch_size: 500) do |group|
if group.ensure_dir_exist
print '.'.green
else
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 ""
puts "\nDone"
end

def migrate_projects
git_path = Gitlab.config.gitolite.repos_path
puts ""
puts "Move projects in groups into respective directories ... "
puts "\nMove projects in groups into respective directories ... ".blue
Project.where('namespace_id IS NOT NULL').find_each(batch_size: 500) do |project|
next unless project.group

Expand Down Expand Up @@ -62,10 +111,6 @@ namespace :gitlab do
end
end

puts ""
puts "Rebuild Gitolite ... "
gitolite = Gitlab::Gitolite.new
gitolite.update_repositories(Project.where('namespace_id IS NOT NULL'))
puts "... #{"done".green}"
puts "\nDone"
end
end

0 comments on commit d03964d

Please sign in to comment.