summaryrefslogtreecommitdiff
path: root/db/migrate
diff options
context:
space:
mode:
authorDouwe Maan <douwe@gitlab.com>2015-03-31 09:30:34 +0200
committerDouwe Maan <douwe@gitlab.com>2015-03-31 09:30:34 +0200
commit175f7f68a6c7857523f1d18b184caa8b84fe0ea3 (patch)
treea9f61e6a151b57c788f9b202e7fb0999fc99a292 /db/migrate
parent1d829ca15102b62fe2eab1287d4c33f1add9d239 (diff)
downloadgitlab-ce-175f7f68a6c7857523f1d18b184caa8b84fe0ea3.tar.gz
Move files for moved namespaces.
Diffstat (limited to 'db/migrate')
-rw-r--r--db/migrate/20150324133047_remove_periods_at_ends_of_usernames.rb41
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