diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2023-12-19 14:01:45 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2023-12-19 14:01:45 +0300 |
commit | 9297025d0b7ddf095eb618dfaaab2ff8f2018d8b (patch) | |
tree | 865198c01d1824a9b098127baa3ab980c9cd2c06 /db/post_migrate/20231201171229_detect_and_fix_duplicate_organizations_path.rb | |
parent | 6372471f43ee03c05a7c1f8b0c6ac6b8a7431dbe (diff) |
Add latest changes from gitlab-org/gitlab@16-7-stable-eev16.7.0-rc42
Diffstat (limited to 'db/post_migrate/20231201171229_detect_and_fix_duplicate_organizations_path.rb')
-rw-r--r-- | db/post_migrate/20231201171229_detect_and_fix_duplicate_organizations_path.rb | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/db/post_migrate/20231201171229_detect_and_fix_duplicate_organizations_path.rb b/db/post_migrate/20231201171229_detect_and_fix_duplicate_organizations_path.rb new file mode 100644 index 00000000000..3b63cfef5ea --- /dev/null +++ b/db/post_migrate/20231201171229_detect_and_fix_duplicate_organizations_path.rb @@ -0,0 +1,35 @@ +# frozen_string_literal: true + +class DetectAndFixDuplicateOrganizationsPath < Gitlab::Database::Migration[2.2] + restrict_gitlab_migration gitlab_schema: :gitlab_main + milestone '16.7' + + module Organizations + class Organization < Gitlab::Database::Migration[2.2]::MigrationRecord + end + end + + def up + duplicate_paths = Organizations::Organization.group("lower(path)").having("count(path) > 1").count.keys + duplicate_paths.each do |dup_path| + # the first one found is the 'winner' here and so we'll drop it an only focus on others + Organizations::Organization.where('lower(path) = ?', dup_path).order(id: :asc).drop(1).each do |dup_path_record| + dup_path_record.update!(path: clean_path(dup_path_record.path)) + end + end + end + + def down + # no-op no reversal required here. + end + + private + + def clean_path(path) + slug = Gitlab::Slug::Path.new(path).generate + path = Namespaces::RandomizedSuffixPath.new(slug) + Gitlab::Utils::Uniquify.new.string(path) do |s| + Organizations::Organization.find_by('lower(path) = :value', value: s.downcase) + end + end +end |