fixed move project method in migration

This commit is contained in:
James Lopez 2016-02-02 17:28:14 +01:00
parent ae73e73bee
commit ecb174bfea
3 changed files with 15 additions and 35 deletions

View file

@ -2,11 +2,12 @@ class RemoveDotAtomPathEndingOfProjects < ActiveRecord::Migration
include Gitlab::ShellAdapter include Gitlab::ShellAdapter
class ProjectPath class ProjectPath
attr_reader :old_path, :id attr_reader :old_path, :id, :namespace_path
def initialize(old_path, id) def initialize(old_path, id, namespace_path)
@old_path = old_path @old_path = old_path
@id = id @id = id
@namespace_path = namespace_path
end end
def clean_path def clean_path
@ -43,48 +44,27 @@ class RemoveDotAtomPathEndingOfProjects < ActiveRecord::Migration
end end
def projects_with_dot_atom def projects_with_dot_atom
select_all("SELECT id, path FROM projects WHERE lower(path) LIKE '%.atom'") select_all("SELECT p.id, p.path, n.path as namespace_path FROM projects p inner join namespaces n on n.id = p.namespace_id WHERE lower(p.path) LIKE '%.atom'")
end end
def up def up
projects_with_dot_atom.each do |project| projects_with_dot_atom.each do |project|
binding.pry project_path = ProjectPath.new(project['path'], project['id'], project['namespace_path'])
project_path = ProjectPath.new(project['path'], project['id']) clean_path(project_path) if rename_project_repo(project_path)
clean_path(project_path) if move_path(project_path)
end end
end end
private private
def clean_path(project_path) def clean_path(project_path)
execute "UPDATE projects SET path = '#{project_path.clean_path}' WHERE id = #{project.id}" execute "UPDATE projects SET path = '#{project_path.clean_path}' WHERE id = #{project_path.id}"
end end
#TODO: Fix this def rename_project_repo(project_path)
def move_path(project_path) old_path_with_namespace = File.join(project_path.namespace_path, project_path.old_path)
# Based on RemovePeriodsAtEndsOfUsernames new_path_with_namespace = File.join(project_path.namespace_path, project_path.clean_path)
# Don't attempt to move if original path only contains periods.
return if project_path.clean_path =~ /\A\.+\z/ gitlab_shell.mv_repository("#{old_path_with_namespace}.wiki", "#{new_path_with_namespace}.wiki")
if gitlab_shell.mv_namespace(project_path.old_path, project_path.clean_path) gitlab_shell.mv_repository(old_path_with_namespace, new_path_with_namespace)
# 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(project_path.old_path)
# 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 avoid
# db changes in order to prevent out of sync between db and fs
false
end
end end
end end

View file

@ -11,7 +11,7 @@
# #
# It's strongly recommended that you check this file into your version control system. # It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema.define(version: 20160128233227) do ActiveRecord::Schema.define(version: 20160129135155) do
# These are extensions that must be enabled in order to support this database # These are extensions that must be enabled in order to support this database
enable_extension "plpgsql" enable_extension "plpgsql"

View file

@ -47,7 +47,7 @@ module Gitlab
# new_path - new project path with namespace # new_path - new project path with namespace
# #
# Ex. # Ex.
# mv_repository("gitlab/gitlab-ci", "randx/gitlab-ci-new.git") # mv_repository("gitlab/gitlab-ci", "randx/gitlab-ci-new")
# #
def mv_repository(path, new_path) def mv_repository(path, new_path)
Gitlab::Utils.system_silent([gitlab_shell_projects_path, 'mv-project', Gitlab::Utils.system_silent([gitlab_shell_projects_path, 'mv-project',