From 175f7f68a6c7857523f1d18b184caa8b84fe0ea3 Mon Sep 17 00:00:00 2001 From: Douwe Maan Date: Tue, 31 Mar 2015 09:30:34 +0200 Subject: [PATCH] Move files for moved namespaces. --- app/models/namespace.rb | 4 -- ...047_remove_periods_at_ends_of_usernames.rb | 41 ++++++++++++++++++- spec/models/namespace_spec.rb | 2 - 3 files changed, 39 insertions(+), 8 deletions(-) diff --git a/app/models/namespace.rb b/app/models/namespace.rb index e2bcd25be21..dd74165f887 100644 --- a/app/models/namespace.rb +++ b/app/models/namespace.rb @@ -58,10 +58,6 @@ class Namespace < ActiveRecord::Base where("name LIKE :query OR path LIKE :query", query: "%#{query}%") end - def global_id - 'GLN' - end - def clean_path(path) path.gsub!(/@.*\z/, "") path.gsub!(/\.git\z/, "") 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 diff --git a/spec/models/namespace_spec.rb b/spec/models/namespace_spec.rb index 48a3ab9c5a2..e87432fdf62 100644 --- a/spec/models/namespace_spec.rb +++ b/spec/models/namespace_spec.rb @@ -33,8 +33,6 @@ describe Namespace do it { is_expected.to respond_to(:to_param) } end - it { expect(Namespace.global_id).to eq('GLN') } - describe :to_param do it { expect(namespace.to_param).to eq(namespace.path) } end