summaryrefslogtreecommitdiff
path: root/lib/gitlab/database
diff options
context:
space:
mode:
authorBob Van Landuyt <bob@gitlab.com>2017-06-06 17:24:32 +0200
committerBob Van Landuyt <bob@vanlanduyt.co>2017-06-26 17:49:30 +0200
commit0faff42d7cc62dba50ca99ab1bc034c285311409 (patch)
tree8b92d208c13fa80410248ac4c7ce1b1135bbf1c7 /lib/gitlab/database
parent3e84b6336f3d61ff56e3e8ef5cc5d8ca08ef0432 (diff)
downloadgitlab-ce-0faff42d7cc62dba50ca99ab1bc034c285311409.tar.gz
Add methods to revert project renames
Diffstat (limited to 'lib/gitlab/database')
-rw-r--r--lib/gitlab/database/rename_reserved_paths_migration/v1/rename_base.rb36
-rw-r--r--lib/gitlab/database/rename_reserved_paths_migration/v1/rename_projects.rb19
2 files changed, 49 insertions, 6 deletions
diff --git a/lib/gitlab/database/rename_reserved_paths_migration/v1/rename_base.rb b/lib/gitlab/database/rename_reserved_paths_migration/v1/rename_base.rb
index a8febf4ec62..29f21b08e6c 100644
--- a/lib/gitlab/database/rename_reserved_paths_migration/v1/rename_base.rb
+++ b/lib/gitlab/database/rename_reserved_paths_migration/v1/rename_base.rb
@@ -7,6 +7,7 @@ module Gitlab
delegate :update_column_in_batches,
:replace_sql,
+ :say,
to: :migration
def initialize(paths, migration)
@@ -26,13 +27,18 @@ module Gitlab
new_path = rename_path(namespace_path, old_path)
new_full_path = join_routable_path(namespace_path, new_path)
+ perform_rename(routable, old_full_path, new_full_path)
+
+ [old_full_path, new_full_path]
+ end
+
+ def perform_rename(routable, old_full_path, new_full_path)
# skips callbacks & validations
- routable.class.where(id: routable)
- .update_all(path: new_path)
+ new_path = new_full_path.split('/').last
+ routable.class.where(id: routable).
+ update_all(path: new_path)
rename_routes(old_full_path, new_full_path)
-
- [old_full_path, new_full_path]
end
def rename_routes(old_full_path, new_full_path)
@@ -86,7 +92,10 @@ module Gitlab
def move_folders(directory, old_relative_path, new_relative_path)
old_path = File.join(directory, old_relative_path)
- return unless File.directory?(old_path)
+ unless File.directory?(old_path)
+ say "#{old_path} doesn't exist, skipping"
+ return
+ end
new_path = File.join(directory, new_relative_path)
FileUtils.mv(old_path, new_path)
@@ -115,10 +124,25 @@ module Gitlab
end
def track_rename(type, old_path, new_path)
- key = "rename:#{migration.version}:#{type}"
+ key = redis_key_for_type(type)
Gitlab::Redis.with { |redis| redis.lpush(key, [old_path, new_path].to_json) }
end
+ def reverts_for_type(type)
+ key = redis_key_for_type(type)
+ Gitlab::Redis.with do |redis|
+ while rename_info = redis.lpop(key)
+ path_before_rename, path_after_rename = JSON.parse(rename_info)
+ say "renaming #{type} from #{path_after_rename} back to #{path_before_rename}"
+ yield(path_before_rename, path_after_rename)
+ end
+ end
+ end
+
+ def redis_key_for_type(type)
+ "rename:#{migration.version}:#{type}"
+ end
+
def file_storage?
CarrierWave::Uploader::Base.storage == CarrierWave::Storage::File
end
diff --git a/lib/gitlab/database/rename_reserved_paths_migration/v1/rename_projects.rb b/lib/gitlab/database/rename_reserved_paths_migration/v1/rename_projects.rb
index 59e47120159..1d2a41d91bb 100644
--- a/lib/gitlab/database/rename_reserved_paths_migration/v1/rename_projects.rb
+++ b/lib/gitlab/database/rename_reserved_paths_migration/v1/rename_projects.rb
@@ -18,12 +18,31 @@ module Gitlab
track_rename('project', old_full_path, new_full_path)
+ move_project_folders(project, old_full_path, new_full_path)
+ end
+
+ def move_project_folders(project, old_full_path, new_full_path)
move_repository(project, old_full_path, new_full_path)
move_repository(project, "#{old_full_path}.wiki", "#{new_full_path}.wiki")
move_uploads(old_full_path, new_full_path)
move_pages(old_full_path, new_full_path)
end
+ def revert_renames
+ reverts_for_type('project') do |path_before_rename, current_path|
+ matches_path = MigrationClasses::Route.arel_table[:path].matches(current_path)
+ project = MigrationClasses::Project.joins(:route)
+ .where(matches_path).first
+ if project
+ perform_rename(project, current_path, path_before_rename)
+
+ move_project_folders(project, current_path, path_before_rename)
+ else
+ say "Couldn't rename project##{project.id} from #{current_path} back to #{path_before_rename}, project no longer exists"
+ end
+ end
+ end
+
def move_repository(project, old_path, new_path)
unless gitlab_shell.mv_repository(project.repository_storage_path,
old_path,