summaryrefslogtreecommitdiff
path: root/lib/gitlab/background_migration/populate_untracked_uploads.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/gitlab/background_migration/populate_untracked_uploads.rb')
-rw-r--r--lib/gitlab/background_migration/populate_untracked_uploads.rb64
1 files changed, 43 insertions, 21 deletions
diff --git a/lib/gitlab/background_migration/populate_untracked_uploads.rb b/lib/gitlab/background_migration/populate_untracked_uploads.rb
index ea04484c6a1..802b661886b 100644
--- a/lib/gitlab/background_migration/populate_untracked_uploads.rb
+++ b/lib/gitlab/background_migration/populate_untracked_uploads.rb
@@ -1,12 +1,18 @@
+# frozen_string_literal: true
+
module Gitlab
module BackgroundMigration
- class PopulateUntrackedUploads
- class UntrackedFile < ActiveRecord::Base
+ # This class processes a batch of rows in `untracked_files_for_uploads` by
+ # adding each file to the `uploads` table if it does not exist.
+ class PopulateUntrackedUploads # rubocop:disable Metrics/ClassLength
+ # This class is responsible for producing the attributes necessary to
+ # track an uploaded file in the `uploads` table.
+ class UntrackedFile < ActiveRecord::Base # rubocop:disable Metrics/ClassLength, Metrics/LineLength
self.table_name = 'untracked_files_for_uploads'
# Ends with /:random_hex/:filename
- FILE_UPLOADER_PATH_PATTERN = %r{/\h+/[^/]+\z}
- FILE_UPLOADER_CAPTURE_FULL_PATH_PATTERN = %r{\A(.+)#{FILE_UPLOADER_PATH_PATTERN}}
+ FILE_UPLOADER_PATH = %r{/\h+/[^/]+\z}
+ FULL_PATH_CAPTURE = %r{\A(.+)#{FILE_UPLOADER_PATH}}
# These regex patterns are tested against a relative path, relative to
# the upload directory.
@@ -44,7 +50,7 @@ module Gitlab
model_type: 'Project'
},
{
- pattern: FILE_UPLOADER_PATH_PATTERN,
+ pattern: FILE_UPLOADER_PATH,
uploader: 'FileUploader',
model_type: 'Project'
}
@@ -63,13 +69,14 @@ module Gitlab
def upload_path
# UntrackedFile#path is absolute, but Upload#path depends on uploader
- @upload_path ||= if uploader == 'FileUploader'
- # Path relative to project directory in uploads
- matchd = path_relative_to_upload_dir.match(FILE_UPLOADER_PATH_PATTERN)
- matchd[0].sub(%r{\A/}, '') # remove leading slash
- else
- path
- end
+ @upload_path ||=
+ if uploader == 'FileUploader'
+ # Path relative to project directory in uploads
+ matchd = path_relative_to_upload_dir.match(FILE_UPLOADER_PATH)
+ matchd[0].sub(%r{\A/}, '') # remove leading slash
+ else
+ path
+ end
end
def uploader
@@ -83,7 +90,8 @@ module Gitlab
def model_id
return @model_id if defined?(@model_id)
- matchd = path_relative_to_upload_dir.match(matching_pattern_map[:pattern])
+ pattern = matching_pattern_map[:pattern]
+ matchd = path_relative_to_upload_dir.match(pattern)
# If something is captured (matchd[1] is not nil), it is a model_id
# Only the FileUploader pattern will not match an ID
@@ -105,14 +113,20 @@ module Gitlab
path_relative_to_upload_dir.match(path_pattern_map[:pattern])
end
- raise "Unknown upload path pattern \"#{path}\"" unless @matching_pattern_map
+ unless @matching_pattern_map
+ raise "Unknown upload path pattern \"#{path}\""
+ end
@matching_pattern_map
end
def file_uploader_model_id
- matchd = path_relative_to_upload_dir.match(FILE_UPLOADER_CAPTURE_FULL_PATH_PATTERN)
- raise "Could not capture project full_path from a FileUploader path: \"#{path_relative_to_upload_dir}\"" unless matchd
+ matchd = path_relative_to_upload_dir.match(FULL_PATH_CAPTURE)
+ not_found_msg = <<~MSG
+ Could not capture project full_path from a FileUploader path:
+ "#{path_relative_to_upload_dir}"
+ MSG
+ raise not_found_msg unless matchd
full_path = matchd[1]
project = Project.find_by_full_path(full_path)
@@ -123,7 +137,8 @@ module Gitlab
# Not including a leading slash
def path_relative_to_upload_dir
- base = %r{\A#{Regexp.escape(Gitlab::BackgroundMigration::PrepareUntrackedUploads::RELATIVE_UPLOAD_DIR)}/}
+ upload_dir = Gitlab::BackgroundMigration::PrepareUntrackedUploads::RELATIVE_UPLOAD_DIR # rubocop:disable Metrics/LineLength
+ base = %r{\A#{Regexp.escape(upload_dir)}/}
@path_relative_to_upload_dir ||= path.sub(base, '')
end
@@ -132,6 +147,7 @@ module Gitlab
end
end
+ # This class is used to query the `uploads` table.
class Upload < ActiveRecord::Base
self.table_name = 'uploads'
end
@@ -192,8 +208,10 @@ module Gitlab
end
ids.each do |model_type, model_ids|
- found_ids = Object.const_get(model_type).where(id: model_ids.uniq).pluck(:id)
- ids[model_type] = ids[model_type] - found_ids # replace with deleted ids
+ model_class = Object.const_get(model_type)
+ found_ids = model_class.where(id: model_ids.uniq).pluck(:id)
+ deleted_ids = ids[model_type] - found_ids
+ ids[model_type] = deleted_ids
end
ids
@@ -204,11 +222,15 @@ module Gitlab
file.to_h.merge(created_at: 'NOW()')
end
- Gitlab::Database.bulk_insert('uploads', rows, disable_quote: :created_at)
+ Gitlab::Database.bulk_insert('uploads',
+ rows,
+ disable_quote: :created_at)
end
def drop_temp_table_if_finished
- UntrackedFile.connection.drop_table(:untracked_files_for_uploads) if UntrackedFile.all.empty?
+ if UntrackedFile.all.empty?
+ UntrackedFile.connection.drop_table(:untracked_files_for_uploads)
+ end
end
end
end