diff options
author | Toon Claes <toon@gitlab.com> | 2018-10-12 14:40:44 +0200 |
---|---|---|
committer | Toon Claes <toon@gitlab.com> | 2018-11-27 22:48:54 +0100 |
commit | ffdb3f26e7f8f9b62fd32b52c30edf167c760793 (patch) | |
tree | 9f9db9b7a9caf354405a3cd297e6a437da12fa9a /db | |
parent | 6c83c2d8b9305fe67fe31cf944c9d83cdbb00b74 (diff) | |
download | gitlab-ce-ffdb3f26e7f8f9b62fd32b52c30edf167c760793.tar.gz |
Migration to write fullpath in all repository configs
In https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/16027 it was
added to write `gitlab.fullpath` in the git config of all
repositories. But this only writes them on move or migrate to hashed
storage.
This adds a migration that writes the fullpath to all the
repositories.
Closes https://gitlab.com/gitlab-org/gitlab-ce/issues/41776
Diffstat (limited to 'db')
-rw-r--r-- | db/post_migrate/20181010133639_backfill_store_project_full_path_in_repo.rb | 136 |
1 files changed, 136 insertions, 0 deletions
diff --git a/db/post_migrate/20181010133639_backfill_store_project_full_path_in_repo.rb b/db/post_migrate/20181010133639_backfill_store_project_full_path_in_repo.rb new file mode 100644 index 00000000000..1e2e4527d2b --- /dev/null +++ b/db/post_migrate/20181010133639_backfill_store_project_full_path_in_repo.rb @@ -0,0 +1,136 @@ +# frozen_string_literal: true + +class BackfillStoreProjectFullPathInRepo < ActiveRecord::Migration + include Gitlab::Database::MigrationHelpers + + DOWNTIME = false + + class Repository + attr_reader :storage + + def initialize(storage, relative_path) + @storage = storage + @relative_path = relative_path + end + + def gitaly_repository + Gitaly::Repository.new(storage_name: @storage, relative_path: @relative_path) + end + end + + module Storage + class HashedProject + attr_accessor :project + + ROOT_PATH_PREFIX = '@hashed'.freeze + + def initialize(project) + @project = project + end + + def disk_path + "#{ROOT_PATH_PREFIX}/#{disk_hash[0..1]}/#{disk_hash[2..3]}/#{disk_hash}" + end + + def disk_hash + @disk_hash ||= Digest::SHA2.hexdigest(project.id.to_s) if project.id + end + end + + class LegacyProject + attr_accessor :project + + def initialize(project) + @project = project + end + + def disk_path + project.full_path + end + end + end + + module Routable + extend ActiveSupport::Concern + + def full_path + @full_path ||= build_full_path + end + + def build_full_path + if parent && path + parent.full_path + '/' + path + else + path + end + end + end + + class Namespace < ActiveRecord::Base + self.table_name = 'namespaces' + + include Routable + + belongs_to :parent, class_name: "Namespace" + end + + class Project < ActiveRecord::Base + self.table_name = 'projects' + + include Routable + include EachBatch + + FULLPATH_CONFIG_KEY = 'gitlab.fullpath' + + belongs_to :namespace + delegate :disk_path, to: :storage + alias_method :parent, :namespace + + def add_fullpath_config + entries = { FULLPATH_CONFIG_KEY => full_path } + + repository_service.set_config(entries) + end + + def remove_fullpath_config + repository_service.delete_config([FULLPATH_CONFIG_KEY]) + end + + def storage + @storage ||= + if hashed_storage? + Storage::HashedProject.new(self) + else + Storage::LegacyProject.new(self) + end + end + + def hashed_storage? + self.storage_version && self.storage_version >= 1 + end + + def repository + @repository ||= Repository.new(repository_storage, disk_path + '.git') + end + + def repository_service + @repository_service ||= Gitlab::GitalyClient::RepositoryService.new(repository) + end + end + + def up + Project.each_batch do |batch| + batch.each do |project| + project.add_fullpath_config + end + end + end + + def down + Project.each_batch do |batch| + batch.each do |project| + project.remove_fullpath_config + end + end + end +end |