summaryrefslogtreecommitdiff
path: root/lib/gitlab/background_migration/fix_user_namespace_names.rb
diff options
context:
space:
mode:
authorBob Van Landuyt <bob@vanlanduyt.co>2019-06-28 20:00:52 +0200
committerBob Van Landuyt <bob@vanlanduyt.co>2019-07-09 18:09:45 +0200
commit82e6ed310b1bb5e7faf44742defaf65b74926195 (patch)
treeb5b0e7fc1dbc539e4c36064a4e3e9da0e0e6a3f5 /lib/gitlab/background_migration/fix_user_namespace_names.rb
parentf138acb9866fa86f16e1db14c23e48c2e9f2b38b (diff)
downloadgitlab-ce-82e6ed310b1bb5e7faf44742defaf65b74926195.tar.gz
Fix incorrect namespaces & route for user-routes
This fixes the `Namespace#name` and `Route#name` for all user namespaces and their personal projects in case they don't match the user name anymore. More info info in https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/23272
Diffstat (limited to 'lib/gitlab/background_migration/fix_user_namespace_names.rb')
-rw-r--r--lib/gitlab/background_migration/fix_user_namespace_names.rb68
1 files changed, 68 insertions, 0 deletions
diff --git a/lib/gitlab/background_migration/fix_user_namespace_names.rb b/lib/gitlab/background_migration/fix_user_namespace_names.rb
new file mode 100644
index 00000000000..1a207121be0
--- /dev/null
+++ b/lib/gitlab/background_migration/fix_user_namespace_names.rb
@@ -0,0 +1,68 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module BackgroundMigration
+ # This migration fixes the namespaces.name for all user-namespaces that have names
+ # that aren't equal to the users name.
+ # Then it uses the updated names of the namespaces to update the associated routes
+ # For more info see https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/23272
+ class FixUserNamespaceNames
+ def perform(from_id, to_id)
+ fix_namespace_names(from_id, to_id)
+ fix_namespace_route_names(from_id, to_id)
+ end
+
+ def fix_namespace_names(from_id, to_id)
+ ActiveRecord::Base.connection.execute <<~UPDATE_NAMESPACES
+ WITH namespaces_to_update AS (
+ SELECT
+ namespaces.id,
+ users.name AS correct_name
+ FROM
+ namespaces
+ INNER JOIN users ON namespaces.owner_id = users.id
+ WHERE
+ namespaces.type IS NULL
+ AND namespaces.id BETWEEN #{from_id} AND #{to_id}
+ AND namespaces.name != users.name
+ )
+ UPDATE
+ namespaces
+ SET
+ name = correct_name
+ FROM
+ namespaces_to_update
+ WHERE
+ namespaces.id = namespaces_to_update.id
+ UPDATE_NAMESPACES
+ end
+
+ def fix_namespace_route_names(from_id, to_id)
+ ActiveRecord::Base.connection.execute <<~ROUTES_UPDATE
+ WITH routes_to_update AS (
+ SELECT
+ routes.id,
+ users.name AS correct_name
+ FROM
+ routes
+ INNER JOIN namespaces ON routes.source_id = namespaces.id
+ INNER JOIN users ON namespaces.owner_id = users.id
+ WHERE
+ namespaces.type IS NULL
+ AND routes.source_type = 'Namespace'
+ AND namespaces.id BETWEEN #{from_id} AND #{to_id}
+ AND (routes.name != users.name OR routes.name IS NULL)
+ )
+ UPDATE
+ routes
+ SET
+ name = correct_name
+ FROM
+ routes_to_update
+ WHERE
+ routes_to_update.id = routes.id
+ ROUTES_UPDATE
+ end
+ end
+ end
+end