summaryrefslogtreecommitdiff
path: root/db/migrate/20161226122833_remove_dot_git_from_usernames.rb
diff options
context:
space:
mode:
Diffstat (limited to 'db/migrate/20161226122833_remove_dot_git_from_usernames.rb')
-rw-r--r--db/migrate/20161226122833_remove_dot_git_from_usernames.rb110
1 files changed, 0 insertions, 110 deletions
diff --git a/db/migrate/20161226122833_remove_dot_git_from_usernames.rb b/db/migrate/20161226122833_remove_dot_git_from_usernames.rb
deleted file mode 100644
index e3318780151..00000000000
--- a/db/migrate/20161226122833_remove_dot_git_from_usernames.rb
+++ /dev/null
@@ -1,110 +0,0 @@
-class RemoveDotGitFromUsernames < ActiveRecord::Migration[4.2]
- include Gitlab::Database::MigrationHelpers
- include Gitlab::ShellAdapter
-
- DOWNTIME = false
-
- def up
- invalid_users.each do |user|
- id = user['id']
- namespace_id = user['namespace_id']
- path_was = user['username']
- path_was_wildcard = quote_string("#{path_was}/%")
- path = quote_string(new_path(path_was))
-
- move_namespace(namespace_id, path_was, path)
-
- begin
- execute "UPDATE routes SET path = '#{path}' WHERE source_type = 'Namespace' AND source_id = #{namespace_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|
- new_path = "#{path}/#{route['path'].split('/').last}"
- 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
-
- def down
- # nothing to do here
- end
-
- private
-
- def invalid_users
- select_all("SELECT u.id, u.username, n.path AS namespace_path, n.id AS namespace_id FROM users u
- INNER JOIN namespaces n ON n.owner_id = u.id
- WHERE n.type is NULL AND n.path LIKE '%.git'")
- end
-
- def route_exists?(path)
- select_all("SELECT id, path FROM routes WHERE path = '#{quote_string(path)}'").present?
- end
-
- def path_exists?(shard, repository_storage_path)
- repository_storage_path && gitlab_shell.exists?(shard, repository_storage_path)
- end
-
- # Accepts invalid path like test.git and returns test_git or
- # test_git1 if test_git already taken
- def new_path(path)
- # To stay closer with original name and reduce risk of duplicates
- # we rename suffix instead of removing it
- path = path.sub(/\.git\z/, '_git')
-
- check_routes(path.dup, 0, path)
- end
-
- def check_routes(base, counter, path)
- route_exists = route_exists?(path)
-
- Gitlab.config.repositories.storages.each do |shard, _storage|
- if route_exists || path_exists?(shard, path)
- counter += 1
- path = "#{base}#{counter}"
-
- return check_routes(base, counter, path)
- end
- end
-
- path
- end
-
- def move_namespace(namespace_id, path_was, path)
- repository_storages = select_all("SELECT distinct(repository_storage) FROM projects WHERE namespace_id = #{namespace_id}").map do |row|
- row['repository_storage']
- end.compact
-
- # Move the namespace directory in all storages used by member projects
- repository_storages.each do |repository_storage|
- # Ensure old directory exists before moving it
- gitlab_shell.add_namespace(repository_storage, path_was)
-
- unless gitlab_shell.mv_namespace(repository_storage, path_was, path)
- Rails.logger.error "Exception moving on shard #{repository_storage} from #{path_was} to #{path}"
-
- # if we cannot move namespace directory we should rollback
- # db changes in order to prevent out of sync between db and fs
- raise Exception.new('namespace directory cannot be moved')
- end
- end
-
- begin
- Gitlab::UploadsTransfer.new.rename_namespace(path_was, 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