提交 1028b111 编写于 作者: S Sean McGivern

Merge branch 'fix/rc-migration-failure' into 'master'

Fix migration failing when user has no projects

See merge request !8589
...@@ -14,16 +14,25 @@ class RemoveDotGitFromUsernames < ActiveRecord::Migration ...@@ -14,16 +14,25 @@ class RemoveDotGitFromUsernames < ActiveRecord::Migration
namespace_id = user['namespace_id'] namespace_id = user['namespace_id']
path_was = user['username'] path_was = user['username']
path_was_wildcard = quote_string("#{path_was}/%") path_was_wildcard = quote_string("#{path_was}/%")
path = quote_string(new_path(path_was))
path = move_namespace(namespace_id, path_was, path) move_namespace(namespace_id, path_was, path)
execute "UPDATE routes SET path = '#{path}' WHERE source_type = 'Namespace' AND source_id = #{namespace_id}" begin
execute "UPDATE namespaces SET path = '#{path}' WHERE id = #{namespace_id}" execute "UPDATE routes SET path = '#{path}' WHERE source_type = 'Namespace' AND source_id = #{namespace_id}"
execute "UPDATE users SET username = '#{path}' WHERE id = #{id}" execute "UPDATE namespaces SET path = '#{path}' WHERE id = #{namespace_id}"
execute "UPDATE users SET username = '#{path}' WHERE id = #{id}"
select_all("SELECT id, path FROM routes WHERE path LIKE '#{path_was_wildcard}'").each do |route| select_all("SELECT id, path FROM routes WHERE path LIKE '#{path_was_wildcard}'").each do |route|
new_path = "#{path}/#{route['path'].split('/').last}" new_path = "#{path}/#{route['path'].split('/').last}"
execute "UPDATE routes SET path = '#{new_path}' WHERE id = #{route['id']}" execute "UPDATE routes SET path = '#{new_path}' WHERE id = #{route['id']}"
end
rescue => e
say("Couldn't update routes for path #{path_was} to #{path}")
# Move namespace back
move_namespace(namespace_id, path, path_was)
raise e
end end
end end
end end
...@@ -44,23 +53,30 @@ class RemoveDotGitFromUsernames < ActiveRecord::Migration ...@@ -44,23 +53,30 @@ class RemoveDotGitFromUsernames < ActiveRecord::Migration
select_all("SELECT id, path FROM routes WHERE path = '#{quote_string(path)}'").present? select_all("SELECT id, path FROM routes WHERE path = '#{quote_string(path)}'").present?
end end
def path_exists?(repository_storage_path, path) def path_exists?(path, repository_storage_path)
gitlab_shell.exists?(repository_storage_path, path) repository_storage_path && gitlab_shell.exists?(repository_storage_path, path)
end end
# Accepts invalid path like test.git and returns test_git or # Accepts invalid path like test.git and returns test_git or
# test_git1 if test_git already taken # test_git1 if test_git already taken
def rename_path(repository_storage_path, path) def new_path(path)
# To stay closer with original name and reduce risk of duplicates # To stay closer with original name and reduce risk of duplicates
# we rename suffix instead of removing it # we rename suffix instead of removing it
path = path.sub(/\.git\z/, '_git') path = path.sub(/\.git\z/, '_git')
counter = 0 check_routes(path.dup, 0, path)
base = path end
def check_routes(base, counter, path)
route_exists = route_exists?(path)
while route_exists?(path) || path_exists?(repository_storage_path, path) Gitlab.config.repositories.storages.each_value do |storage|
counter += 1 if route_exists || path_exists?(path, storage)
path = "#{base}#{counter}" counter += 1
path = "#{base}#{counter}"
return check_route(base, counter, path)
end
end end
path path
...@@ -76,8 +92,6 @@ class RemoveDotGitFromUsernames < ActiveRecord::Migration ...@@ -76,8 +92,6 @@ class RemoveDotGitFromUsernames < ActiveRecord::Migration
# Ensure old directory exists before moving it # Ensure old directory exists before moving it
gitlab_shell.add_namespace(repository_storage_path, path_was) gitlab_shell.add_namespace(repository_storage_path, path_was)
path = quote_string(rename_path(repository_storage_path, path_was))
unless gitlab_shell.mv_namespace(repository_storage_path, path_was, path) unless gitlab_shell.mv_namespace(repository_storage_path, path_was, path)
Rails.logger.error "Exception moving path #{repository_storage_path} from #{path_was} to #{path}" Rails.logger.error "Exception moving path #{repository_storage_path} from #{path_was} to #{path}"
...@@ -87,8 +101,14 @@ class RemoveDotGitFromUsernames < ActiveRecord::Migration ...@@ -87,8 +101,14 @@ class RemoveDotGitFromUsernames < ActiveRecord::Migration
end end
end end
Gitlab::UploadsTransfer.new.rename_namespace(path_was, path) begin
Gitlab::UploadsTransfer.new.rename_namespace(path_was, path)
path rescue => e
if path.nil?
say("Couldn't find a storage path for #{namespace_id}, #{path_was} -- skipping")
else
raise e
end
end
end end
end end
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册