Consistent usage of CLI dry_run? method (#25116)

This commit is contained in:
Matt Jankowski 2023-05-30 10:07:44 -04:00 committed by GitHub
parent 3d253b9830
commit ec9bc7e604
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 47 additions and 58 deletions

View File

@ -217,7 +217,6 @@ module Mastodon::CLI
exit(1) exit(1)
end end
dry_run = options[:dry_run] ? ' (DRY RUN)' : ''
account = nil account = nil
if username.present? if username.present?
@ -234,9 +233,9 @@ module Mastodon::CLI
end end
end end
say("Deleting user with #{account.statuses_count} statuses, this might take a while...#{dry_run}") 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 options[:dry_run] DeleteAccountService.new.call(account, reserve_email: false) unless dry_run?
say("OK#{dry_run}", :green) say("OK#{dry_run_mode_suffix}", :green)
end end
option :force, type: :boolean, aliases: [:f], description: 'Override public key check' 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| Account.remote.select(:uri, 'count(*)').group(:uri).having('count(*) > 1').pluck(:uri).each do |uri|
say("Duplicates found for #{uri}") say("Duplicates found for #{uri}")
begin begin
ActivityPub::FetchRemoteAccountService.new.call(uri) unless options[:dry_run] ActivityPub::FetchRemoteAccountService.new.call(uri) unless dry_run?
rescue => e rescue => e
say("Error processing #{uri}: #{e}", :red) say("Error processing #{uri}: #{e}", :red)
end end
@ -332,7 +331,6 @@ module Mastodon::CLI
LONG_DESC LONG_DESC
def cull(*domains) def cull(*domains)
skip_threshold = 7.days.ago skip_threshold = 7.days.ago
dry_run = options[:dry_run] ? ' (DRY RUN)' : ''
skip_domains = Concurrent::Set.new skip_domains = Concurrent::Set.new
query = Account.remote.where(protocol: :activitypub) query = Account.remote.where(protocol: :activitypub)
@ -350,7 +348,7 @@ module Mastodon::CLI
end end
if [404, 410].include?(code) 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 1
else else
# Touch account even during dry run to avoid getting the account into the window again # Touch account even during dry run to avoid getting the account into the window again
@ -358,7 +356,7 @@ module Mastodon::CLI
end end
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? unless skip_domains.empty?
say('The following domains were not available during the check:', :yellow) say('The following domains were not available during the check:', :yellow)
@ -381,21 +379,19 @@ module Mastodon::CLI
specified with space-separated USERNAMES. specified with space-separated USERNAMES.
LONG_DESC LONG_DESC
def refresh(*usernames) def refresh(*usernames)
dry_run = options[:dry_run] ? ' (DRY RUN)' : ''
if options[:domain] || options[:all] if options[:domain] || options[:all]
scope = Account.remote scope = Account.remote
scope = scope.where(domain: options[:domain]) if options[:domain] scope = scope.where(domain: options[:domain]) if options[:domain]
processed, = parallelize_with_progress(scope) do |account| processed, = parallelize_with_progress(scope) do |account|
next if options[:dry_run] next if dry_run?
account.reset_avatar! account.reset_avatar!
account.reset_header! account.reset_header!
account.save account.save
end end
say("Refreshed #{processed} accounts#{dry_run}", :green, true) say("Refreshed #{processed} accounts#{dry_run_mode_suffix}", :green, true)
elsif !usernames.empty? elsif !usernames.empty?
usernames.each do |user| usernames.each do |user|
user, domain = user.split('@') user, domain = user.split('@')
@ -406,7 +402,7 @@ module Mastodon::CLI
exit(1) exit(1)
end end
next if options[:dry_run] next if dry_run?
begin begin
account.reset_avatar! account.reset_avatar!
@ -417,7 +413,7 @@ module Mastodon::CLI
end end
end end
say("OK#{dry_run}", :green) say("OK#{dry_run_mode_suffix}", :green)
else else
say('No account(s) given', :red) say('No account(s) given', :red)
exit(1) exit(1)
@ -568,8 +564,6 @@ module Mastodon::CLI
- not muted/blocked by us - not muted/blocked by us
LONG_DESC LONG_DESC
def prune def prune
dry_run = options[:dry_run] ? ' (dry run)' : ''
query = Account.remote.where.not(actor_type: %i(Application Service)) 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 mentions WHERE account_id = accounts.id)')
query = query.where('NOT EXISTS (SELECT 1 FROM favourites 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.suspended?
next if account.silenced? next if account.silenced?
account.destroy unless options[:dry_run] account.destroy unless dry_run?
1 1
end end
say("OK, pruned #{deleted} accounts#{dry_run}", :green) say("OK, pruned #{deleted} accounts#{dry_run_mode_suffix}", :green)
end end
option :force, type: :boolean option :force, type: :boolean

View File

@ -34,7 +34,6 @@ module Mastodon::CLI
When the --purge-domain-blocks option is given, also purge matching domain blocks. When the --purge-domain-blocks option is given, also purge matching domain blocks.
LONG_DESC LONG_DESC
def purge(*domains) def purge(*domains)
dry_run = options[:dry_run] ? ' (DRY RUN)' : ''
domains = domains.map { |domain| TagManager.instance.normalize_domain(domain) } domains = domains.map { |domain| TagManager.instance.normalize_domain(domain) }
account_scope = Account.none account_scope = Account.none
domain_block_scope = DomainBlock.none domain_block_scope = DomainBlock.none
@ -79,23 +78,23 @@ module Mastodon::CLI
# Actually perform the deletions # Actually perform the deletions
processed, = parallelize_with_progress(account_scope) do |account| 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 end
say("Removed #{processed} accounts#{dry_run}", :green) say("Removed #{processed} accounts#{dry_run_mode_suffix}", :green)
if options[:purge_domain_blocks] if options[:purge_domain_blocks]
domain_block_count = domain_block_scope.count domain_block_count = domain_block_scope.count
domain_block_scope.in_batches.destroy_all unless options[:dry_run] domain_block_scope.in_batches.destroy_all unless dry_run?
say("Removed #{domain_block_count} domain blocks#{dry_run}", :green) say("Removed #{domain_block_count} domain blocks#{dry_run_mode_suffix}", :green)
end end
custom_emojis_count = emoji_scope.count 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 end
option :concurrency, type: :numeric, default: 50, aliases: [:c] option :concurrency, type: :numeric, default: 50, aliases: [:c]

View File

@ -18,14 +18,12 @@ module Mastodon::CLI
Otherwise, a single user specified by USERNAME. Otherwise, a single user specified by USERNAME.
LONG_DESC LONG_DESC
def build(username = nil) def build(username = nil)
dry_run = options[:dry_run] ? '(DRY RUN)' : ''
if options[:all] || username.nil? if options[:all] || username.nil?
processed, = parallelize_with_progress(Account.joins(:user).merge(User.active)) do |account| 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 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? elsif username.present?
account = Account.find_local(username) account = Account.find_local(username)
@ -34,9 +32,9 @@ module Mastodon::CLI
exit(1) exit(1)
end 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 else
say('No account(s) given', :red) say('No account(s) given', :red)
exit(1) exit(1)

View File

@ -15,6 +15,10 @@ module Mastodon::CLI
options[:dry_run] options[:dry_run]
end end
def dry_run_mode_suffix
dry_run? ? ' (DRY RUN)' : ''
end
def create_progress_bar(total = nil) def create_progress_bar(total = nil)
ProgressBar.create(total: total, format: '%c/%u |%b%i| %e') ProgressBar.create(total: total, format: '%c/%u |%b%i| %e')
end end

View File

@ -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 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('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('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.') 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 inboxes = Account.inboxes
processed = 0 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? 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('It seems like your server has not federated with anything')
prompt.ok('You can shut it down and delete it any time') prompt.ok('You can shut it down and delete it any time')
return return
@ -126,7 +125,7 @@ module Mastodon::CLI
json = Oj.dump(ActivityPub::LinkedDataSignature.new(payload).sign!(account)) 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| ActivityPub::DeliveryWorker.push_bulk(inboxes, limit: 1_000) do |inbox_url|
[json, account.id, inbox_url] [json, account.id, inbox_url]
end end
@ -140,7 +139,7 @@ module Mastodon::CLI
Account.local.without_suspended.find_each { |account| delete_account.call(account) } Account.local.without_suspended.find_each { |account| delete_account.call(account) }
Account.local.suspended.joins(:deletion_request).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') prompt.ok('Wait until Sidekiq processes all items, then you can shut everything down and delete the data')
rescue TTY::Reader::InputInterrupt rescue TTY::Reader::InputInterrupt
exit(1) exit(1)

View File

@ -35,12 +35,12 @@ module Mastodon::CLI
say('--prune-profiles and --remove-headers should not be specified simultaneously', :red, true) say('--prune-profiles and --remove-headers should not be specified simultaneously', :red, true)
exit(1) exit(1)
end end
if options[:include_follows] && !(options[:prune_profiles] || options[:remove_headers]) 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) say('--include-follows can only be used with --prune-profiles or --remove-headers', :red, true)
exit(1) exit(1)
end end
time_ago = options[:days].days.ago time_ago = options[:days].days.ago
dry_run = options[:dry_run] ? ' (DRY RUN)' : ''
if options[:prune_profiles] || options[:remove_headers] 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| 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.header_file_size || 0)
size += (account.avatar_file_size || 0) if options[:prune_profiles] size += (account.avatar_file_size || 0) if options[:prune_profiles]
unless options[:dry_run] unless dry_run?
account.header.destroy account.header.destroy
account.avatar.destroy if options[:prune_profiles] account.avatar.destroy if options[:prune_profiles]
account.save! account.save!
@ -60,7 +60,7 @@ module Mastodon::CLI
size size
end 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 end
unless options[:prune_profiles] || options[:remove_headers] 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) 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.file.destroy
media_attachment.thumbnail.destroy media_attachment.thumbnail.destroy
media_attachment.save media_attachment.save
@ -78,7 +78,7 @@ module Mastodon::CLI
size size
end 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
end end
@ -97,7 +97,6 @@ module Mastodon::CLI
progress = create_progress_bar(nil) progress = create_progress_bar(nil)
reclaimed_bytes = 0 reclaimed_bytes = 0
removed = 0 removed = 0
dry_run = options[:dry_run] ? ' (DRY RUN)' : ''
prefix = options[:prefix] prefix = options[:prefix]
case Paperclip::Attachment.default_options[:storage] case Paperclip::Attachment.default_options[:storage]
@ -123,7 +122,7 @@ module Mastodon::CLI
record_map = preload_records_from_mixed_objects(objects) record_map = preload_records_from_mixed_objects(objects)
objects.each do |object| 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 = object.key.split('/')
path_segments.delete('cache') path_segments.delete('cache')
@ -145,7 +144,7 @@ module Mastodon::CLI
next unless attachment.blank? || !attachment.variant?(file_name) next unless attachment.blank? || !attachment.variant?(file_name)
begin begin
object.delete unless options[:dry_run] object.delete unless dry_run?
reclaimed_bytes += object.size reclaimed_bytes += object.size
removed += 1 removed += 1
@ -194,7 +193,7 @@ module Mastodon::CLI
begin begin
size = File.size(path) size = File.size(path)
unless options[:dry_run] unless dry_run?
File.delete(path) File.delete(path)
begin begin
FileUtils.rmdir(File.dirname(path), parents: true) FileUtils.rmdir(File.dirname(path), parents: true)
@ -216,7 +215,7 @@ module Mastodon::CLI
progress.total = progress.progress progress.total = progress.progress
progress.finish 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 end
option :account, type: :string option :account, type: :string
@ -246,8 +245,6 @@ module Mastodon::CLI
not be re-downloaded. To force re-download of every URL, use --force. not be re-downloaded. To force re-download of every URL, use --force.
DESC DESC
def refresh def refresh
dry_run = options[:dry_run] ? ' (DRY RUN)' : ''
if options[:status] if options[:status]
scope = MediaAttachment.where(status_id: options[:status]) scope = MediaAttachment.where(status_id: options[:status])
elsif options[:account] 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 media_attachment.remote_url.blank? || (!options[:force] && media_attachment.file_file_name.present?)
next if DomainBlock.reject_media?(media_attachment.account.domain) next if DomainBlock.reject_media?(media_attachment.account.domain)
unless options[:dry_run] unless dry_run?
media_attachment.reset_file! media_attachment.reset_file!
media_attachment.reset_thumbnail! media_attachment.reset_thumbnail!
media_attachment.save media_attachment.save
@ -283,7 +280,7 @@ module Mastodon::CLI
media_attachment.file_file_size + (media_attachment.thumbnail_file_size || 0) media_attachment.file_file_size + (media_attachment.thumbnail_file_size || 0)
end 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 end
desc 'usage', 'Calculate disk space consumed by Mastodon' desc 'usage', 'Calculate disk space consumed by Mastodon'

View File

@ -27,7 +27,6 @@ module Mastodon::CLI
DESC DESC
def remove def remove
time_ago = options[:days].days.ago time_ago = options[:days].days.ago
dry_run = options[:dry_run] ? ' (DRY RUN)' : ''
link = options[:link] ? 'link-type ' : '' link = options[:link] ? 'link-type ' : ''
scope = PreviewCard.cached scope = PreviewCard.cached
scope = scope.where(type: :link) if options[:link] scope = scope.where(type: :link) if options[:link]
@ -38,7 +37,7 @@ module Mastodon::CLI
size = preview_card.image_file_size size = preview_card.image_file_size
unless options[:dry_run] unless dry_run?
preview_card.image.destroy preview_card.image.destroy
preview_card.save preview_card.save
end end
@ -46,7 +45,7 @@ module Mastodon::CLI
size size
end 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 end
end end

View File

@ -17,7 +17,6 @@ module Mastodon::CLI
LONG_DESC LONG_DESC
def storage_schema def storage_schema
progress = create_progress_bar(nil) progress = create_progress_bar(nil)
dry_run = dry_run? ? ' (DRY RUN)' : ''
records = 0 records = 0
klasses = [ klasses = [
@ -69,7 +68,7 @@ module Mastodon::CLI
progress.total = progress.progress progress.total = progress.progress
progress.finish 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 end
private private