Refactor common checks in tootctl media remove-orphans (#32720)
				
					
				
			This commit is contained in:
		@@ -6,6 +6,8 @@ module Mastodon::CLI
 | 
			
		||||
  class Media < Base
 | 
			
		||||
    include ActionView::Helpers::NumberHelper
 | 
			
		||||
 | 
			
		||||
    class UnrecognizedOrphanType < StandardError; end
 | 
			
		||||
 | 
			
		||||
    VALID_PATH_SEGMENTS_SIZE = [7, 10].freeze
 | 
			
		||||
 | 
			
		||||
    option :days, type: :numeric, default: 7, aliases: [:d]
 | 
			
		||||
@@ -120,23 +122,10 @@ module Mastodon::CLI
 | 
			
		||||
            object.acl.put(acl: s3_permissions) if options[:fix_permissions] && !dry_run?
 | 
			
		||||
 | 
			
		||||
            path_segments = object.key.split('/')
 | 
			
		||||
            path_segments.delete('cache')
 | 
			
		||||
 | 
			
		||||
            unless VALID_PATH_SEGMENTS_SIZE.include?(path_segments.size)
 | 
			
		||||
              progress.log(pastel.yellow("Unrecognized file found: #{object.key}"))
 | 
			
		||||
              next
 | 
			
		||||
            end
 | 
			
		||||
 | 
			
		||||
            model_name      = path_segments.first.classify
 | 
			
		||||
            attachment_name = path_segments[1].singularize
 | 
			
		||||
            record_id       = path_segments[2...-2].join.to_i
 | 
			
		||||
            file_name       = path_segments.last
 | 
			
		||||
            record          = record_map.dig(model_name, record_id)
 | 
			
		||||
            attachment      = record&.public_send(attachment_name)
 | 
			
		||||
 | 
			
		||||
            progress.increment
 | 
			
		||||
 | 
			
		||||
            next unless attachment.blank? || !attachment.variant?(file_name)
 | 
			
		||||
            next unless orphaned_file?(path_segments, record_map)
 | 
			
		||||
 | 
			
		||||
            begin
 | 
			
		||||
              object.delete unless dry_run?
 | 
			
		||||
@@ -148,6 +137,8 @@ module Mastodon::CLI
 | 
			
		||||
            rescue => e
 | 
			
		||||
              progress.log(pastel.red("Error processing #{object.key}: #{e}"))
 | 
			
		||||
            end
 | 
			
		||||
          rescue UnrecognizedOrphanType
 | 
			
		||||
            progress.log(pastel.yellow("Unrecognized file found: #{object.key}"))
 | 
			
		||||
          end
 | 
			
		||||
        end
 | 
			
		||||
      when :fog
 | 
			
		||||
@@ -165,26 +156,10 @@ module Mastodon::CLI
 | 
			
		||||
          key = path.gsub("#{root_path}#{File::SEPARATOR}", '')
 | 
			
		||||
 | 
			
		||||
          path_segments = key.split(File::SEPARATOR)
 | 
			
		||||
          path_segments.delete('cache')
 | 
			
		||||
 | 
			
		||||
          unless VALID_PATH_SEGMENTS_SIZE.include?(path_segments.size)
 | 
			
		||||
            progress.log(pastel.yellow("Unrecognized file found: #{key}"))
 | 
			
		||||
            next
 | 
			
		||||
          end
 | 
			
		||||
 | 
			
		||||
          model_name      = path_segments.first.classify
 | 
			
		||||
          record_id       = path_segments[2...-2].join.to_i
 | 
			
		||||
          attachment_name = path_segments[1].singularize
 | 
			
		||||
          file_name       = path_segments.last
 | 
			
		||||
 | 
			
		||||
          next unless PRELOADED_MODELS.include?(model_name)
 | 
			
		||||
 | 
			
		||||
          record     = model_name.constantize.find_by(id: record_id)
 | 
			
		||||
          attachment = record&.public_send(attachment_name)
 | 
			
		||||
 | 
			
		||||
          progress.increment
 | 
			
		||||
 | 
			
		||||
          next unless attachment.blank? || !attachment.variant?(file_name)
 | 
			
		||||
          next unless orphaned_file?(path_segments)
 | 
			
		||||
 | 
			
		||||
          begin
 | 
			
		||||
            size = File.size(path)
 | 
			
		||||
@@ -205,6 +180,8 @@ module Mastodon::CLI
 | 
			
		||||
          rescue => e
 | 
			
		||||
            progress.log(pastel.red("Error processing #{key}: #{e}"))
 | 
			
		||||
          end
 | 
			
		||||
        rescue UnrecognizedOrphanType
 | 
			
		||||
          progress.log(pastel.yellow("Unrecognized file found: #{path}"))
 | 
			
		||||
        end
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
@@ -364,5 +341,23 @@ module Mastodon::CLI
 | 
			
		||||
        model_map[model_name] = model_name.constantize.where(id: record_ids).index_by(&:id)
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    def orphaned_file?(path_segments, record_map = nil)
 | 
			
		||||
      path_segments.delete('cache')
 | 
			
		||||
 | 
			
		||||
      raise UnrecognizedOrphanType unless VALID_PATH_SEGMENTS_SIZE.include?(path_segments.size)
 | 
			
		||||
 | 
			
		||||
      model_name      = path_segments.first.classify
 | 
			
		||||
      record_id       = path_segments[2...-2].join.to_i
 | 
			
		||||
      attachment_name = path_segments[1].singularize
 | 
			
		||||
      file_name       = path_segments.last
 | 
			
		||||
 | 
			
		||||
      raise UnrecognizedOrphanType unless PRELOADED_MODELS.include?(model_name)
 | 
			
		||||
 | 
			
		||||
      record     = record_map.present? ? record_map.dig(model_name, record_id) : model_name.constantize.find_by(id: record_id)
 | 
			
		||||
      attachment = record&.public_send(attachment_name)
 | 
			
		||||
 | 
			
		||||
      attachment.blank? || !attachment.variant?(file_name)
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user