Merge remote-tracking branch 'upstream/main' into develop, bump version

Conflicts:
- .github/workflows/build-image.yml
  We're not building an image with GitHub Actions.
This commit is contained in:
Jeremy Kescher 2023-03-17 07:22:42 +01:00
commit 24e9a23fe6
No known key found for this signature in database
GPG key ID: 48DFE4BB15BA5940
173 changed files with 2098 additions and 1778 deletions

View file

@ -1,128 +0,0 @@
version: 2.1
orbs:
ruby: circleci/ruby@2.0.0
node: circleci/node@5.0.3
executors:
default:
parameters:
ruby-version:
type: string
docker:
- image: cimg/ruby:<< parameters.ruby-version >>
environment:
BUNDLE_JOBS: 3
BUNDLE_RETRY: 3
CONTINUOUS_INTEGRATION: true
DB_HOST: localhost
DB_USER: root
DISABLE_SIMPLECOV: true
RAILS_ENV: test
- image: cimg/postgres:14.5
environment:
POSTGRES_USER: root
POSTGRES_HOST_AUTH_METHOD: trust
- image: cimg/redis:7.0
commands:
install-system-dependencies:
steps:
- run:
name: Install system dependencies
command: |
sudo apt-get update
sudo apt-get install -y libicu-dev libidn11-dev
install-ruby-dependencies:
parameters:
ruby-version:
type: string
steps:
- run:
command: |
bundle config clean 'true'
bundle config frozen 'true'
bundle config without 'development production'
name: Set bundler settings
- ruby/install-deps:
bundler-version: '2.3.26'
key: ruby<< parameters.ruby-version >>-gems-v2
wait-db:
steps:
- run:
command: dockerize -wait tcp://localhost:5432 -wait tcp://localhost:6379 -timeout 1m
name: Wait for PostgreSQL and Redis
jobs:
build:
docker:
- image: cimg/ruby:3.2-node
environment:
RAILS_ENV: test
steps:
- checkout
- install-system-dependencies
- install-ruby-dependencies:
ruby-version: '3.2'
- node/install-packages:
cache-version: v1
pkg-manager: yarn
- run:
command: |
export NODE_OPTIONS=--openssl-legacy-provider
./bin/rails assets:precompile
name: Precompile assets
- persist_to_workspace:
paths:
- public/assets
- public/packs-test
root: .
test:
parameters:
ruby-version:
type: string
executor:
name: default
ruby-version: << parameters.ruby-version >>
environment:
ALLOW_NOPAM: true
PAM_ENABLED: true
PAM_DEFAULT_SERVICE: pam_test
PAM_CONTROLLED_SERVICE: pam_test_controlled
parallelism: 4
steps:
- checkout
- install-system-dependencies
- run:
command: sudo apt-get install -y ffmpeg imagemagick libmagickcore-dev libmagickwand-dev libjpeg-dev libpng-dev libtiff-dev libwebp-dev libpam-dev
name: Install additional system dependencies
- run:
command: bundle config with 'pam_authentication'
name: Enable PAM authentication
- install-ruby-dependencies:
ruby-version: << parameters.ruby-version >>
- attach_workspace:
at: .
- wait-db
- run:
command: ./bin/rails db:create db:schema:load db:seed
name: Load database schema
- ruby/rspec-test
workflows:
version: 2
build-and-test:
jobs:
- build
- test:
matrix:
parameters:
ruby-version:
- '2.7'
- '3.0'
- '3.1'
- '3.2'
name: test-ruby<< matrix.ruby-version >>
requires:
- build

View file

@ -41,7 +41,7 @@ services:
- internal_network - internal_network
redis: redis:
image: redis:6-alpine image: redis:7-alpine
restart: unless-stopped restart: unless-stopped
volumes: volumes:
- redis-data:/data - redis-data:/data

View file

@ -0,0 +1,17 @@
{
"problemMatcher": [
{
"owner": "haml-lint",
"severity": "warning",
"pattern": [
{
"regexp": "^(.*):(\\d+)\\s\\[W]\\s(.*):\\s(.*)$",
"file": 1,
"line": 2,
"code": 3,
"message": 4
}
]
}
]
}

44
.github/workflows/lint-haml.yml vendored Normal file
View file

@ -0,0 +1,44 @@
name: Haml Linting
on:
push:
branches-ignore:
- 'dependabot/**'
paths:
- '.github/workflows/haml-lint-problem-matcher.json'
- '.github/workflows/lint-haml.yml'
- '.haml-lint*.yml'
- '.rubocop*.yml'
- '.ruby-version'
- '**/*.haml'
- 'Gemfile*'
pull_request:
paths:
- '.github/workflows/haml-lint-problem-matcher.json'
- '.github/workflows/lint-haml.yml'
- '.haml-lint*.yml'
- '.rubocop*.yml'
- '.ruby-version'
- '**/*.haml'
- 'Gemfile*'
jobs:
lint:
runs-on: ubuntu-latest
steps:
- name: Clone repository
uses: actions/checkout@v3
- name: Install native Ruby dependencies
run: sudo apt-get install -y libicu-dev libidn11-dev
- name: Set up Ruby
uses: ruby/setup-ruby@v1
with:
ruby-version: .ruby-version
bundler-cache: true
- name: Run haml-lint
run: |
echo "::add-matcher::.github/workflows/haml-lint-problem-matcher.json"
bundle exec haml-lint

View file

@ -2,7 +2,13 @@ name: PR Needs Rebase
on: on:
push: push:
branches-ignore:
- 'dependabot/**'
- 'l10n_main'
pull_request_target: pull_request_target:
branches-ignore:
- 'dependabot/**'
- 'l10n_main'
types: [synchronize] types: [synchronize]
permissions: permissions:

View file

@ -25,7 +25,7 @@ jobs:
services: services:
postgres: postgres:
image: postgres:14.5 image: postgres:14-alpine
env: env:
POSTGRES_PASSWORD: postgres POSTGRES_PASSWORD: postgres
POSTGRES_USER: postgres POSTGRES_USER: postgres
@ -38,7 +38,7 @@ jobs:
- 5432:5432 - 5432:5432
redis: redis:
image: redis:7.0 image: redis:7-alpine
options: >- options: >-
--health-cmd "redis-cli ping" --health-cmd "redis-cli ping"
--health-interval 10s --health-interval 10s

View file

@ -25,7 +25,7 @@ jobs:
services: services:
postgres: postgres:
image: postgres:14.5 image: postgres:14-alpine
env: env:
POSTGRES_PASSWORD: postgres POSTGRES_PASSWORD: postgres
POSTGRES_USER: postgres POSTGRES_USER: postgres
@ -37,7 +37,7 @@ jobs:
ports: ports:
- 5432:5432 - 5432:5432
redis: redis:
image: redis:7.0 image: redis:7-alpine
options: >- options: >-
--health-cmd "redis-cli ping" --health-cmd "redis-cli ping"
--health-interval 10s --health-interval 10s

141
.github/workflows/test-ruby.yml vendored Normal file
View file

@ -0,0 +1,141 @@
name: Ruby Testing
on:
push:
branches-ignore:
- 'dependabot/**'
pull_request:
env:
BUNDLE_CLEAN: true
BUNDLE_FROZEN: true
BUNDLE_WITHOUT: 'development production'
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
build:
runs-on: ubuntu-latest
env:
RAILS_ENV: test
steps:
- uses: actions/checkout@v3
- name: Set up Node.js
uses: actions/setup-node@v3
with:
cache: yarn
node-version-file: '.nvmrc'
- name: Install native Ruby dependencies
run: sudo apt-get install -y libicu-dev libidn11-dev
- name: Set up bundler cache
uses: ruby/setup-ruby@v1
with:
ruby-version: .ruby-version
bundler-cache: true
- run: yarn install --frozen-lockfile
- name: Precompile assets
# Previously had set this, but it's not supported
# export NODE_OPTIONS=--openssl-legacy-provider
run: |-
./bin/rails assets:precompile
- uses: actions/upload-artifact@v3
with:
path: |-
./public/assets
./public/packs-test
name: ${{ github.sha }}
retention-days: 0
test:
runs-on: ubuntu-latest
needs:
- build
services:
postgres:
image: postgres:14-alpine
env:
POSTGRES_PASSWORD: postgres
POSTGRES_USER: postgres
options: >-
--health-cmd pg_isready
--health-interval 10s
--health-timeout 5s
--health-retries 5
ports:
- 5432:5432
redis:
image: redis:7-alpine
options: >-
--health-cmd "redis-cli ping"
--health-interval 10s
--health-timeout 5s
--health-retries 5
ports:
- 6379:6379
env:
DB_HOST: localhost
DB_USER: postgres
DB_PASS: postgres
DISABLE_SIMPLECOV: true
RAILS_ENV: test
ALLOW_NOPAM: true
PAM_ENABLED: true
PAM_DEFAULT_SERVICE: pam_test
PAM_CONTROLLED_SERVICE: pam_test_controlled
BUNDLE_WITH: 'pam_authentication'
CI_JOBS: ${{ matrix.ci_job }}/4
strategy:
fail-fast: false
matrix:
ruby-version:
- '2.7'
- '3.0'
- '3.1'
- '.ruby-version'
ci_job:
- 1
- 2
- 3
- 4
steps:
- uses: actions/checkout@v3
- uses: actions/download-artifact@v3
with:
path: './public'
name: ${{ github.sha }}
- name: Install native Ruby dependencies
run: sudo apt-get install -y libicu-dev libidn11-dev
- name: Install additional system dependencies
run: sudo apt-get install -y ffmpeg imagemagick libpam-dev
- name: Set up bundler cache
uses: ruby/setup-ruby@v1
with:
ruby-version: ${{ matrix.ruby-version}}
bundler-cache: true
- name: Update system gems
if: matrix.ruby-version == '2.7'
run: gem update --system
- name: Load database schema
run: './bin/rails db:create db:schema:load db:seed'
- run: bundle exec rake rspec_chunked

View file

@ -1,108 +1,9 @@
# Whether to ignore frontmatter at the beginning of HAML documents for inherits_from: .haml-lint_todo.yml
# frameworks such as Jekyll/Middleman
skip_frontmatter: false
exclude: exclude:
- 'vendor/**/*' - 'vendor/**/*'
- 'spec/**/*' - lib/templates/haml/scaffold/_form.html.haml
- 'lib/templates/**/*'
- 'app/views/kaminari/**/*'
linters: linters:
AltText: AltText:
enabled: false
ClassAttributeWithStaticValue:
enabled: true
ClassesBeforeIds:
enabled: true
ConsecutiveComments:
enabled: true
ConsecutiveSilentScripts:
enabled: true
max_consecutive: 2
EmptyObjectReference:
enabled: true
EmptyScript:
enabled: true
FinalNewline:
enabled: true
present: true
HtmlAttributes:
enabled: true
ImplicitDiv:
enabled: true
LeadingCommentSpace:
enabled: true
LineLength:
enabled: false
max: 80
MultilinePipe:
enabled: true
MultilineScript:
enabled: true
ObjectReferenceAttributes:
enabled: true
RuboCop:
enabled: true
# These cops are incredibly noisy when it comes to HAML templates, so we
# ignore them.
ignored_cops:
- Lint/BlockAlignment
- Lint/EndAlignment
- Lint/Void
- Metrics/BlockLength
- Metrics/LineLength
- Style/AlignParameters
- Style/BlockNesting
- Style/ElseAlignment
- Style/EndOfLine
- Style/FileName
- Style/FinalNewline
- Style/FrozenStringLiteralComment
- Style/IfUnlessModifier
- Style/IndentationWidth
- Style/Next
- Style/TrailingBlankLines
- Style/TrailingWhitespace
- Style/WhileUntilModifier
RubyComments:
enabled: true
SpaceBeforeScript:
enabled: true
SpaceInsideHashAttributes:
enabled: true
style: space
Indentation:
enabled: true
character: space # or tab
TagName:
enabled: true
TrailingWhitespace:
enabled: true
UnnecessaryInterpolation:
enabled: true
UnnecessaryStringOutput:
enabled: true enabled: true

128
.haml-lint_todo.yml Normal file
View file

@ -0,0 +1,128 @@
# This configuration was generated by
# `haml-lint --auto-gen-config`
# on 2023-02-11 02:16:03 -0500 using Haml-Lint version 0.45.0.
# The point is for the user to remove these configuration records
# one by one as the lints are removed from the code base.
# Note that changes in the inspected code, or installation of new
# versions of Haml-Lint, may require this file to be generated again.
linters:
# Offense count: 76
RuboCop:
exclude:
- 'app/views/accounts/_og.html.haml'
- 'app/views/admin/account_actions/new.html.haml'
- 'app/views/admin/account_warnings/_account_warning.html.haml'
- 'app/views/admin/accounts/index.html.haml'
- 'app/views/admin/accounts/show.html.haml'
- 'app/views/admin/action_logs/index.html.haml'
- 'app/views/admin/announcements/edit.html.haml'
- 'app/views/admin/announcements/new.html.haml'
- 'app/views/admin/change_emails/show.html.haml'
- 'app/views/admin/custom_emojis/index.html.haml'
- 'app/views/admin/dashboard/index.html.haml'
- 'app/views/admin/disputes/appeals/_appeal.html.haml'
- 'app/views/admin/domain_blocks/edit.html.haml'
- 'app/views/admin/domain_blocks/new.html.haml'
- 'app/views/admin/ip_blocks/new.html.haml'
- 'app/views/admin/reports/actions/preview.html.haml'
- 'app/views/admin/reports/index.html.haml'
- 'app/views/admin/reports/show.html.haml'
- 'app/views/admin/roles/_form.html.haml'
- 'app/views/admin/settings/about/show.html.haml'
- 'app/views/admin/settings/appearance/show.html.haml'
- 'app/views/admin/settings/registrations/show.html.haml'
- 'app/views/admin/statuses/show.html.haml'
- 'app/views/application/_card.html.haml'
- 'app/views/application/_sidebar.html.haml'
- 'app/views/auth/registrations/_sessions.html.haml'
- 'app/views/auth/registrations/new.html.haml'
- 'app/views/auth/sessions/new.html.haml'
- 'app/views/disputes/strikes/show.html.haml'
- 'app/views/filters/_filter_fields.html.haml'
- 'app/views/invites/_form.html.haml'
- 'app/views/layouts/application.html.haml'
- 'app/views/layouts/error.html.haml'
- 'app/views/layouts/mailer.html.haml'
- 'app/views/notification_mailer/_status.html.haml'
- 'app/views/notification_mailer/favourite.html.haml'
- 'app/views/notification_mailer/follow_request.html.haml'
- 'app/views/oauth/authorizations/new.html.haml'
- 'app/views/oauth/authorized_applications/index.html.haml'
- 'app/views/settings/applications/_fields.html.haml'
- 'app/views/settings/imports/show.html.haml'
- 'app/views/settings/login_activities/_login_activity.html.haml'
- 'app/views/settings/preferences/appearance/show.html.haml'
- 'app/views/settings/preferences/other/show.html.haml'
- 'app/views/settings/preferences/other/show.html.haml'
- 'app/views/statuses_cleanup/show.html.haml'
- 'app/views/statuses/_detailed_status.html.haml'
- 'app/views/statuses/_og_image.html.haml'
- 'app/views/statuses/_poll.html.haml'
- 'app/views/statuses/_status.html.haml'
- 'app/views/statuses/show.html.haml'
- 'app/views/user_mailer/suspicious_sign_in.html.haml'
- 'app/views/user_mailer/warning.html.haml'
- 'app/views/user_mailer/webauthn_credential_added.html.haml'
- 'app/views/user_mailer/webauthn_credential_deleted.html.haml'
# Offense count: 918
LineLength:
enabled: false
# Offense count: 22
UnnecessaryStringOutput:
exclude:
- 'app/views/accounts/show.html.haml'
- 'app/views/admin/custom_emojis/_custom_emoji.html.haml'
- 'app/views/admin/relays/_relay.html.haml'
- 'app/views/admin/rules/_rule.html.haml'
- 'app/views/admin/statuses/index.html.haml'
- 'app/views/auth/registrations/_sessions.html.haml'
- 'app/views/disputes/strikes/show.html.haml'
- 'app/views/notification_mailer/_status.html.haml'
- 'app/views/settings/two_factor_authentication_methods/index.html.haml'
- 'app/views/statuses/_detailed_status.html.haml'
- 'app/views/statuses/_poll.html.haml'
- 'app/views/statuses/_simple_status.html.haml'
- 'app/views/user_mailer/suspicious_sign_in.html.haml'
- 'app/views/user_mailer/webauthn_credential_added.html.haml'
- 'app/views/user_mailer/webauthn_credential_deleted.html.haml'
- 'app/views/user_mailer/welcome.html.haml'
# Offense count: 3
ViewLength:
exclude:
- 'app/views/admin/accounts/show.html.haml'
- 'app/views/admin/reports/show.html.haml'
- 'app/views/disputes/strikes/show.html.haml'
# Offense count: 43
InstanceVariables:
exclude:
- 'app/views/admin/reports/_actions.html.haml'
- 'app/views/admin/roles/_form.html.haml'
- 'app/views/admin/webhooks/_form.html.haml'
- 'app/views/application/_sidebar.html.haml'
- 'app/views/auth/registrations/_sessions.html.haml'
- 'app/views/auth/registrations/_status.html.haml'
- 'app/views/auth/sessions/two_factor/_otp_authentication_form.html.haml'
- 'app/views/authorize_interactions/_post_follow_actions.html.haml'
- 'app/views/invites/_form.html.haml'
- 'app/views/relationships/_account.html.haml'
- 'app/views/shared/_og.html.haml'
- 'app/views/statuses/_status.html.haml'
# Offense count: 6
ConsecutiveSilentScripts:
exclude:
- 'app/views/admin/settings/shared/_links.html.haml'
- 'app/views/settings/login_activities/_login_activity.html.haml'
- 'app/views/statuses/_poll.html.haml'
# Offense count: 3
IdNames:
exclude:
- 'app/views/authorize_interactions/error.html.haml'
- 'app/views/oauth/authorizations/error.html.haml'
- 'app/views/shared/_error_messages.html.haml'

View file

@ -96,9 +96,26 @@ Rails/Exit:
- 'lib/mastodon/cli_helper.rb' - 'lib/mastodon/cli_helper.rb'
- 'lib/cli.rb' - 'lib/cli.rb'
# Reason: Some single letter camel case files shouldn't be split
# https://docs.rubocop.org/rubocop-rspec/cops_rspec.html#rspecfilepath
RSpec/FilePath: RSpec/FilePath:
CustomTransform: CustomTransform:
ActivityPub: activitypub # Ignore the snake_case due to the amount of files to rename
DeepL: deepl DeepL: deepl
FetchOEmbedService: fetch_oembed_service
JsonLdHelper: jsonld_helper
OEmbedController: oembed_controller
OStatus: ostatus
NodeInfoController: nodeinfo_controller # NodeInfo isn't snake_cased for any of the instances
Exclude:
- 'spec/config/initializers/rack_attack_spec.rb' # namespaces usually have separate folder
- 'spec/lib/sanitize_config_spec.rb' # namespaces usually have separate folder
- 'spec/controllers/concerns/account_controller_concern_spec.rb' # Concerns describe ApplicationController and don't fit naming
- 'spec/controllers/concerns/export_controller_concern_spec.rb'
- 'spec/controllers/concerns/localized_spec.rb'
- 'spec/controllers/concerns/rate_limit_headers_spec.rb'
- 'spec/controllers/concerns/signature_verification_spec.rb'
- 'spec/controllers/concerns/user_tracking_concern_spec.rb'
RSpec/NotToNot: RSpec/NotToNot:
EnforcedStyle: to_not EnforcedStyle: to_not

View file

@ -301,13 +301,6 @@ Performance/DeletePrefix:
- 'app/services/resolve_account_service.rb' - 'app/services/resolve_account_service.rb'
- 'app/services/tag_search_service.rb' - 'app/services/tag_search_service.rb'
# Offense count: 1
# This cop supports unsafe autocorrection (--autocorrect-all).
# Configuration parameters: SafeMultiline.
Performance/DeleteSuffix:
Exclude:
- 'lib/tasks/repo.rake'
# Offense count: 19 # Offense count: 19
# This cop supports unsafe autocorrection (--autocorrect-all). # This cop supports unsafe autocorrection (--autocorrect-all).
Performance/MapCompact: Performance/MapCompact:
@ -655,73 +648,6 @@ RSpec/ExpectInHook:
- 'spec/controllers/settings/applications_controller_spec.rb' - 'spec/controllers/settings/applications_controller_spec.rb'
- 'spec/lib/status_filter_spec.rb' - 'spec/lib/status_filter_spec.rb'
# Offense count: 61
# Configuration parameters: Include, CustomTransform, IgnoreMethods, SpecSuffixOnly.
# Include: **/*_spec*rb*, **/spec/**/*
RSpec/FilePath:
Exclude:
- 'spec/config/initializers/rack_attack_spec.rb'
- 'spec/controllers/activitypub/collections_controller_spec.rb'
- 'spec/controllers/activitypub/followers_synchronizations_controller_spec.rb'
- 'spec/controllers/activitypub/inboxes_controller_spec.rb'
- 'spec/controllers/activitypub/outboxes_controller_spec.rb'
- 'spec/controllers/activitypub/replies_controller_spec.rb'
- 'spec/controllers/admin/change_email_controller_spec.rb'
- 'spec/controllers/admin/users/roles_controller.rb'
- 'spec/controllers/api/oembed_controller_spec.rb'
- 'spec/controllers/concerns/account_controller_concern_spec.rb'
- 'spec/controllers/concerns/export_controller_concern_spec.rb'
- 'spec/controllers/concerns/localized_spec.rb'
- 'spec/controllers/concerns/rate_limit_headers_spec.rb'
- 'spec/controllers/concerns/signature_verification_spec.rb'
- 'spec/controllers/concerns/user_tracking_concern_spec.rb'
- 'spec/controllers/well_known/nodeinfo_controller_spec.rb'
- 'spec/helpers/admin/action_log_helper_spec.rb'
- 'spec/helpers/jsonld_helper_spec.rb'
- 'spec/lib/activitypub/activity/accept_spec.rb'
- 'spec/lib/activitypub/activity/add_spec.rb'
- 'spec/lib/activitypub/activity/announce_spec.rb'
- 'spec/lib/activitypub/activity/block_spec.rb'
- 'spec/lib/activitypub/activity/create_spec.rb'
- 'spec/lib/activitypub/activity/delete_spec.rb'
- 'spec/lib/activitypub/activity/flag_spec.rb'
- 'spec/lib/activitypub/activity/follow_spec.rb'
- 'spec/lib/activitypub/activity/like_spec.rb'
- 'spec/lib/activitypub/activity/move_spec.rb'
- 'spec/lib/activitypub/activity/reject_spec.rb'
- 'spec/lib/activitypub/activity/remove_spec.rb'
- 'spec/lib/activitypub/activity/undo_spec.rb'
- 'spec/lib/activitypub/activity/update_spec.rb'
- 'spec/lib/activitypub/adapter_spec.rb'
- 'spec/lib/activitypub/dereferencer_spec.rb'
- 'spec/lib/activitypub/linked_data_signature_spec.rb'
- 'spec/lib/activitypub/tag_manager_spec.rb'
- 'spec/lib/ostatus/tag_manager_spec.rb'
- 'spec/lib/sanitize_config_spec.rb'
- 'spec/serializers/activitypub/note_serializer_spec.rb'
- 'spec/serializers/activitypub/update_poll_serializer_spec.rb'
- 'spec/services/activitypub/fetch_featured_collection_service_spec.rb'
- 'spec/services/activitypub/fetch_featured_tags_collection_service_spec.rb'
- 'spec/services/activitypub/fetch_remote_account_service_spec.rb'
- 'spec/services/activitypub/fetch_remote_actor_service_spec.rb'
- 'spec/services/activitypub/fetch_remote_key_service_spec.rb'
- 'spec/services/activitypub/fetch_remote_status_service_spec.rb'
- 'spec/services/activitypub/fetch_replies_service_spec.rb'
- 'spec/services/activitypub/process_account_service_spec.rb'
- 'spec/services/activitypub/process_collection_service_spec.rb'
- 'spec/services/activitypub/process_status_update_service_spec.rb'
- 'spec/services/activitypub/synchronize_followers_service_spec.rb'
- 'spec/services/fetch_oembed_service_spec.rb'
- 'spec/services/remove_from_follwers_service_spec.rb'
- 'spec/workers/activitypub/delivery_worker_spec.rb'
- 'spec/workers/activitypub/distribute_poll_update_worker_spec.rb'
- 'spec/workers/activitypub/distribution_worker_spec.rb'
- 'spec/workers/activitypub/fetch_replies_worker_spec.rb'
- 'spec/workers/activitypub/move_distribution_worker_spec.rb'
- 'spec/workers/activitypub/processing_worker_spec.rb'
- 'spec/workers/activitypub/status_update_distribution_worker_spec.rb'
- 'spec/workers/activitypub/update_distribution_worker_spec.rb'
# Offense count: 16 # Offense count: 16
# This cop supports safe autocorrection (--autocorrect). # This cop supports safe autocorrection (--autocorrect).
# Configuration parameters: EnforcedStyle. # Configuration parameters: EnforcedStyle.

View file

@ -79,8 +79,6 @@ It is not always possible to phrase every change in such a manner, but it is des
- Code style rules (rubocop, eslint) - Code style rules (rubocop, eslint)
- Normalization of locale files (i18n-tasks) - Normalization of locale files (i18n-tasks)
**Note**: You may need to log in and authorise the GitHub account your fork of this repository belongs to with CircleCI to enable some of the automated checks to run.
## Documentation ## Documentation
The [Mastodon documentation](https://docs.joinmastodon.org) is a statically generated site. You can [submit merge requests to mastodon/documentation](https://github.com/mastodon/documentation). The [Mastodon documentation](https://docs.joinmastodon.org) is a statically generated site. You can [submit merge requests to mastodon/documentation](https://github.com/mastodon/documentation).

View file

@ -4,7 +4,6 @@ source 'https://rubygems.org'
ruby '>= 2.7.0', '< 3.3.0' ruby '>= 2.7.0', '< 3.3.0'
gem 'pkg-config', '~> 1.5' gem 'pkg-config', '~> 1.5'
gem 'rexml', '~> 3.2'
gem 'puma', '~> 6.1' gem 'puma', '~> 6.1'
gem 'rails', '~> 6.1.7' gem 'rails', '~> 6.1.7'
@ -40,7 +39,7 @@ end
gem 'net-ldap', '~> 0.17' gem 'net-ldap', '~> 0.17'
gem 'omniauth-cas', '~> 2.0' gem 'omniauth-cas', '~> 2.0'
gem 'omniauth-saml', '~> 1.10' gem 'omniauth-saml', '~> 1.10'
gem 'omniauth_openid_connect', '~> 0.6.0' gem 'omniauth_openid_connect', '~> 0.6.1'
gem 'omniauth', '~> 1.9' gem 'omniauth', '~> 1.9'
gem 'omniauth-rails_csrf_protection', '~> 0.1' gem 'omniauth-rails_csrf_protection', '~> 0.1'
@ -105,6 +104,7 @@ group :development, :test do
gem 'fuubar', '~> 2.5' gem 'fuubar', '~> 2.5'
gem 'i18n-tasks', '~> 1.0', require: false gem 'i18n-tasks', '~> 1.0', require: false
gem 'rspec-rails', '~> 6.0' gem 'rspec-rails', '~> 6.0'
gem 'rspec_chunked', '~> 0.6'
gem 'rubocop-performance', require: false gem 'rubocop-performance', require: false
gem 'rubocop-rails', require: false gem 'rubocop-rails', require: false
gem 'rubocop-rspec', require: false gem 'rubocop-rspec', require: false
@ -117,6 +117,7 @@ end
group :test do group :test do
gem 'capybara', '~> 3.38' gem 'capybara', '~> 3.38'
gem 'climate_control'
gem 'faker', '~> 3.1' gem 'faker', '~> 3.1'
gem 'json-schema', '~> 3.0' gem 'json-schema', '~> 3.0'
gem 'rack-test', '~> 2.0' gem 'rack-test', '~> 2.0'
@ -138,6 +139,7 @@ group :development do
gem 'memory_profiler' gem 'memory_profiler'
gem 'brakeman', '~> 5.4', require: false gem 'brakeman', '~> 5.4', require: false
gem 'bundler-audit', '~> 0.9', require: false gem 'bundler-audit', '~> 0.9', require: false
gem 'haml_lint', require: false
gem 'capistrano', '~> 3.17' gem 'capistrano', '~> 3.17'
gem 'capistrano-rails', '~> 1.6' gem 'capistrano-rails', '~> 1.6'

View file

@ -30,40 +30,40 @@ GIT
GEM GEM
remote: https://rubygems.org/ remote: https://rubygems.org/
specs: specs:
actioncable (6.1.7.2) actioncable (6.1.7.3)
actionpack (= 6.1.7.2) actionpack (= 6.1.7.3)
activesupport (= 6.1.7.2) activesupport (= 6.1.7.3)
nio4r (~> 2.0) nio4r (~> 2.0)
websocket-driver (>= 0.6.1) websocket-driver (>= 0.6.1)
actionmailbox (6.1.7.2) actionmailbox (6.1.7.3)
actionpack (= 6.1.7.2) actionpack (= 6.1.7.3)
activejob (= 6.1.7.2) activejob (= 6.1.7.3)
activerecord (= 6.1.7.2) activerecord (= 6.1.7.3)
activestorage (= 6.1.7.2) activestorage (= 6.1.7.3)
activesupport (= 6.1.7.2) activesupport (= 6.1.7.3)
mail (>= 2.7.1) mail (>= 2.7.1)
actionmailer (6.1.7.2) actionmailer (6.1.7.3)
actionpack (= 6.1.7.2) actionpack (= 6.1.7.3)
actionview (= 6.1.7.2) actionview (= 6.1.7.3)
activejob (= 6.1.7.2) activejob (= 6.1.7.3)
activesupport (= 6.1.7.2) activesupport (= 6.1.7.3)
mail (~> 2.5, >= 2.5.4) mail (~> 2.5, >= 2.5.4)
rails-dom-testing (~> 2.0) rails-dom-testing (~> 2.0)
actionpack (6.1.7.2) actionpack (6.1.7.3)
actionview (= 6.1.7.2) actionview (= 6.1.7.3)
activesupport (= 6.1.7.2) activesupport (= 6.1.7.3)
rack (~> 2.0, >= 2.0.9) rack (~> 2.0, >= 2.0.9)
rack-test (>= 0.6.3) rack-test (>= 0.6.3)
rails-dom-testing (~> 2.0) rails-dom-testing (~> 2.0)
rails-html-sanitizer (~> 1.0, >= 1.2.0) rails-html-sanitizer (~> 1.0, >= 1.2.0)
actiontext (6.1.7.2) actiontext (6.1.7.3)
actionpack (= 6.1.7.2) actionpack (= 6.1.7.3)
activerecord (= 6.1.7.2) activerecord (= 6.1.7.3)
activestorage (= 6.1.7.2) activestorage (= 6.1.7.3)
activesupport (= 6.1.7.2) activesupport (= 6.1.7.3)
nokogiri (>= 1.8.5) nokogiri (>= 1.8.5)
actionview (6.1.7.2) actionview (6.1.7.3)
activesupport (= 6.1.7.2) activesupport (= 6.1.7.3)
builder (~> 3.1) builder (~> 3.1)
erubi (~> 1.4) erubi (~> 1.4)
rails-dom-testing (~> 2.0) rails-dom-testing (~> 2.0)
@ -74,22 +74,22 @@ GEM
case_transform (>= 0.2) case_transform (>= 0.2)
jsonapi-renderer (>= 0.1.1.beta1, < 0.3) jsonapi-renderer (>= 0.1.1.beta1, < 0.3)
active_record_query_trace (1.8) active_record_query_trace (1.8)
activejob (6.1.7.2) activejob (6.1.7.3)
activesupport (= 6.1.7.2) activesupport (= 6.1.7.3)
globalid (>= 0.3.6) globalid (>= 0.3.6)
activemodel (6.1.7.2) activemodel (6.1.7.3)
activesupport (= 6.1.7.2) activesupport (= 6.1.7.3)
activerecord (6.1.7.2) activerecord (6.1.7.3)
activemodel (= 6.1.7.2) activemodel (= 6.1.7.3)
activesupport (= 6.1.7.2) activesupport (= 6.1.7.3)
activestorage (6.1.7.2) activestorage (6.1.7.3)
actionpack (= 6.1.7.2) actionpack (= 6.1.7.3)
activejob (= 6.1.7.2) activejob (= 6.1.7.3)
activerecord (= 6.1.7.2) activerecord (= 6.1.7.3)
activesupport (= 6.1.7.2) activesupport (= 6.1.7.3)
marcel (~> 1.0) marcel (~> 1.0)
mini_mime (>= 1.1.0) mini_mime (>= 1.1.0)
activesupport (6.1.7.2) activesupport (6.1.7.3)
concurrent-ruby (~> 1.0, >= 1.0.2) concurrent-ruby (~> 1.0, >= 1.0.2)
i18n (>= 1.6, < 2) i18n (>= 1.6, < 2)
minitest (>= 5.1) minitest (>= 5.1)
@ -225,7 +225,7 @@ GEM
docile (1.4.0) docile (1.4.0)
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.6.4) doorkeeper (5.6.5)
railties (>= 5) railties (>= 5)
dotenv (2.8.1) dotenv (2.8.1)
dotenv-rails (2.8.1) dotenv-rails (2.8.1)
@ -308,6 +308,12 @@ GEM
activesupport (>= 5.1) activesupport (>= 5.1)
haml (>= 4.0.6) haml (>= 4.0.6)
railties (>= 5.1) railties (>= 5.1)
haml_lint (0.45.0)
haml (>= 4.0, < 6.2)
parallel (~> 1.10)
rainbow
rubocop (>= 0.50.0)
sysexits (~> 1.1)
hashdiff (1.0.1) hashdiff (1.0.1)
hashie (5.0.0) hashie (5.0.0)
hcaptcha (7.1.0) hcaptcha (7.1.0)
@ -399,7 +405,7 @@ GEM
loofah (2.19.1) loofah (2.19.1)
crass (~> 1.0.2) crass (~> 1.0.2)
nokogiri (>= 1.5.9) nokogiri (>= 1.5.9)
mail (2.8.0.1) mail (2.8.1)
mini_mime (>= 0.1.1) mini_mime (>= 0.1.1)
net-imap net-imap
net-pop net-pop
@ -417,7 +423,7 @@ GEM
mime-types-data (3.2022.0105) mime-types-data (3.2022.0105)
mini_mime (1.1.2) mini_mime (1.1.2)
mini_portile2 (2.8.1) mini_portile2 (2.8.1)
minitest (5.17.0) minitest (5.18.0)
msgpack (1.6.0) msgpack (1.6.0)
multi_json (1.15.0) multi_json (1.15.0)
multipart-post (2.3.0) multipart-post (2.3.0)
@ -459,7 +465,7 @@ GEM
omniauth-saml (1.10.3) omniauth-saml (1.10.3)
omniauth (~> 1.3, >= 1.3.2) omniauth (~> 1.3, >= 1.3.2)
ruby-saml (~> 1.9) ruby-saml (~> 1.9)
omniauth_openid_connect (0.6.0) omniauth_openid_connect (0.6.1)
omniauth (>= 1.9, < 3) omniauth (>= 1.9, < 3)
openid_connect (~> 1.1) openid_connect (~> 1.1)
openid_connect (1.4.2) openid_connect (1.4.2)
@ -479,13 +485,13 @@ GEM
orm_adapter (0.5.0) orm_adapter (0.5.0)
ox (2.14.14) ox (2.14.14)
parallel (1.22.1) parallel (1.22.1)
parser (3.2.1.0) parser (3.2.1.1)
ast (~> 2.4.1) ast (~> 2.4.1)
parslet (2.0.0) parslet (2.0.0)
pastel (0.8.0) pastel (0.8.0)
tty-color (~> 0.5) tty-color (~> 0.5)
pg (1.4.5) pg (1.4.6)
pghero (3.1.0) pghero (3.3.0)
activerecord (>= 6) activerecord (>= 6)
pkg-config (1.5.1) pkg-config (1.5.1)
posix-spawn (0.3.15) posix-spawn (0.3.15)
@ -499,13 +505,13 @@ GEM
premailer (~> 1.7, >= 1.7.9) premailer (~> 1.7, >= 1.7.9)
private_address_check (0.5.0) private_address_check (0.5.0)
public_suffix (5.0.1) public_suffix (5.0.1)
puma (6.1.0) puma (6.1.1)
nio4r (~> 2.0) nio4r (~> 2.0)
pundit (2.3.0) pundit (2.3.0)
activesupport (>= 3.0.0) activesupport (>= 3.0.0)
raabro (1.4.0) raabro (1.4.0)
racc (1.6.2) racc (1.6.2)
rack (2.2.6.2) rack (2.2.6.4)
rack-attack (6.6.1) rack-attack (6.6.1)
rack (>= 1.0, < 3) rack (>= 1.0, < 3)
rack-cors (1.1.1) rack-cors (1.1.1)
@ -520,20 +526,20 @@ GEM
rack rack
rack-test (2.0.2) rack-test (2.0.2)
rack (>= 1.3) rack (>= 1.3)
rails (6.1.7.2) rails (6.1.7.3)
actioncable (= 6.1.7.2) actioncable (= 6.1.7.3)
actionmailbox (= 6.1.7.2) actionmailbox (= 6.1.7.3)
actionmailer (= 6.1.7.2) actionmailer (= 6.1.7.3)
actionpack (= 6.1.7.2) actionpack (= 6.1.7.3)
actiontext (= 6.1.7.2) actiontext (= 6.1.7.3)
actionview (= 6.1.7.2) actionview (= 6.1.7.3)
activejob (= 6.1.7.2) activejob (= 6.1.7.3)
activemodel (= 6.1.7.2) activemodel (= 6.1.7.3)
activerecord (= 6.1.7.2) activerecord (= 6.1.7.3)
activestorage (= 6.1.7.2) activestorage (= 6.1.7.3)
activesupport (= 6.1.7.2) activesupport (= 6.1.7.3)
bundler (>= 1.15.0) bundler (>= 1.15.0)
railties (= 6.1.7.2) railties (= 6.1.7.3)
sprockets-rails (>= 2.0.0) sprockets-rails (>= 2.0.0)
rails-controller-testing (1.0.5) rails-controller-testing (1.0.5)
actionpack (>= 5.0.1.rc1) actionpack (>= 5.0.1.rc1)
@ -547,9 +553,9 @@ GEM
rails-i18n (6.0.0) rails-i18n (6.0.0)
i18n (>= 0.7, < 2) i18n (>= 0.7, < 2)
railties (>= 6.0.0, < 7) railties (>= 6.0.0, < 7)
railties (6.1.7.2) railties (6.1.7.3)
actionpack (= 6.1.7.2) actionpack (= 6.1.7.3)
activesupport (= 6.1.7.2) activesupport (= 6.1.7.3)
method_source method_source
rake (>= 12.2) rake (>= 12.2)
thor (~> 1.0) thor (~> 1.0)
@ -598,20 +604,21 @@ GEM
rspec-core (~> 3.0, >= 3.0.0) rspec-core (~> 3.0, >= 3.0.0)
sidekiq (>= 2.4.0) sidekiq (>= 2.4.0)
rspec-support (3.12.0) rspec-support (3.12.0)
rspec_chunked (0.6)
rspec_junit_formatter (0.6.0) rspec_junit_formatter (0.6.0)
rspec-core (>= 2, < 4, != 2.12.0) rspec-core (>= 2, < 4, != 2.12.0)
rubocop (1.45.1) rubocop (1.48.1)
json (~> 2.3) json (~> 2.3)
parallel (~> 1.10) parallel (~> 1.10)
parser (>= 3.2.0.0) parser (>= 3.2.0.0)
rainbow (>= 2.2.2, < 4.0) rainbow (>= 2.2.2, < 4.0)
regexp_parser (>= 1.8, < 3.0) regexp_parser (>= 1.8, < 3.0)
rexml (>= 3.2.5, < 4.0) rexml (>= 3.2.5, < 4.0)
rubocop-ast (>= 1.24.1, < 2.0) rubocop-ast (>= 1.26.0, < 2.0)
ruby-progressbar (~> 1.7) ruby-progressbar (~> 1.7)
unicode-display_width (>= 2.4.0, < 3.0) unicode-display_width (>= 2.4.0, < 3.0)
rubocop-ast (1.24.1) rubocop-ast (1.27.0)
parser (>= 3.1.1.0) parser (>= 3.2.1.0)
rubocop-capybara (2.17.0) rubocop-capybara (2.17.0)
rubocop (~> 1.41) rubocop (~> 1.41)
rubocop-performance (1.16.0) rubocop-performance (1.16.0)
@ -646,9 +653,9 @@ GEM
redis (>= 4.5.0, < 5) redis (>= 4.5.0, < 5)
sidekiq-bulk (0.2.0) sidekiq-bulk (0.2.0)
sidekiq sidekiq
sidekiq-scheduler (5.0.1) sidekiq-scheduler (5.0.2)
rufus-scheduler (~> 3.2) rufus-scheduler (~> 3.2)
sidekiq (>= 4, < 8) sidekiq (>= 6, < 8)
tilt (>= 1.4.0) tilt (>= 1.4.0)
sidekiq-unique-jobs (7.1.29) sidekiq-unique-jobs (7.1.29)
brpoplpush-redis_script (> 0.1.1, <= 2.0.0) brpoplpush-redis_script (> 0.1.1, <= 2.0.0)
@ -688,14 +695,15 @@ GEM
activesupport (>= 3) activesupport (>= 3)
attr_required (>= 0.0.5) attr_required (>= 0.0.5)
httpclient (>= 2.4) httpclient (>= 2.4)
sysexits (1.2.0)
temple (0.10.0) temple (0.10.0)
terminal-table (3.0.2) terminal-table (3.0.2)
unicode-display_width (>= 1.1.1, < 3) unicode-display_width (>= 1.1.1, < 3)
terrapin (0.6.0) terrapin (0.6.0)
climate_control (>= 0.0.3, < 1.0) climate_control (>= 0.0.3, < 1.0)
thor (1.2.1) thor (1.2.1)
tilt (2.0.11) tilt (2.1.0)
timeout (0.3.1) timeout (0.3.2)
tpm-key_attestation (0.12.0) tpm-key_attestation (0.12.0)
bindata (~> 2.4) bindata (~> 2.4)
openssl (> 2.0) openssl (> 2.0)
@ -785,6 +793,7 @@ DEPENDENCIES
capybara (~> 3.38) capybara (~> 3.38)
charlock_holmes (~> 0.7.7) charlock_holmes (~> 0.7.7)
chewy (~> 7.2) chewy (~> 7.2)
climate_control
cocoon (~> 1.2) cocoon (~> 1.2)
color_diff (~> 0.1) color_diff (~> 0.1)
concurrent-ruby concurrent-ruby
@ -804,6 +813,7 @@ DEPENDENCIES
fog-openstack (~> 0.3) fog-openstack (~> 0.3)
fuubar (~> 2.5) fuubar (~> 2.5)
haml-rails (~> 2.0) haml-rails (~> 2.0)
haml_lint
hcaptcha (~> 7.1) hcaptcha (~> 7.1)
hiredis (~> 0.6) hiredis (~> 0.6)
htmlentities (~> 4.3) htmlentities (~> 4.3)
@ -834,7 +844,7 @@ DEPENDENCIES
omniauth-cas (~> 2.0) omniauth-cas (~> 2.0)
omniauth-rails_csrf_protection (~> 0.1) omniauth-rails_csrf_protection (~> 0.1)
omniauth-saml (~> 1.10) omniauth-saml (~> 1.10)
omniauth_openid_connect (~> 0.6.0) omniauth_openid_connect (~> 0.6.1)
ox (~> 2.14) ox (~> 2.14)
parslet parslet
pg (~> 1.4) pg (~> 1.4)
@ -858,10 +868,10 @@ DEPENDENCIES
redcarpet (~> 3.6) redcarpet (~> 3.6)
redis (~> 4.5) redis (~> 4.5)
redis-namespace (~> 1.10) redis-namespace (~> 1.10)
rexml (~> 3.2)
rqrcode (~> 2.1) rqrcode (~> 2.1)
rspec-rails (~> 6.0) rspec-rails (~> 6.0)
rspec-sidekiq (~> 3.1) rspec-sidekiq (~> 3.1)
rspec_chunked (~> 0.6)
rspec_junit_formatter (~> 0.6) rspec_junit_formatter (~> 0.6)
rubocop rubocop
rubocop-performance rubocop-performance

View file

@ -63,7 +63,11 @@ class ApplicationController < ActionController::Base
end end
def after_sign_out_path_for(_resource_or_scope) def after_sign_out_path_for(_resource_or_scope)
new_user_session_path if ENV['OMNIAUTH_ONLY'] == 'true' && ENV['OIDC_ENABLED'] == 'true'
'/auth/auth/openid_connect/logout'
else
new_user_session_path
end
end end
protected protected

View file

@ -33,7 +33,7 @@ class Auth::OmniauthCallbacksController < Devise::OmniauthCallbacksController
def after_sign_in_path_for(resource) def after_sign_in_path_for(resource)
if resource.email_present? if resource.email_present?
root_path stored_location_for(resource) || root_path
else else
auth_setup_path(missing_email: '1') auth_setup_path(missing_email: '1')
end end

View file

@ -52,7 +52,7 @@ module Settings
end end
else else
flash[:error] = I18n.t('webauthn_credentials.create.error') flash[:error] = I18n.t('webauthn_credentials.create.error')
status = :internal_server_error status = :unprocessable_entity
end end
else else
flash[:error] = t('webauthn_credentials.create.error') flash[:error] = t('webauthn_credentials.create.error')

View file

@ -54,6 +54,8 @@ const messages = defineMessages({
redraftMessage: { id: 'confirmations.redraft.message', defaultMessage: 'Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.' }, redraftMessage: { id: 'confirmations.redraft.message', defaultMessage: 'Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.' },
replyConfirm: { id: 'confirmations.reply.confirm', defaultMessage: 'Reply' }, replyConfirm: { id: 'confirmations.reply.confirm', defaultMessage: 'Reply' },
replyMessage: { id: 'confirmations.reply.message', defaultMessage: 'Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?' }, replyMessage: { id: 'confirmations.reply.message', defaultMessage: 'Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?' },
editConfirm: { id: 'confirmations.edit.confirm', defaultMessage: 'Edit' },
editMessage: { id: 'confirmations.edit.message', defaultMessage: 'Editing now will overwrite the message you are currently composing. Are you sure you want to proceed?' },
unfilterConfirm: { id: 'confirmations.unfilter.confirm', defaultMessage: 'Show' }, unfilterConfirm: { id: 'confirmations.unfilter.confirm', defaultMessage: 'Show' },
author: { id: 'confirmations.unfilter.author', defaultMessage: 'Author' }, author: { id: 'confirmations.unfilter.author', defaultMessage: 'Author' },
matchingFilters: { id: 'confirmations.unfilter.filters', defaultMessage: 'Matching {count, plural, one {filter} other {filters}}' }, matchingFilters: { id: 'confirmations.unfilter.filters', defaultMessage: 'Matching {count, plural, one {filter} other {filters}}' },
@ -193,7 +195,18 @@ const mapDispatchToProps = (dispatch, { intl, contextType }) => ({
}, },
onEdit (status, history) { onEdit (status, history) {
dispatch(editStatus(status.get('id'), history)); dispatch((_, getState) => {
let state = getState();
if (state.getIn(['compose', 'text']).trim().length !== 0) {
dispatch(openModal('CONFIRM', {
message: intl.formatMessage(messages.editMessage),
confirm: intl.formatMessage(messages.editConfirm),
onConfirm: () => dispatch(editStatus(status.get('id'), history)),
}));
} else {
dispatch(editStatus(status.get('id'), history));
}
});
}, },
onTranslate (status) { onTranslate (status) {

View file

@ -1628,6 +1628,7 @@ button.icon-button.active i.fa-retweet {
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
text-align: center;
color: $secondary-text-color; color: $secondary-text-color;
font-size: 18px; font-size: 18px;
font-weight: 500; font-weight: 500;

View file

@ -58,6 +58,8 @@ const messages = defineMessages({
redraftMessage: { id: 'confirmations.redraft.message', defaultMessage: 'Are you sure you want to delete this status and re-draft it? Favourites and boosts will be lost, and replies to the original post will be orphaned.' }, redraftMessage: { id: 'confirmations.redraft.message', defaultMessage: 'Are you sure you want to delete this status and re-draft it? Favourites and boosts will be lost, and replies to the original post will be orphaned.' },
replyConfirm: { id: 'confirmations.reply.confirm', defaultMessage: 'Reply' }, replyConfirm: { id: 'confirmations.reply.confirm', defaultMessage: 'Reply' },
replyMessage: { id: 'confirmations.reply.message', defaultMessage: 'Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?' }, replyMessage: { id: 'confirmations.reply.message', defaultMessage: 'Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?' },
editConfirm: { id: 'confirmations.edit.confirm', defaultMessage: 'Edit' },
editMessage: { id: 'confirmations.edit.message', defaultMessage: 'Editing now will overwrite the message you are currently composing. Are you sure you want to proceed?' },
blockDomainConfirm: { id: 'confirmations.domain_block.confirm', defaultMessage: 'Hide entire domain' }, blockDomainConfirm: { id: 'confirmations.domain_block.confirm', defaultMessage: 'Hide entire domain' },
}); });
@ -160,7 +162,18 @@ const mapDispatchToProps = (dispatch, { intl, contextType }) => ({
}, },
onEdit (status, history) { onEdit (status, history) {
dispatch(editStatus(status.get('id'), history)); dispatch((_, getState) => {
let state = getState();
if (state.getIn(['compose', 'text']).trim().length !== 0) {
dispatch(openModal('CONFIRM', {
message: intl.formatMessage(messages.editMessage),
confirm: intl.formatMessage(messages.editConfirm),
onConfirm: () => dispatch(editStatus(status.get('id'), history)),
}));
} else {
dispatch(editStatus(status.get('id'), history));
}
});
}, },
onTranslate (status) { onTranslate (status) {

View file

@ -166,6 +166,8 @@
"confirmations.discard_edit_media.message": "You have unsaved changes to the media description or preview, discard them anyway?", "confirmations.discard_edit_media.message": "You have unsaved changes to the media description or preview, discard them anyway?",
"confirmations.domain_block.confirm": "Block entire domain", "confirmations.domain_block.confirm": "Block entire domain",
"confirmations.domain_block.message": "Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable. You will not see content from that domain in any public timelines or your notifications. Your followers from that domain will be removed.", "confirmations.domain_block.message": "Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable. You will not see content from that domain in any public timelines or your notifications. Your followers from that domain will be removed.",
"confirmations.edit.confirm": "Edit",
"confirmations.edit.message": "Editing now will overwrite the message you are currently composing. Are you sure you want to proceed?",
"confirmations.logout.confirm": "Log out", "confirmations.logout.confirm": "Log out",
"confirmations.logout.message": "Are you sure you want to log out?", "confirmations.logout.message": "Are you sure you want to log out?",
"confirmations.mute.confirm": "Mute", "confirmations.mute.confirm": "Mute",

View file

@ -4527,6 +4527,7 @@ a.status-card.compact:hover {
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
text-align: center;
color: $secondary-text-color; color: $secondary-text-color;
font-size: 18px; font-size: 18px;
font-weight: 500; font-weight: 500;

View file

@ -12,7 +12,7 @@ class ActivityPub::Forwarder
end end
def forward! def forward!
ActivityPub::LowPriorityDeliveryWorker.push_bulk(inboxes) do |inbox_url| ActivityPub::LowPriorityDeliveryWorker.push_bulk(inboxes, limit: 1_000) do |inbox_url|
[payload, signature_account_id, inbox_url] [payload, signature_account_id, inbox_url]
end end
end end

View file

@ -31,7 +31,7 @@ class Admin::SystemCheck::ElasticsearchCheck < Admin::SystemCheck::BaseCheck
def running_version def running_version
@running_version ||= begin @running_version ||= begin
Chewy.client.info['version']['number'] Chewy.client.info['version']['number']
rescue Faraday::ConnectionFailed rescue Faraday::ConnectionFailed, Elasticsearch::Transport::Transport::Error
nil nil
end end
end end

View file

@ -18,7 +18,7 @@ class PlainTextFormatter
if local? if local?
text text
else else
strip_tags(insert_newlines).chomp html_entities.decode(strip_tags(insert_newlines)).chomp
end end
end end
@ -27,4 +27,8 @@ class PlainTextFormatter
def insert_newlines def insert_newlines
text.gsub(NEWLINE_TAGS_RE) { |match| "#{match}\n" } text.gsub(NEWLINE_TAGS_RE) { |match| "#{match}\n" }
end end
def html_entities
HTMLEntities.new
end
end end

View file

@ -1,69 +0,0 @@
# frozen_string_literal: true
class TOCGenerator
TARGET_ELEMENTS = %w(h1 h2 h3 h4 h5 h6).freeze
LISTED_ELEMENTS = %w(h2 h3).freeze
class Section
attr_accessor :depth, :title, :children, :anchor
def initialize(depth, title, anchor)
@depth = depth
@title = title
@children = []
@anchor = anchor
end
delegate :<<, to: :children
end
def initialize(source_html)
@source_html = source_html
@processed = false
@target_html = ''
@headers = []
@slugs = Hash.new { |h, k| h[k] = 0 }
end
def html
parse_and_transform unless @processed
@target_html
end
def toc
parse_and_transform unless @processed
@headers
end
private
def parse_and_transform
return if @source_html.blank?
parsed_html = Nokogiri::HTML.fragment(@source_html)
parsed_html.traverse do |node|
next unless TARGET_ELEMENTS.include?(node.name)
anchor = node['id'] || node.text.parameterize.presence || 'sec'
@slugs[anchor] += 1
anchor = "#{anchor}-#{@slugs[anchor]}" if @slugs[anchor] > 1
node['id'] = anchor
next unless LISTED_ELEMENTS.include?(node.name)
depth = node.name[1..-1]
latest_section = @headers.last
if latest_section.nil? || latest_section.depth >= depth
@headers << Section.new(depth, node.text, anchor)
else
latest_section << Section.new(depth, node.text, anchor)
end
end
@target_html = parsed_html.to_s
@processed = true
end
end

View file

@ -516,11 +516,14 @@ class User < ApplicationRecord
def prepare_new_user! def prepare_new_user!
BootstrapTimelineWorker.perform_async(account_id) BootstrapTimelineWorker.perform_async(account_id)
ActivityTracker.increment('activity:accounts:local') ActivityTracker.increment('activity:accounts:local')
ActivityTracker.record('activity:logins', id)
UserMailer.welcome(self).deliver_later UserMailer.welcome(self).deliver_later
TriggerWebhookWorker.perform_async('account.approved', 'Account', account_id) TriggerWebhookWorker.perform_async('account.approved', 'Account', account_id)
end end
def prepare_returning_user! def prepare_returning_user!
return unless confirmed?
ActivityTracker.record('activity:logins', id) ActivityTracker.record('activity:logins', id)
regenerate_feed! if needs_feed_update? regenerate_feed! if needs_feed_update?
end end

View file

@ -257,11 +257,11 @@ class DeleteAccountService < BaseService
end end
def delete_actor! def delete_actor!
ActivityPub::DeliveryWorker.push_bulk(delivery_inboxes) do |inbox_url| ActivityPub::DeliveryWorker.push_bulk(delivery_inboxes, limit: 1_000) do |inbox_url|
[delete_actor_json, @account.id, inbox_url] [delete_actor_json, @account.id, inbox_url]
end end
ActivityPub::LowPriorityDeliveryWorker.push_bulk(low_priority_delivery_inboxes) do |inbox_url| ActivityPub::LowPriorityDeliveryWorker.push_bulk(low_priority_delivery_inboxes, limit: 1_000) do |inbox_url|
[delete_actor_json, @account.id, inbox_url] [delete_actor_json, @account.id, inbox_url]
end end
end end

View file

@ -90,7 +90,7 @@ class RemoveStatusService < BaseService
status_reach_finder = StatusReachFinder.new(@status, unsafe: true) status_reach_finder = StatusReachFinder.new(@status, unsafe: true)
ActivityPub::DeliveryWorker.push_bulk(status_reach_finder.inboxes) do |inbox_url| ActivityPub::DeliveryWorker.push_bulk(status_reach_finder.inboxes, limit: 1_000) do |inbox_url|
[signed_activity_json, @account.id, inbox_url] [signed_activity_json, @account.id, inbox_url]
end end
end end

View file

@ -31,13 +31,13 @@ class SuspendAccountService < BaseService
# counterpart to this operation, i.e. you can't then force a remote # counterpart to this operation, i.e. you can't then force a remote
# account to re-follow you, so this part is not reversible. # account to re-follow you, so this part is not reversible.
follows = Follow.where(account: @account).to_a Follow.where(account: @account).find_in_batches do |follows|
ActivityPub::DeliveryWorker.push_bulk(follows) do |follow|
[Oj.dump(serialize_payload(follow, ActivityPub::RejectFollowSerializer)), follow.target_account_id, @account.inbox_url]
end
ActivityPub::DeliveryWorker.push_bulk(follows) do |follow| follows.each(&:destroy)
[Oj.dump(serialize_payload(follow, ActivityPub::RejectFollowSerializer)), follow.target_account_id, @account.inbox_url]
end end
follows.each(&:destroy)
end end
def distribute_update_actor! def distribute_update_actor!
@ -45,7 +45,7 @@ class SuspendAccountService < BaseService
account_reach_finder = AccountReachFinder.new(@account) account_reach_finder = AccountReachFinder.new(@account)
ActivityPub::DeliveryWorker.push_bulk(account_reach_finder.inboxes) do |inbox_url| ActivityPub::DeliveryWorker.push_bulk(account_reach_finder.inboxes, limit: 1_000) do |inbox_url|
[signed_activity_json, @account.id, inbox_url] [signed_activity_json, @account.id, inbox_url]
end end
end end

View file

@ -41,7 +41,7 @@ class UnsuspendAccountService < BaseService
account_reach_finder = AccountReachFinder.new(@account) account_reach_finder = AccountReachFinder.new(@account)
ActivityPub::DeliveryWorker.push_bulk(account_reach_finder.inboxes) do |inbox_url| ActivityPub::DeliveryWorker.push_bulk(account_reach_finder.inboxes, limit: 1_000) do |inbox_url|
[signed_activity_json, @account.id, inbox_url] [signed_activity_json, @account.id, inbox_url]
end end
end end

View file

@ -22,7 +22,7 @@ class UpdateAccountService < BaseService
def authorize_all_follow_requests(account) def authorize_all_follow_requests(account)
follow_requests = FollowRequest.where(target_account: account) follow_requests = FollowRequest.where(target_account: account)
follow_requests = follow_requests.preload(:account).select { |req| !req.account.silenced? } follow_requests = follow_requests.preload(:account).select { |req| !req.account.silenced? }
AuthorizeFollowWorker.push_bulk(follow_requests) do |req| AuthorizeFollowWorker.push_bulk(follow_requests, limit: 1_000) do |req|
[req.account_id, req.target_account_id] [req.account_id, req.target_account_id]
end end
end end

View file

@ -206,7 +206,7 @@
- if @deletion_request.present? - if @deletion_request.present?
= link_to t('admin.accounts.delete'), admin_account_path(@account.id), method: :delete, class: 'button button--destructive', data: { confirm: t('admin.accounts.are_you_sure') } if can?(:destroy, @account) = link_to t('admin.accounts.delete'), admin_account_path(@account.id), method: :delete, class: 'button button--destructive', data: { confirm: t('admin.accounts.are_you_sure') } if can?(:destroy, @account)
- else - else
%div.action-buttons .action-buttons
%div %div
- if @account.local? && @account.user_approved? - if @account.local? && @account.user_approved?
= link_to t('admin.accounts.warn'), new_admin_account_action_path(@account.id, type: 'none'), class: 'button' if can?(:warn, @account) = link_to t('admin.accounts.warn'), new_admin_account_action_path(@account.id, type: 'none'), class: 'button' if can?(:warn, @account)
@ -276,9 +276,9 @@
%hr.spacer/ %hr.spacer/
- if @account.user&.invite_request&.text&.present? - if @account.user&.invite_request&.text&.present?
%div.speech-bubble .speech-bubble
%div.speech-bubble__bubble .speech-bubble__bubble
= @account.user&.invite_request&.text = @account.user&.invite_request&.text
%div.speech-bubble__owner .speech-bubble__owner
= admin_account_link_to @account = admin_account_link_to @account
= t('admin.accounts.invite_request_text') = t('admin.accounts.invite_request_text')

View file

@ -16,7 +16,7 @@
= select_tag :action_type, options_for_select(Admin::ActionLogFilter::ACTION_TYPE_MAP.keys.map { |key| [I18n.t("admin.action_logs.action_types.#{key}"), key]}, params[:action_type]), prompt: I18n.t('admin.accounts.moderation.all') = select_tag :action_type, options_for_select(Admin::ActionLogFilter::ACTION_TYPE_MAP.keys.map { |key| [I18n.t("admin.action_logs.action_types.#{key}"), key]}, params[:action_type]), prompt: I18n.t('admin.accounts.moderation.all')
- if @action_logs.empty? - if @action_logs.empty?
%div.muted-hint.center-text .muted-hint.center-text
= t 'admin.action_logs.empty' = t 'admin.action_logs.empty'
- else - else
.report-notes .report-notes

View file

@ -12,7 +12,7 @@
%li= filter_link_to safe_join([t('admin.announcements.live'), "(#{number_with_delimiter(Announcement.published.count)})"], ' '), published: '1', unpublished: nil %li= filter_link_to safe_join([t('admin.announcements.live'), "(#{number_with_delimiter(Announcement.published.count)})"], ' '), published: '1', unpublished: nil
- if @announcements.empty? - if @announcements.empty?
%div.muted-hint.center-text .muted-hint.center-text
= t 'admin.announcements.empty' = t 'admin.announcements.empty'
- else - else
.announcements-list .announcements-list

View file

@ -10,7 +10,7 @@
%li= filter_link_to t('admin.trends.rejected'), status: 'rejected' %li= filter_link_to t('admin.trends.rejected'), status: 'rejected'
- if @appeals.empty? - if @appeals.empty?
%div.muted-hint.center-text .muted-hint.center-text
= t 'admin.disputes.appeals.empty' = t 'admin.disputes.appeals.empty'
- else - else
.announcements-list .announcements-list

View file

@ -44,7 +44,7 @@
%hr.spacer/ %hr.spacer/
- if @instances.empty? - if @instances.empty?
%div.muted-hint.center-text .muted-hint.center-text
= t 'admin.instances.empty' = t 'admin.instances.empty'
- else - else
= render partial: 'instance', collection: @instances = render partial: 'instance', collection: @instances

View file

@ -54,15 +54,15 @@
.strike-card__statuses-list__item .strike-card__statuses-list__item
- if (status = status_map[status_id.to_i]) - if (status = status_map[status_id.to_i])
.one-liner .one-liner
= link_to short_account_status_url(@report.target_account, status_id), class: 'emojify' do .emojify= one_line_preview(status)
= one_line_preview(status)
- status.ordered_media_attachments.each do |media_attachment| - status.ordered_media_attachments.each do |media_attachment|
%abbr{ title: media_attachment.description } %abbr{ title: media_attachment.description }
= fa_icon 'link' = fa_icon 'link'
= media_attachment.file_file_name = media_attachment.file_file_name
.strike-card__statuses-list__item__meta .strike-card__statuses-list__item__meta
%time.formatted{ datetime: status.created_at.iso8601, title: l(status.created_at) }= l(status.created_at) = link_to ActivityPub::TagManager.instance.url_for(status), target: '_blank' do
%time.formatted{ datetime: status.created_at.iso8601, title: l(status.created_at) }= l(status.created_at)
- unless status.application.nil? - unless status.application.nil?
· ·
= status.application.name = status.application.name

View file

@ -18,7 +18,7 @@
%hr.spacer/ %hr.spacer/
- if @rules.empty? - if @rules.empty?
%div.muted-hint.center-text .muted-hint.center-text
= t 'admin.rules.empty' = t 'admin.rules.empty'
- else - else
.announcements-list .announcements-list

View file

@ -17,7 +17,7 @@
%hr.spacer/ %hr.spacer/
- if @warning_presets.empty? - if @warning_presets.empty?
%div.muted-hint.center-text .muted-hint.center-text
= t 'admin.warning_presets.empty' = t 'admin.warning_presets.empty'
- else - else
.announcements-list .announcements-list

View file

@ -9,7 +9,7 @@
%hr.spacer/ %hr.spacer/
- if @webhooks.empty? - if @webhooks.empty?
%div.muted-hint.center-text .muted-hint.center-text
= t 'admin.webhooks.empty' = t 'admin.webhooks.empty'
- else - else
.applications-list .applications-list

View file

@ -1,16 +0,0 @@
.hero-widget
.hero-widget__img
= image_tag @instance_presenter.thumbnail&.file&.url(:'@1x') || asset_pack_path('media/images/preview.png'), alt: @instance_presenter.title
.hero-widget__text
%p= @instance_presenter.description.html_safe.presence || t('about.about_mastodon_html')
- if Setting.trends && !(user_signed_in? && !current_user.setting_trends)
- trends = Trends.tags.query.allowed.limit(3)
- unless trends.empty?
.endorsements-widget.trends-widget
%h4.emojify= t('footer.trending_now')
- trends.each do |tag|
= react_component :hashtag, hashtag: ActiveModelSerializers::SerializableResource.new(tag, serializer: REST::TagSerializer, scope: current_user, scope_name: :current_user).as_json

View file

@ -50,15 +50,15 @@
.strike-card__statuses-list__item .strike-card__statuses-list__item
- if (status = status_map[status_id.to_i]) - if (status = status_map[status_id.to_i])
.one-liner .one-liner
= link_to short_account_status_url(@strike.target_account, status_id), class: 'emojify' do .emojify= one_line_preview(status)
= one_line_preview(status)
- status.ordered_media_attachments.each do |media_attachment| - status.ordered_media_attachments.each do |media_attachment|
%abbr{ title: media_attachment.description } %abbr{ title: media_attachment.description }
= fa_icon 'link' = fa_icon 'link'
= media_attachment.file_file_name = media_attachment.file_file_name
.strike-card__statuses-list__item__meta .strike-card__statuses-list__item__meta
%time.formatted{ datetime: status.created_at.iso8601, title: l(status.created_at) }= l(status.created_at) = link_to ActivityPub::TagManager.instance.url_for(status), target: '_blank' do
%time.formatted{ datetime: status.created_at.iso8601, title: l(status.created_at) }= l(status.created_at)
- unless status.application.nil? - unless status.application.nil?
· ·
= status.application.name = status.application.name

View file

@ -35,6 +35,6 @@
= render 'keyword_fields', f: keyword = render 'keyword_fields', f: keyword
%tfoot %tfoot
%tr %tr
%td{ colspan: 3} %td{ colspan: 3 }
= link_to_add_association f, :keywords, class: 'table-action-link', partial: 'keyword_fields', 'data-association-insertion-node': '.keywords-table tbody', 'data-association-insertion-method': 'append' do = link_to_add_association f, :keywords, class: 'table-action-link', partial: 'keyword_fields', 'data-association-insertion-node': '.keywords-table tbody', 'data-association-insertion-method': 'append' do
= safe_join([fa_icon('plus'), t('filters.edit.add_keyword')]) = safe_join([fa_icon('plus'), t('filters.edit.add_keyword')])

View file

@ -5,7 +5,7 @@
= link_to t('filters.new.title'), new_filter_path, class: 'button' = link_to t('filters.new.title'), new_filter_path, class: 'button'
- if @filters.empty? - if @filters.empty?
%div.muted-hint.center-text= t 'filters.index.empty' .muted-hint.center-text= t 'filters.index.empty'
- else - else
.applications-list .applications-list
= render partial: 'filter', collection: @filters = render partial: 'filter', collection: @filters

View file

@ -1,9 +1,11 @@
-# Link to the "Next" page -#
-# available local variables Link to the "Next" page
-# url: url to the next page available local variables
-# current_page: a page object for the currently displayed page url: url to the next page
-# total_pages: total number of pages current_page: a page object for the currently displayed page
-# per_page: number of items to fetch per page total_pages: total number of pages
-# remote: data-remote per_page: number of items to fetch per page
remote: data-remote
%span.next %span.next
= link_to_unless current_page.last?, safe_join([t('pagination.next'), fa_icon('chevron-right')], ' '), url, rel: 'next', remote: remote = link_to_unless current_page.last?, safe_join([t('pagination.next'), fa_icon('chevron-right')], ' '), url, rel: 'next', remote: remote

View file

@ -1,10 +1,11 @@
-# The container tag -#
-# available local variables The container tag
-# current_page: a page object for the currently displayed page available local variables
-# total_pages: total number of pages current_page: a page object for the currently displayed page
-# per_page: number of items to fetch per page total_pages: total number of pages
-# remote: data-remote per_page: number of items to fetch per page
-# paginator: the paginator that renders the pagination tags inside remote: data-remote
paginator: the paginator that renders the pagination tags inside
= paginator.render do = paginator.render do
%nav.pagination %nav.pagination
= prev_page_tag unless current_page.first? = prev_page_tag unless current_page.first?

View file

@ -1,9 +1,10 @@
-# Link to the "Previous" page -#
-# available local variables Link to the "Previous" page
-# url: url to the previous page available local variables
-# current_page: a page object for the currently displayed page url: url to the previous page
-# total_pages: total number of pages current_page: a page object for the currently displayed page
-# per_page: number of items to fetch per page total_pages: total number of pages
-# remote: data-remote per_page: number of items to fetch per page
remote: data-remote
%span.prev %span.prev
= link_to_unless current_page.first?, safe_join([fa_icon('chevron-left'), t('pagination.prev')], ' '), url, rel: 'prev', remote: remote = link_to_unless current_page.first?, safe_join([fa_icon('chevron-left'), t('pagination.prev')], ' '), url, rel: 'prev', remote: remote

View file

@ -12,6 +12,6 @@
.modal-layout__mastodon .modal-layout__mastodon
%div %div
%img{alt: '', draggable: 'false', src: mascot_url } %img{ alt: '', draggable: 'false', src: mascot_url }
= render template: 'layouts/application' = render template: 'layouts/application'

View file

@ -26,11 +26,11 @@
= "@#{status.account.pretty_acct}" = "@#{status.account.pretty_acct}"
- if status.spoiler_text? - if status.spoiler_text?
%div.auto-dir .auto-dir
%p %p
= status.spoiler_text = status.spoiler_text
%div.auto-dir .auto-dir
= status_content_format(status) = status_content_format(status)
- if status.ordered_media_attachments.size > 0 - if status.ordered_media_attachments.size > 0

View file

@ -3,5 +3,5 @@
%p= t('doorkeeper.authorizations.show.title') %p= t('doorkeeper.authorizations.show.title')
.input-copy .input-copy
.input-copy__wrapper .input-copy__wrapper
%input{ type: 'text', class: 'oauth-code', spellcheck: 'false', readonly: true, value: params[:code] } %input.oauth-code{ type: 'text', spellcheck: 'false', readonly: true, value: params[:code] }
%button{ type: :button }= t('generic.copy') %button{ type: :button }= t('generic.copy')

View file

@ -5,7 +5,7 @@
= link_to t('doorkeeper.applications.index.new'), new_settings_application_path, class: 'button' = link_to t('doorkeeper.applications.index.new'), new_settings_application_path, class: 'button'
- if @applications.empty? - if @applications.empty?
%div.muted-hint.center-text=t 'doorkeeper.applications.index.empty' .muted-hint.center-text= t 'doorkeeper.applications.index.empty'
- else - else
.table-wrapper .table-wrapper
%table.table %table.table

View file

@ -6,7 +6,7 @@
.table-wrapper .table-wrapper
%table.table %table.table
%tbody %tbody
%tr %tr
%th= t('doorkeeper.applications.show.application_id') %th= t('doorkeeper.applications.show.application_id')
%td %td
%code= @application.uid %code= @application.uid
@ -15,7 +15,7 @@
%td %td
%code= @application.secret %code= @application.secret
%tr %tr
%th{ rowspan: 2}= t('applications.your_token') %th{ rowspan: 2 }= t('applications.your_token')
%td %td
%code= current_user.token_for_app(@application).token %code= current_user.token_for_app(@application).token
%tr %tr

View file

@ -6,7 +6,7 @@
%hr.spacer/ %hr.spacer/
- if @login_activities.empty? - if @login_activities.empty?
%div.muted-hint.center-text .muted-hint.center-text
= t 'login_activities.empty' = t 'login_activities.empty'
- else - else
.announcements-list .announcements-list

View file

@ -1,5 +1,5 @@
- thumbnail = @instance_presenter.thumbnail - thumbnail = @instance_presenter.thumbnail
- description ||= strip_tags(@instance_presenter.description.presence || t('about.about_mastodon_html')) - description ||= @instance_presenter.description.presence || strip_tags(t('about.about_mastodon_html'))
%meta{ name: 'description', content: description }/ %meta{ name: 'description', content: description }/

View file

@ -21,7 +21,7 @@
%span.poll__chart %span.poll__chart
- else - else
%label.poll__option>< %label.poll__option><
%span.poll__input{ class: poll.multiple? ? 'checkbox' : nil}>< %span.poll__input{ class: poll.multiple? ? 'checkbox' : nil }><
%span.poll__option__text %span.poll__option__text
= prerender_custom_emojis(h(option.title), status.emojis) = prerender_custom_emojis(h(option.title), status.emojis)
.poll__footer .poll__footer

View file

@ -12,7 +12,7 @@ class ActivityPub::DistributePollUpdateWorker
return if @status.preloadable_poll.nil? || @status.local_only? return if @status.preloadable_poll.nil? || @status.local_only?
ActivityPub::DeliveryWorker.push_bulk(inboxes) do |inbox_url| ActivityPub::DeliveryWorker.push_bulk(inboxes, limit: 1_000) do |inbox_url|
[payload, @account.id, inbox_url] [payload, @account.id, inbox_url]
end end

View file

@ -10,7 +10,7 @@ class ActivityPub::MoveDistributionWorker
@migration = AccountMigration.find(migration_id) @migration = AccountMigration.find(migration_id)
@account = @migration.account @account = @migration.account
ActivityPub::DeliveryWorker.push_bulk(inboxes) do |inbox_url| ActivityPub::DeliveryWorker.push_bulk(inboxes, limit: 1_000) do |inbox_url|
[signed_payload, @account.id, inbox_url] [signed_payload, @account.id, inbox_url]
end end

View file

@ -25,7 +25,7 @@ class ActivityPub::RawDistributionWorker
def distribute! def distribute!
return if inboxes.empty? return if inboxes.empty?
ActivityPub::DeliveryWorker.push_bulk(inboxes) do |inbox_url| ActivityPub::DeliveryWorker.push_bulk(inboxes, limit: 1_000) do |inbox_url|
[payload, source_account_id, inbox_url, options] [payload, source_account_id, inbox_url, options]
end end
end end

View file

@ -5,7 +5,9 @@ require_relative '../config/boot'
require_relative '../lib/cli' require_relative '../lib/cli'
begin begin
Mastodon::CLI.start(ARGV) Chewy.strategy(:mastodon) do
Mastodon::CLI.start(ARGV)
end
rescue Interrupt rescue Interrupt
exit(130) exit(130)
end end

View file

@ -19,7 +19,6 @@ Chewy.settings = {
# cycle, which takes care of checking if Elasticsearch is enabled # cycle, which takes care of checking if Elasticsearch is enabled
# or not. However, mind that for the Rails console, the :urgent # or not. However, mind that for the Rails console, the :urgent
# strategy is set automatically with no way to override it. # strategy is set automatically with no way to override it.
Chewy.root_strategy = :mastodon
Chewy.request_strategy = :mastodon Chewy.request_strategy = :mastodon
Chewy.use_after_commit_callbacks = false Chewy.use_after_commit_callbacks = false

View file

@ -1159,8 +1159,6 @@ an:
index: index:
hint: Este filtro s'aplica a la selección de publicacions individuals independientment d'atros criterios. Puede anyadir mas publicacions a este filtro dende la interficie web. hint: Este filtro s'aplica a la selección de publicacions individuals independientment d'atros criterios. Puede anyadir mas publicacions a este filtro dende la interficie web.
title: Publicacions filtradas title: Publicacions filtradas
footer:
trending_now: Tendencia agora
generic: generic:
all: Totz all: Totz
all_items_on_page_selected_html: all_items_on_page_selected_html:

View file

@ -1214,8 +1214,6 @@ ar:
index: index:
hint: ينطبق الفلتر هذا على اختيار المنشورات الفردية بغض النظر عن المعايير الأخرى. يمكنك إضافة المزيد من المنشورات إلى هذا الفلتر من واجهة الويب. hint: ينطبق الفلتر هذا على اختيار المنشورات الفردية بغض النظر عن المعايير الأخرى. يمكنك إضافة المزيد من المنشورات إلى هذا الفلتر من واجهة الويب.
title: الرسائل المصفّاة title: الرسائل المصفّاة
footer:
trending_now: المتداولة الآن
generic: generic:
all: الكل all: الكل
changes_saved_msg: تم حفظ التعديلات بنجاح! changes_saved_msg: تم حفظ التعديلات بنجاح!

View file

@ -601,8 +601,6 @@ ast:
title: Peñeres title: Peñeres
new: new:
title: Amestar una peñera title: Amestar una peñera
footer:
trending_now: En tendencia
generic: generic:
all: Too all: Too
all_items_on_page_selected_html: all_items_on_page_selected_html:

View file

@ -1238,8 +1238,6 @@ be:
index: index:
hint: Гэты фільтр прымяняецца для выбару асобных допісаў незалежна ад іншых крытэрыяў. Вы можаце дадаць больш допісаў у гэты фільтр з вэб-інтэрфейсу. hint: Гэты фільтр прымяняецца для выбару асобных допісаў незалежна ад іншых крытэрыяў. Вы можаце дадаць больш допісаў у гэты фільтр з вэб-інтэрфейсу.
title: Адфільтраваныя допісы title: Адфільтраваныя допісы
footer:
trending_now: Актуальнае
generic: generic:
all: Усе all: Усе
all_items_on_page_selected_html: all_items_on_page_selected_html:

View file

@ -1196,8 +1196,6 @@ bg:
index: index:
hint: Този филтър се прилага за избор на отделни публикации, независимо от други критерии. Може да добавите още публикации в този филтър от уебинтерфейса. hint: Този филтър се прилага за избор на отделни публикации, независимо от други критерии. Може да добавите още публикации в този филтър от уебинтерфейса.
title: Филтрирани публикации title: Филтрирани публикации
footer:
trending_now: Налагащи се сега
generic: generic:
all: Всичко all: Всичко
all_items_on_page_selected_html: all_items_on_page_selected_html:

View file

@ -1196,8 +1196,6 @@ ca:
index: index:
hint: Aquest filtre aplica als tuts seleccionats independentment d'altres criteris. Pots afegir més tuts a aquest filtre des de la interfície Web. hint: Aquest filtre aplica als tuts seleccionats independentment d'altres criteris. Pots afegir més tuts a aquest filtre des de la interfície Web.
title: Tuts filtrats title: Tuts filtrats
footer:
trending_now: En tendència
generic: generic:
all: Tot all: Tot
all_items_on_page_selected_html: all_items_on_page_selected_html:

View file

@ -744,8 +744,6 @@ ckb:
title: فلتەرەکان title: فلتەرەکان
new: new:
title: زیادکردنی فلتەری نوێ title: زیادکردنی فلتەری نوێ
footer:
trending_now: هەوادارانی ئێستا
generic: generic:
all: هەموو all: هەموو
changes_saved_msg: گۆڕانکاریەکان بە سەرکەوتوویی هەڵگیرا! changes_saved_msg: گۆڕانکاریەکان بە سەرکەوتوویی هەڵگیرا!

View file

@ -704,8 +704,6 @@ co:
title: Filtri title: Filtri
new: new:
title: Aghjunghje un novu filtru title: Aghjunghje un novu filtru
footer:
trending_now: Tindenze d'avà
generic: generic:
all: Tuttu all: Tuttu
changes_saved_msg: Cambiamenti salvati! changes_saved_msg: Cambiamenti salvati!

View file

@ -1213,8 +1213,6 @@ cs:
index: index:
hint: Tento filtr se vztahuje na výběr jednotlivých příspěvků bez ohledu na jiná kritéria. Do tohoto filtru můžete přidat více příspěvků z webového rozhraní. hint: Tento filtr se vztahuje na výběr jednotlivých příspěvků bez ohledu na jiná kritéria. Do tohoto filtru můžete přidat více příspěvků z webového rozhraní.
title: Filtrované příspěvky title: Filtrované příspěvky
footer:
trending_now: Právě populární
generic: generic:
all: Všechny all: Všechny
all_items_on_page_selected_html: all_items_on_page_selected_html:

View file

@ -1280,8 +1280,6 @@ cy:
index: index:
hint: Mae'r hidlydd hwn yn berthnasol i ddethol postiadau unigol waeth beth fo'r meini prawf eraill. Gallwch ychwanegu mwy o bostiadau at yr hidlydd hwn o'r rhyngwyneb gwe. hint: Mae'r hidlydd hwn yn berthnasol i ddethol postiadau unigol waeth beth fo'r meini prawf eraill. Gallwch ychwanegu mwy o bostiadau at yr hidlydd hwn o'r rhyngwyneb gwe.
title: Postiadau wedi'u hidlo title: Postiadau wedi'u hidlo
footer:
trending_now: Trendiau
generic: generic:
all: Popeth all: Popeth
all_items_on_page_selected_html: all_items_on_page_selected_html:

View file

@ -1192,8 +1192,6 @@ da:
index: index:
hint: Dette filter gælder for udvalgte, individuelle indlæg uanset andre kriterier. Flere indlæg kan føjes til filteret via webfladen. hint: Dette filter gælder for udvalgte, individuelle indlæg uanset andre kriterier. Flere indlæg kan føjes til filteret via webfladen.
title: Filtrerede indlæg title: Filtrerede indlæg
footer:
trending_now: Trender lige nu
generic: generic:
all: Alle all: Alle
all_items_on_page_selected_html: all_items_on_page_selected_html:

View file

@ -1196,8 +1196,6 @@ de:
index: index:
hint: Dieser Filter wird verwendet, um einzelne Beiträge unabhängig von anderen Kriterien auszuwählen. Du kannst mehr Beiträge zu diesem Filter über das Webinterface hinzufügen. hint: Dieser Filter wird verwendet, um einzelne Beiträge unabhängig von anderen Kriterien auszuwählen. Du kannst mehr Beiträge zu diesem Filter über das Webinterface hinzufügen.
title: Gefilterte Beiträge title: Gefilterte Beiträge
footer:
trending_now: Jetzt in den Trends
generic: generic:
all: Alle all: Alle
all_items_on_page_selected_html: all_items_on_page_selected_html:

View file

@ -875,8 +875,6 @@ el:
new: new:
save: Αποθήκευση νέου φίλτρου save: Αποθήκευση νέου φίλτρου
title: Πρόσθεσε νέο φίλτρο title: Πρόσθεσε νέο φίλτρο
footer:
trending_now: Τάσεις
generic: generic:
all: Όλα all: Όλα
changes_saved_msg: Οι αλλαγές αποθηκεύτηκαν! changes_saved_msg: Οι αλλαγές αποθηκεύτηκαν!

View file

@ -1196,8 +1196,6 @@ en:
index: index:
hint: This filter applies to select individual posts regardless of other criteria. You can add more posts to this filter from the web interface. hint: This filter applies to select individual posts regardless of other criteria. You can add more posts to this filter from the web interface.
title: Filtered posts title: Filtered posts
footer:
trending_now: Trending now
generic: generic:
all: All all: All
all_items_on_page_selected_html: all_items_on_page_selected_html:

View file

@ -1197,8 +1197,6 @@ eo:
index: index:
hint: Ĉi tiu filtrilo kongruas kelkaj mesaĝoj sendepende de aliaj kriterioj. hint: Ĉi tiu filtrilo kongruas kelkaj mesaĝoj sendepende de aliaj kriterioj.
title: Filtritaj mesaĝoj title: Filtritaj mesaĝoj
footer:
trending_now: Nunaj furoraĵoj
generic: generic:
all: Ĉio all: Ĉio
all_items_on_page_selected_html: all_items_on_page_selected_html:

View file

@ -1196,8 +1196,6 @@ es-AR:
index: index:
hint: Este filtro se aplica a la selección de mensajes individuales, independientemente de otros criterios. Podés agregar más mensajes a este filtro desde la interface web. hint: Este filtro se aplica a la selección de mensajes individuales, independientemente de otros criterios. Podés agregar más mensajes a este filtro desde la interface web.
title: Mensajes filtrados title: Mensajes filtrados
footer:
trending_now: Tendencia ahora
generic: generic:
all: Todas all: Todas
all_items_on_page_selected_html: all_items_on_page_selected_html:

View file

@ -1196,8 +1196,6 @@ es-MX:
index: index:
hint: Este filtro se aplica a la selección de publicaciones individuales independientemente de otros criterios. Puede añadir más publicaciones a este filtro desde la interfaz web. hint: Este filtro se aplica a la selección de publicaciones individuales independientemente de otros criterios. Puede añadir más publicaciones a este filtro desde la interfaz web.
title: Publicaciones filtradas title: Publicaciones filtradas
footer:
trending_now: Tendencia ahora
generic: generic:
all: Todos all: Todos
all_items_on_page_selected_html: all_items_on_page_selected_html:

View file

@ -1196,8 +1196,6 @@ es:
index: index:
hint: Este filtro se aplica a la selección de publicaciones individuales independientemente de otros criterios. Puede añadir más publicaciones a este filtro desde la interfaz web. hint: Este filtro se aplica a la selección de publicaciones individuales independientemente de otros criterios. Puede añadir más publicaciones a este filtro desde la interfaz web.
title: Publicaciones filtradas title: Publicaciones filtradas
footer:
trending_now: Tendencia ahora
generic: generic:
all: Todos all: Todos
all_items_on_page_selected_html: all_items_on_page_selected_html:

View file

@ -1196,8 +1196,6 @@ et:
index: index:
hint: See filter kehtib üksikute postituste valimisel, sõltumata muudest kriteeriumidest. Sellesse filtrisse saab veebiliidese kaudu rohkem postitusi lisada. hint: See filter kehtib üksikute postituste valimisel, sõltumata muudest kriteeriumidest. Sellesse filtrisse saab veebiliidese kaudu rohkem postitusi lisada.
title: Filtreeritud postitused title: Filtreeritud postitused
footer:
trending_now: Praegu trendikad
generic: generic:
all: Kõik all: Kõik
all_items_on_page_selected_html: all_items_on_page_selected_html:

View file

@ -1198,8 +1198,6 @@ eu:
index: index:
hint: Iragazki honek banako bidalketei eragiten die, beste kriterioak badaude ere. Bidalketa gehiago gehitu ditzakezu iragazkira web interfazetik. hint: Iragazki honek banako bidalketei eragiten die, beste kriterioak badaude ere. Bidalketa gehiago gehitu ditzakezu iragazkira web interfazetik.
title: Iragazitako bidalketak title: Iragazitako bidalketak
footer:
trending_now: Joera orain
generic: generic:
all: Denak all: Denak
all_items_on_page_selected_html: all_items_on_page_selected_html:

View file

@ -890,8 +890,6 @@ fa:
title: پالایه‌ها title: پالایه‌ها
new: new:
title: افزودن پالایهٔ جدید title: افزودن پالایهٔ جدید
footer:
trending_now: پرطرفدار
generic: generic:
all: همه all: همه
changes_saved_msg: تغییرات با موفقیت ذخیره شدند! changes_saved_msg: تغییرات با موفقیت ذخیره شدند!

View file

@ -1196,8 +1196,6 @@ fi:
index: index:
hint: Tämä suodatin koskee yksittäisten viestien valintaa muista kriteereistä riippumatta. Voit lisätä lisää viestejä tähän suodattimeen web-käyttöliittymästä. hint: Tämä suodatin koskee yksittäisten viestien valintaa muista kriteereistä riippumatta. Voit lisätä lisää viestejä tähän suodattimeen web-käyttöliittymästä.
title: Suodatetut viestit title: Suodatetut viestit
footer:
trending_now: Suosittua nyt
generic: generic:
all: Kaikki all: Kaikki
all_items_on_page_selected_html: all_items_on_page_selected_html:

View file

@ -1196,8 +1196,6 @@ fo:
index: index:
hint: Hetta filtrið er galdandi fyri útvaldar stakar postar óansæð aðrar treytir. Tú kanst leggja fleiri postar afturat hesum filtrinum frá vevmarkamótinum. hint: Hetta filtrið er galdandi fyri útvaldar stakar postar óansæð aðrar treytir. Tú kanst leggja fleiri postar afturat hesum filtrinum frá vevmarkamótinum.
title: Filtreraðir postar title: Filtreraðir postar
footer:
trending_now: Rák beint nú
generic: generic:
all: Alt all: Alt
all_items_on_page_selected_html: all_items_on_page_selected_html:

View file

@ -1196,8 +1196,6 @@ fr-QC:
index: index:
hint: Ce filtre s'applique à la sélection de messages individuels, indépendamment d'autres critères. Vous pouvez ajouter plus de messages à ce filtre à partir de l'interface Web. hint: Ce filtre s'applique à la sélection de messages individuels, indépendamment d'autres critères. Vous pouvez ajouter plus de messages à ce filtre à partir de l'interface Web.
title: Messages filtrés title: Messages filtrés
footer:
trending_now: Tendance en ce moment
generic: generic:
all: Tous all: Tous
all_items_on_page_selected_html: all_items_on_page_selected_html:

View file

@ -1196,8 +1196,6 @@ fr:
index: index:
hint: Ce filtre s'applique à la sélection de messages individuels, indépendamment d'autres critères. Vous pouvez ajouter plus de messages à ce filtre à partir de l'interface Web. hint: Ce filtre s'applique à la sélection de messages individuels, indépendamment d'autres critères. Vous pouvez ajouter plus de messages à ce filtre à partir de l'interface Web.
title: Messages filtrés title: Messages filtrés
footer:
trending_now: Tendance en ce moment
generic: generic:
all: Tous all: Tous
all_items_on_page_selected_html: all_items_on_page_selected_html:

View file

@ -1196,8 +1196,6 @@ fy:
index: index:
hint: Dit filter is fan tapassing om yndividuele berjochten te selektearjen, ûnôfhinklik fan oare kritearia. Jo kinne yn de webomjouwing mear berjochten oan dit filter tafoegje. hint: Dit filter is fan tapassing om yndividuele berjochten te selektearjen, ûnôfhinklik fan oare kritearia. Jo kinne yn de webomjouwing mear berjochten oan dit filter tafoegje.
title: Filtere berjochten title: Filtere berjochten
footer:
trending_now: Trends
generic: generic:
all: Alle all: Alle
all_items_on_page_selected_html: all_items_on_page_selected_html:

View file

@ -1225,8 +1225,6 @@ gd:
index: index:
hint: Bidh a chriathrag seo an sàs air postaichean fa leth ge b e dè na roghainnean eile. S urrainn dhut barrachd phostaichean a chur ris a chriathrag seo leis an eadar-aghaidh-lìn. hint: Bidh a chriathrag seo an sàs air postaichean fa leth ge b e dè na roghainnean eile. S urrainn dhut barrachd phostaichean a chur ris a chriathrag seo leis an eadar-aghaidh-lìn.
title: Postaichean criathraichte title: Postaichean criathraichte
footer:
trending_now: A treandadh an-dràsta
generic: generic:
all: Na h-uile all: Na h-uile
all_items_on_page_selected_html: all_items_on_page_selected_html:

View file

@ -1196,8 +1196,6 @@ gl:
index: index:
hint: Este filtro aplícase para seleccionar publicacións individuais independentemente doutros criterios. Podes engadir máis publicacións a este filtro desde a interface web. hint: Este filtro aplícase para seleccionar publicacións individuais independentemente doutros criterios. Podes engadir máis publicacións a este filtro desde a interface web.
title: Publicacións filtradas title: Publicacións filtradas
footer:
trending_now: Tendencia agora
generic: generic:
all: Todo all: Todo
all_items_on_page_selected_html: all_items_on_page_selected_html:

View file

@ -1238,8 +1238,6 @@ he:
index: index:
hint: סנן זה חל באופן של בחירת הודעות בודדות ללא תלות בקריטריונים אחרים. תוכלו להוסיף עוד הודעות לסנן זה ממנשק הווב. hint: סנן זה חל באופן של בחירת הודעות בודדות ללא תלות בקריטריונים אחרים. תוכלו להוסיף עוד הודעות לסנן זה ממנשק הווב.
title: הודעות שסוננו title: הודעות שסוננו
footer:
trending_now: נושאים חמים
generic: generic:
all: הכל all: הכל
all_items_on_page_selected_html: all_items_on_page_selected_html:

View file

@ -99,8 +99,6 @@ hr:
title: Filteri title: Filteri
new: new:
title: Dodaj novi filter title: Dodaj novi filter
footer:
trending_now: Popularno
generic: generic:
all: Sve all: Sve
changes_saved_msg: Izmjene su uspješno sačuvane! changes_saved_msg: Izmjene su uspješno sačuvane!

View file

@ -1196,8 +1196,6 @@ hu:
index: index:
hint: Ez a szűrő egyedi bejegyzések kiválasztására vonatkozik a megadott kritériumoktól függetlenül. Újabb bejegyzéseket adhatsz hozzá ehhez a szűrőhöz a webes felületen keresztül. hint: Ez a szűrő egyedi bejegyzések kiválasztására vonatkozik a megadott kritériumoktól függetlenül. Újabb bejegyzéseket adhatsz hozzá ehhez a szűrőhöz a webes felületen keresztül.
title: Megszűrt bejegyzések title: Megszűrt bejegyzések
footer:
trending_now: Most felkapott
generic: generic:
all: Mind all: Mind
all_items_on_page_selected_html: all_items_on_page_selected_html:

View file

@ -575,8 +575,6 @@ hy:
title: Ֆիլտրեր title: Ֆիլտրեր
new: new:
title: Ավելացնել ֆիլտր title: Ավելացնել ֆիլտր
footer:
trending_now: Այժմ արդիական
generic: generic:
all: Բոլորը all: Բոլորը
changes_saved_msg: Փոփոխութիւնները յաջող պահուած են changes_saved_msg: Փոփոխութիւնները յաջող պահուած են

View file

@ -1133,8 +1133,6 @@ id:
index: index:
hint: Saringan ini diterapkan ke beberapa kiriman individu tanpa memengaruhi oleh kriteria lain. Anda dapat menambahkan lebih banyak kiriman ke saringan ini dari antarmuka web. hint: Saringan ini diterapkan ke beberapa kiriman individu tanpa memengaruhi oleh kriteria lain. Anda dapat menambahkan lebih banyak kiriman ke saringan ini dari antarmuka web.
title: Kiriman yang disaring title: Kiriman yang disaring
footer:
trending_now: Sedang tren
generic: generic:
all: Semua all: Semua
all_items_on_page_selected_html: all_items_on_page_selected_html:

View file

@ -1112,8 +1112,6 @@ io:
index: index:
hint: Ca filtrilo aplikesas a selektita posti ne segun altra kriterio. Vu povas pozar plu multa posti a ca filtrilo de retintervizajo. hint: Ca filtrilo aplikesas a selektita posti ne segun altra kriterio. Vu povas pozar plu multa posti a ca filtrilo de retintervizajo.
title: Filtrita posti title: Filtrita posti
footer:
trending_now: Nuna tendenco
generic: generic:
all: Omna all: Omna
all_items_on_page_selected_html: all_items_on_page_selected_html:

View file

@ -1196,8 +1196,6 @@ is:
index: index:
hint: Þessi sía virkar til að velja stakar færslur án tillits til annarra skilyrða. Þú getur bætt fleiri færslum í þessa síu í vefviðmótinu. hint: Þessi sía virkar til að velja stakar færslur án tillits til annarra skilyrða. Þú getur bætt fleiri færslum í þessa síu í vefviðmótinu.
title: Síaðar færslur title: Síaðar færslur
footer:
trending_now: Í umræðunni núna
generic: generic:
all: Allt all: Allt
all_items_on_page_selected_html: all_items_on_page_selected_html:

View file

@ -1198,8 +1198,6 @@ it:
index: index:
hint: Questo filtro si applica a singoli post indipendentemente da altri criteri. Puoi aggiungere più post a questo filtro dall'interfaccia Web. hint: Questo filtro si applica a singoli post indipendentemente da altri criteri. Puoi aggiungere più post a questo filtro dall'interfaccia Web.
title: Post filtrati title: Post filtrati
footer:
trending_now: Di tendenza ora
generic: generic:
all: Tutto all: Tutto
all_items_on_page_selected_html: all_items_on_page_selected_html:

View file

@ -1175,8 +1175,6 @@ ja:
index: index:
hint: このフィルターは、他の条件に関係なく個々の投稿を選択する場合に適用されます。Webインターフェースからこのフィルターにさらに投稿を追加できます。 hint: このフィルターは、他の条件に関係なく個々の投稿を選択する場合に適用されます。Webインターフェースからこのフィルターにさらに投稿を追加できます。
title: フィルターされた投稿 title: フィルターされた投稿
footer:
trending_now: トレンドタグ
generic: generic:
all: すべて all: すべて
all_items_on_page_selected_html: all_items_on_page_selected_html:

View file

@ -543,8 +543,6 @@ kab:
back_to_filter: Tuɣalin ɣer umsizdeg back_to_filter: Tuɣalin ɣer umsizdeg
batch: batch:
remove: Kkes seg umsizdeg remove: Kkes seg umsizdeg
footer:
trending_now: Ayen mucaɛen tura
generic: generic:
all: Akk all: Akk
changes_saved_msg: Ttwaskelsen ibelliden-ik·im akken ilaq! changes_saved_msg: Ttwaskelsen ibelliden-ik·im akken ilaq!

Some files were not shown because too many files have changed in this diff Show more