~cytrogen/masto-fe

ec9bc7e6047686328df47c2af88d251a196b38b2 — Matt Jankowski 2 years ago 3d253b9
Consistent usage of CLI `dry_run?` method (#25116)

M lib/mastodon/cli/accounts.rb => lib/mastodon/cli/accounts.rb +12 -18
@@ 217,7 217,6 @@ module Mastodon::CLI
        exit(1)
      end

      dry_run = options[:dry_run] ? ' (DRY RUN)' : ''
      account = nil

      if username.present?


@@ 234,9 233,9 @@ module Mastodon::CLI
        end
      end

      say("Deleting user with #{account.statuses_count} statuses, this might take a while...#{dry_run}")
      DeleteAccountService.new.call(account, reserve_email: false) unless options[:dry_run]
      say("OK#{dry_run}", :green)
      say("Deleting user with #{account.statuses_count} statuses, this might take a while...#{dry_run_mode_suffix}")
      DeleteAccountService.new.call(account, reserve_email: false) unless dry_run?
      say("OK#{dry_run_mode_suffix}", :green)
    end

    option :force, type: :boolean, aliases: [:f], description: 'Override public key check'


@@ 291,7 290,7 @@ module Mastodon::CLI
      Account.remote.select(:uri, 'count(*)').group(:uri).having('count(*) > 1').pluck(:uri).each do |uri|
        say("Duplicates found for #{uri}")
        begin
          ActivityPub::FetchRemoteAccountService.new.call(uri) unless options[:dry_run]
          ActivityPub::FetchRemoteAccountService.new.call(uri) unless dry_run?
        rescue => e
          say("Error processing #{uri}: #{e}", :red)
        end


@@ 332,7 331,6 @@ module Mastodon::CLI
    LONG_DESC
    def cull(*domains)
      skip_threshold = 7.days.ago
      dry_run        = options[:dry_run] ? ' (DRY RUN)' : ''
      skip_domains   = Concurrent::Set.new

      query = Account.remote.where(protocol: :activitypub)


@@ 350,7 348,7 @@ module Mastodon::CLI
        end

        if [404, 410].include?(code)
          DeleteAccountService.new.call(account, reserve_username: false) unless options[:dry_run]
          DeleteAccountService.new.call(account, reserve_username: false) unless dry_run?
          1
        else
          # Touch account even during dry run to avoid getting the account into the window again


@@ 358,7 356,7 @@ module Mastodon::CLI
        end
      end

      say("Visited #{processed} accounts, removed #{culled}#{dry_run}", :green)
      say("Visited #{processed} accounts, removed #{culled}#{dry_run_mode_suffix}", :green)

      unless skip_domains.empty?
        say('The following domains were not available during the check:', :yellow)


@@ 381,21 379,19 @@ module Mastodon::CLI
      specified with space-separated USERNAMES.
    LONG_DESC
    def refresh(*usernames)
      dry_run = options[:dry_run] ? ' (DRY RUN)' : ''

      if options[:domain] || options[:all]
        scope  = Account.remote
        scope  = scope.where(domain: options[:domain]) if options[:domain]

        processed, = parallelize_with_progress(scope) do |account|
          next if options[:dry_run]
          next if dry_run?

          account.reset_avatar!
          account.reset_header!
          account.save
        end

        say("Refreshed #{processed} accounts#{dry_run}", :green, true)
        say("Refreshed #{processed} accounts#{dry_run_mode_suffix}", :green, true)
      elsif !usernames.empty?
        usernames.each do |user|
          user, domain = user.split('@')


@@ 406,7 402,7 @@ module Mastodon::CLI
            exit(1)
          end

          next if options[:dry_run]
          next if dry_run?

          begin
            account.reset_avatar!


@@ 417,7 413,7 @@ module Mastodon::CLI
          end
        end

        say("OK#{dry_run}", :green)
        say("OK#{dry_run_mode_suffix}", :green)
      else
        say('No account(s) given', :red)
        exit(1)


@@ 568,8 564,6 @@ module Mastodon::CLI
      - not muted/blocked by us
    LONG_DESC
    def prune
      dry_run = options[:dry_run] ? ' (dry run)' : ''

      query = Account.remote.where.not(actor_type: %i(Application Service))
      query = query.where('NOT EXISTS (SELECT 1 FROM mentions WHERE account_id = accounts.id)')
      query = query.where('NOT EXISTS (SELECT 1 FROM favourites WHERE account_id = accounts.id)')


@@ 585,11 579,11 @@ module Mastodon::CLI
        next if account.suspended?
        next if account.silenced?

        account.destroy unless options[:dry_run]
        account.destroy unless dry_run?
        1
      end

      say("OK, pruned #{deleted} accounts#{dry_run}", :green)
      say("OK, pruned #{deleted} accounts#{dry_run_mode_suffix}", :green)
    end

    option :force, type: :boolean

M lib/mastodon/cli/domains.rb => lib/mastodon/cli/domains.rb +7 -8
@@ 34,7 34,6 @@ module Mastodon::CLI
      When the --purge-domain-blocks option is given, also purge matching domain blocks.
    LONG_DESC
    def purge(*domains)
      dry_run            = options[:dry_run] ? ' (DRY RUN)' : ''
      domains            = domains.map { |domain| TagManager.instance.normalize_domain(domain) }
      account_scope      = Account.none
      domain_block_scope = DomainBlock.none


@@ 79,23 78,23 @@ module Mastodon::CLI

      # Actually perform the deletions
      processed, = parallelize_with_progress(account_scope) do |account|
        DeleteAccountService.new.call(account, reserve_username: false, skip_side_effects: true) unless options[:dry_run]
        DeleteAccountService.new.call(account, reserve_username: false, skip_side_effects: true) unless dry_run?
      end

      say("Removed #{processed} accounts#{dry_run}", :green)
      say("Removed #{processed} accounts#{dry_run_mode_suffix}", :green)

      if options[:purge_domain_blocks]
        domain_block_count = domain_block_scope.count
        domain_block_scope.in_batches.destroy_all unless options[:dry_run]
        say("Removed #{domain_block_count} domain blocks#{dry_run}", :green)
        domain_block_scope.in_batches.destroy_all unless dry_run?
        say("Removed #{domain_block_count} domain blocks#{dry_run_mode_suffix}", :green)
      end

      custom_emojis_count = emoji_scope.count
      emoji_scope.in_batches.destroy_all unless options[:dry_run]
      emoji_scope.in_batches.destroy_all unless dry_run?

      Instance.refresh unless options[:dry_run]
      Instance.refresh unless dry_run?

      say("Removed #{custom_emojis_count} custom emojis#{dry_run}", :green)
      say("Removed #{custom_emojis_count} custom emojis#{dry_run_mode_suffix}", :green)
    end

    option :concurrency, type: :numeric, default: 50, aliases: [:c]

M lib/mastodon/cli/feeds.rb => lib/mastodon/cli/feeds.rb +4 -6
@@ 18,14 18,12 @@ module Mastodon::CLI
      Otherwise, a single user specified by USERNAME.
    LONG_DESC
    def build(username = nil)
      dry_run = options[:dry_run] ? '(DRY RUN)' : ''

      if options[:all] || username.nil?
        processed, = parallelize_with_progress(Account.joins(:user).merge(User.active)) do |account|
          PrecomputeFeedService.new.call(account) unless options[:dry_run]
          PrecomputeFeedService.new.call(account) unless dry_run?
        end

        say("Regenerated feeds for #{processed} accounts #{dry_run}", :green, true)
        say("Regenerated feeds for #{processed} accounts #{dry_run_mode_suffix}", :green, true)
      elsif username.present?
        account = Account.find_local(username)



@@ 34,9 32,9 @@ module Mastodon::CLI
          exit(1)
        end

        PrecomputeFeedService.new.call(account) unless options[:dry_run]
        PrecomputeFeedService.new.call(account) unless dry_run?

        say("OK #{dry_run}", :green, true)
        say("OK #{dry_run_mode_suffix}", :green, true)
      else
        say('No account(s) given', :red)
        exit(1)

M lib/mastodon/cli/helper.rb => lib/mastodon/cli/helper.rb +4 -0
@@ 15,6 15,10 @@ module Mastodon::CLI
      options[:dry_run]
    end

    def dry_run_mode_suffix
      dry_run? ? ' (DRY RUN)' : ''
    end

    def create_progress_bar(total = nil)
      ProgressBar.create(total: total, format: '%c/%u |%b%i| %e')
    end

M lib/mastodon/cli/main.rb => lib/mastodon/cli/main.rb +5 -6
@@ 94,7 94,7 @@ module Mastodon::CLI

      exit(1) unless prompt.ask('Type in the domain of the server to confirm:', required: true) == Rails.configuration.x.local_domain

      unless options[:dry_run]
      unless dry_run?
        prompt.warn('This operation WILL NOT be reversible. It can also take a long time.')
        prompt.warn('While the data won\'t be erased locally, the server will be in a BROKEN STATE afterwards.')
        prompt.warn('A running Sidekiq process is required. Do not shut it down until queues clear.')


@@ 104,12 104,11 @@ module Mastodon::CLI

      inboxes   = Account.inboxes
      processed = 0
      dry_run   = options[:dry_run] ? ' (DRY RUN)' : ''

      Setting.registrations_mode = 'none' unless options[:dry_run]
      Setting.registrations_mode = 'none' unless dry_run?

      if inboxes.empty?
        Account.local.without_suspended.in_batches.update_all(suspended_at: Time.now.utc, suspension_origin: :local) unless options[:dry_run]
        Account.local.without_suspended.in_batches.update_all(suspended_at: Time.now.utc, suspension_origin: :local) unless dry_run?
        prompt.ok('It seems like your server has not federated with anything')
        prompt.ok('You can shut it down and delete it any time')
        return


@@ 126,7 125,7 @@ module Mastodon::CLI

        json = Oj.dump(ActivityPub::LinkedDataSignature.new(payload).sign!(account))

        unless options[:dry_run]
        unless dry_run?
          ActivityPub::DeliveryWorker.push_bulk(inboxes, limit: 1_000) do |inbox_url|
            [json, account.id, inbox_url]
          end


@@ 140,7 139,7 @@ module Mastodon::CLI
      Account.local.without_suspended.find_each { |account| delete_account.call(account) }
      Account.local.suspended.joins(:deletion_request).find_each { |account| delete_account.call(account) }

      prompt.ok("Queued #{inboxes.size * processed} items into Sidekiq for #{processed} accounts#{dry_run}")
      prompt.ok("Queued #{inboxes.size * processed} items into Sidekiq for #{processed} accounts#{dry_run_mode_suffix}")
      prompt.ok('Wait until Sidekiq processes all items, then you can shut everything down and delete the data')
    rescue TTY::Reader::InputInterrupt
      exit(1)

M lib/mastodon/cli/media.rb => lib/mastodon/cli/media.rb +12 -15
@@ 35,12 35,12 @@ module Mastodon::CLI
        say('--prune-profiles and --remove-headers should not be specified simultaneously', :red, true)
        exit(1)
      end

      if options[:include_follows] && !(options[:prune_profiles] || options[:remove_headers])
        say('--include-follows can only be used with --prune-profiles or --remove-headers', :red, true)
        exit(1)
      end
      time_ago        = options[:days].days.ago
      dry_run         = options[:dry_run] ? ' (DRY RUN)' : ''
      time_ago = options[:days].days.ago

      if options[:prune_profiles] || options[:remove_headers]
        processed, aggregate = parallelize_with_progress(Account.remote.where({ last_webfingered_at: ..time_ago, updated_at: ..time_ago })) do |account|


@@ 51,7 51,7 @@ module Mastodon::CLI
          size = (account.header_file_size || 0)
          size += (account.avatar_file_size || 0) if options[:prune_profiles]

          unless options[:dry_run]
          unless dry_run?
            account.header.destroy
            account.avatar.destroy if options[:prune_profiles]
            account.save!


@@ 60,7 60,7 @@ module Mastodon::CLI
          size
        end

        say("Visited #{processed} accounts and removed profile media totaling #{number_to_human_size(aggregate)}#{dry_run}", :green, true)
        say("Visited #{processed} accounts and removed profile media totaling #{number_to_human_size(aggregate)}#{dry_run_mode_suffix}", :green, true)
      end

      unless options[:prune_profiles] || options[:remove_headers]


@@ 69,7 69,7 @@ module Mastodon::CLI

          size = (media_attachment.file_file_size || 0) + (media_attachment.thumbnail_file_size || 0)

          unless options[:dry_run]
          unless dry_run?
            media_attachment.file.destroy
            media_attachment.thumbnail.destroy
            media_attachment.save


@@ 78,7 78,7 @@ module Mastodon::CLI
          size
        end

        say("Removed #{processed} media attachments (approx. #{number_to_human_size(aggregate)})#{dry_run}", :green, true)
        say("Removed #{processed} media attachments (approx. #{number_to_human_size(aggregate)})#{dry_run_mode_suffix}", :green, true)
      end
    end



@@ 97,7 97,6 @@ module Mastodon::CLI
      progress        = create_progress_bar(nil)
      reclaimed_bytes = 0
      removed         = 0
      dry_run         = options[:dry_run] ? ' (DRY RUN)' : ''
      prefix          = options[:prefix]

      case Paperclip::Attachment.default_options[:storage]


@@ 123,7 122,7 @@ module Mastodon::CLI
          record_map = preload_records_from_mixed_objects(objects)

          objects.each do |object|
            object.acl.put(acl: s3_permissions) if options[:fix_permissions] && !options[:dry_run]
            object.acl.put(acl: s3_permissions) if options[:fix_permissions] && !dry_run?

            path_segments = object.key.split('/')
            path_segments.delete('cache')


@@ 145,7 144,7 @@ module Mastodon::CLI
            next unless attachment.blank? || !attachment.variant?(file_name)

            begin
              object.delete unless options[:dry_run]
              object.delete unless dry_run?

              reclaimed_bytes += object.size
              removed += 1


@@ 194,7 193,7 @@ module Mastodon::CLI
          begin
            size = File.size(path)

            unless options[:dry_run]
            unless dry_run?
              File.delete(path)
              begin
                FileUtils.rmdir(File.dirname(path), parents: true)


@@ 216,7 215,7 @@ module Mastodon::CLI
      progress.total = progress.progress
      progress.finish

      say("Removed #{removed} orphans (approx. #{number_to_human_size(reclaimed_bytes)})#{dry_run}", :green, true)
      say("Removed #{removed} orphans (approx. #{number_to_human_size(reclaimed_bytes)})#{dry_run_mode_suffix}", :green, true)
    end

    option :account, type: :string


@@ 246,8 245,6 @@ module Mastodon::CLI
      not be re-downloaded. To force re-download of every URL, use --force.
    DESC
    def refresh
      dry_run = options[:dry_run] ? ' (DRY RUN)' : ''

      if options[:status]
        scope = MediaAttachment.where(status_id: options[:status])
      elsif options[:account]


@@ 274,7 271,7 @@ module Mastodon::CLI
        next if media_attachment.remote_url.blank? || (!options[:force] && media_attachment.file_file_name.present?)
        next if DomainBlock.reject_media?(media_attachment.account.domain)

        unless options[:dry_run]
        unless dry_run?
          media_attachment.reset_file!
          media_attachment.reset_thumbnail!
          media_attachment.save


@@ 283,7 280,7 @@ module Mastodon::CLI
        media_attachment.file_file_size + (media_attachment.thumbnail_file_size || 0)
      end

      say("Downloaded #{processed} media attachments (approx. #{number_to_human_size(aggregate)})#{dry_run}", :green, true)
      say("Downloaded #{processed} media attachments (approx. #{number_to_human_size(aggregate)})#{dry_run_mode_suffix}", :green, true)
    end

    desc 'usage', 'Calculate disk space consumed by Mastodon'

M lib/mastodon/cli/preview_cards.rb => lib/mastodon/cli/preview_cards.rb +2 -3
@@ 27,7 27,6 @@ module Mastodon::CLI
    DESC
    def remove
      time_ago = options[:days].days.ago
      dry_run  = options[:dry_run] ? ' (DRY RUN)' : ''
      link     = options[:link] ? 'link-type ' : ''
      scope    = PreviewCard.cached
      scope    = scope.where(type: :link) if options[:link]


@@ 38,7 37,7 @@ module Mastodon::CLI

        size = preview_card.image_file_size

        unless options[:dry_run]
        unless dry_run?
          preview_card.image.destroy
          preview_card.save
        end


@@ 46,7 45,7 @@ module Mastodon::CLI
        size
      end

      say("Removed #{processed} #{link}preview cards (approx. #{number_to_human_size(aggregate)})#{dry_run}", :green, true)
      say("Removed #{processed} #{link}preview cards (approx. #{number_to_human_size(aggregate)})#{dry_run_mode_suffix}", :green, true)
    end
  end
end

M lib/mastodon/cli/upgrade.rb => lib/mastodon/cli/upgrade.rb +1 -2
@@ 17,7 17,6 @@ module Mastodon::CLI
    LONG_DESC
    def storage_schema
      progress = create_progress_bar(nil)
      dry_run  = dry_run? ? ' (DRY RUN)' : ''
      records  = 0

      klasses = [


@@ 69,7 68,7 @@ module Mastodon::CLI
      progress.total = progress.progress
      progress.finish

      say("Upgraded storage schema of #{records} records#{dry_run}", :green, true)
      say("Upgraded storage schema of #{records} records#{dry_run_mode_suffix}", :green, true)
    end

    private