diff options
author | Bob Van Landuyt <bob@gitlab.com> | 2017-06-06 17:24:32 +0200 |
---|---|---|
committer | Bob Van Landuyt <bob@vanlanduyt.co> | 2017-06-26 17:49:30 +0200 |
commit | 0faff42d7cc62dba50ca99ab1bc034c285311409 (patch) | |
tree | 8b92d208c13fa80410248ac4c7ce1b1135bbf1c7 /lib/gitlab/database | |
parent | 3e84b6336f3d61ff56e3e8ef5cc5d8ca08ef0432 (diff) | |
download | gitlab-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.rb | 36 | ||||
-rw-r--r-- | lib/gitlab/database/rename_reserved_paths_migration/v1/rename_projects.rb | 19 |
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, |