summaryrefslogtreecommitdiff
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
parent1d829ca15102b62fe2eab1287d4c33f1add9d239 (diff)
downloadgitlab-ce-175f7f68a6c7857523f1d18b184caa8b84fe0ea3.tar.gz
Move files for moved namespaces.
-rw-r--r--app/models/namespace.rb4
-rw-r--r--db/migrate/20150324133047_remove_periods_at_ends_of_usernames.rb41
-rw-r--r--spec/models/namespace_spec.rb2
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