summaryrefslogtreecommitdiff
path: root/db
diff options
context:
space:
mode:
authorDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>2016-12-21 19:31:30 +0200
committerDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>2016-12-24 19:39:51 +0200
commitd72b40423c6736fd24ef4371604897871a1b3acc (patch)
tree059e017d8115f4dbc3d74459133c30db97a03afd /db
parent79ce691d71e8fcbd198f9c228bc7db1bfd2b6e03 (diff)
downloadgitlab-ce-d72b40423c6736fd24ef4371604897871a1b3acc.tar.gz
Rename projects with reserved path names
We cant have project with name 'project' or 'tree' anymore. This merge request containts a migration that will find and rename all projects using reserved names by adding N digit to the end of the name. Signed-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
Diffstat (limited to 'db')
-rw-r--r--db/post_migrate/20161221153951_rename_reserved_project_names.rb76
-rw-r--r--db/schema.rb2
2 files changed, 77 insertions, 1 deletions
diff --git a/db/post_migrate/20161221153951_rename_reserved_project_names.rb b/db/post_migrate/20161221153951_rename_reserved_project_names.rb
new file mode 100644
index 00000000000..7e7342d80f9
--- /dev/null
+++ b/db/post_migrate/20161221153951_rename_reserved_project_names.rb
@@ -0,0 +1,76 @@
+class RenameReservedProjectNames < ActiveRecord::Migration
+ include Gitlab::Database::MigrationHelpers
+ include Gitlab::ShellAdapter
+
+ DOWNTIME = false
+
+ class Project < ActiveRecord::Base; end
+
+ def up
+ threads = reserved_projects.each_slice(100).map do |slice|
+ Thread.new do
+ rename_projects(slice)
+ end
+ end
+
+ threads.each(&:join)
+ end
+
+ def down
+ # nothing to do here
+ end
+
+ private
+
+ def reserved_projects
+ select_all("SELECT p.id, p.path, p.repository_storage, 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 IN (
+ '.well-known', 'all', 'assets', 'files', 'groups', 'hooks', 'issues',
+ 'merge_requests', 'new', 'profile', 'projects', 'public', 'repository',
+ 'robots.txt', 's', 'snippets', 'teams', 'u', 'unsubscribes', 'users',
+ 'tree', 'commits', 'wikis', 'new', 'edit', 'create', 'update', 'logs_tree',
+ 'preview', 'blob', 'blame', 'raw', 'files', 'create_dir', 'find_file')")
+ end
+
+ def route_exists?(full_path)
+ select_all("SELECT id, path FROM routes WHERE path = '#{quote_string(full_path)}'").present?
+ end
+
+ # Adds number to the end of the path that is not taken by other route
+ def rename_path(namespace_path, path_was)
+ counter = 0
+ path = "#{path_was}#{counter}"
+
+ while route_exists?("#{namespace_path}/#{path}")
+ counter += 1
+ path = "#{path_was}#{counter}"
+ end
+
+ path
+ end
+
+ def rename_projects(projects)
+ projects.each do |row|
+ id = row['id']
+ path_was = row['path']
+ namespace_path = row['namespace_path']
+ path = rename_path(namespace_path, path_was)
+ project = Project.find_by(id: id)
+
+ begin
+ # Because project path update is quite complex operation we can't safely
+ # copy-paste all code from GitLab. As exception we use Rails code here
+ if project &&
+ project.respond_to?(:update_attributes) &&
+ project.update_attributes(path: path) &&
+ project.respond_to?(:rename_repo)
+
+ project.rename_repo
+ end
+ rescue => e
+ Rails.logger.error "Exception when rename project #{id}: #{e.message}"
+ end
+ end
+ end
+end
diff --git a/db/schema.rb b/db/schema.rb
index 05b6c807660..e48ce9f4ca5 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -11,7 +11,7 @@
#
# It's strongly recommended that you check this file into your version control system.
-ActiveRecord::Schema.define(version: 20161221140236) do
+ActiveRecord::Schema.define(version: 20161221153951) do
# These are extensions that must be enabled in order to support this database
enable_extension "plpgsql"