Move files for moved namespaces.
This commit is contained in:
parent
1d829ca151
commit
175f7f68a6
|
@ -58,10 +58,6 @@ class Namespace < ActiveRecord::Base
|
||||||
where("name LIKE :query OR path LIKE :query", query: "%#{query}%")
|
where("name LIKE :query OR path LIKE :query", query: "%#{query}%")
|
||||||
end
|
end
|
||||||
|
|
||||||
def global_id
|
|
||||||
'GLN'
|
|
||||||
end
|
|
||||||
|
|
||||||
def clean_path(path)
|
def clean_path(path)
|
||||||
path.gsub!(/@.*\z/, "")
|
path.gsub!(/@.*\z/, "")
|
||||||
path.gsub!(/\.git\z/, "")
|
path.gsub!(/\.git\z/, "")
|
||||||
|
|
|
@ -1,4 +1,6 @@
|
||||||
class RemovePeriodsAtEndsOfUsernames < ActiveRecord::Migration
|
class RemovePeriodsAtEndsOfUsernames < ActiveRecord::Migration
|
||||||
|
include Gitlab::ShellAdapter
|
||||||
|
|
||||||
class Namespace < ActiveRecord::Base
|
class Namespace < ActiveRecord::Base
|
||||||
class << self
|
class << self
|
||||||
def by_path(path)
|
def by_path(path)
|
||||||
|
@ -6,6 +8,7 @@ class RemovePeriodsAtEndsOfUsernames < ActiveRecord::Migration
|
||||||
end
|
end
|
||||||
|
|
||||||
def clean_path(path)
|
def clean_path(path)
|
||||||
|
path = path.dup
|
||||||
path.gsub!(/@.*\z/, "")
|
path.gsub!(/@.*\z/, "")
|
||||||
path.gsub!(/\.git\z/, "")
|
path.gsub!(/\.git\z/, "")
|
||||||
path.gsub!(/\A-/, "")
|
path.gsub!(/\A-/, "")
|
||||||
|
@ -25,15 +28,49 @@ class RemovePeriodsAtEndsOfUsernames < ActiveRecord::Migration
|
||||||
end
|
end
|
||||||
|
|
||||||
def up
|
def up
|
||||||
|
changed_paths = {}
|
||||||
|
|
||||||
select_all("SELECT id, username FROM users WHERE username LIKE '%.'").each do |user|
|
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 users SET username = '#{username}' WHERE id = #{user["id"]}"
|
||||||
execute "UPDATE namespaces SET path = '#{username}', name = '#{username}' WHERE type = NULL AND owner_id = #{user["id"]}"
|
execute "UPDATE namespaces SET path = '#{username}', name = '#{username}' WHERE type = NULL AND owner_id = #{user["id"]}"
|
||||||
end
|
end
|
||||||
|
|
||||||
select_all("SELECT id, path FROM namespaces WHERE type = 'Group' AND path LIKE '%.'").each do |group|
|
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"]}"
|
execute "UPDATE namespaces SET path = '#{path}' WHERE id = #{group["id"]}"
|
||||||
end
|
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
|
||||||
end
|
end
|
||||||
|
|
|
@ -33,8 +33,6 @@ describe Namespace do
|
||||||
it { is_expected.to respond_to(:to_param) }
|
it { is_expected.to respond_to(:to_param) }
|
||||||
end
|
end
|
||||||
|
|
||||||
it { expect(Namespace.global_id).to eq('GLN') }
|
|
||||||
|
|
||||||
describe :to_param do
|
describe :to_param do
|
||||||
it { expect(namespace.to_param).to eq(namespace.path) }
|
it { expect(namespace.to_param).to eq(namespace.path) }
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in New Issue