Merge branch 'master' into glitch-soc/merge-upstream

This commit is contained in:
Thibaut Girka
2018-08-26 18:21:33 +02:00
67 changed files with 798 additions and 178 deletions

View File

@ -2,10 +2,14 @@
require 'thor'
require_relative 'mastodon/media_cli'
require_relative 'mastodon/emoji_cli'
module Mastodon
class CLI < Thor
desc 'media SUBCOMMAND ...ARGS', 'manage media files'
subcommand 'media', Mastodon::MediaCLI
desc 'emoji SUBCOMMAND ...ARGS', 'manage custom emoji'
subcommand 'emoji', Mastodon::EmojiCLI
end
end

View File

@ -0,0 +1,8 @@
# frozen_string_literal: true
dev_null = Logger.new('/dev/null')
Rails.logger = dev_null
ActiveRecord::Base.logger = dev_null
HttpLog.configuration.logger = dev_null
Paperclip.options[:log] = false

81
lib/mastodon/emoji_cli.rb Normal file
View File

@ -0,0 +1,81 @@
# frozen_string_literal: true
require 'rubygems/package'
require_relative '../../config/boot'
require_relative '../../config/environment'
require_relative 'cli_helper'
# rubocop:disable Rails/Output
module Mastodon
class EmojiCLI < Thor
option :prefix
option :suffix
option :overwrite, type: :boolean
option :unlisted, type: :boolean
desc 'import PATH', 'import emoji from a TAR archive at PATH'
long_desc <<-LONG_DESC
Imports custom emoji from a TAR archive specified by PATH.
Existing emoji will be skipped unless the --overwrite option
is provided, in which case they will be overwritten.
With the --prefix option, a prefix can be added to all
generated shortcodes. Likewise, the --suffix option controls
the suffix of all shortcodes.
With the --unlisted option, the processed emoji will not be
visible in the emoji picker (but still usable via other means)
LONG_DESC
def import(path)
imported = 0
skipped = 0
failed = 0
Gem::Package::TarReader.new(Zlib::GzipReader.open(path)) do |tar|
tar.each do |entry|
next unless entry.file? && entry.full_name.end_with?('.png')
shortcode = [options[:prefix], File.basename(entry.full_name, '.*'), options[:suffix]].compact.join
custom_emoji = CustomEmoji.local.find_by(shortcode: shortcode)
if custom_emoji && !options[:overwrite]
skipped += 1
next
end
custom_emoji ||= CustomEmoji.new(shortcode: shortcode, domain: nil)
custom_emoji.image = StringIO.new(entry.read)
custom_emoji.image_file_name = File.basename(entry.full_name)
custom_emoji.visible_in_picker = !options[:unlisted]
if custom_emoji.save
imported += 1
else
failed += 1
say('Failure/Error: ', :red)
say(entry.full_name)
say(' ' + custom_emoji.errors[:image].join(', '), :red)
end
end
end
puts
say("Imported #{imported}, skipped #{skipped}, failed to import #{failed}", color(imported, skipped, failed))
end
private
def color(green, _yellow, red)
if !green.zero? && red.zero?
:green
elsif red.zero?
:yellow
else
:red
end
end
end
end
# rubocop:enable Rails/Output

View File

@ -2,6 +2,7 @@
require_relative '../../config/boot'
require_relative '../../config/environment'
require_relative 'cli_helper'
# rubocop:disable Rails/Output
@ -23,8 +24,9 @@ module Mastodon
the underlying file storage.
DESC
def remove
time_ago = options[:days].days.ago
queued = 0
time_ago = options[:days].days.ago
queued = 0
processed = 0
MediaAttachment.where.not(remote_url: '').where.not(file_file_name: nil).where('created_at < ?', time_ago).select(:id).reorder(nil).find_in_batches do |media_attachments|
if options[:background]
@ -33,13 +35,19 @@ module Mastodon
else
media_attachments.each do |m|
Maintenance::UncacheMediaWorker.new.perform(m)
print '.'
say('.', :green, false)
processed += 1
end
end
end
puts
puts "Scheduled the deletion of #{queued} media attachments" if options[:background]
say
if options[:background]
say("Scheduled the deletion of #{queued} media attachments", :green)
else
say("Removed #{processed} media attachments", :green)
end
end
end
end

View File

@ -394,12 +394,6 @@ namespace :mastodon do
end
end
desc 'Execute daily tasks (deprecated)'
task :daily do
# No-op
# All of these tasks are now executed via sidekiq-scheduler
end
desc 'Turn a user into an admin, identified by the USERNAME environment variable'
task make_admin: :environment do
include RoutingHelper
@ -494,12 +488,6 @@ namespace :mastodon do
end
namespace :media do
desc 'Removes media attachments that have not been assigned to any status for longer than a day (deprecated)'
task clear: :environment do
# No-op
# This task is now executed via sidekiq-scheduler
end
desc 'Remove media attachments attributed to silenced accounts'
task remove_silenced: :environment do
nb_media_attachments = 0
@ -512,8 +500,9 @@ namespace :mastodon do
desc 'Remove cached remote media attachments that are older than NUM_DAYS. By default 7 (week)'
task remove_remote: :environment do
puts 'Please use `./bin/tootctl media remove --help` directly'.colorize(:yellow)
require_relative '../mastodon/media_cli'
cli = Mastodon::MediaCLI.new([], days: ENV['NUM_DAYS'] || 7)
cli = Mastodon::MediaCLI.new([], days: (ENV['NUM_DAYS'] || 7).to_i)
cli.invoke(:remove)
end
@ -543,21 +532,9 @@ namespace :mastodon do
task clear: :environment do
Pubsubhubbub::UnsubscribeWorker.push_bulk(Account.remote.without_followers.where.not(subscription_expires_at: nil).pluck(:id))
end
desc 'Re-subscribes to soon expiring PuSH subscriptions (deprecated)'
task refresh: :environment do
# No-op
# This task is now executed via sidekiq-scheduler
end
end
namespace :feeds do
desc 'Clear timelines of inactive users (deprecated)'
task clear: :environment do
# No-op
# This task is now executed via sidekiq-scheduler
end
desc 'Clear all timelines without regenerating them'
task clear_all: :environment do
Redis.current.keys('feed:*').each { |key| Redis.current.del(key) }
@ -571,21 +548,7 @@ namespace :mastodon do
end
end
namespace :emails do
desc 'Send out digest e-mails (deprecated)'
task digest: :environment do
# No-op
# This task is now executed via sidekiq-scheduler
end
end
namespace :users do
desc 'Clear out unconfirmed users (deprecated)'
task clear: :environment do
# No-op
# This task is now executed via sidekiq-scheduler
end
desc 'List e-mails of all admin users'
task admins: :environment do
puts 'Admin user emails:'