mirror of
https://github.com/mastodon/mastodon.git
synced 2024-11-23 14:35:41 +00:00
Merge branch 'main' into glitch-soc/merge-upstream
Conflicts: - `README.md`: Upstream added some documentation in the README, but our README is pretty different and barebone. Kept our README.
This commit is contained in:
commit
b2eaf5562d
|
@ -56,6 +56,7 @@ COPY Gemfile* package.json yarn.lock /opt/mastodon/
|
||||||
RUN cd /opt/mastodon && \
|
RUN cd /opt/mastodon && \
|
||||||
bundle config set deployment 'true' && \
|
bundle config set deployment 'true' && \
|
||||||
bundle config set without 'development test' && \
|
bundle config set without 'development test' && \
|
||||||
|
bundle config set silence_root_warning true && \
|
||||||
bundle install -j"$(nproc)" && \
|
bundle install -j"$(nproc)" && \
|
||||||
yarn install --pure-lockfile
|
yarn install --pure-lockfile
|
||||||
|
|
||||||
|
|
12
Gemfile.lock
12
Gemfile.lock
|
@ -188,7 +188,7 @@ GEM
|
||||||
docile (1.3.4)
|
docile (1.3.4)
|
||||||
domain_name (0.5.20190701)
|
domain_name (0.5.20190701)
|
||||||
unf (>= 0.0.5, < 1.0.0)
|
unf (>= 0.0.5, < 1.0.0)
|
||||||
doorkeeper (5.5.3)
|
doorkeeper (5.5.4)
|
||||||
railties (>= 5)
|
railties (>= 5)
|
||||||
dotenv (2.7.6)
|
dotenv (2.7.6)
|
||||||
dotenv-rails (2.7.6)
|
dotenv-rails (2.7.6)
|
||||||
|
@ -262,7 +262,7 @@ GEM
|
||||||
hiredis (0.6.3)
|
hiredis (0.6.3)
|
||||||
hkdf (0.3.0)
|
hkdf (0.3.0)
|
||||||
htmlentities (4.3.4)
|
htmlentities (4.3.4)
|
||||||
http (5.0.2)
|
http (5.0.4)
|
||||||
addressable (~> 2.8)
|
addressable (~> 2.8)
|
||||||
http-cookie (~> 1.0)
|
http-cookie (~> 1.0)
|
||||||
http-form_data (~> 2.2)
|
http-form_data (~> 2.2)
|
||||||
|
@ -326,7 +326,7 @@ GEM
|
||||||
addressable (~> 2.7)
|
addressable (~> 2.7)
|
||||||
letter_opener (1.7.0)
|
letter_opener (1.7.0)
|
||||||
launchy (~> 2.2)
|
launchy (~> 2.2)
|
||||||
letter_opener_web (1.4.0)
|
letter_opener_web (1.4.1)
|
||||||
actionmailer (>= 3.2)
|
actionmailer (>= 3.2)
|
||||||
letter_opener (~> 1.0)
|
letter_opener (~> 1.0)
|
||||||
railties (>= 3.2)
|
railties (>= 3.2)
|
||||||
|
@ -357,7 +357,7 @@ GEM
|
||||||
mime-types (3.3.1)
|
mime-types (3.3.1)
|
||||||
mime-types-data (~> 3.2015)
|
mime-types-data (~> 3.2015)
|
||||||
mime-types-data (3.2020.0512)
|
mime-types-data (3.2020.0512)
|
||||||
mini_mime (1.1.1)
|
mini_mime (1.1.2)
|
||||||
mini_portile2 (2.6.1)
|
mini_portile2 (2.6.1)
|
||||||
minitest (5.14.4)
|
minitest (5.14.4)
|
||||||
msgpack (1.4.2)
|
msgpack (1.4.2)
|
||||||
|
@ -531,7 +531,7 @@ GEM
|
||||||
unicode-display_width (>= 1.4.0, < 3.0)
|
unicode-display_width (>= 1.4.0, < 3.0)
|
||||||
rubocop-ast (1.12.0)
|
rubocop-ast (1.12.0)
|
||||||
parser (>= 3.0.1.1)
|
parser (>= 3.0.1.1)
|
||||||
rubocop-rails (2.12.2)
|
rubocop-rails (2.12.3)
|
||||||
activesupport (>= 4.2.0)
|
activesupport (>= 4.2.0)
|
||||||
rack (>= 1.1)
|
rack (>= 1.1)
|
||||||
rubocop (>= 1.7.0, < 2.0)
|
rubocop (>= 1.7.0, < 2.0)
|
||||||
|
@ -627,7 +627,7 @@ GEM
|
||||||
tzinfo (>= 1.0.0)
|
tzinfo (>= 1.0.0)
|
||||||
unf (0.1.4)
|
unf (0.1.4)
|
||||||
unf_ext
|
unf_ext
|
||||||
unf_ext (0.0.7.7)
|
unf_ext (0.0.8)
|
||||||
unicode-display_width (1.8.0)
|
unicode-display_width (1.8.0)
|
||||||
uniform_notifier (1.14.2)
|
uniform_notifier (1.14.2)
|
||||||
warden (1.2.9)
|
warden (1.2.9)
|
||||||
|
|
12
Vagrantfile
vendored
12
Vagrantfile
vendored
|
@ -45,16 +45,8 @@ sudo apt-get install \
|
||||||
# Install rvm
|
# Install rvm
|
||||||
read RUBY_VERSION < .ruby-version
|
read RUBY_VERSION < .ruby-version
|
||||||
|
|
||||||
gpg_command="gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB"
|
curl -sSL https://rvm.io/mpapis.asc | gpg --import
|
||||||
$($gpg_command)
|
curl -sSL https://rvm.io/pkuczynski.asc | gpg --import
|
||||||
if [ $? -ne 0 ];then
|
|
||||||
echo "GPG command failed, This prevented RVM from installing."
|
|
||||||
echo "Retrying once..." && $($gpg_command)
|
|
||||||
if [ $? -ne 0 ];then
|
|
||||||
echo "GPG failed for the second time, please ensure network connectivity."
|
|
||||||
echo "Exiting..." && exit 1
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
curl -sSL https://raw.githubusercontent.com/rvm/rvm/stable/binscripts/rvm-installer | bash -s stable --ruby=$RUBY_VERSION
|
curl -sSL https://raw.githubusercontent.com/rvm/rvm/stable/binscripts/rvm-installer | bash -s stable --ruby=$RUBY_VERSION
|
||||||
source /home/vagrant/.rvm/scripts/rvm
|
source /home/vagrant/.rvm/scripts/rvm
|
||||||
|
|
|
@ -41,6 +41,7 @@ module SettingsHelper
|
||||||
ka: 'ქართული',
|
ka: 'ქართული',
|
||||||
kab: 'Taqbaylit',
|
kab: 'Taqbaylit',
|
||||||
kk: 'Қазақша',
|
kk: 'Қазақша',
|
||||||
|
kmr: 'Kurmancî',
|
||||||
kn: 'ಕನ್ನಡ',
|
kn: 'ಕನ್ನಡ',
|
||||||
ko: '한국어',
|
ko: '한국어',
|
||||||
ku: 'سۆرانی',
|
ku: 'سۆرانی',
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
url('~fonts/montserrat/Montserrat-Regular.woff') format('woff'),
|
url('~fonts/montserrat/Montserrat-Regular.woff') format('woff'),
|
||||||
url('~fonts/montserrat/Montserrat-Regular.ttf') format('truetype');
|
url('~fonts/montserrat/Montserrat-Regular.ttf') format('truetype');
|
||||||
font-weight: 400;
|
font-weight: 400;
|
||||||
|
font-display: swap;
|
||||||
font-style: normal;
|
font-style: normal;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -13,5 +14,6 @@
|
||||||
src: local('Montserrat Medium'),
|
src: local('Montserrat Medium'),
|
||||||
url('~fonts/montserrat/Montserrat-Medium.ttf') format('truetype');
|
url('~fonts/montserrat/Montserrat-Medium.ttf') format('truetype');
|
||||||
font-weight: 500;
|
font-weight: 500;
|
||||||
|
font-display: swap;
|
||||||
font-style: normal;
|
font-style: normal;
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,5 +6,6 @@
|
||||||
url('~fonts/roboto-mono/robotomono-regular-webfont.ttf') format('truetype'),
|
url('~fonts/roboto-mono/robotomono-regular-webfont.ttf') format('truetype'),
|
||||||
url('~fonts/roboto-mono/robotomono-regular-webfont.svg#roboto_monoregular') format('svg');
|
url('~fonts/roboto-mono/robotomono-regular-webfont.svg#roboto_monoregular') format('svg');
|
||||||
font-weight: 400;
|
font-weight: 400;
|
||||||
|
font-display: swap;
|
||||||
font-style: normal;
|
font-style: normal;
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
url('~fonts/roboto/roboto-italic-webfont.ttf') format('truetype'),
|
url('~fonts/roboto/roboto-italic-webfont.ttf') format('truetype'),
|
||||||
url('~fonts/roboto/roboto-italic-webfont.svg#roboto-italic-webfont') format('svg');
|
url('~fonts/roboto/roboto-italic-webfont.svg#roboto-italic-webfont') format('svg');
|
||||||
font-weight: normal;
|
font-weight: normal;
|
||||||
|
font-display: swap;
|
||||||
font-style: italic;
|
font-style: italic;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -17,6 +18,7 @@
|
||||||
url('~fonts/roboto/roboto-bold-webfont.ttf') format('truetype'),
|
url('~fonts/roboto/roboto-bold-webfont.ttf') format('truetype'),
|
||||||
url('~fonts/roboto/roboto-bold-webfont.svg#roboto-bold-webfont') format('svg');
|
url('~fonts/roboto/roboto-bold-webfont.svg#roboto-bold-webfont') format('svg');
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
|
font-display: swap;
|
||||||
font-style: normal;
|
font-style: normal;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -28,6 +30,7 @@
|
||||||
url('~fonts/roboto/roboto-medium-webfont.ttf') format('truetype'),
|
url('~fonts/roboto/roboto-medium-webfont.ttf') format('truetype'),
|
||||||
url('~fonts/roboto/roboto-medium-webfont.svg#roboto-medium-webfont') format('svg');
|
url('~fonts/roboto/roboto-medium-webfont.svg#roboto-medium-webfont') format('svg');
|
||||||
font-weight: 500;
|
font-weight: 500;
|
||||||
|
font-display: swap;
|
||||||
font-style: normal;
|
font-style: normal;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -39,5 +42,6 @@
|
||||||
url('~fonts/roboto/roboto-regular-webfont.ttf') format('truetype'),
|
url('~fonts/roboto/roboto-regular-webfont.ttf') format('truetype'),
|
||||||
url('~fonts/roboto/roboto-regular-webfont.svg#roboto-regular-webfont') format('svg');
|
url('~fonts/roboto/roboto-regular-webfont.svg#roboto-regular-webfont') format('svg');
|
||||||
font-weight: normal;
|
font-weight: normal;
|
||||||
|
font-display: swap;
|
||||||
font-style: normal;
|
font-style: normal;
|
||||||
}
|
}
|
||||||
|
|
|
@ -164,8 +164,8 @@ class AccountStatusesCleanupPolicy < ApplicationRecord
|
||||||
|
|
||||||
def without_popular_scope
|
def without_popular_scope
|
||||||
scope = Status.left_joins(:status_stat)
|
scope = Status.left_joins(:status_stat)
|
||||||
scope = scope.where('COALESCE(status_stats.reblogs_count, 0) <= ?', min_reblogs) unless min_reblogs.nil?
|
scope = scope.where('COALESCE(status_stats.reblogs_count, 0) < ?', min_reblogs) unless min_reblogs.nil?
|
||||||
scope = scope.where('COALESCE(status_stats.favourites_count, 0) <= ?', min_favs) unless min_favs.nil?
|
scope = scope.where('COALESCE(status_stats.favourites_count, 0) < ?', min_favs) unless min_favs.nil?
|
||||||
scope
|
scope
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
class ReactionValidator < ActiveModel::Validator
|
class ReactionValidator < ActiveModel::Validator
|
||||||
SUPPORTED_EMOJIS = Oj.load(File.read(Rails.root.join('app', 'javascript', 'mastodon', 'features', 'emoji', 'emoji_map.json'))).keys.freeze
|
SUPPORTED_EMOJIS = Oj.load_file(Rails.root.join('app', 'javascript', 'mastodon', 'features', 'emoji', 'emoji_map.json').to_s).keys.freeze
|
||||||
|
|
||||||
LIMIT = 8
|
LIMIT = 8
|
||||||
|
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
dependencies:
|
dependencies:
|
||||||
- name: elasticsearch
|
- name: elasticsearch
|
||||||
repository: https://charts.bitnami.com/bitnami
|
repository: https://charts.bitnami.com/bitnami
|
||||||
version: 14.2.3
|
version: 15.10.3
|
||||||
- name: postgresql
|
- name: postgresql
|
||||||
repository: https://charts.bitnami.com/bitnami
|
repository: https://charts.bitnami.com/bitnami
|
||||||
version: 8.10.14
|
version: 8.10.14
|
||||||
- name: redis
|
- name: redis
|
||||||
repository: https://charts.bitnami.com/bitnami
|
repository: https://charts.bitnami.com/bitnami
|
||||||
version: 10.9.0
|
version: 10.9.0
|
||||||
digest: sha256:9e3e7b987c6ffba9295a30b7fae2613fe680c2b1a1832ff5afb185414ce1898e
|
digest: sha256:f5c57108f7768fd16391c1a050991c7809f84a640cca308d7d24d87379d04000
|
||||||
generated: "2021-02-27T01:01:12.776919968Z"
|
generated: "2021-08-05T08:01:01.457727804Z"
|
||||||
|
|
|
@ -24,7 +24,7 @@ appVersion: 3.3.0
|
||||||
|
|
||||||
dependencies:
|
dependencies:
|
||||||
- name: elasticsearch
|
- name: elasticsearch
|
||||||
version: 14.2.3
|
version: 15.10.3
|
||||||
repository: https://charts.bitnami.com/bitnami
|
repository: https://charts.bitnami.com/bitnami
|
||||||
condition: elasticsearch.enabled
|
condition: elasticsearch.enabled
|
||||||
- name: postgresql
|
- name: postgresql
|
||||||
|
|
|
@ -107,6 +107,7 @@ module Mastodon
|
||||||
:ka,
|
:ka,
|
||||||
:kab,
|
:kab,
|
||||||
:kk,
|
:kk,
|
||||||
|
:kmr,
|
||||||
:kn,
|
:kn,
|
||||||
:ko,
|
:ko,
|
||||||
:ku,
|
:ku,
|
||||||
|
|
|
@ -105,7 +105,7 @@ Rails.application.configure do
|
||||||
:password => ENV['SMTP_PASSWORD'].presence,
|
:password => ENV['SMTP_PASSWORD'].presence,
|
||||||
:domain => ENV['SMTP_DOMAIN'] || ENV['LOCAL_DOMAIN'],
|
:domain => ENV['SMTP_DOMAIN'] || ENV['LOCAL_DOMAIN'],
|
||||||
:authentication => ENV['SMTP_AUTH_METHOD'] == 'none' ? nil : ENV['SMTP_AUTH_METHOD'] || :plain,
|
:authentication => ENV['SMTP_AUTH_METHOD'] == 'none' ? nil : ENV['SMTP_AUTH_METHOD'] || :plain,
|
||||||
:ca_file => ENV['SMTP_CA_FILE'].presence,
|
:ca_file => ENV['SMTP_CA_FILE'].presence || '/etc/ssl/certs/ca-certificates.crt',
|
||||||
:openssl_verify_mode => ENV['SMTP_OPENSSL_VERIFY_MODE'],
|
:openssl_verify_mode => ENV['SMTP_OPENSSL_VERIFY_MODE'],
|
||||||
:enable_starttls_auto => ENV['SMTP_ENABLE_STARTTLS_AUTO'] || true,
|
:enable_starttls_auto => ENV['SMTP_ENABLE_STARTTLS_AUTO'] || true,
|
||||||
:tls => ENV['SMTP_TLS'].presence,
|
:tls => ENV['SMTP_TLS'].presence,
|
||||||
|
|
|
@ -24,10 +24,9 @@ module Twitter::TwitterText
|
||||||
)
|
)
|
||||||
\)
|
\)
|
||||||
/iox
|
/iox
|
||||||
REGEXEN[:valid_iri_ucschar] = /[\u{A0}-\u{D7FF}\u{F900}-\u{FDCF}\u{FDF0}-\u{FFEF}\u{10000}-\u{1FFFD}\u{20000}-\u{2FFFD}\u{30000}-\u{3FFFD}\u{40000}-\u{4FFFD}\u{50000}-\u{5FFFD}\u{60000}-\u{6FFFD}\u{70000}-\u{7FFFD}\u{80000}-\u{8FFFD}\u{90000}-\u{9FFFD}\u{A0000}-\u{AFFFD}\u{B0000}-\u{BFFFD}\u{C0000}-\u{CFFFD}\u{D0000}-\u{DFFFD}\u{E1000}-\u{EFFFD}]/iou
|
UCHARS = '\u{A0}-\u{D7FF}\u{F900}-\u{FDCF}\u{FDF0}-\u{FFEF}\u{10000}-\u{1FFFD}\u{20000}-\u{2FFFD}\u{30000}-\u{3FFFD}\u{40000}-\u{4FFFD}\u{50000}-\u{5FFFD}\u{60000}-\u{6FFFD}\u{70000}-\u{7FFFD}\u{80000}-\u{8FFFD}\u{90000}-\u{9FFFD}\u{A0000}-\u{AFFFD}\u{B0000}-\u{BFFFD}\u{C0000}-\u{CFFFD}\u{D0000}-\u{DFFFD}\u{E1000}-\u{EFFFD}\u{E000}-\u{F8FF}\u{F0000}-\u{FFFFD}\u{100000}-\u{10FFFD}'
|
||||||
REGEXEN[:valid_iri_iprivate] = /[\u{E000}-\u{F8FF}\u{F0000}-\u{FFFFD}\u{100000}-\u{10FFFD}]/iou
|
REGEXEN[:valid_url_query_chars] = /[a-z0-9!?\*'\(\);:&=\+\$\/%#\[\]\-_\.,~|@#{UCHARS}]/iou
|
||||||
REGEXEN[:valid_url_query_chars] = /(?:#{REGEXEN[:valid_iri_ucschar]})|(?:#{REGEXEN[:valid_iri_iprivate]})|[a-z0-9!?\*'\(\);:&=\+\$\/%#\[\]\-_\.,~|@]/iou
|
REGEXEN[:valid_url_query_ending_chars] = /[a-z0-9_&=#\/\-#{UCHARS}]/iou
|
||||||
REGEXEN[:valid_url_query_ending_chars] = /(?:#{REGEXEN[:valid_iri_ucschar]})|(?:#{REGEXEN[:valid_iri_iprivate]})|[a-z0-9_&=#\/\-]/iou
|
|
||||||
REGEXEN[:valid_url_path] = /(?:
|
REGEXEN[:valid_url_path] = /(?:
|
||||||
(?:
|
(?:
|
||||||
#{REGEXEN[:valid_general_url_path_chars]}*
|
#{REGEXEN[:valid_general_url_path_chars]}*
|
||||||
|
@ -57,23 +56,21 @@ module Twitter::TwitterText
|
||||||
#{REGEXEN[:validate_url_pct_encoded]}|
|
#{REGEXEN[:validate_url_pct_encoded]}|
|
||||||
#{REGEXEN[:validate_url_sub_delims]}
|
#{REGEXEN[:validate_url_sub_delims]}
|
||||||
)/iox
|
)/iox
|
||||||
REGEXEN[:xmpp_uri] = %r{
|
|
||||||
(xmpp:) # Protocol
|
|
||||||
(//#{REGEXEN[:validate_nodeid]}+@#{REGEXEN[:valid_domain]}/)? # Authority (optional)
|
|
||||||
(#{REGEXEN[:validate_nodeid]}+@)? # Username in path (optional)
|
|
||||||
(#{REGEXEN[:valid_domain]}) # Domain in path
|
|
||||||
(/#{REGEXEN[:validate_resid]}+)? # Resource in path (optional)
|
|
||||||
(\?#{REGEXEN[:valid_url_query_chars]}*#{REGEXEN[:valid_url_query_ending_chars]})? # Query String
|
|
||||||
}iox
|
|
||||||
REGEXEN[:magnet_uri] = %r{
|
|
||||||
(magnet:) # Protocol
|
|
||||||
(\?#{REGEXEN[:valid_url_query_chars]}*#{REGEXEN[:valid_url_query_ending_chars]}) # Query String
|
|
||||||
}iox
|
|
||||||
REGEXEN[:valid_extended_uri] = %r{
|
REGEXEN[:valid_extended_uri] = %r{
|
||||||
( # $1 total match
|
( # $1 total match
|
||||||
(#{REGEXEN[:valid_url_preceding_chars]}) # $2 Preceding character
|
(#{REGEXEN[:valid_url_preceding_chars]}) # $2 Preceding character
|
||||||
( # $3 URL
|
( # $3 URL
|
||||||
(#{REGEXEN[:xmpp_uri]}) | (#{REGEXEN[:magnet_uri]})
|
(
|
||||||
|
(xmpp:) # Protocol
|
||||||
|
(//#{REGEXEN[:validate_nodeid]}+@#{REGEXEN[:valid_domain]}/)? # Authority (optional)
|
||||||
|
(#{REGEXEN[:validate_nodeid]}+@)? # Username in path (optional)
|
||||||
|
(#{REGEXEN[:valid_domain]}) # Domain in path
|
||||||
|
(/#{REGEXEN[:validate_resid]}+)? # Resource in path (optional)
|
||||||
|
(\?#{REGEXEN[:valid_url_query_chars]}*#{REGEXEN[:valid_url_query_ending_chars]})? # Query String
|
||||||
|
) | (
|
||||||
|
(magnet:) # Protocol
|
||||||
|
(\?#{REGEXEN[:valid_url_query_chars]}*#{REGEXEN[:valid_url_query_ending_chars]}) # Query String
|
||||||
|
)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
}iox
|
}iox
|
||||||
|
|
|
@ -1332,10 +1332,10 @@ en:
|
||||||
'63113904': 2 years
|
'63113904': 2 years
|
||||||
'7889238': 3 months
|
'7889238': 3 months
|
||||||
min_age_label: Age threshold
|
min_age_label: Age threshold
|
||||||
min_favs: Keep posts favourited more than
|
min_favs: Keep posts favourited at least
|
||||||
min_favs_hint: Doesn't delete any of your posts that has received more than this amount of favourites. Leave blank to delete posts regardless of their number of favourites
|
min_favs_hint: Doesn't delete any of your posts that has received at least this amount of favourites. Leave blank to delete posts regardless of their number of favourites
|
||||||
min_reblogs: Keep posts boosted more than
|
min_reblogs: Keep posts boosted at least
|
||||||
min_reblogs_hint: Doesn't delete any of your posts that has been boosted more than this number of times. Leave blank to delete posts regardless of their number of boosts
|
min_reblogs_hint: Doesn't delete any of your posts that has been boosted at least this number of times. Leave blank to delete posts regardless of their number of boosts
|
||||||
stream_entries:
|
stream_entries:
|
||||||
pinned: Pinned post
|
pinned: Pinned post
|
||||||
reblogged: boosted
|
reblogged: boosted
|
||||||
|
|
|
@ -287,7 +287,7 @@ module Mastodon
|
||||||
|
|
||||||
option :concurrency, type: :numeric, default: 5, aliases: [:c]
|
option :concurrency, type: :numeric, default: 5, aliases: [:c]
|
||||||
option :dry_run, type: :boolean
|
option :dry_run, type: :boolean
|
||||||
desc 'cull', 'Remove remote accounts that no longer exist'
|
desc 'cull [DOMAIN...]', 'Remove remote accounts that no longer exist'
|
||||||
long_desc <<-LONG_DESC
|
long_desc <<-LONG_DESC
|
||||||
Query every single remote account in the database to determine
|
Query every single remote account in the database to determine
|
||||||
if it still exists on the origin server, and if it doesn't,
|
if it still exists on the origin server, and if it doesn't,
|
||||||
|
@ -296,19 +296,22 @@ module Mastodon
|
||||||
Accounts that have had confirmed activity within the last week
|
Accounts that have had confirmed activity within the last week
|
||||||
are excluded from the checks.
|
are excluded from the checks.
|
||||||
LONG_DESC
|
LONG_DESC
|
||||||
def cull
|
def cull(*domains)
|
||||||
skip_threshold = 7.days.ago
|
skip_threshold = 7.days.ago
|
||||||
dry_run = options[:dry_run] ? ' (DRY RUN)' : ''
|
dry_run = options[:dry_run] ? ' (DRY RUN)' : ''
|
||||||
skip_domains = Concurrent::Set.new
|
skip_domains = Concurrent::Set.new
|
||||||
|
|
||||||
processed, culled = parallelize_with_progress(Account.remote.where(protocol: :activitypub).partitioned) do |account|
|
query = Account.remote.where(protocol: :activitypub)
|
||||||
|
query = query.where(domain: domains) unless domains.empty?
|
||||||
|
|
||||||
|
processed, culled = parallelize_with_progress(query.partitioned) do |account|
|
||||||
next if account.updated_at >= skip_threshold || (account.last_webfingered_at.present? && account.last_webfingered_at >= skip_threshold) || skip_domains.include?(account.domain)
|
next if account.updated_at >= skip_threshold || (account.last_webfingered_at.present? && account.last_webfingered_at >= skip_threshold) || skip_domains.include?(account.domain)
|
||||||
|
|
||||||
code = 0
|
code = 0
|
||||||
|
|
||||||
begin
|
begin
|
||||||
code = Request.new(:head, account.uri).perform(&:code)
|
code = Request.new(:head, account.uri).perform(&:code)
|
||||||
rescue HTTP::ConnectionError
|
rescue HTTP::TimeoutError, HTTP::ConnectionError, OpenSSL::SSL::SSLError
|
||||||
skip_domains << account.domain
|
skip_domains << account.domain
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
10
package.json
10
package.json
|
@ -61,11 +61,11 @@
|
||||||
},
|
},
|
||||||
"private": true,
|
"private": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/core": "^7.15.5",
|
"@babel/core": "^7.15.8",
|
||||||
"@babel/plugin-proposal-decorators": "^7.15.8",
|
"@babel/plugin-proposal-decorators": "^7.15.8",
|
||||||
"@babel/plugin-transform-react-inline-elements": "^7.14.5",
|
"@babel/plugin-transform-react-inline-elements": "^7.14.5",
|
||||||
"@babel/plugin-transform-runtime": "^7.15.8",
|
"@babel/plugin-transform-runtime": "^7.15.8",
|
||||||
"@babel/preset-env": "^7.15.6",
|
"@babel/preset-env": "^7.15.8",
|
||||||
"@babel/preset-react": "^7.14.5",
|
"@babel/preset-react": "^7.14.5",
|
||||||
"@babel/runtime": "^7.15.4",
|
"@babel/runtime": "^7.15.4",
|
||||||
"@gamestdio/websocket": "^0.3.2",
|
"@gamestdio/websocket": "^0.3.2",
|
||||||
|
@ -102,7 +102,7 @@
|
||||||
"glob": "^7.2.0",
|
"glob": "^7.2.0",
|
||||||
"history": "^4.10.1",
|
"history": "^4.10.1",
|
||||||
"http-link-header": "^1.0.3",
|
"http-link-header": "^1.0.3",
|
||||||
"immutable": "^3.8.2",
|
"immutable": "^4.0.0",
|
||||||
"imports-loader": "^1.2.0",
|
"imports-loader": "^1.2.0",
|
||||||
"intersection-observer": "^0.12.0",
|
"intersection-observer": "^0.12.0",
|
||||||
"intl": "^1.2.5",
|
"intl": "^1.2.5",
|
||||||
|
@ -141,7 +141,7 @@
|
||||||
"react-redux-loading-bar": "^4.0.8",
|
"react-redux-loading-bar": "^4.0.8",
|
||||||
"react-router-dom": "^4.1.1",
|
"react-router-dom": "^4.1.1",
|
||||||
"react-router-scroll-4": "^1.0.0-beta.1",
|
"react-router-scroll-4": "^1.0.0-beta.1",
|
||||||
"react-select": "^4.3.1",
|
"react-select": "^5.1.0",
|
||||||
"react-sparklines": "^1.7.0",
|
"react-sparklines": "^1.7.0",
|
||||||
"react-swipeable-views": "^0.14.0",
|
"react-swipeable-views": "^0.14.0",
|
||||||
"react-textarea-autosize": "^8.3.3",
|
"react-textarea-autosize": "^8.3.3",
|
||||||
|
@ -184,7 +184,7 @@
|
||||||
"eslint-plugin-jsx-a11y": "~6.4.1",
|
"eslint-plugin-jsx-a11y": "~6.4.1",
|
||||||
"eslint-plugin-promise": "~5.1.0",
|
"eslint-plugin-promise": "~5.1.0",
|
||||||
"eslint-plugin-react": "~7.26.1",
|
"eslint-plugin-react": "~7.26.1",
|
||||||
"jest": "^27.2.3",
|
"jest": "^27.2.5",
|
||||||
"raf": "^3.4.1",
|
"raf": "^3.4.1",
|
||||||
"react-intl-translations-manager": "^5.0.3",
|
"react-intl-translations-manager": "^5.0.3",
|
||||||
"react-test-renderer": "^16.14.0",
|
"react-test-renderer": "^16.14.0",
|
||||||
|
|
|
@ -499,9 +499,9 @@ RSpec.describe AccountStatusesCleanupPolicy, type: :model do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'when policy is to keep statuses with more than 4 boosts' do
|
context 'when policy is to keep statuses with at least 5 boosts' do
|
||||||
before do
|
before do
|
||||||
account_statuses_cleanup_policy.min_reblogs = 4
|
account_statuses_cleanup_policy.min_reblogs = 5
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'does not return the recent toot' do
|
it 'does not return the recent toot' do
|
||||||
|
@ -521,9 +521,9 @@ RSpec.describe AccountStatusesCleanupPolicy, type: :model do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'when policy is to keep statuses with more than 4 favs' do
|
context 'when policy is to keep statuses with at least 5 favs' do
|
||||||
before do
|
before do
|
||||||
account_statuses_cleanup_policy.min_favs = 4
|
account_statuses_cleanup_policy.min_favs = 5
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'does not return the recent toot' do
|
it 'does not return the recent toot' do
|
||||||
|
|
Loading…
Reference in a new issue