2018-11-13 07:27:31 +00:00
class RemoveDotAtomPathEndingOfProjects < ActiveRecord :: Migration [ 4 . 2 ]
2016-02-01 14:47:11 +00:00
include Gitlab :: ShellAdapter
2016-01-29 17:52:49 +00:00
class ProjectPath
2016-02-02 16:28:14 +00:00
attr_reader :old_path , :id , :namespace_path
2016-02-01 14:47:11 +00:00
2016-02-04 12:20:55 +00:00
def initialize ( old_path , id , namespace_path , namespace_id )
2016-01-29 17:52:49 +00:00
@old_path = old_path
2016-02-01 14:47:11 +00:00
@id = id
2016-02-02 16:28:14 +00:00
@namespace_path = namespace_path
2016-02-04 12:20:55 +00:00
@namespace_id = namespace_id
2016-01-29 17:52:49 +00:00
end
def clean_path
2016-02-04 12:20:55 +00:00
@_clean_path || = PathCleaner . clean ( @old_path , @namespace_id )
2016-01-29 17:52:49 +00:00
end
end
2016-02-01 14:47:11 +00:00
class PathCleaner
2016-02-04 12:20:55 +00:00
def initialize ( path , namespace_id )
@namespace_id = namespace_id
2016-01-29 17:52:49 +00:00
@path = path
end
def self . clean ( * args )
new ( * args ) . clean
end
def clean
path = cleaned_path
count = 0
while path_exists? ( path )
path = " #{ cleaned_path } #{ count } "
count += 1
end
path
end
2016-02-04 12:20:55 +00:00
private
2016-01-29 17:52:49 +00:00
def cleaned_path
2016-02-01 14:47:11 +00:00
@_cleaned_path || = @path . gsub ( / \ .atom \ z / , '-atom' )
2016-01-29 17:52:49 +00:00
end
def path_exists? ( path )
2016-02-04 12:20:55 +00:00
Project . find_by_path_and_namespace_id ( path , @namespace_id )
2016-01-29 17:52:49 +00:00
end
end
2016-02-01 14:47:11 +00:00
def projects_with_dot_atom
2016-02-04 17:38:11 +00:00
select_all ( " SELECT p.id, p.path, n.path as namespace_path, n.id as namespace_id FROM projects p inner join namespaces n on n.id = p.namespace_id WHERE p.path LIKE '%.atom' " )
2016-02-01 14:47:11 +00:00
end
2016-01-29 17:52:49 +00:00
def up
projects_with_dot_atom . each do | project |
2016-02-04 12:20:55 +00:00
project_path = ProjectPath . new ( project [ 'path' ] , project [ 'id' ] , project [ 'namespace_path' ] , project [ 'namespace_id' ] )
2016-02-02 16:28:14 +00:00
clean_path ( project_path ) if rename_project_repo ( project_path )
2016-01-29 17:52:49 +00:00
end
end
private
2016-02-01 14:47:11 +00:00
def clean_path ( project_path )
2016-02-04 14:35:03 +00:00
execute " UPDATE projects SET path = #{ sanitize ( project_path . clean_path ) } WHERE id = #{ project_path . id } "
2016-01-29 17:52:49 +00:00
end
2016-02-02 16:28:14 +00:00
def rename_project_repo ( project_path )
old_path_with_namespace = File . join ( project_path . namespace_path , project_path . old_path )
new_path_with_namespace = File . join ( project_path . namespace_path , project_path . clean_path )
gitlab_shell . mv_repository ( " #{ old_path_with_namespace } .wiki " , " #{ new_path_with_namespace } .wiki " )
gitlab_shell . mv_repository ( old_path_with_namespace , new_path_with_namespace )
2016-02-04 12:20:55 +00:00
rescue
false
2016-02-01 14:47:11 +00:00
end
2016-02-04 14:35:03 +00:00
def sanitize ( value )
ActiveRecord :: Base . connection . quote ( value )
end
2016-01-29 17:52:49 +00:00
end