Skip to content

Commit d03964d

Browse files
committed
Fixed and improved enable_naamespace migration task
1 parent d991ce6 commit d03964d

File tree

3 files changed

+71
-22
lines changed

3 files changed

+71
-22
lines changed

app/models/namespace.rb

+5-1
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,12 @@ def human_name
5151
end
5252

5353
def ensure_dir_exist
54+
dir_exists? || system("mkdir -m 770 #{namespace_dir_path}")
55+
end
56+
57+
def dir_exists?
5458
namespace_dir_path = File.join(Gitlab.config.gitolite.repos_path, path)
55-
system("mkdir -m 770 #{namespace_dir_path}") unless File.exists?(namespace_dir_path)
59+
File.exists?(namespace_dir_path)
5660
end
5761

5862
def move_dir

app/observers/user_observer.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ def after_save user
1414
if user.namespace
1515
user.namespace.update_attributes(path: user.username)
1616
else
17-
user.create_namespace!(path: user.username, name: user.name)
17+
user.create_namespace!(path: user.username, name: user.username)
1818
end
1919
end
2020
end

lib/tasks/gitlab/enable_namespaces.rake

+65-20
Original file line numberDiff line numberDiff line change
@@ -3,36 +3,85 @@ namespace :gitlab do
33
task enable_namespaces: :environment do
44
warn_user_is_not_gitlab
55

6-
print "Generate usernames for users without one: "
6+
migrate_user_namespaces
7+
migrate_groups
8+
migrate_projects
79

10+
puts "Rebuild Gitolite ... "
11+
gitolite = Gitlab::Gitolite.new
12+
gitolite.update_repositories(Project.where('namespace_id IS NOT NULL'))
13+
puts "... #{"done".green}"
14+
end
15+
16+
def migrate_user_namespaces
17+
puts "\nGenerate usernames for users without one: ".blue
818
User.find_each(batch_size: 500) do |user|
9-
next if user.namespace
19+
if user.namespace
20+
print '-'.cyan
21+
next
22+
end
1023

11-
User.transaction do
12-
username = user.email.match(/^[^@]*/)[0]
13-
if user.update_attributes!(username: username)
24+
username = if user.username.present?
25+
# if user already has username filled
26+
user.username
27+
else
28+
build_username(user)
29+
end
30+
31+
begin
32+
User.transaction do
33+
user.update_attributes!(username: username)
1434
print '.'.green
15-
else
16-
print 'F'.red
1735
end
36+
rescue
37+
print 'F'.red
1838
end
1939
end
40+
puts "\nDone"
41+
end
42+
43+
def build_username(user)
44+
username = nil
45+
46+
# generate username
47+
username = user.email.match(/^[^@]*/)[0]
48+
username.gsub!("+", ".")
49+
50+
# return username if no mathes
51+
return username unless User.find_by_username(username)
52+
53+
# look for same username
54+
(1..10).each do |i|
55+
suffixed_username = "#{username}#{i}"
56+
57+
return suffixed_username unless User.find_by_username(suffixed_username)
58+
end
59+
end
2060

21-
puts ""
22-
print "Create directories for groups: "
61+
def migrate_groups
62+
puts "\nCreate directories for groups: ".blue
2363

2464
Group.find_each(batch_size: 500) do |group|
25-
if group.ensure_dir_exist
26-
print '.'.green
27-
else
65+
begin
66+
if group.dir_exists?
67+
print '-'.cyan
68+
else
69+
if group.ensure_dir_exist
70+
print '.'.green
71+
else
72+
print 'F'.red
73+
end
74+
end
75+
rescue
2876
print 'F'.red
2977
end
3078
end
31-
puts ""
79+
puts "\nDone"
80+
end
3281

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

@@ -62,10 +111,6 @@ namespace :gitlab do
62111
end
63112
end
64113

65-
puts ""
66-
puts "Rebuild Gitolite ... "
67-
gitolite = Gitlab::Gitolite.new
68-
gitolite.update_repositories(Project.where('namespace_id IS NOT NULL'))
69-
puts "... #{"done".green}"
114+
puts "\nDone"
70115
end
71116
end

0 commit comments

Comments
 (0)