diff options
author | Douwe Maan <douwe@gitlab.com> | 2015-03-31 09:30:34 +0200 |
---|---|---|
committer | Douwe Maan <douwe@gitlab.com> | 2015-03-31 09:30:34 +0200 |
commit | 175f7f68a6c7857523f1d18b184caa8b84fe0ea3 (patch) | |
tree | a9f61e6a151b57c788f9b202e7fb0999fc99a292 /db | |
parent | 1d829ca15102b62fe2eab1287d4c33f1add9d239 (diff) | |
download | gitlab-ce-175f7f68a6c7857523f1d18b184caa8b84fe0ea3.tar.gz |
Move files for moved namespaces.
Diffstat (limited to 'db')
-rw-r--r-- | db/migrate/20150324133047_remove_periods_at_ends_of_usernames.rb | 41 |
1 files changed, 39 insertions, 2 deletions
diff --git a/db/migrate/20150324133047_remove_periods_at_ends_of_usernames.rb b/db/migrate/20150324133047_remove_periods_at_ends_of_usernames.rb index 36e3faa53be..bd49caef684 100644 --- a/db/migrate/20150324133047_remove_periods_at_ends_of_usernames.rb +++ b/db/migrate/20150324133047_remove_periods_at_ends_of_usernames.rb @@ -1,4 +1,6 @@ class RemovePeriodsAtEndsOfUsernames < ActiveRecord::Migration + include Gitlab::ShellAdapter + class Namespace < ActiveRecord::Base class << self def by_path(path) @@ -6,6 +8,7 @@ class RemovePeriodsAtEndsOfUsernames < ActiveRecord::Migration end def clean_path(path) + path = path.dup path.gsub!(/@.*\z/, "") path.gsub!(/\.git\z/, "") path.gsub!(/\A-/, "") @@ -25,15 +28,49 @@ class RemovePeriodsAtEndsOfUsernames < ActiveRecord::Migration end def up + changed_paths = {} + select_all("SELECT id, username FROM users WHERE username LIKE '%.'").each do |user| - username = quote_string(Namespace.clean_path(user["username"])) + username_was = user["username"] + username = Namespace.clean_path(username_was) + changed_paths[username_was] = username + + username = quote_string(username) execute "UPDATE users SET username = '#{username}' WHERE id = #{user["id"]}" execute "UPDATE namespaces SET path = '#{username}', name = '#{username}' WHERE type = NULL AND owner_id = #{user["id"]}" end select_all("SELECT id, path FROM namespaces WHERE type = 'Group' AND path LIKE '%.'").each do |group| - path = quote_string(Namespace.clean_path(group["path"])) + path_was = group["path"] + path = Namespace.clean_path(path_was) + changed_paths[path_was] = path + + path = quote_string(path) execute "UPDATE namespaces SET path = '#{path}' WHERE id = #{group["id"]}" end + + changed_paths.each do |path_was, path| + if gitlab_shell.mv_namespace(path_was, path) + # If repositories moved successfully we need to remove old satellites + # and send update instructions to users. + # However we cannot allow rollback since we moved namespace dir + # So we basically we mute exceptions in next actions + begin + gitlab_shell.rm_satellites(path_was) + # We cannot send update instructions since models and mailers + # can't safely be used from migrations as they may be written for + # later versions of the database. + # send_update_instructions + rescue + # Returning false does not rollback after_* transaction but gives + # us information about failing some of tasks + false + end + else + # 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 end end |