53 lines
1.7 KiB
Ruby
53 lines
1.7 KiB
Ruby
|
# frozen_string_literal: true
|
||
|
|
||
|
module Projects
|
||
|
# The CleanupService removes data from the project repository following a
|
||
|
# BFG rewrite: https://rtyley.github.io/bfg-repo-cleaner/
|
||
|
#
|
||
|
# Before executing this service, all refs rewritten by BFG should have been
|
||
|
# pushed to the repository
|
||
|
class CleanupService < BaseService
|
||
|
NoUploadError = StandardError.new("Couldn't find uploaded object map")
|
||
|
|
||
|
include Gitlab::Utils::StrongMemoize
|
||
|
|
||
|
# Attempt to clean up the project following the push. Warning: this is
|
||
|
# destructive!
|
||
|
#
|
||
|
# path is the path of an upload of a BFG object map file. It contains a line
|
||
|
# per rewritten object, with the old and new SHAs space-separated. It can be
|
||
|
# used to update or remove content that references the objects that BFG has
|
||
|
# altered
|
||
|
#
|
||
|
# Currently, only the project repository is modified by this service, but we
|
||
|
# may wish to modify other data sources in the future.
|
||
|
def execute
|
||
|
apply_bfg_object_map!
|
||
|
|
||
|
# Remove older objects that are no longer referenced
|
||
|
GitGarbageCollectWorker.new.perform(project.id, :gc)
|
||
|
|
||
|
# The cache may now be inaccurate, and holding onto it could prevent
|
||
|
# bugs assuming the presence of some object from manifesting for some
|
||
|
# time. Better to feel the pain immediately.
|
||
|
project.repository.expire_all_method_caches
|
||
|
|
||
|
project.bfg_object_map.remove!
|
||
|
end
|
||
|
|
||
|
private
|
||
|
|
||
|
def apply_bfg_object_map!
|
||
|
raise NoUploadError unless project.bfg_object_map.exists?
|
||
|
|
||
|
project.bfg_object_map.open do |io|
|
||
|
repository_cleaner.apply_bfg_object_map(io)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def repository_cleaner
|
||
|
@repository_cleaner ||= Gitlab::Git::RepositoryCleaner.new(repository.raw)
|
||
|
end
|
||
|
end
|
||
|
end
|