Compare commits
5 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
a0f7453c6e | ||
|
46a1e16f21 | ||
|
f3f7a3840a | ||
|
7539254e96 | ||
|
456478c4e1 |
7
.babelrc
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"presets": ["es2015", "react"],
|
||||||
|
"plugins": [
|
||||||
|
"transform-decorators-legacy",
|
||||||
|
"transform-object-rest-spread"
|
||||||
|
]
|
||||||
|
}
|
@@ -1,4 +1,2 @@
|
|||||||
https://github.com/heroku/heroku-buildpack-apt
|
|
||||||
https://github.com/Scalingo/ffmpeg-buildpack
|
|
||||||
https://github.com/Scalingo/nodejs-buildpack
|
https://github.com/Scalingo/nodejs-buildpack
|
||||||
https://github.com/Scalingo/ruby-buildpack
|
https://github.com/Scalingo/ruby-buildpack
|
||||||
|
@@ -1,218 +0,0 @@
|
|||||||
version: 2
|
|
||||||
|
|
||||||
aliases:
|
|
||||||
- &defaults
|
|
||||||
docker:
|
|
||||||
- image: circleci/ruby:2.6-stretch-node
|
|
||||||
environment: &ruby_environment
|
|
||||||
BUNDLE_APP_CONFIG: ./.bundle/
|
|
||||||
DB_HOST: localhost
|
|
||||||
DB_USER: root
|
|
||||||
RAILS_ENV: test
|
|
||||||
PARALLEL_TEST_PROCESSORS: 4
|
|
||||||
ALLOW_NOPAM: true
|
|
||||||
CONTINUOUS_INTEGRATION: true
|
|
||||||
DISABLE_SIMPLECOV: true
|
|
||||||
PAM_ENABLED: true
|
|
||||||
PAM_DEFAULT_SERVICE: pam_test
|
|
||||||
PAM_CONTROLLED_SERVICE: pam_test_controlled
|
|
||||||
working_directory: ~/projects/mastodon/
|
|
||||||
|
|
||||||
- &attach_workspace
|
|
||||||
attach_workspace:
|
|
||||||
at: ~/projects/
|
|
||||||
|
|
||||||
- &persist_to_workspace
|
|
||||||
persist_to_workspace:
|
|
||||||
root: ~/projects/
|
|
||||||
paths:
|
|
||||||
- ./mastodon/
|
|
||||||
|
|
||||||
- &restore_ruby_dependencies
|
|
||||||
restore_cache:
|
|
||||||
keys:
|
|
||||||
- v2-ruby-dependencies-{{ checksum "/tmp/.ruby-version" }}-{{ checksum "Gemfile.lock" }}
|
|
||||||
- v2-ruby-dependencies-{{ checksum "/tmp/.ruby-version" }}-
|
|
||||||
- v2-ruby-dependencies-
|
|
||||||
|
|
||||||
- &install_steps
|
|
||||||
steps:
|
|
||||||
- checkout
|
|
||||||
- *attach_workspace
|
|
||||||
|
|
||||||
- restore_cache:
|
|
||||||
keys:
|
|
||||||
- v1-node-dependencies-{{ checksum "yarn.lock" }}
|
|
||||||
- v1-node-dependencies-
|
|
||||||
- run: yarn install --frozen-lockfile
|
|
||||||
- save_cache:
|
|
||||||
key: v1-node-dependencies-{{ checksum "yarn.lock" }}
|
|
||||||
paths:
|
|
||||||
- ./node_modules/
|
|
||||||
|
|
||||||
- *persist_to_workspace
|
|
||||||
|
|
||||||
- &install_system_dependencies
|
|
||||||
run:
|
|
||||||
name: Install system dependencies
|
|
||||||
command: |
|
|
||||||
sudo apt-get update
|
|
||||||
sudo apt-get install -y libicu-dev libidn11-dev libprotobuf-dev protobuf-compiler
|
|
||||||
|
|
||||||
- &install_ruby_dependencies
|
|
||||||
steps:
|
|
||||||
- *attach_workspace
|
|
||||||
|
|
||||||
- *install_system_dependencies
|
|
||||||
|
|
||||||
- run: ruby -e 'puts RUBY_VERSION' | tee /tmp/.ruby-version
|
|
||||||
- *restore_ruby_dependencies
|
|
||||||
- run: bundle install --clean --jobs 16 --path ./vendor/bundle/ --retry 3 --with pam_authentication --without development production && bundle clean
|
|
||||||
- save_cache:
|
|
||||||
key: v2-ruby-dependencies-{{ checksum "/tmp/.ruby-version" }}-{{ checksum "Gemfile.lock" }}
|
|
||||||
paths:
|
|
||||||
- ./.bundle/
|
|
||||||
- ./vendor/bundle/
|
|
||||||
- persist_to_workspace:
|
|
||||||
root: ~/projects/
|
|
||||||
paths:
|
|
||||||
- ./mastodon/.bundle/
|
|
||||||
- ./mastodon/vendor/bundle/
|
|
||||||
|
|
||||||
- &test_steps
|
|
||||||
steps:
|
|
||||||
- *attach_workspace
|
|
||||||
|
|
||||||
- *install_system_dependencies
|
|
||||||
- run: sudo apt-get install -y ffmpeg
|
|
||||||
|
|
||||||
- run:
|
|
||||||
name: Prepare Tests
|
|
||||||
command: ./bin/rails parallel:create parallel:load_schema parallel:prepare
|
|
||||||
- run:
|
|
||||||
name: Run Tests
|
|
||||||
command: ./bin/retry bundle exec parallel_test ./spec/ --group-by filesize --type rspec
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
install:
|
|
||||||
<<: *defaults
|
|
||||||
<<: *install_steps
|
|
||||||
|
|
||||||
install-ruby2.6:
|
|
||||||
<<: *defaults
|
|
||||||
<<: *install_ruby_dependencies
|
|
||||||
|
|
||||||
install-ruby2.5:
|
|
||||||
<<: *defaults
|
|
||||||
docker:
|
|
||||||
- image: circleci/ruby:2.5-stretch-node
|
|
||||||
environment: *ruby_environment
|
|
||||||
<<: *install_ruby_dependencies
|
|
||||||
|
|
||||||
install-ruby2.4:
|
|
||||||
<<: *defaults
|
|
||||||
docker:
|
|
||||||
- image: circleci/ruby:2.4-stretch-node
|
|
||||||
environment: *ruby_environment
|
|
||||||
<<: *install_ruby_dependencies
|
|
||||||
|
|
||||||
build:
|
|
||||||
<<: *defaults
|
|
||||||
steps:
|
|
||||||
- *attach_workspace
|
|
||||||
- *install_system_dependencies
|
|
||||||
- run: ./bin/rails assets:precompile
|
|
||||||
- persist_to_workspace:
|
|
||||||
root: ~/projects/
|
|
||||||
paths:
|
|
||||||
- ./mastodon/public/assets
|
|
||||||
- ./mastodon/public/packs-test/
|
|
||||||
|
|
||||||
test-ruby2.6:
|
|
||||||
<<: *defaults
|
|
||||||
docker:
|
|
||||||
- image: circleci/ruby:2.6-stretch-node
|
|
||||||
environment: *ruby_environment
|
|
||||||
- image: circleci/postgres:10.6-alpine
|
|
||||||
environment:
|
|
||||||
POSTGRES_USER: root
|
|
||||||
- image: circleci/redis:5-alpine
|
|
||||||
<<: *test_steps
|
|
||||||
|
|
||||||
test-ruby2.5:
|
|
||||||
<<: *defaults
|
|
||||||
docker:
|
|
||||||
- image: circleci/ruby:2.5-stretch-node
|
|
||||||
environment: *ruby_environment
|
|
||||||
- image: circleci/postgres:10.6-alpine
|
|
||||||
environment:
|
|
||||||
POSTGRES_USER: root
|
|
||||||
- image: circleci/redis:5-alpine
|
|
||||||
<<: *test_steps
|
|
||||||
|
|
||||||
test-ruby2.4:
|
|
||||||
<<: *defaults
|
|
||||||
docker:
|
|
||||||
- image: circleci/ruby:2.4-stretch-node
|
|
||||||
environment: *ruby_environment
|
|
||||||
- image: circleci/postgres:10.6-alpine
|
|
||||||
environment:
|
|
||||||
POSTGRES_USER: root
|
|
||||||
- image: circleci/redis:5-alpine
|
|
||||||
<<: *test_steps
|
|
||||||
|
|
||||||
test-webui:
|
|
||||||
<<: *defaults
|
|
||||||
docker:
|
|
||||||
- image: circleci/node:12.9-stretch
|
|
||||||
steps:
|
|
||||||
- *attach_workspace
|
|
||||||
- run: ./bin/retry yarn test:jest
|
|
||||||
|
|
||||||
check-i18n:
|
|
||||||
<<: *defaults
|
|
||||||
steps:
|
|
||||||
- *attach_workspace
|
|
||||||
- *install_system_dependencies
|
|
||||||
- run: bundle exec i18n-tasks check-normalized
|
|
||||||
- run: bundle exec i18n-tasks unused -l en
|
|
||||||
- run: bundle exec i18n-tasks check-consistent-interpolations
|
|
||||||
- run: bundle exec rake repo:check_locales_files
|
|
||||||
|
|
||||||
workflows:
|
|
||||||
version: 2
|
|
||||||
build-and-test:
|
|
||||||
jobs:
|
|
||||||
- install
|
|
||||||
- install-ruby2.6:
|
|
||||||
requires:
|
|
||||||
- install
|
|
||||||
- install-ruby2.5:
|
|
||||||
requires:
|
|
||||||
- install
|
|
||||||
- install-ruby2.6
|
|
||||||
- install-ruby2.4:
|
|
||||||
requires:
|
|
||||||
- install
|
|
||||||
- install-ruby2.6
|
|
||||||
- build:
|
|
||||||
requires:
|
|
||||||
- install-ruby2.6
|
|
||||||
- test-ruby2.6:
|
|
||||||
requires:
|
|
||||||
- install-ruby2.6
|
|
||||||
- build
|
|
||||||
- test-ruby2.5:
|
|
||||||
requires:
|
|
||||||
- install-ruby2.5
|
|
||||||
- build
|
|
||||||
- test-ruby2.4:
|
|
||||||
requires:
|
|
||||||
- install-ruby2.4
|
|
||||||
- build
|
|
||||||
- test-webui:
|
|
||||||
requires:
|
|
||||||
- install
|
|
||||||
- check-i18n:
|
|
||||||
requires:
|
|
||||||
- install-ruby2.6
|
|
@@ -1,38 +1,14 @@
|
|||||||
version: "2"
|
engines:
|
||||||
checks:
|
duplication:
|
||||||
argument-count:
|
enabled: false
|
||||||
enabled: false
|
rubocop:
|
||||||
complex-logic:
|
enabled: true
|
||||||
enabled: false
|
eslint:
|
||||||
file-lines:
|
enabled: true
|
||||||
enabled: false
|
ratings:
|
||||||
method-complexity:
|
paths:
|
||||||
enabled: false
|
- "**.rb"
|
||||||
method-count:
|
- "**.js"
|
||||||
enabled: false
|
exclude_paths:
|
||||||
method-lines:
|
|
||||||
enabled: false
|
|
||||||
nested-control-flow:
|
|
||||||
enabled: false
|
|
||||||
return-statements:
|
|
||||||
enabled: false
|
|
||||||
similar-code:
|
|
||||||
enabled: false
|
|
||||||
identical-code:
|
|
||||||
enabled: false
|
|
||||||
plugins:
|
|
||||||
brakeman:
|
|
||||||
enabled: true
|
|
||||||
bundler-audit:
|
|
||||||
enabled: true
|
|
||||||
eslint:
|
|
||||||
enabled: true
|
|
||||||
channel: eslint-5
|
|
||||||
rubocop:
|
|
||||||
enabled: true
|
|
||||||
channel: rubocop-0-71
|
|
||||||
sass-lint:
|
|
||||||
enabled: true
|
|
||||||
exclude_patterns:
|
|
||||||
- spec/
|
- spec/
|
||||||
- vendor/asset
|
- vendor/asset
|
||||||
|
@@ -1,10 +0,0 @@
|
|||||||
version: 1
|
|
||||||
|
|
||||||
update_configs:
|
|
||||||
- package_manager: "ruby:bundler"
|
|
||||||
directory: "/"
|
|
||||||
update_schedule: "weekly"
|
|
||||||
|
|
||||||
- package_manager: "javascript"
|
|
||||||
directory: "/"
|
|
||||||
update_schedule: "weekly"
|
|
@@ -1,15 +1,11 @@
|
|||||||
.bundle
|
|
||||||
.env
|
.env
|
||||||
.env.*
|
.env.*
|
||||||
public/system
|
public/system
|
||||||
public/assets
|
public/assets
|
||||||
public/packs
|
|
||||||
node_modules
|
node_modules
|
||||||
|
storybook
|
||||||
neo4j
|
neo4j
|
||||||
vendor/bundle
|
vendor/bundle
|
||||||
.DS_Store
|
.DS_Store
|
||||||
*.swp
|
*.swp
|
||||||
*~
|
*~
|
||||||
postgres
|
|
||||||
redis
|
|
||||||
elasticsearch
|
|
||||||
|
226
.env.nanobox
@@ -1,226 +0,0 @@
|
|||||||
# Service dependencies
|
|
||||||
# You may set REDIS_URL instead for more advanced options
|
|
||||||
REDIS_HOST=$DATA_REDIS_HOST
|
|
||||||
REDIS_PORT=6379
|
|
||||||
# REDIS_DB=0
|
|
||||||
|
|
||||||
# You may set DATABASE_URL instead for more advanced options
|
|
||||||
DB_HOST=$DATA_DB_HOST
|
|
||||||
DB_USER=$DATA_DB_USER
|
|
||||||
DB_NAME=gonano
|
|
||||||
DB_PASS=$DATA_DB_PASS
|
|
||||||
DB_PORT=5432
|
|
||||||
|
|
||||||
DATABASE_URL=postgresql://$DATA_DB_USER:$DATA_DB_PASS@$DATA_DB_HOST/gonano
|
|
||||||
|
|
||||||
# Optional ElasticSearch configuration
|
|
||||||
ES_ENABLED=true
|
|
||||||
ES_HOST=$DATA_ELASTIC_HOST
|
|
||||||
ES_PORT=9200
|
|
||||||
|
|
||||||
# Optimizations
|
|
||||||
LD_PRELOAD=/data/lib/libjemalloc.so
|
|
||||||
|
|
||||||
# ImageMagick optimizations
|
|
||||||
MAGICK_TEMPORARY_PATH=/app/tmp
|
|
||||||
MAGICK_MEMORY_LIMIT=128MiB
|
|
||||||
MAGICK_MAP_LIMIT=64MiB
|
|
||||||
MAGICK_TIME_LIMIT=15
|
|
||||||
MAGICK_AREA_LIMIT=16MP
|
|
||||||
MAGICK_WIDTH_LIMIT=8KP
|
|
||||||
MAGICK_HEIGHT_LIMIT=8KP
|
|
||||||
|
|
||||||
# Federation
|
|
||||||
# Note: Changing LOCAL_DOMAIN at a later time will cause unwanted side effects, including breaking all existing federation.
|
|
||||||
# LOCAL_DOMAIN should *NOT* contain the protocol part of the domain e.g https://example.com.
|
|
||||||
LOCAL_DOMAIN=${APP_NAME}.nanoapp.io
|
|
||||||
|
|
||||||
# Changing LOCAL_HTTPS in production is no longer supported. (Mastodon will always serve https:// links)
|
|
||||||
|
|
||||||
# Use this only if you need to run mastodon on a different domain than the one used for federation.
|
|
||||||
# You can read more about this option on https://github.com/tootsuite/documentation/blob/master/Running-Mastodon/Serving_a_different_domain.md
|
|
||||||
# DO *NOT* USE THIS UNLESS YOU KNOW *EXACTLY* WHAT YOU ARE DOING.
|
|
||||||
# WEB_DOMAIN=mastodon.example.com
|
|
||||||
|
|
||||||
# Use this if you want to have several aliases handler@example1.com
|
|
||||||
# handler@example2.com etc. for the same user. LOCAL_DOMAIN should not
|
|
||||||
# be added. Comma separated values
|
|
||||||
# ALTERNATE_DOMAINS=example1.com,example2.com
|
|
||||||
|
|
||||||
# Application secrets
|
|
||||||
# Generate each with the `rake secret` task (`nanobox run bundle exec rake secret`)
|
|
||||||
SECRET_KEY_BASE=$SECRET_KEY_BASE
|
|
||||||
OTP_SECRET=$OTP_SECRET
|
|
||||||
|
|
||||||
# VAPID keys (used for push notifications)
|
|
||||||
# You can generate the keys using the following command (first is the private key, second is the public one)
|
|
||||||
# You should only generate this once per instance. If you later decide to change it, all push subscription will
|
|
||||||
# be invalidated, requiring the users to access the website again to resubscribe.
|
|
||||||
#
|
|
||||||
# Generate with `rake mastodon:webpush:generate_vapid_key` task (`nanobox run bundle exec rake mastodon:webpush:generate_vapid_key`)
|
|
||||||
#
|
|
||||||
# For more information visit https://rossta.net/blog/using-the-web-push-api-with-vapid.html
|
|
||||||
VAPID_PRIVATE_KEY=$VAPID_PRIVATE_KEY
|
|
||||||
VAPID_PUBLIC_KEY=$VAPID_PUBLIC_KEY
|
|
||||||
|
|
||||||
# Registrations
|
|
||||||
# Single user mode will disable registrations and redirect frontpage to the first profile
|
|
||||||
# SINGLE_USER_MODE=true
|
|
||||||
# Prevent registrations with following e-mail domains
|
|
||||||
# EMAIL_DOMAIN_BLACKLIST=example1.com|example2.de|etc
|
|
||||||
# Only allow registrations with the following e-mail domains
|
|
||||||
# EMAIL_DOMAIN_WHITELIST=example1.com|example2.de|etc
|
|
||||||
|
|
||||||
# Optionally change default language
|
|
||||||
# DEFAULT_LOCALE=de
|
|
||||||
|
|
||||||
# E-mail configuration
|
|
||||||
# Note: Mailgun and SparkPost (https://sparkpo.st/smtp) each have good free tiers
|
|
||||||
# If you want to use an SMTP server without authentication (e.g local Postfix relay)
|
|
||||||
# then set SMTP_AUTH_METHOD and SMTP_OPENSSL_VERIFY_MODE to 'none' and
|
|
||||||
# *comment* SMTP_LOGIN and SMTP_PASSWORD (leaving them blank is not enough).
|
|
||||||
SMTP_SERVER=$SMTP_SERVER
|
|
||||||
SMTP_PORT=587
|
|
||||||
SMTP_LOGIN=$SMTP_LOGIN
|
|
||||||
SMTP_PASSWORD=$SMTP_PASSWORD
|
|
||||||
SMTP_FROM_ADDRESS=notifications@${APP_NAME}.nanoapp.io
|
|
||||||
#SMTP_DOMAIN= # defaults to LOCAL_DOMAIN
|
|
||||||
#SMTP_DELIVERY_METHOD=smtp # delivery method can also be sendmail
|
|
||||||
#SMTP_AUTH_METHOD=plain
|
|
||||||
#SMTP_CA_FILE=/etc/ssl/certs/ca-certificates.crt
|
|
||||||
#SMTP_OPENSSL_VERIFY_MODE=peer
|
|
||||||
#SMTP_ENABLE_STARTTLS_AUTO=true
|
|
||||||
#SMTP_TLS=true
|
|
||||||
|
|
||||||
# Optional user upload path and URL (images, avatars). Default is :rails_root/public/system. If you set this variable, you are responsible for making your HTTP server (eg. nginx) serve these files.
|
|
||||||
# PAPERCLIP_ROOT_PATH=/var/lib/mastodon/public-system
|
|
||||||
# PAPERCLIP_ROOT_URL=/system
|
|
||||||
|
|
||||||
# Optional asset host for multi-server setups
|
|
||||||
# CDN_HOST=https://assets.example.com
|
|
||||||
|
|
||||||
# S3 (optional)
|
|
||||||
# S3_ENABLED=true
|
|
||||||
# S3_BUCKET=
|
|
||||||
# AWS_ACCESS_KEY_ID=
|
|
||||||
# AWS_SECRET_ACCESS_KEY=
|
|
||||||
# S3_REGION=
|
|
||||||
# S3_PROTOCOL=http
|
|
||||||
# S3_HOSTNAME=192.168.1.123:9000
|
|
||||||
|
|
||||||
# S3 (Minio Config (optional) Please check Minio instance for details)
|
|
||||||
# S3_ENABLED=true
|
|
||||||
# S3_BUCKET=
|
|
||||||
# AWS_ACCESS_KEY_ID=
|
|
||||||
# AWS_SECRET_ACCESS_KEY=
|
|
||||||
# S3_REGION=
|
|
||||||
# S3_PROTOCOL=https
|
|
||||||
# S3_HOSTNAME=
|
|
||||||
# S3_ENDPOINT=
|
|
||||||
# S3_SIGNATURE_VERSION=
|
|
||||||
|
|
||||||
# Swift (optional)
|
|
||||||
# SWIFT_ENABLED=true
|
|
||||||
# SWIFT_USERNAME=
|
|
||||||
# For Keystone V3, the value for SWIFT_TENANT should be the project name
|
|
||||||
# SWIFT_TENANT=
|
|
||||||
# SWIFT_PASSWORD=
|
|
||||||
# Keystone V2 and V3 URLs are supported. Use a V3 URL if possible to avoid
|
|
||||||
# issues with token rate-limiting during high load.
|
|
||||||
# SWIFT_AUTH_URL=
|
|
||||||
# SWIFT_CONTAINER=
|
|
||||||
# SWIFT_OBJECT_URL=
|
|
||||||
# SWIFT_REGION=
|
|
||||||
# Defaults to 'default'
|
|
||||||
# SWIFT_DOMAIN_NAME=
|
|
||||||
# Defaults to 60 seconds. Set to 0 to disable
|
|
||||||
# SWIFT_CACHE_TTL=
|
|
||||||
|
|
||||||
# Optional alias for S3 (e.g. to serve files on a custom domain, possibly using Cloudfront or Cloudflare)
|
|
||||||
# S3_ALIAS_HOST=
|
|
||||||
|
|
||||||
# Streaming API integration
|
|
||||||
# STREAMING_API_BASE_URL=
|
|
||||||
|
|
||||||
# Advanced settings
|
|
||||||
# If you need to use pgBouncer, you need to disable prepared statements:
|
|
||||||
# PREPARED_STATEMENTS=false
|
|
||||||
|
|
||||||
# Cluster number setting for streaming API server.
|
|
||||||
# If you comment out following line, cluster number will be `numOfCpuCores - 1`.
|
|
||||||
# STREAMING_CLUSTER_NUM=1
|
|
||||||
|
|
||||||
# Docker mastodon user
|
|
||||||
# If you use Docker, you may want to assign UID/GID manually.
|
|
||||||
# UID=1000
|
|
||||||
# GID=1000
|
|
||||||
|
|
||||||
# LDAP authentication (optional)
|
|
||||||
# LDAP_ENABLED=true
|
|
||||||
# LDAP_HOST=localhost
|
|
||||||
# LDAP_PORT=389
|
|
||||||
# LDAP_METHOD=simple_tls
|
|
||||||
# LDAP_BASE=
|
|
||||||
# LDAP_BIND_DN=
|
|
||||||
# LDAP_PASSWORD=
|
|
||||||
# LDAP_UID=cn
|
|
||||||
|
|
||||||
# PAM authentication (optional)
|
|
||||||
# PAM authentication uses for the email generation the "email" pam variable
|
|
||||||
# and optional as fallback PAM_DEFAULT_SUFFIX
|
|
||||||
# The pam environment variable "email" is provided by:
|
|
||||||
# https://github.com/devkral/pam_email_extractor
|
|
||||||
# PAM_ENABLED=true
|
|
||||||
# Fallback Suffix for email address generation (nil by default)
|
|
||||||
# PAM_DEFAULT_SUFFIX=pam
|
|
||||||
# Name of the pam service (pam "auth" section is evaluated)
|
|
||||||
# PAM_DEFAULT_SERVICE=rpam
|
|
||||||
# Name of the pam service used for checking if an user can register (pam "account" section is evaluated) (nil (disabled) by default)
|
|
||||||
# PAM_CONTROLLED_SERVICE=rpam
|
|
||||||
|
|
||||||
# Global OAuth settings (optional) :
|
|
||||||
# If you have only one strategy, you may want to enable this
|
|
||||||
# OAUTH_REDIRECT_AT_SIGN_IN=true
|
|
||||||
|
|
||||||
# Optional CAS authentication (cf. omniauth-cas) :
|
|
||||||
# CAS_ENABLED=true
|
|
||||||
# CAS_URL=https://sso.myserver.com/
|
|
||||||
# CAS_HOST=sso.myserver.com/
|
|
||||||
# CAS_PORT=443
|
|
||||||
# CAS_SSL=true
|
|
||||||
# CAS_VALIDATE_URL=
|
|
||||||
# CAS_CALLBACK_URL=
|
|
||||||
# CAS_LOGOUT_URL=
|
|
||||||
# CAS_LOGIN_URL=
|
|
||||||
# CAS_UID_FIELD='user'
|
|
||||||
# CAS_CA_PATH=
|
|
||||||
# CAS_DISABLE_SSL_VERIFICATION=false
|
|
||||||
# CAS_UID_KEY='user'
|
|
||||||
# CAS_NAME_KEY='name'
|
|
||||||
# CAS_EMAIL_KEY='email'
|
|
||||||
# CAS_NICKNAME_KEY='nickname'
|
|
||||||
# CAS_FIRST_NAME_KEY='firstname'
|
|
||||||
# CAS_LAST_NAME_KEY='lastname'
|
|
||||||
# CAS_LOCATION_KEY='location'
|
|
||||||
# CAS_IMAGE_KEY='image'
|
|
||||||
# CAS_PHONE_KEY='phone'
|
|
||||||
|
|
||||||
# Optional SAML authentication (cf. omniauth-saml)
|
|
||||||
# SAML_ENABLED=true
|
|
||||||
# SAML_ACS_URL=
|
|
||||||
# SAML_ISSUER=http://localhost:3000/auth/auth/saml/callback
|
|
||||||
# SAML_IDP_SSO_TARGET_URL=https://idp.testshib.org/idp/profile/SAML2/Redirect/SSO
|
|
||||||
# SAML_IDP_CERT=
|
|
||||||
# SAML_IDP_CERT_FINGERPRINT=
|
|
||||||
# SAML_NAME_IDENTIFIER_FORMAT=
|
|
||||||
# SAML_CERT=
|
|
||||||
# SAML_PRIVATE_KEY=
|
|
||||||
# SAML_SECURITY_WANT_ASSERTION_SIGNED=true
|
|
||||||
# SAML_SECURITY_WANT_ASSERTION_ENCRYPTED=true
|
|
||||||
# SAML_SECURITY_ASSUME_EMAIL_IS_VERIFIED=true
|
|
||||||
# SAML_ATTRIBUTES_STATEMENTS_UID="urn:oid:0.9.2342.19200300.100.1.1"
|
|
||||||
# SAML_ATTRIBUTES_STATEMENTS_EMAIL="urn:oid:1.3.6.1.4.1.5923.1.1.1.6"
|
|
||||||
# SAML_ATTRIBUTES_STATEMENTS_FULL_NAME="urn:oid:2.5.4.42"
|
|
||||||
# SAML_UID_ATTRIBUTE="urn:oid:0.9.2342.19200300.100.1.1"
|
|
||||||
# SAML_ATTRIBUTES_STATEMENTS_VERIFIED=
|
|
||||||
# SAML_ATTRIBUTES_STATEMENTS_VERIFIED_EMAIL=
|
|
@@ -1,53 +1,27 @@
|
|||||||
# Service dependencies
|
# Service dependencies
|
||||||
# You may set REDIS_URL instead for more advanced options
|
|
||||||
# You may also set REDIS_NAMESPACE to share Redis between multiple Mastodon servers
|
|
||||||
REDIS_HOST=redis
|
REDIS_HOST=redis
|
||||||
REDIS_PORT=6379
|
REDIS_PORT=6379
|
||||||
# You may set DATABASE_URL instead for more advanced options
|
# REDIS_DB=0
|
||||||
DB_HOST=db
|
DB_HOST=db
|
||||||
DB_USER=postgres
|
DB_USER=postgres
|
||||||
DB_NAME=postgres
|
DB_NAME=postgres
|
||||||
DB_PASS=
|
DB_PASS=
|
||||||
DB_PORT=5432
|
DB_PORT=5432
|
||||||
# Optional ElasticSearch configuration
|
|
||||||
# You may also set ES_PREFIX to share the same cluster between multiple Mastodon servers (falls back to REDIS_NAMESPACE if not set)
|
|
||||||
# ES_ENABLED=true
|
|
||||||
# ES_HOST=es
|
|
||||||
# ES_PORT=9200
|
|
||||||
|
|
||||||
# Federation
|
# Federation
|
||||||
# Note: Changing LOCAL_DOMAIN at a later time will cause unwanted side effects, including breaking all existing federation.
|
|
||||||
# LOCAL_DOMAIN should *NOT* contain the protocol part of the domain e.g https://example.com.
|
|
||||||
LOCAL_DOMAIN=example.com
|
LOCAL_DOMAIN=example.com
|
||||||
|
LOCAL_HTTPS=true
|
||||||
# Changing LOCAL_HTTPS in production is no longer supported. (Mastodon will always serve https:// links)
|
|
||||||
|
|
||||||
# Use this only if you need to run mastodon on a different domain than the one used for federation.
|
# Use this only if you need to run mastodon on a different domain than the one used for federation.
|
||||||
# You can read more about this option on https://github.com/tootsuite/documentation/blob/master/Running-Mastodon/Serving_a_different_domain.md
|
# Do not use this unless you know exactly what you are doing.
|
||||||
# DO *NOT* USE THIS UNLESS YOU KNOW *EXACTLY* WHAT YOU ARE DOING.
|
|
||||||
# WEB_DOMAIN=mastodon.example.com
|
# WEB_DOMAIN=mastodon.example.com
|
||||||
|
|
||||||
# Use this if you want to have several aliases handler@example1.com
|
|
||||||
# handler@example2.com etc. for the same user. LOCAL_DOMAIN should not
|
|
||||||
# be added. Comma separated values
|
|
||||||
# ALTERNATE_DOMAINS=example1.com,example2.com
|
|
||||||
|
|
||||||
# Application secrets
|
# Application secrets
|
||||||
# Generate each with the `RAILS_ENV=production bundle exec rake secret` task (`docker-compose run --rm web rake secret` if you use docker compose)
|
# Generate each with the `rake secret` task (`docker-compose run --rm web rake secret` if you use docker compose)
|
||||||
|
PAPERCLIP_SECRET=
|
||||||
SECRET_KEY_BASE=
|
SECRET_KEY_BASE=
|
||||||
OTP_SECRET=
|
OTP_SECRET=
|
||||||
|
|
||||||
# VAPID keys (used for push notifications
|
|
||||||
# You can generate the keys using the following command (first is the private key, second is the public one)
|
|
||||||
# You should only generate this once per instance. If you later decide to change it, all push subscription will
|
|
||||||
# be invalidated, requiring the users to access the website again to resubscribe.
|
|
||||||
#
|
|
||||||
# Generate with `RAILS_ENV=production bundle exec rake mastodon:webpush:generate_vapid_key` task (`docker-compose run --rm web rake mastodon:webpush:generate_vapid_key` if you use docker compose)
|
|
||||||
#
|
|
||||||
# For more information visit https://rossta.net/blog/using-the-web-push-api-with-vapid.html
|
|
||||||
VAPID_PRIVATE_KEY=
|
|
||||||
VAPID_PUBLIC_KEY=
|
|
||||||
|
|
||||||
# Registrations
|
# Registrations
|
||||||
# Single user mode will disable registrations and redirect frontpage to the first profile
|
# Single user mode will disable registrations and redirect frontpage to the first profile
|
||||||
# SINGLE_USER_MODE=true
|
# SINGLE_USER_MODE=true
|
||||||
@@ -62,38 +36,28 @@ VAPID_PUBLIC_KEY=
|
|||||||
# E-mail configuration
|
# E-mail configuration
|
||||||
# Note: Mailgun and SparkPost (https://sparkpo.st/smtp) each have good free tiers
|
# Note: Mailgun and SparkPost (https://sparkpo.st/smtp) each have good free tiers
|
||||||
# If you want to use an SMTP server without authentication (e.g local Postfix relay)
|
# If you want to use an SMTP server without authentication (e.g local Postfix relay)
|
||||||
# then set SMTP_AUTH_METHOD and SMTP_OPENSSL_VERIFY_MODE to 'none' and
|
# then set SMTP_AUTH_METHOD to 'none' and *comment* SMTP_LOGIN and SMTP_PASSWORD.
|
||||||
# *comment* SMTP_LOGIN and SMTP_PASSWORD (leaving them blank is not enough).
|
# Leaving them blank is not enough for authentication method 'none'.
|
||||||
SMTP_SERVER=smtp.mailgun.org
|
SMTP_SERVER=smtp.mailgun.org
|
||||||
SMTP_PORT=587
|
SMTP_PORT=587
|
||||||
SMTP_LOGIN=
|
SMTP_LOGIN=
|
||||||
SMTP_PASSWORD=
|
SMTP_PASSWORD=
|
||||||
SMTP_FROM_ADDRESS=notifications@example.com
|
SMTP_FROM_ADDRESS=notifications@example.com
|
||||||
#SMTP_REPLY_TO=
|
|
||||||
#SMTP_DOMAIN= # defaults to LOCAL_DOMAIN
|
#SMTP_DOMAIN= # defaults to LOCAL_DOMAIN
|
||||||
#SMTP_DELIVERY_METHOD=smtp # delivery method can also be sendmail
|
#SMTP_DELIVERY_METHOD=smtp # delivery method can also be sendmail
|
||||||
#SMTP_AUTH_METHOD=plain
|
#SMTP_AUTH_METHOD=plain
|
||||||
#SMTP_CA_FILE=/etc/ssl/certs/ca-certificates.crt
|
|
||||||
#SMTP_OPENSSL_VERIFY_MODE=peer
|
#SMTP_OPENSSL_VERIFY_MODE=peer
|
||||||
#SMTP_ENABLE_STARTTLS_AUTO=true
|
#SMTP_ENABLE_STARTTLS_AUTO=true
|
||||||
#SMTP_TLS=true
|
|
||||||
|
|
||||||
# Optional user upload path and URL (images, avatars). Default is :rails_root/public/system. If you set this variable, you are responsible for making your HTTP server (eg. nginx) serve these files.
|
# Optional user upload path and URL (images, avatars). Default is :rails_root/public/system. If you set this variable, you are responsible for making your HTTP server (eg. nginx) serve these files.
|
||||||
# PAPERCLIP_ROOT_PATH=/var/lib/mastodon/public-system
|
# PAPERCLIP_ROOT_PATH=/var/lib/mastodon/public-system
|
||||||
# PAPERCLIP_ROOT_URL=/system
|
# PAPERCLIP_ROOT_URL=/system
|
||||||
|
|
||||||
# Optional asset host for multi-server setups
|
# Optional asset host for multi-server setups
|
||||||
# The asset host must allow cross origin request from WEB_DOMAIN or LOCAL_DOMAIN
|
# CDN_HOST=assets.example.com
|
||||||
# if WEB_DOMAIN is not set. For example, the server may have the
|
|
||||||
# following header field:
|
|
||||||
# Access-Control-Allow-Origin: https://example.com/
|
|
||||||
# CDN_HOST=https://assets.example.com
|
|
||||||
|
|
||||||
# S3 (optional)
|
# S3 (optional)
|
||||||
# The attachment host must allow cross origin request from WEB_DOMAIN or
|
|
||||||
# LOCAL_DOMAIN if WEB_DOMAIN is not set. For example, the server may have the
|
|
||||||
# following header field:
|
|
||||||
# Access-Control-Allow-Origin: https://192.168.1.123:9000/
|
|
||||||
# S3_ENABLED=true
|
# S3_ENABLED=true
|
||||||
# S3_BUCKET=
|
# S3_BUCKET=
|
||||||
# AWS_ACCESS_KEY_ID=
|
# AWS_ACCESS_KEY_ID=
|
||||||
@@ -103,8 +67,6 @@ SMTP_FROM_ADDRESS=notifications@example.com
|
|||||||
# S3_HOSTNAME=192.168.1.123:9000
|
# S3_HOSTNAME=192.168.1.123:9000
|
||||||
|
|
||||||
# S3 (Minio Config (optional) Please check Minio instance for details)
|
# S3 (Minio Config (optional) Please check Minio instance for details)
|
||||||
# The attachment host must allow cross origin request - see the description
|
|
||||||
# above.
|
|
||||||
# S3_ENABLED=true
|
# S3_ENABLED=true
|
||||||
# S3_BUCKET=
|
# S3_BUCKET=
|
||||||
# AWS_ACCESS_KEY_ID=
|
# AWS_ACCESS_KEY_ID=
|
||||||
@@ -115,43 +77,8 @@ SMTP_FROM_ADDRESS=notifications@example.com
|
|||||||
# S3_ENDPOINT=
|
# S3_ENDPOINT=
|
||||||
# S3_SIGNATURE_VERSION=
|
# S3_SIGNATURE_VERSION=
|
||||||
|
|
||||||
# Google Cloud Storage (optional)
|
# Optional alias for S3 if you want to use Cloudfront or Cloudflare in front
|
||||||
# Use S3 compatible API. Since GCS does not support Multipart Upload,
|
# S3_CLOUDFRONT_HOST=
|
||||||
# increase the value of S3_MULTIPART_THRESHOLD to disable Multipart Upload.
|
|
||||||
# The attachment host must allow cross origin request - see the description
|
|
||||||
# above.
|
|
||||||
# S3_ENABLED=true
|
|
||||||
# AWS_ACCESS_KEY_ID=
|
|
||||||
# AWS_SECRET_ACCESS_KEY=
|
|
||||||
# S3_REGION=
|
|
||||||
# S3_PROTOCOL=https
|
|
||||||
# S3_HOSTNAME=storage.googleapis.com
|
|
||||||
# S3_ENDPOINT=https://storage.googleapis.com
|
|
||||||
# S3_MULTIPART_THRESHOLD=52428801 # 50.megabytes
|
|
||||||
|
|
||||||
# Swift (optional)
|
|
||||||
# The attachment host must allow cross origin request - see the description
|
|
||||||
# above.
|
|
||||||
# SWIFT_ENABLED=true
|
|
||||||
# SWIFT_USERNAME=
|
|
||||||
# For Keystone V3, the value for SWIFT_TENANT should be the project name
|
|
||||||
# SWIFT_TENANT=
|
|
||||||
# SWIFT_PASSWORD=
|
|
||||||
# Some OpenStack V3 providers require PROJECT_ID (optional)
|
|
||||||
# SWIFT_PROJECT_ID=
|
|
||||||
# Keystone V2 and V3 URLs are supported. Use a V3 URL if possible to avoid
|
|
||||||
# issues with token rate-limiting during high load.
|
|
||||||
# SWIFT_AUTH_URL=
|
|
||||||
# SWIFT_CONTAINER=
|
|
||||||
# SWIFT_OBJECT_URL=
|
|
||||||
# SWIFT_REGION=
|
|
||||||
# Defaults to 'default'
|
|
||||||
# SWIFT_DOMAIN_NAME=
|
|
||||||
# Defaults to 60 seconds. Set to 0 to disable
|
|
||||||
# SWIFT_CACHE_TTL=
|
|
||||||
|
|
||||||
# Optional alias for S3 (e.g. to serve files on a custom domain, possibly using Cloudfront or Cloudflare)
|
|
||||||
# S3_ALIAS_HOST=
|
|
||||||
|
|
||||||
# Streaming API integration
|
# Streaming API integration
|
||||||
# STREAMING_API_BASE_URL=
|
# STREAMING_API_BASE_URL=
|
||||||
@@ -163,86 +90,3 @@ SMTP_FROM_ADDRESS=notifications@example.com
|
|||||||
# Cluster number setting for streaming API server.
|
# Cluster number setting for streaming API server.
|
||||||
# If you comment out following line, cluster number will be `numOfCpuCores - 1`.
|
# If you comment out following line, cluster number will be `numOfCpuCores - 1`.
|
||||||
STREAMING_CLUSTER_NUM=1
|
STREAMING_CLUSTER_NUM=1
|
||||||
|
|
||||||
# Docker mastodon user
|
|
||||||
# If you use Docker, you may want to assign UID/GID manually.
|
|
||||||
# UID=1000
|
|
||||||
# GID=1000
|
|
||||||
|
|
||||||
# LDAP authentication (optional)
|
|
||||||
# LDAP_ENABLED=true
|
|
||||||
# LDAP_HOST=localhost
|
|
||||||
# LDAP_PORT=389
|
|
||||||
# LDAP_METHOD=simple_tls
|
|
||||||
# LDAP_BASE=
|
|
||||||
# LDAP_BIND_DN=
|
|
||||||
# LDAP_PASSWORD=
|
|
||||||
# LDAP_UID=cn
|
|
||||||
# LDAP_SEARCH_FILTER="%{uid}=%{email}"
|
|
||||||
|
|
||||||
# PAM authentication (optional)
|
|
||||||
# PAM authentication uses for the email generation the "email" pam variable
|
|
||||||
# and optional as fallback PAM_DEFAULT_SUFFIX
|
|
||||||
# The pam environment variable "email" is provided by:
|
|
||||||
# https://github.com/devkral/pam_email_extractor
|
|
||||||
# PAM_ENABLED=true
|
|
||||||
# Fallback email domain for email address generation (LOCAL_DOMAIN by default)
|
|
||||||
# PAM_EMAIL_DOMAIN=example.com
|
|
||||||
# Name of the pam service (pam "auth" section is evaluated)
|
|
||||||
# PAM_DEFAULT_SERVICE=rpam
|
|
||||||
# Name of the pam service used for checking if an user can register (pam "account" section is evaluated) (nil (disabled) by default)
|
|
||||||
# PAM_CONTROLLED_SERVICE=rpam
|
|
||||||
|
|
||||||
# Global OAuth settings (optional) :
|
|
||||||
# If you have only one strategy, you may want to enable this
|
|
||||||
# OAUTH_REDIRECT_AT_SIGN_IN=true
|
|
||||||
|
|
||||||
# Optional CAS authentication (cf. omniauth-cas) :
|
|
||||||
# CAS_ENABLED=true
|
|
||||||
# CAS_URL=https://sso.myserver.com/
|
|
||||||
# CAS_HOST=sso.myserver.com/
|
|
||||||
# CAS_PORT=443
|
|
||||||
# CAS_SSL=true
|
|
||||||
# CAS_VALIDATE_URL=
|
|
||||||
# CAS_CALLBACK_URL=
|
|
||||||
# CAS_LOGOUT_URL=
|
|
||||||
# CAS_LOGIN_URL=
|
|
||||||
# CAS_UID_FIELD='user'
|
|
||||||
# CAS_CA_PATH=
|
|
||||||
# CAS_DISABLE_SSL_VERIFICATION=false
|
|
||||||
# CAS_UID_KEY='user'
|
|
||||||
# CAS_NAME_KEY='name'
|
|
||||||
# CAS_EMAIL_KEY='email'
|
|
||||||
# CAS_NICKNAME_KEY='nickname'
|
|
||||||
# CAS_FIRST_NAME_KEY='firstname'
|
|
||||||
# CAS_LAST_NAME_KEY='lastname'
|
|
||||||
# CAS_LOCATION_KEY='location'
|
|
||||||
# CAS_IMAGE_KEY='image'
|
|
||||||
# CAS_PHONE_KEY='phone'
|
|
||||||
|
|
||||||
# Optional SAML authentication (cf. omniauth-saml)
|
|
||||||
# SAML_ENABLED=true
|
|
||||||
# SAML_ACS_URL=
|
|
||||||
# SAML_ISSUER=http://localhost:3000/auth/auth/saml/callback
|
|
||||||
# SAML_IDP_SSO_TARGET_URL=https://idp.testshib.org/idp/profile/SAML2/Redirect/SSO
|
|
||||||
# SAML_IDP_CERT=
|
|
||||||
# SAML_IDP_CERT_FINGERPRINT=
|
|
||||||
# SAML_NAME_IDENTIFIER_FORMAT=
|
|
||||||
# SAML_CERT=
|
|
||||||
# SAML_PRIVATE_KEY=
|
|
||||||
# SAML_SECURITY_WANT_ASSERTION_SIGNED=true
|
|
||||||
# SAML_SECURITY_WANT_ASSERTION_ENCRYPTED=true
|
|
||||||
# SAML_SECURITY_ASSUME_EMAIL_IS_VERIFIED=true
|
|
||||||
# SAML_ATTRIBUTES_STATEMENTS_UID="urn:oid:0.9.2342.19200300.100.1.1"
|
|
||||||
# SAML_ATTRIBUTES_STATEMENTS_EMAIL="urn:oid:1.3.6.1.4.1.5923.1.1.1.6"
|
|
||||||
# SAML_ATTRIBUTES_STATEMENTS_FULL_NAME="urn:oid:2.16.840.1.113730.3.1.241"
|
|
||||||
# SAML_ATTRIBUTES_STATEMENTS_FIRST_NAME="urn:oid:2.5.4.42"
|
|
||||||
# SAML_ATTRIBUTES_STATEMENTS_LAST_NAME="urn:oid:2.5.4.4"
|
|
||||||
# SAML_UID_ATTRIBUTE="urn:oid:0.9.2342.19200300.100.1.1"
|
|
||||||
# SAML_ATTRIBUTES_STATEMENTS_VERIFIED=
|
|
||||||
# SAML_ATTRIBUTES_STATEMENTS_VERIFIED_EMAIL=
|
|
||||||
|
|
||||||
# Use HTTP proxy for outgoing request (optional)
|
|
||||||
# http_proxy=http://gateway.local:8118
|
|
||||||
# Access control for hidden service.
|
|
||||||
# ALLOW_ACCESS_TO_HIDDEN_SERVICE=true
|
|
||||||
|
@@ -1,5 +1,4 @@
|
|||||||
# Node.js
|
|
||||||
NODE_ENV=test
|
|
||||||
# Federation
|
# Federation
|
||||||
LOCAL_DOMAIN=cb6e6126.ngrok.io
|
LOCAL_DOMAIN=cb6e6126.ngrok.io
|
||||||
LOCAL_HTTPS=true
|
LOCAL_HTTPS=true
|
||||||
|
OTP_SECRET=100c7faeef00caa29242f6b04156742bf76065771fd4117990c4282b8748ff3d99f8fdae97c982ab5bd2e6756a159121377cce4421f4a8ecd2d67bd7749a3fb4
|
||||||
|
@@ -1,2 +1,2 @@
|
|||||||
VAGRANT=true
|
VAGRANT=true
|
||||||
LOCAL_DOMAIN=mastodon.local
|
LOCAL_DOMAIN=mastodon.dev
|
@@ -1,13 +1,30 @@
|
|||||||
/build/**
|
# See https://help.github.com/articles/ignoring-files for more about ignoring files.
|
||||||
/coverage/**
|
#
|
||||||
/db/**
|
# If you find yourself ignoring temporary files generated by your text editor
|
||||||
/lib/**
|
# or operating system, you probably want to add a global ignore instead:
|
||||||
/log/**
|
# git config --global core.excludesfile '~/.gitignore_global'
|
||||||
/node_modules/**
|
|
||||||
/nonobox/**
|
# Ignore bundler config.
|
||||||
/public/**
|
/.bundle
|
||||||
!/public/embed.js
|
|
||||||
/spec/**
|
# Ignore the default SQLite database.
|
||||||
/tmp/**
|
/db/*.sqlite3
|
||||||
/vendor/**
|
/db/*.sqlite3-journal
|
||||||
!.eslintrc.js
|
|
||||||
|
# Ignore all logfiles and tempfiles.
|
||||||
|
/log/*
|
||||||
|
!/log/.keep
|
||||||
|
/tmp
|
||||||
|
coverage
|
||||||
|
public/system
|
||||||
|
public/assets
|
||||||
|
.env
|
||||||
|
.env.production
|
||||||
|
node_modules/
|
||||||
|
neo4j/
|
||||||
|
|
||||||
|
# Ignore Vagrant files
|
||||||
|
.vagrant/
|
||||||
|
|
||||||
|
# Ignore Capistrano customizations
|
||||||
|
config/deploy/*
|
||||||
|
204
.eslintrc.js
@@ -1,204 +0,0 @@
|
|||||||
module.exports = {
|
|
||||||
root: true,
|
|
||||||
|
|
||||||
env: {
|
|
||||||
browser: true,
|
|
||||||
node: true,
|
|
||||||
es6: true,
|
|
||||||
jest: true,
|
|
||||||
},
|
|
||||||
|
|
||||||
globals: {
|
|
||||||
ATTACHMENT_HOST: false,
|
|
||||||
},
|
|
||||||
|
|
||||||
parser: 'babel-eslint',
|
|
||||||
|
|
||||||
plugins: [
|
|
||||||
'react',
|
|
||||||
'jsx-a11y',
|
|
||||||
'import',
|
|
||||||
'promise',
|
|
||||||
],
|
|
||||||
|
|
||||||
parserOptions: {
|
|
||||||
sourceType: 'module',
|
|
||||||
ecmaFeatures: {
|
|
||||||
experimentalObjectRestSpread: true,
|
|
||||||
jsx: true,
|
|
||||||
},
|
|
||||||
ecmaVersion: 2018,
|
|
||||||
},
|
|
||||||
|
|
||||||
settings: {
|
|
||||||
react: {
|
|
||||||
version: 'detect',
|
|
||||||
},
|
|
||||||
'import/extensions': [
|
|
||||||
'.js',
|
|
||||||
],
|
|
||||||
'import/ignore': [
|
|
||||||
'node_modules',
|
|
||||||
'\\.(css|scss|json)$',
|
|
||||||
],
|
|
||||||
'import/resolver': {
|
|
||||||
node: {
|
|
||||||
paths: ['app/javascript'],
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
|
|
||||||
rules: {
|
|
||||||
'brace-style': 'warn',
|
|
||||||
'comma-dangle': ['error', 'always-multiline'],
|
|
||||||
'comma-spacing': [
|
|
||||||
'warn',
|
|
||||||
{
|
|
||||||
before: false,
|
|
||||||
after: true,
|
|
||||||
},
|
|
||||||
],
|
|
||||||
'comma-style': ['warn', 'last'],
|
|
||||||
'consistent-return': 'error',
|
|
||||||
'dot-notation': 'error',
|
|
||||||
eqeqeq: 'error',
|
|
||||||
indent: ['warn', 2],
|
|
||||||
'jsx-quotes': ['error', 'prefer-single'],
|
|
||||||
'no-catch-shadow': 'error',
|
|
||||||
'no-cond-assign': 'error',
|
|
||||||
'no-console': [
|
|
||||||
'warn',
|
|
||||||
{
|
|
||||||
allow: [
|
|
||||||
'error',
|
|
||||||
'warn',
|
|
||||||
],
|
|
||||||
},
|
|
||||||
],
|
|
||||||
'no-fallthrough': 'error',
|
|
||||||
'no-irregular-whitespace': 'error',
|
|
||||||
'no-mixed-spaces-and-tabs': 'warn',
|
|
||||||
'no-nested-ternary': 'warn',
|
|
||||||
'no-trailing-spaces': 'warn',
|
|
||||||
'no-undef': 'error',
|
|
||||||
'no-unreachable': 'error',
|
|
||||||
'no-unused-expressions': 'error',
|
|
||||||
'no-unused-vars': [
|
|
||||||
'error',
|
|
||||||
{
|
|
||||||
vars: 'all',
|
|
||||||
args: 'after-used',
|
|
||||||
ignoreRestSiblings: true,
|
|
||||||
},
|
|
||||||
],
|
|
||||||
'object-curly-spacing': ['error', 'always'],
|
|
||||||
'padded-blocks': [
|
|
||||||
'error',
|
|
||||||
{
|
|
||||||
classes: 'always',
|
|
||||||
},
|
|
||||||
],
|
|
||||||
quotes: ['error', 'single'],
|
|
||||||
semi: 'error',
|
|
||||||
strict: 'off',
|
|
||||||
'valid-typeof': 'error',
|
|
||||||
|
|
||||||
'react/jsx-boolean-value': 'error',
|
|
||||||
'react/jsx-closing-bracket-location': ['error', 'line-aligned'],
|
|
||||||
'react/jsx-curly-spacing': 'error',
|
|
||||||
'react/jsx-equals-spacing': 'error',
|
|
||||||
'react/jsx-first-prop-new-line': ['error', 'multiline-multiprop'],
|
|
||||||
'react/jsx-indent': ['error', 2],
|
|
||||||
'react/jsx-no-bind': 'error',
|
|
||||||
'react/jsx-no-duplicate-props': 'error',
|
|
||||||
'react/jsx-no-undef': 'error',
|
|
||||||
'react/jsx-tag-spacing': 'error',
|
|
||||||
'react/jsx-uses-react': 'error',
|
|
||||||
'react/jsx-uses-vars': 'error',
|
|
||||||
'react/jsx-wrap-multilines': 'error',
|
|
||||||
'react/no-multi-comp': 'off',
|
|
||||||
'react/no-string-refs': 'error',
|
|
||||||
'react/prop-types': 'error',
|
|
||||||
'react/self-closing-comp': 'error',
|
|
||||||
|
|
||||||
'jsx-a11y/accessible-emoji': 'warn',
|
|
||||||
'jsx-a11y/alt-text': 'warn',
|
|
||||||
'jsx-a11y/anchor-has-content': 'warn',
|
|
||||||
'jsx-a11y/anchor-is-valid': [
|
|
||||||
'warn',
|
|
||||||
{
|
|
||||||
components: [
|
|
||||||
'Link',
|
|
||||||
'NavLink',
|
|
||||||
],
|
|
||||||
specialLink: [
|
|
||||||
'to',
|
|
||||||
],
|
|
||||||
aspect: [
|
|
||||||
'noHref',
|
|
||||||
'invalidHref',
|
|
||||||
'preferButton',
|
|
||||||
],
|
|
||||||
},
|
|
||||||
],
|
|
||||||
'jsx-a11y/aria-activedescendant-has-tabindex': 'warn',
|
|
||||||
'jsx-a11y/aria-props': 'warn',
|
|
||||||
'jsx-a11y/aria-proptypes': 'warn',
|
|
||||||
'jsx-a11y/aria-role': 'warn',
|
|
||||||
'jsx-a11y/aria-unsupported-elements': 'warn',
|
|
||||||
'jsx-a11y/heading-has-content': 'warn',
|
|
||||||
'jsx-a11y/html-has-lang': 'warn',
|
|
||||||
'jsx-a11y/iframe-has-title': 'warn',
|
|
||||||
'jsx-a11y/img-redundant-alt': 'warn',
|
|
||||||
'jsx-a11y/interactive-supports-focus': 'warn',
|
|
||||||
'jsx-a11y/label-has-for': 'off',
|
|
||||||
'jsx-a11y/mouse-events-have-key-events': 'warn',
|
|
||||||
'jsx-a11y/no-access-key': 'warn',
|
|
||||||
'jsx-a11y/no-distracting-elements': 'warn',
|
|
||||||
'jsx-a11y/no-noninteractive-element-interactions': [
|
|
||||||
'warn',
|
|
||||||
{
|
|
||||||
handlers: [
|
|
||||||
'onClick',
|
|
||||||
],
|
|
||||||
},
|
|
||||||
],
|
|
||||||
'jsx-a11y/no-onchange': 'warn',
|
|
||||||
'jsx-a11y/no-redundant-roles': 'warn',
|
|
||||||
'jsx-a11y/no-static-element-interactions': [
|
|
||||||
'warn',
|
|
||||||
{
|
|
||||||
handlers: [
|
|
||||||
'onClick',
|
|
||||||
],
|
|
||||||
},
|
|
||||||
],
|
|
||||||
'jsx-a11y/role-has-required-aria-props': 'warn',
|
|
||||||
'jsx-a11y/role-supports-aria-props': 'off',
|
|
||||||
'jsx-a11y/scope': 'warn',
|
|
||||||
'jsx-a11y/tabindex-no-positive': 'warn',
|
|
||||||
|
|
||||||
'import/extensions': [
|
|
||||||
'error',
|
|
||||||
'always',
|
|
||||||
{
|
|
||||||
js: 'never',
|
|
||||||
},
|
|
||||||
],
|
|
||||||
'import/newline-after-import': 'error',
|
|
||||||
'import/no-extraneous-dependencies': [
|
|
||||||
'error',
|
|
||||||
{
|
|
||||||
devDependencies: [
|
|
||||||
'config/webpack/**',
|
|
||||||
'app/javascript/mastodon/test_setup.js',
|
|
||||||
'app/javascript/**/__tests__/**',
|
|
||||||
],
|
|
||||||
},
|
|
||||||
],
|
|
||||||
'import/no-unresolved': 'error',
|
|
||||||
'import/no-webpack-loader-syntax': 'error',
|
|
||||||
|
|
||||||
'promise/catch-or-return': 'error',
|
|
||||||
},
|
|
||||||
};
|
|
79
.eslintrc.json
Normal file
@@ -0,0 +1,79 @@
|
|||||||
|
{
|
||||||
|
"env": {
|
||||||
|
"browser": true,
|
||||||
|
"node": false,
|
||||||
|
"es6": true
|
||||||
|
},
|
||||||
|
|
||||||
|
"parser": "babel-eslint",
|
||||||
|
|
||||||
|
"plugins": [
|
||||||
|
"react",
|
||||||
|
"jsx-a11y"
|
||||||
|
],
|
||||||
|
|
||||||
|
"parserOptions": {
|
||||||
|
"sourceType": "module",
|
||||||
|
|
||||||
|
"ecmaFeatures": {
|
||||||
|
"arrowFunctions": true,
|
||||||
|
"jsx": true,
|
||||||
|
"destructuring": true,
|
||||||
|
"modules": true,
|
||||||
|
"spread": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
"rules": {
|
||||||
|
"no-cond-assign": 2,
|
||||||
|
"no-console": 1,
|
||||||
|
"no-irregular-whitespace": 2,
|
||||||
|
"no-unreachable": 2,
|
||||||
|
"valid-typeof": 2,
|
||||||
|
"consistent-return": 2,
|
||||||
|
"dot-notation": 2,
|
||||||
|
"eqeqeq": 2,
|
||||||
|
"no-fallthrough": 2,
|
||||||
|
"no-unused-expressions": 2,
|
||||||
|
"strict": 0,
|
||||||
|
"no-catch-shadow": 2,
|
||||||
|
"indent": [1, 2],
|
||||||
|
"brace-style": 1,
|
||||||
|
"comma-spacing": [1, {"before": false, "after": true}],
|
||||||
|
"comma-style": [1, "last"],
|
||||||
|
"no-mixed-spaces-and-tabs": 1,
|
||||||
|
"no-nested-ternary": 1,
|
||||||
|
"no-trailing-spaces": 1,
|
||||||
|
|
||||||
|
"react/jsx-wrap-multilines": 2,
|
||||||
|
"react/self-closing-comp": 2,
|
||||||
|
"react/prop-types": 2,
|
||||||
|
"react/no-multi-comp": 0,
|
||||||
|
|
||||||
|
"jsx-a11y/accessible-emoji": 1,
|
||||||
|
"jsx-a11y/anchor-has-content": 1,
|
||||||
|
"jsx-a11y/aria-activedescendant-has-tabindex": 1,
|
||||||
|
"jsx-a11y/aria-props": 1,
|
||||||
|
"jsx-a11y/aria-proptypes": 1,
|
||||||
|
"jsx-a11y/aria-role": 1,
|
||||||
|
"jsx-a11y/aria-unsupported-elements": 1,
|
||||||
|
"jsx-a11y/heading-has-content": 1,
|
||||||
|
"jsx-a11y/href-no-hash": 1,
|
||||||
|
"jsx-a11y/html-has-lang": 1,
|
||||||
|
"jsx-a11y/iframe-has-title": 1,
|
||||||
|
"jsx-a11y/img-has-alt": 1,
|
||||||
|
"jsx-a11y/img-redundant-alt": 1,
|
||||||
|
"jsx-a11y/label-has-for": 1,
|
||||||
|
"jsx-a11y/mouse-events-have-key-events": 1,
|
||||||
|
"jsx-a11y/no-access-key": 1,
|
||||||
|
"jsx-a11y/no-distracting-elements": 1,
|
||||||
|
"jsx-a11y/no-onchange": 1,
|
||||||
|
"jsx-a11y/no-redundant-roles": 1,
|
||||||
|
"jsx-a11y/onclick-has-focus": 1,
|
||||||
|
"jsx-a11y/onclick-has-role": 1,
|
||||||
|
"jsx-a11y/role-has-required-aria-props": 1,
|
||||||
|
"jsx-a11y/role-supports-aria-props": 1,
|
||||||
|
"jsx-a11y/scope": 1,
|
||||||
|
"jsx-a11y/tabindex-no-positive": 1
|
||||||
|
}
|
||||||
|
}
|
14
.gitattributes
vendored
@@ -1,14 +0,0 @@
|
|||||||
* text=auto eol=lf
|
|
||||||
*.eot -text
|
|
||||||
*.gif -text
|
|
||||||
*.gz -text
|
|
||||||
*.ico -text
|
|
||||||
*.jpg -text
|
|
||||||
*.mp3 -text
|
|
||||||
*.ogg -text
|
|
||||||
*.png -text
|
|
||||||
*.ttf -text
|
|
||||||
*.webm -text
|
|
||||||
*.woff -text
|
|
||||||
*.woff2 -text
|
|
||||||
spec/fixtures/requests/** -text !eol
|
|
32
.github/CODEOWNERS
vendored
@@ -1,32 +0,0 @@
|
|||||||
# CODEOWNERS for tootsuite/mastodon
|
|
||||||
|
|
||||||
# Translators
|
|
||||||
# To add translator, copy these lines, replace `fr` with appropriate language code and replace `@żelipapą` with user's GitHub nickname preceded by `@` sign or e-mail address.
|
|
||||||
# /app/javascript/mastodon/locales/fr.json @żelipapą
|
|
||||||
# /app/views/user_mailer/*.fr.html.erb @żelipapą
|
|
||||||
# /app/views/user_mailer/*.fr.text.erb @żelipapą
|
|
||||||
# /config/locales/*.fr.yml @żelipapą
|
|
||||||
# /config/locales/fr.yml @żelipapą
|
|
||||||
|
|
||||||
# Polish
|
|
||||||
/app/javascript/mastodon/locales/pl.json @m4sk1n
|
|
||||||
/app/views/user_mailer/*.pl.html.erb @m4sk1n
|
|
||||||
/app/views/user_mailer/*.pl.text.erb @m4sk1n
|
|
||||||
/config/locales/*.pl.yml @m4sk1n
|
|
||||||
/config/locales/pl.yml @m4sk1n
|
|
||||||
|
|
||||||
# French
|
|
||||||
/app/javascript/mastodon/locales/fr.json @aldarone
|
|
||||||
/app/javascript/mastodon/locales/whitelist_fr.json @aldarone
|
|
||||||
/app/views/user_mailer/*.fr.html.erb @aldarone
|
|
||||||
/app/views/user_mailer/*.fr.text.erb @aldarone
|
|
||||||
/config/locales/*.fr.yml @aldarone
|
|
||||||
/config/locales/fr.yml @aldarone
|
|
||||||
|
|
||||||
# Dutch
|
|
||||||
/app/javascript/mastodon/locales/nl.json @jeroenpraat
|
|
||||||
/app/javascript/mastodon/locales/whitelist_nl.json @jeroenpraat
|
|
||||||
/app/views/user_mailer/*.nl.html.erb @jeroenpraat
|
|
||||||
/app/views/user_mailer/*.nl.text.erb @jeroenpraat
|
|
||||||
/config/locales/*.nl.yml @jeroenpraat
|
|
||||||
/config/locales/nl.yml @jeroenpraat
|
|
2
.github/FUNDING.yml
vendored
@@ -1,2 +0,0 @@
|
|||||||
patreon: mastodon
|
|
||||||
open_collective: mastodon
|
|
27
.github/ISSUE_TEMPLATE/bug_report.md
vendored
@@ -1,27 +0,0 @@
|
|||||||
---
|
|
||||||
name: Bug Report
|
|
||||||
about: If something isn't working as expected
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
<!-- Make sure that you are submitting a new bug that was not previously reported or already fixed -->
|
|
||||||
|
|
||||||
<!-- Please use a concise and distinct title for the issue -->
|
|
||||||
|
|
||||||
### Expected behaviour
|
|
||||||
|
|
||||||
<!-- What should have happened? -->
|
|
||||||
|
|
||||||
### Actual behaviour
|
|
||||||
|
|
||||||
<!-- What happened? -->
|
|
||||||
|
|
||||||
### Steps to reproduce the problem
|
|
||||||
|
|
||||||
<!-- What were you trying to do? -->
|
|
||||||
|
|
||||||
### Specifications
|
|
||||||
|
|
||||||
<!-- What version or commit hash of Mastodon did you find this bug in? -->
|
|
||||||
|
|
||||||
<!-- If a front-end issue, what browser and operating systems were you using? -->
|
|
17
.github/ISSUE_TEMPLATE/feature_request.md
vendored
@@ -1,17 +0,0 @@
|
|||||||
---
|
|
||||||
name: Feature Request
|
|
||||||
about: I have a suggestion
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
<!-- Please use a concise and distinct title for the issue -->
|
|
||||||
|
|
||||||
<!-- Consider: Could it be implemented as a 3rd party app using the REST API instead? -->
|
|
||||||
|
|
||||||
### Pitch
|
|
||||||
|
|
||||||
<!-- Describe your idea for a feature. Make sure it has not already been suggested/implemented/turned down before -->
|
|
||||||
|
|
||||||
### Motivation
|
|
||||||
|
|
||||||
<!-- Why do you think this feature is needed? Who would benefit from it? -->
|
|
10
.github/ISSUE_TEMPLATE/support.md
vendored
@@ -1,10 +0,0 @@
|
|||||||
---
|
|
||||||
name: Support
|
|
||||||
about: Ask for help with your deployment
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
We primarily use GitHub as a bug and feature tracker. For usage questions, troubleshooting of deployments and other individual technical assistance, please use one of the resources below:
|
|
||||||
|
|
||||||
- https://discourse.joinmastodon.org
|
|
||||||
- #mastodon on irc.freenode.net
|
|
19
.gitignore
vendored
@@ -19,12 +19,10 @@
|
|||||||
coverage
|
coverage
|
||||||
public/system
|
public/system
|
||||||
public/assets
|
public/assets
|
||||||
public/packs
|
|
||||||
public/packs-test
|
|
||||||
.env
|
.env
|
||||||
.env.production
|
.env.production
|
||||||
node_modules/
|
node_modules/
|
||||||
build/
|
neo4j/
|
||||||
|
|
||||||
# Ignore Vagrant files
|
# Ignore Vagrant files
|
||||||
.vagrant/
|
.vagrant/
|
||||||
@@ -34,12 +32,10 @@ config/deploy/*
|
|||||||
|
|
||||||
# Ignore IDE files
|
# Ignore IDE files
|
||||||
.vscode/
|
.vscode/
|
||||||
.idea/
|
|
||||||
|
|
||||||
# Ignore postgres + redis + elasticsearch volume optionally created by docker-compose
|
# Ignore postgres + redis volume optionally created by docker-compose
|
||||||
postgres
|
postgres
|
||||||
redis
|
redis
|
||||||
elasticsearch
|
|
||||||
|
|
||||||
# Ignore Apple files
|
# Ignore Apple files
|
||||||
.DS_Store
|
.DS_Store
|
||||||
@@ -47,14 +43,3 @@ elasticsearch
|
|||||||
# Ignore vim files
|
# Ignore vim files
|
||||||
*~
|
*~
|
||||||
*.swp
|
*.swp
|
||||||
|
|
||||||
# Ignore npm debug log
|
|
||||||
npm-debug.log
|
|
||||||
|
|
||||||
# Ignore yarn log files
|
|
||||||
yarn-error.log
|
|
||||||
yarn-debug.log
|
|
||||||
|
|
||||||
# Ignore Docker option files
|
|
||||||
docker-compose.override.yml
|
|
||||||
|
|
||||||
|
108
.haml-lint.yml
@@ -1,108 +0,0 @@
|
|||||||
# Whether to ignore frontmatter at the beginning of HAML documents for
|
|
||||||
# frameworks such as Jekyll/Middleman
|
|
||||||
skip_frontmatter: false
|
|
||||||
|
|
||||||
exclude:
|
|
||||||
- 'vendor/**/*'
|
|
||||||
- 'spec/**/*'
|
|
||||||
- 'lib/templates/**/*'
|
|
||||||
- 'app/views/kaminari/**/*'
|
|
||||||
|
|
||||||
linters:
|
|
||||||
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
|
|
19
.nanoignore
@@ -1,19 +0,0 @@
|
|||||||
.DS_Store
|
|
||||||
.git/
|
|
||||||
.gitignore
|
|
||||||
|
|
||||||
.bundle/
|
|
||||||
.cache/
|
|
||||||
config/deploy/*
|
|
||||||
coverage
|
|
||||||
docs/
|
|
||||||
.env
|
|
||||||
log/*.log
|
|
||||||
neo4j/
|
|
||||||
node_modules/
|
|
||||||
public/assets/
|
|
||||||
public/system/
|
|
||||||
spec/
|
|
||||||
tmp/
|
|
||||||
.vagrant/
|
|
||||||
vendor/bundle/
|
|
1
.profile
@@ -1 +0,0 @@
|
|||||||
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/app/.apt/lib/x86_64-linux-gnu:/app/.apt/usr/lib/x86_64-linux-gnu/mesa:/app/.apt/usr/lib/x86_64-linux-gnu/pulseaudio
|
|
136
.rubocop.yml
@@ -1,50 +1,14 @@
|
|||||||
require:
|
Rails:
|
||||||
- rubocop-rails
|
Enabled: true
|
||||||
|
|
||||||
AllCops:
|
Style/PerlBackrefs:
|
||||||
TargetRubyVersion: 2.3
|
AutoCorrect: false
|
||||||
Exclude:
|
|
||||||
- 'spec/**/*'
|
|
||||||
- 'db/**/*'
|
|
||||||
- 'app/views/**/*'
|
|
||||||
- 'config/**/*'
|
|
||||||
- 'bin/*'
|
|
||||||
- 'Rakefile'
|
|
||||||
- 'node_modules/**/*'
|
|
||||||
- 'Vagrantfile'
|
|
||||||
- 'vendor/**/*'
|
|
||||||
- 'lib/json_ld/*'
|
|
||||||
- 'lib/templates/**/*'
|
|
||||||
|
|
||||||
Bundler/OrderedGems:
|
Style/ClassAndModuleChildren:
|
||||||
Enabled: false
|
Enabled: false
|
||||||
|
|
||||||
Layout/AccessModifierIndentation:
|
|
||||||
EnforcedStyle: indent
|
|
||||||
|
|
||||||
Layout/EmptyLineAfterMagicComment:
|
|
||||||
Enabled: false
|
|
||||||
|
|
||||||
Layout/SpaceInsideHashLiteralBraces:
|
|
||||||
EnforcedStyle: space
|
|
||||||
|
|
||||||
Metrics/AbcSize:
|
|
||||||
Max: 100
|
|
||||||
|
|
||||||
Metrics/BlockLength:
|
|
||||||
Max: 35
|
|
||||||
Exclude:
|
|
||||||
- 'lib/tasks/**/*'
|
|
||||||
|
|
||||||
Metrics/BlockNesting:
|
Metrics/BlockNesting:
|
||||||
Max: 3
|
Max: 2
|
||||||
|
|
||||||
Metrics/ClassLength:
|
|
||||||
CountComments: false
|
|
||||||
Max: 300
|
|
||||||
|
|
||||||
Metrics/CyclomaticComplexity:
|
|
||||||
Max: 25
|
|
||||||
|
|
||||||
Metrics/LineLength:
|
Metrics/LineLength:
|
||||||
AllowURI: true
|
AllowURI: true
|
||||||
@@ -52,44 +16,37 @@ Metrics/LineLength:
|
|||||||
|
|
||||||
Metrics/MethodLength:
|
Metrics/MethodLength:
|
||||||
CountComments: false
|
CountComments: false
|
||||||
|
Max: 10
|
||||||
|
|
||||||
|
Metrics/AbcSize:
|
||||||
|
Max: 100
|
||||||
|
|
||||||
|
Metrics/BlockNesting:
|
||||||
|
Max: 3
|
||||||
|
|
||||||
|
Metrics/ClassLength:
|
||||||
|
CountComments: false
|
||||||
|
Max: 200
|
||||||
|
|
||||||
|
Metrics/CyclomaticComplexity:
|
||||||
|
Max: 15
|
||||||
|
|
||||||
|
Metrics/MethodLength:
|
||||||
Max: 55
|
Max: 55
|
||||||
|
|
||||||
Metrics/ModuleLength:
|
Metrics/ModuleLength:
|
||||||
CountComments: false
|
CountComments: false
|
||||||
Max: 200
|
Max: 200
|
||||||
|
|
||||||
|
Metrics/PerceivedComplexity:
|
||||||
|
Max: 10
|
||||||
|
|
||||||
Metrics/ParameterLists:
|
Metrics/ParameterLists:
|
||||||
Max: 5
|
Max: 4
|
||||||
CountKeywordArgs: true
|
CountKeywordArgs: true
|
||||||
|
|
||||||
Metrics/PerceivedComplexity:
|
Style/AccessModifierIndentation:
|
||||||
Max: 20
|
EnforcedStyle: indent
|
||||||
|
|
||||||
Naming/MemoizedInstanceVariableName:
|
|
||||||
Enabled: false
|
|
||||||
|
|
||||||
Rails:
|
|
||||||
Enabled: true
|
|
||||||
|
|
||||||
Rails/HasAndBelongsToMany:
|
|
||||||
Enabled: false
|
|
||||||
|
|
||||||
Rails/SkipsModelValidations:
|
|
||||||
Enabled: false
|
|
||||||
|
|
||||||
Rails/HttpStatus:
|
|
||||||
Enabled: false
|
|
||||||
|
|
||||||
Rails/Exit:
|
|
||||||
Exclude:
|
|
||||||
- 'lib/mastodon/*'
|
|
||||||
- 'lib/cli.rb'
|
|
||||||
|
|
||||||
Rails/HelperInstanceVariable:
|
|
||||||
Enabled: false
|
|
||||||
|
|
||||||
Style/ClassAndModuleChildren:
|
|
||||||
Enabled: false
|
|
||||||
|
|
||||||
Style/CollectionMethods:
|
Style/CollectionMethods:
|
||||||
Enabled: true
|
Enabled: true
|
||||||
@@ -105,28 +62,29 @@ Style/DoubleNegation:
|
|||||||
Style/FrozenStringLiteralComment:
|
Style/FrozenStringLiteralComment:
|
||||||
Enabled: true
|
Enabled: true
|
||||||
|
|
||||||
Style/GuardClause:
|
Style/SpaceInsideHashLiteralBraces:
|
||||||
|
EnforcedStyle: space
|
||||||
|
|
||||||
|
Style/TrailingCommaInLiteral:
|
||||||
|
EnforcedStyleForMultiline: 'comma'
|
||||||
|
|
||||||
|
Style/RegexpLiteral:
|
||||||
Enabled: false
|
Enabled: false
|
||||||
|
|
||||||
Style/Lambda:
|
Style/Lambda:
|
||||||
Enabled: false
|
Enabled: false
|
||||||
|
|
||||||
Style/PercentLiteralDelimiters:
|
Rails/HasAndBelongsToMany:
|
||||||
PreferredDelimiters:
|
|
||||||
'%i': '()'
|
|
||||||
'%w': '()'
|
|
||||||
|
|
||||||
Style/PerlBackrefs:
|
|
||||||
AutoCorrect: false
|
|
||||||
|
|
||||||
Style/RegexpLiteral:
|
|
||||||
Enabled: false
|
Enabled: false
|
||||||
|
|
||||||
Style/SymbolArray:
|
AllCops:
|
||||||
Enabled: false
|
TargetRubyVersion: 2.3
|
||||||
|
Exclude:
|
||||||
Style/TrailingCommaInArrayLiteral:
|
- 'spec/**/*'
|
||||||
EnforcedStyleForMultiline: 'comma'
|
- 'db/**/*'
|
||||||
|
- 'app/views/**/*'
|
||||||
Style/TrailingCommaInHashLiteral:
|
- 'config/**/*'
|
||||||
EnforcedStyleForMultiline: 'comma'
|
- 'bin/*'
|
||||||
|
- 'Rakefile'
|
||||||
|
- 'node_modules/**/*'
|
||||||
|
- 'Vagrantfile'
|
||||||
|
@@ -1 +1 @@
|
|||||||
2.6.4
|
2.4.1
|
||||||
|
@@ -1,37 +0,0 @@
|
|||||||
# Linter Documentation:
|
|
||||||
# https://github.com/sasstools/sass-lint/tree/v1.13.1/docs/options
|
|
||||||
|
|
||||||
files:
|
|
||||||
include: app/javascript/styles/**/*.scss
|
|
||||||
ignore:
|
|
||||||
- app/javascript/styles/mastodon/reset.scss
|
|
||||||
|
|
||||||
rules:
|
|
||||||
# Disallows
|
|
||||||
no-color-literals: 0
|
|
||||||
no-css-comments: 0
|
|
||||||
no-duplicate-properties: 0
|
|
||||||
no-ids: 0
|
|
||||||
no-important: 0
|
|
||||||
no-mergeable-selectors: 0
|
|
||||||
no-misspelled-properties: 0
|
|
||||||
no-qualifying-elements: 0
|
|
||||||
no-transition-all: 0
|
|
||||||
no-vendor-prefixes: 0
|
|
||||||
|
|
||||||
# Nesting
|
|
||||||
force-element-nesting: 0
|
|
||||||
force-attribute-nesting: 0
|
|
||||||
force-pseudo-nesting: 0
|
|
||||||
|
|
||||||
# Name Formats
|
|
||||||
class-name-format: 0
|
|
||||||
leading-zero: 0
|
|
||||||
|
|
||||||
# Style Guide
|
|
||||||
attribute-quotes: 0
|
|
||||||
hex-length: 0
|
|
||||||
indentation: 0
|
|
||||||
nesting-depth: 0
|
|
||||||
property-sort-order: 0
|
|
||||||
quotes: 0
|
|
@@ -2,3 +2,4 @@ node_modules/
|
|||||||
.cache/
|
.cache/
|
||||||
docs/
|
docs/
|
||||||
spec/
|
spec/
|
||||||
|
storybook/
|
||||||
|
50
.travis.yml
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
language: ruby
|
||||||
|
cache:
|
||||||
|
bundler: true
|
||||||
|
yarn: true
|
||||||
|
directories:
|
||||||
|
- node_modules
|
||||||
|
dist: trusty
|
||||||
|
sudo: false
|
||||||
|
|
||||||
|
notifications:
|
||||||
|
email: false
|
||||||
|
|
||||||
|
env:
|
||||||
|
global:
|
||||||
|
- LOCAL_DOMAIN=cb6e6126.ngrok.io
|
||||||
|
- LOCAL_HTTPS=true
|
||||||
|
- RAILS_ENV=test
|
||||||
|
- CXX=g++-4.8
|
||||||
|
addons:
|
||||||
|
postgresql: 9.4
|
||||||
|
apt:
|
||||||
|
sources:
|
||||||
|
- ubuntu-toolchain-r-test
|
||||||
|
- trusty-media
|
||||||
|
packages:
|
||||||
|
- g++-4.8
|
||||||
|
- ffmpeg
|
||||||
|
|
||||||
|
rvm:
|
||||||
|
- 2.3.4
|
||||||
|
- 2.4.1
|
||||||
|
|
||||||
|
services:
|
||||||
|
- redis-server
|
||||||
|
|
||||||
|
bundler_args: --without development production --retry=3 --jobs=3
|
||||||
|
|
||||||
|
install:
|
||||||
|
- nvm install
|
||||||
|
- npm install -g yarn
|
||||||
|
- bundle install
|
||||||
|
- yarn install
|
||||||
|
|
||||||
|
before_script:
|
||||||
|
- bundle exec rails db:create db:migrate
|
||||||
|
|
||||||
|
script:
|
||||||
|
- bundle exec rspec
|
||||||
|
- npm test
|
||||||
|
- i18n-tasks unused
|
46
.yarnclean
@@ -1,46 +0,0 @@
|
|||||||
# test directories
|
|
||||||
__tests__
|
|
||||||
test
|
|
||||||
tests
|
|
||||||
powered-test
|
|
||||||
|
|
||||||
# asset directories
|
|
||||||
docs
|
|
||||||
doc
|
|
||||||
website
|
|
||||||
images
|
|
||||||
# assets
|
|
||||||
|
|
||||||
# examples
|
|
||||||
example
|
|
||||||
examples
|
|
||||||
|
|
||||||
# code coverage directories
|
|
||||||
coverage
|
|
||||||
.nyc_output
|
|
||||||
|
|
||||||
# build scripts
|
|
||||||
Makefile
|
|
||||||
Gulpfile.js
|
|
||||||
Gruntfile.js
|
|
||||||
|
|
||||||
# configs
|
|
||||||
.tern-project
|
|
||||||
.gitattributes
|
|
||||||
.editorconfig
|
|
||||||
.*ignore
|
|
||||||
.eslintrc
|
|
||||||
.jshintrc
|
|
||||||
.flowconfig
|
|
||||||
.documentup.json
|
|
||||||
.yarn-metadata.json
|
|
||||||
.*.yml
|
|
||||||
*.yml
|
|
||||||
|
|
||||||
# misc
|
|
||||||
*.gz
|
|
||||||
*.md
|
|
||||||
|
|
||||||
# for specific ignore
|
|
||||||
!.svgo.yml
|
|
||||||
!sass-lint/**/*.yml
|
|
944
AUTHORS.md
@@ -1,944 +0,0 @@
|
|||||||
Authors
|
|
||||||
=======
|
|
||||||
|
|
||||||
Mastodon is available on [GitHub](https://github.com/tootsuite/mastodon)
|
|
||||||
and provided thanks to the work of the following contributors:
|
|
||||||
|
|
||||||
* [Gargron](https://github.com/Gargron)
|
|
||||||
* [ykzts](https://github.com/ykzts)
|
|
||||||
* [ThibG](https://github.com/ThibG)
|
|
||||||
* [akihikodaki](https://github.com/akihikodaki)
|
|
||||||
* [mjankowski](https://github.com/mjankowski)
|
|
||||||
* [dependabot[bot]](https://github.com/apps/dependabot)
|
|
||||||
* [unarist](https://github.com/unarist)
|
|
||||||
* [m4sk1n](https://github.com/m4sk1n)
|
|
||||||
* [yiskah](https://github.com/yiskah)
|
|
||||||
* [nolanlawson](https://github.com/nolanlawson)
|
|
||||||
* [ysksn](https://github.com/ysksn)
|
|
||||||
* [sorin-davidoi](https://github.com/sorin-davidoi)
|
|
||||||
* [abcang](https://github.com/abcang)
|
|
||||||
* [lynlynlynx](https://github.com/lynlynlynx)
|
|
||||||
* [mayaeh](https://github.com/mayaeh)
|
|
||||||
* [renatolond](https://github.com/renatolond)
|
|
||||||
* [alpaca-tc](https://github.com/alpaca-tc)
|
|
||||||
* [nclm](https://github.com/nclm)
|
|
||||||
* [ineffyble](https://github.com/ineffyble)
|
|
||||||
* [jeroenpraat](https://github.com/jeroenpraat)
|
|
||||||
* [blackle](https://github.com/blackle)
|
|
||||||
* [Quent-in](https://github.com/Quent-in)
|
|
||||||
* [JantsoP](https://github.com/JantsoP)
|
|
||||||
* [Kjwon15](https://github.com/Kjwon15)
|
|
||||||
* [mabkenar](https://github.com/mabkenar)
|
|
||||||
* [nullkal](https://github.com/nullkal)
|
|
||||||
* [yookoala](https://github.com/yookoala)
|
|
||||||
* [shuheiktgw](https://github.com/shuheiktgw)
|
|
||||||
* [ashfurrow](https://github.com/ashfurrow)
|
|
||||||
* [zunda](https://github.com/zunda)
|
|
||||||
* [Quenty31](https://github.com/Quenty31)
|
|
||||||
* [eramdam](https://github.com/eramdam)
|
|
||||||
* [takayamaki](https://github.com/takayamaki)
|
|
||||||
* [masarakki](https://github.com/masarakki)
|
|
||||||
* [ticky](https://github.com/ticky)
|
|
||||||
* [danhunsaker](https://github.com/danhunsaker)
|
|
||||||
* [ThisIsMissEm](https://github.com/ThisIsMissEm)
|
|
||||||
* [hcmiya](https://github.com/hcmiya)
|
|
||||||
* [stephenburgess8](https://github.com/stephenburgess8)
|
|
||||||
* [Wonderfall](https://github.com/Wonderfall)
|
|
||||||
* [matteoaquila](https://github.com/matteoaquila)
|
|
||||||
* [yukimochi](https://github.com/yukimochi)
|
|
||||||
* [rkarabut](https://github.com/rkarabut)
|
|
||||||
* [Artoria2e5](https://github.com/Artoria2e5)
|
|
||||||
* [nightpool](https://github.com/nightpool)
|
|
||||||
* [marrus-sh](https://github.com/marrus-sh)
|
|
||||||
* [krainboltgreene](https://github.com/krainboltgreene)
|
|
||||||
* [pfigel](https://github.com/pfigel)
|
|
||||||
* [Aldarone](https://github.com/Aldarone)
|
|
||||||
* [BoFFire](https://github.com/BoFFire)
|
|
||||||
* [clworld](https://github.com/clworld)
|
|
||||||
* [dracos](https://github.com/dracos)
|
|
||||||
* [SerCom_KC](mailto:sercom-kc@users.noreply.github.com)
|
|
||||||
* [Sylvhem](https://github.com/Sylvhem)
|
|
||||||
* [MasterGroosha](https://github.com/MasterGroosha)
|
|
||||||
* [JeanGauthier](https://github.com/JeanGauthier)
|
|
||||||
* [kschaper](https://github.com/kschaper)
|
|
||||||
* [MaciekBaron](https://github.com/MaciekBaron)
|
|
||||||
* [MitarashiDango](mailto:mitarashidango@users.noreply.github.com)
|
|
||||||
* [beatrix-bitrot](https://github.com/beatrix-bitrot)
|
|
||||||
* [Aditoo17](https://github.com/Aditoo17)
|
|
||||||
* [adbelle](https://github.com/adbelle)
|
|
||||||
* [evanminto](https://github.com/evanminto)
|
|
||||||
* [MightyPork](https://github.com/MightyPork)
|
|
||||||
* [yhirano55](https://github.com/yhirano55)
|
|
||||||
* [rinsuki](https://github.com/rinsuki)
|
|
||||||
* [camponez](https://github.com/camponez)
|
|
||||||
* [hinaloe](https://github.com/hinaloe)
|
|
||||||
* [SerCom-KC](https://github.com/SerCom-KC)
|
|
||||||
* [aschmitz](https://github.com/aschmitz)
|
|
||||||
* [devkral](https://github.com/devkral)
|
|
||||||
* [fpiesche](https://github.com/fpiesche)
|
|
||||||
* [gandaro](https://github.com/gandaro)
|
|
||||||
* [johnsudaar](https://github.com/johnsudaar)
|
|
||||||
* [trebmuh](https://github.com/trebmuh)
|
|
||||||
* [Rakib Hasan](mailto:rmhasan@gmail.com)
|
|
||||||
* [ashleyhull-versent](https://github.com/ashleyhull-versent)
|
|
||||||
* [lindwurm](https://github.com/lindwurm)
|
|
||||||
* [victorhck](mailto:victorhck@geeko.site)
|
|
||||||
* [voidsatisfaction](https://github.com/voidsatisfaction)
|
|
||||||
* [hikari-no-yume](https://github.com/hikari-no-yume)
|
|
||||||
* [angristan](https://github.com/angristan)
|
|
||||||
* [seefood](https://github.com/seefood)
|
|
||||||
* [jackjennings](https://github.com/jackjennings)
|
|
||||||
* [spla](mailto:spla@mastodont.cat)
|
|
||||||
* [expenses](https://github.com/expenses)
|
|
||||||
* [walf443](https://github.com/walf443)
|
|
||||||
* [JoelQ](https://github.com/JoelQ)
|
|
||||||
* [mistydemeo](https://github.com/mistydemeo)
|
|
||||||
* [dunn](https://github.com/dunn)
|
|
||||||
* [xqus](https://github.com/xqus)
|
|
||||||
* [hugogameiro](https://github.com/hugogameiro)
|
|
||||||
* [ariasuni](https://github.com/ariasuni)
|
|
||||||
* [pfm-eyesightjp](https://github.com/pfm-eyesightjp)
|
|
||||||
* [fakenine](https://github.com/fakenine)
|
|
||||||
* [tsuwatch](https://github.com/tsuwatch)
|
|
||||||
* [victorhck](https://github.com/victorhck)
|
|
||||||
* [kedamaDQ](https://github.com/kedamaDQ)
|
|
||||||
* [puckipedia](https://github.com/puckipedia)
|
|
||||||
* [trwnh](https://github.com/trwnh)
|
|
||||||
* [fvh-P](https://github.com/fvh-P)
|
|
||||||
* [Anna e só](mailto:contraexemplos@gmail.com)
|
|
||||||
* [BenLubar](https://github.com/BenLubar)
|
|
||||||
* [kazu9su](https://github.com/kazu9su)
|
|
||||||
* [Komic](https://github.com/Komic)
|
|
||||||
* [lmorchard](https://github.com/lmorchard)
|
|
||||||
* [diomed](https://github.com/diomed)
|
|
||||||
* [Neetshin](mailto:neetshin@neetsh.in)
|
|
||||||
* [rainyday](https://github.com/rainyday)
|
|
||||||
* [ProgVal](https://github.com/ProgVal)
|
|
||||||
* [valentin2105](https://github.com/valentin2105)
|
|
||||||
* [yuntan](https://github.com/yuntan)
|
|
||||||
* [goofy-bz](mailto:goofy@babelzilla.org)
|
|
||||||
* [kadiix](https://github.com/kadiix)
|
|
||||||
* [kodacs](https://github.com/kodacs)
|
|
||||||
* [JMendyk](https://github.com/JMendyk)
|
|
||||||
* [KScl](https://github.com/KScl)
|
|
||||||
* [sterdev](https://github.com/sterdev)
|
|
||||||
* [TheKinrar](https://github.com/TheKinrar)
|
|
||||||
* [AA4ch1](https://github.com/AA4ch1)
|
|
||||||
* [alexgleason](https://github.com/alexgleason)
|
|
||||||
* [cpytel](https://github.com/cpytel)
|
|
||||||
* [northerner](https://github.com/northerner)
|
|
||||||
* [fhemberger](https://github.com/fhemberger)
|
|
||||||
* [greysteil](https://github.com/greysteil)
|
|
||||||
* [hensmith](https://github.com/hensmith)
|
|
||||||
* [d6rkaiz](https://github.com/d6rkaiz)
|
|
||||||
* [Reverite](https://github.com/Reverite)
|
|
||||||
* [JohnD28](https://github.com/JohnD28)
|
|
||||||
* [znz](https://github.com/znz)
|
|
||||||
* [marek-lach](https://github.com/marek-lach)
|
|
||||||
* [Naouak](https://github.com/Naouak)
|
|
||||||
* [pawelngei](https://github.com/pawelngei)
|
|
||||||
* [rtucker](https://github.com/rtucker)
|
|
||||||
* [reneklacan](https://github.com/reneklacan)
|
|
||||||
* [ekiru](https://github.com/ekiru)
|
|
||||||
* [noellabo](https://github.com/noellabo)
|
|
||||||
* [tcitworld](https://github.com/tcitworld)
|
|
||||||
* [geta6](https://github.com/geta6)
|
|
||||||
* [happycoloredbanana](https://github.com/happycoloredbanana)
|
|
||||||
* [leopku](https://github.com/leopku)
|
|
||||||
* [SansPseudoFix](https://github.com/SansPseudoFix)
|
|
||||||
* [tomfhowe](https://github.com/tomfhowe)
|
|
||||||
* [noraworld](https://github.com/noraworld)
|
|
||||||
* [theboss](https://github.com/theboss)
|
|
||||||
* [178inaba](https://github.com/178inaba)
|
|
||||||
* [alyssais](https://github.com/alyssais)
|
|
||||||
* [hiphref](https://github.com/hiphref)
|
|
||||||
* [stalker314314](https://github.com/stalker314314)
|
|
||||||
* [huertanix](https://github.com/huertanix)
|
|
||||||
* [genesixx](https://github.com/genesixx)
|
|
||||||
* [halkeye](https://github.com/halkeye)
|
|
||||||
* [treby](https://github.com/treby)
|
|
||||||
* [jpdevries](https://github.com/jpdevries)
|
|
||||||
* [gdpelican](https://github.com/gdpelican)
|
|
||||||
* [kmichl](https://github.com/kmichl)
|
|
||||||
* [Kurtis Rainbolt-Greene](mailto:me@kurtisrainboltgreene.name)
|
|
||||||
* [saper](https://github.com/saper)
|
|
||||||
* [nevillepark](https://github.com/nevillepark)
|
|
||||||
* [ornithocoder](https://github.com/ornithocoder)
|
|
||||||
* [pierreozoux](https://github.com/pierreozoux)
|
|
||||||
* [qguv](https://github.com/qguv)
|
|
||||||
* [Ram Lmn](mailto:ramlmn@users.noreply.github.com)
|
|
||||||
* [sascha-sl](https://github.com/sascha-sl)
|
|
||||||
* [harukasan](https://github.com/harukasan)
|
|
||||||
* [stamak](https://github.com/stamak)
|
|
||||||
* [Technowix](mailto:technowix@users.noreply.github.com)
|
|
||||||
* [Zoeille](https://github.com/Zoeille)
|
|
||||||
* [Thor Harald Johansen](mailto:thj@thj.no)
|
|
||||||
* [0x70b1a5](https://github.com/0x70b1a5)
|
|
||||||
* [gled-rs](https://github.com/gled-rs)
|
|
||||||
* [Valentin_NC](mailto:valentin.ouvrard@nautile.sarl)
|
|
||||||
* [R0ckweb](https://github.com/R0ckweb)
|
|
||||||
* [caasi](https://github.com/caasi)
|
|
||||||
* [chr-1x](https://github.com/chr-1x)
|
|
||||||
* [esetomo](https://github.com/esetomo)
|
|
||||||
* [foxiehkins](https://github.com/foxiehkins)
|
|
||||||
* [hoodie](mailto:hoodiekitten@outlook.com)
|
|
||||||
* [luzi82](https://github.com/luzi82)
|
|
||||||
* [duxovni](https://github.com/duxovni)
|
|
||||||
* [tmm576](https://github.com/tmm576)
|
|
||||||
* [unsmell](https://github.com/unsmell)
|
|
||||||
* [valerauko](https://github.com/valerauko)
|
|
||||||
* [chriswmartin](https://github.com/chriswmartin)
|
|
||||||
* [vahnj](https://github.com/vahnj)
|
|
||||||
* [ikuradon](https://github.com/ikuradon)
|
|
||||||
* [AndreLewin](https://github.com/AndreLewin)
|
|
||||||
* [0xflotus](https://github.com/0xflotus)
|
|
||||||
* [redtachyons](https://github.com/redtachyons)
|
|
||||||
* [thurloat](https://github.com/thurloat)
|
|
||||||
* [aaribaud](https://github.com/aaribaud)
|
|
||||||
* [pointlessone](https://github.com/pointlessone)
|
|
||||||
* [Andrew](mailto:andrewlchronister@gmail.com)
|
|
||||||
* [estuans](https://github.com/estuans)
|
|
||||||
* [dissolve](https://github.com/dissolve)
|
|
||||||
* [PurpleBooth](https://github.com/PurpleBooth)
|
|
||||||
* [bradurani](https://github.com/bradurani)
|
|
||||||
* [wavebeem](https://github.com/wavebeem)
|
|
||||||
* [bruwalfas](https://github.com/bruwalfas)
|
|
||||||
* [foxsan48](https://github.com/foxsan48)
|
|
||||||
* [wchristian](https://github.com/wchristian)
|
|
||||||
* [muffinista](https://github.com/muffinista)
|
|
||||||
* [cdutson](https://github.com/cdutson)
|
|
||||||
* [farlistener](https://github.com/farlistener)
|
|
||||||
* [DavidLibeau](https://github.com/DavidLibeau)
|
|
||||||
* [ddevault](https://github.com/ddevault)
|
|
||||||
* [Fjoerfoks](https://github.com/Fjoerfoks)
|
|
||||||
* [fmauNeko](https://github.com/fmauNeko)
|
|
||||||
* [gloaec](https://github.com/gloaec)
|
|
||||||
* [Gomasy](https://github.com/Gomasy)
|
|
||||||
* [unstabler](https://github.com/unstabler)
|
|
||||||
* [potato4d](https://github.com/potato4d)
|
|
||||||
* [h-izumi](https://github.com/h-izumi)
|
|
||||||
* [ErikXXon](https://github.com/ErikXXon)
|
|
||||||
* [ian-kelling](https://github.com/ian-kelling)
|
|
||||||
* [immae](https://github.com/immae)
|
|
||||||
* [J0WI](https://github.com/J0WI)
|
|
||||||
* [foozmeat](https://github.com/foozmeat)
|
|
||||||
* [jasonrhodes](https://github.com/jasonrhodes)
|
|
||||||
* [Jason Snell](mailto:jason@newrelic.com)
|
|
||||||
* [jviide](https://github.com/jviide)
|
|
||||||
* [YuleZ](https://github.com/YuleZ)
|
|
||||||
* [crakaC](https://github.com/crakaC)
|
|
||||||
* [tkbky](https://github.com/tkbky)
|
|
||||||
* [Kaylee](mailto:kaylee@codethat.sucks)
|
|
||||||
* [Kazhnuz](https://github.com/Kazhnuz)
|
|
||||||
* [connyduck](https://github.com/connyduck)
|
|
||||||
* [Lindsey Bieda](mailto:lindseyb@users.noreply.github.com)
|
|
||||||
* [Lorenz Diener](mailto:halcyon@icosahedron.website)
|
|
||||||
* [alimony](https://github.com/alimony)
|
|
||||||
* [mig5](https://github.com/mig5)
|
|
||||||
* [moritzheiber](https://github.com/moritzheiber)
|
|
||||||
* [ndarville](https://github.com/ndarville)
|
|
||||||
* [Abzol](https://github.com/Abzol)
|
|
||||||
* [pwoolcoc](https://github.com/pwoolcoc)
|
|
||||||
* [xPaw](https://github.com/xPaw)
|
|
||||||
* [petzah](https://github.com/petzah)
|
|
||||||
* [ignisf](https://github.com/ignisf)
|
|
||||||
* [raymestalez](https://github.com/raymestalez)
|
|
||||||
* [remram44](https://github.com/remram44)
|
|
||||||
* [sts10](https://github.com/sts10)
|
|
||||||
* [u1-liquid](https://github.com/u1-liquid)
|
|
||||||
* [sim6](https://github.com/sim6)
|
|
||||||
* [Sir-Boops](https://github.com/Sir-Boops)
|
|
||||||
* [stemid](https://github.com/stemid)
|
|
||||||
* [sumdog](https://github.com/sumdog)
|
|
||||||
* [ThomasLeister](https://github.com/ThomasLeister)
|
|
||||||
* [mcat-ee](https://github.com/mcat-ee)
|
|
||||||
* [tototoshi](https://github.com/tototoshi)
|
|
||||||
* [TrashMacNugget](https://github.com/TrashMacNugget)
|
|
||||||
* [VirtuBox](https://github.com/VirtuBox)
|
|
||||||
* [Vladyslav](mailto:vaden@tuta.io)
|
|
||||||
* [kaniini](https://github.com/kaniini)
|
|
||||||
* [vayan](https://github.com/vayan)
|
|
||||||
* [yannicka](https://github.com/yannicka)
|
|
||||||
* [ikasoumen](https://github.com/ikasoumen)
|
|
||||||
* [zacanger](https://github.com/zacanger)
|
|
||||||
* [amazedkoumei](https://github.com/amazedkoumei)
|
|
||||||
* [anon5r](https://github.com/anon5r)
|
|
||||||
* [aus-social](https://github.com/aus-social)
|
|
||||||
* [imbsky](https://github.com/imbsky)
|
|
||||||
* [bsky](mailto:me@imbsky.net)
|
|
||||||
* [codl](https://github.com/codl)
|
|
||||||
* [cpsdqs](https://github.com/cpsdqs)
|
|
||||||
* [barzamin](https://github.com/barzamin)
|
|
||||||
* [fhalna](https://github.com/fhalna)
|
|
||||||
* [haoyayoi](https://github.com/haoyayoi)
|
|
||||||
* [ik11235](https://github.com/ik11235)
|
|
||||||
* [kawax](https://github.com/kawax)
|
|
||||||
* [007lva](https://github.com/007lva)
|
|
||||||
* [mbajur](https://github.com/mbajur)
|
|
||||||
* [matsurai25](https://github.com/matsurai25)
|
|
||||||
* [mecab](https://github.com/mecab)
|
|
||||||
* [nicobz25](https://github.com/nicobz25)
|
|
||||||
* [oliverkeeble](https://github.com/oliverkeeble)
|
|
||||||
* [pinfort](https://github.com/pinfort)
|
|
||||||
* [rbaumert](https://github.com/rbaumert)
|
|
||||||
* [rhoio](https://github.com/rhoio)
|
|
||||||
* [usagi-f](https://github.com/usagi-f)
|
|
||||||
* [vidarlee](https://github.com/vidarlee)
|
|
||||||
* [vjackson725](https://github.com/vjackson725)
|
|
||||||
* [wxcafe](https://github.com/wxcafe)
|
|
||||||
* [新都心(Neet Shin)](mailto:nucx@dio-vox.com)
|
|
||||||
* [cygnan](https://github.com/cygnan)
|
|
||||||
* [Awea](https://github.com/Awea)
|
|
||||||
* [halcy](https://github.com/halcy)
|
|
||||||
* [naaaaaaaaaaaf](https://github.com/naaaaaaaaaaaf)
|
|
||||||
* [8398a7](https://github.com/8398a7)
|
|
||||||
* [857b](https://github.com/857b)
|
|
||||||
* [insom](https://github.com/insom)
|
|
||||||
* [tachyons](https://github.com/tachyons)
|
|
||||||
* [acid-chicken](https://github.com/acid-chicken)
|
|
||||||
* [Esteth](https://github.com/Esteth)
|
|
||||||
* [unascribed](https://github.com/unascribed)
|
|
||||||
* [Aguay-val](https://github.com/Aguay-val)
|
|
||||||
* [Akihiko Odaki](mailto:nekomanma@pixiv.co.jp)
|
|
||||||
* [knu](https://github.com/knu)
|
|
||||||
* [h3poteto](https://github.com/h3poteto)
|
|
||||||
* [unleashed](https://github.com/unleashed)
|
|
||||||
* [alxrcs](https://github.com/alxrcs)
|
|
||||||
* [console-cowboy](https://github.com/console-cowboy)
|
|
||||||
* [Alkarex](https://github.com/Alkarex)
|
|
||||||
* [a2](https://github.com/a2)
|
|
||||||
* [0xa](https://github.com/0xa)
|
|
||||||
* [palindromordnilap](https://github.com/palindromordnilap)
|
|
||||||
* [virtualpain](https://github.com/virtualpain)
|
|
||||||
* [sapphirus](https://github.com/sapphirus)
|
|
||||||
* [amandavisconti](https://github.com/amandavisconti)
|
|
||||||
* [ameliavoncat](https://github.com/ameliavoncat)
|
|
||||||
* [ilpianista](https://github.com/ilpianista)
|
|
||||||
* [Andreas Drop](mailto:andy@remline.de)
|
|
||||||
* [andi1984](https://github.com/andi1984)
|
|
||||||
* [schas002](https://github.com/schas002)
|
|
||||||
* [contraexemplo](https://github.com/contraexemplo)
|
|
||||||
* [abackstrom](https://github.com/abackstrom)
|
|
||||||
* [armandfardeau](https://github.com/armandfardeau)
|
|
||||||
* [jumbosushi](https://github.com/jumbosushi)
|
|
||||||
* [aurelien-reeves](https://github.com/aurelien-reeves)
|
|
||||||
* [ayumin](https://github.com/ayumin)
|
|
||||||
* [BaptisteGelez](https://github.com/BaptisteGelez)
|
|
||||||
* [bzg](https://github.com/bzg)
|
|
||||||
* [benediktg](https://github.com/benediktg)
|
|
||||||
* [blakebarnett](https://github.com/blakebarnett)
|
|
||||||
* [bradj](https://github.com/bradj)
|
|
||||||
* [brycied00d](https://github.com/brycied00d)
|
|
||||||
* [carlosjs23](https://github.com/carlosjs23)
|
|
||||||
* [cgxxx](https://github.com/cgxxx)
|
|
||||||
* [kibitan](https://github.com/kibitan)
|
|
||||||
* [chrisheninger](https://github.com/chrisheninger)
|
|
||||||
* [chris-martin](https://github.com/chris-martin)
|
|
||||||
* [DoubleMalt](https://github.com/DoubleMalt)
|
|
||||||
* [Moosh-be](https://github.com/Moosh-be)
|
|
||||||
* [Motoma](https://github.com/Motoma)
|
|
||||||
* [chriswk](https://github.com/chriswk)
|
|
||||||
* [csu](https://github.com/csu)
|
|
||||||
* [clarfon](https://github.com/clarfon)
|
|
||||||
* [kklleemm](https://github.com/kklleemm)
|
|
||||||
* [colindean](https://github.com/colindean)
|
|
||||||
* [dachinat](https://github.com/dachinat)
|
|
||||||
* [multiple-creatures](https://github.com/multiple-creatures)
|
|
||||||
* [watilde](https://github.com/watilde)
|
|
||||||
* [daprice](https://github.com/daprice)
|
|
||||||
* [dar5hak](https://github.com/dar5hak)
|
|
||||||
* [kant](https://github.com/kant)
|
|
||||||
* [maxolasersquad](https://github.com/maxolasersquad)
|
|
||||||
* [singingwolfboy](https://github.com/singingwolfboy)
|
|
||||||
* [davidcelis](https://github.com/davidcelis)
|
|
||||||
* [davefp](https://github.com/davefp)
|
|
||||||
* [yipdw](https://github.com/yipdw)
|
|
||||||
* [debanshuk](https://github.com/debanshuk)
|
|
||||||
* [Derek Lewis](mailto:derekcecillewis@gmail.com)
|
|
||||||
* [dblandin](https://github.com/dblandin)
|
|
||||||
* [Drew Gates](mailto:aranaur@users.noreply.github.com)
|
|
||||||
* [dtschust](https://github.com/dtschust)
|
|
||||||
* [Dryusdan](https://github.com/Dryusdan)
|
|
||||||
* [eai04191](https://github.com/eai04191)
|
|
||||||
* [d3vgru](https://github.com/d3vgru)
|
|
||||||
* [Elizafox](https://github.com/Elizafox)
|
|
||||||
* [enewhuis](https://github.com/enewhuis)
|
|
||||||
* [ericblade](https://github.com/ericblade)
|
|
||||||
* [mikoim](https://github.com/mikoim)
|
|
||||||
* [espenronnevik](https://github.com/espenronnevik)
|
|
||||||
* [Finariel](https://github.com/Finariel)
|
|
||||||
* [siuying](https://github.com/siuying)
|
|
||||||
* [zoc](https://github.com/zoc)
|
|
||||||
* [fwenzel](https://github.com/fwenzel)
|
|
||||||
* [GenbuHase](https://github.com/GenbuHase)
|
|
||||||
* [hattori6789](https://github.com/hattori6789)
|
|
||||||
* [algernon](https://github.com/algernon)
|
|
||||||
* [Fastbyte01](https://github.com/Fastbyte01)
|
|
||||||
* [myfreeweb](https://github.com/myfreeweb)
|
|
||||||
* [gfaivre](https://github.com/gfaivre)
|
|
||||||
* [Fiaxhs](https://github.com/Fiaxhs)
|
|
||||||
* [reedcourty](https://github.com/reedcourty)
|
|
||||||
* [anneau](https://github.com/anneau)
|
|
||||||
* [lanodan](https://github.com/lanodan)
|
|
||||||
* [Harmon758](https://github.com/Harmon758)
|
|
||||||
* [HellPie](https://github.com/HellPie)
|
|
||||||
* [Habu-Kagumba](https://github.com/Habu-Kagumba)
|
|
||||||
* [suzukaze](https://github.com/suzukaze)
|
|
||||||
* [Hiromi-Kai](https://github.com/Hiromi-Kai)
|
|
||||||
* [hishamhm](https://github.com/hishamhm)
|
|
||||||
* [musashino205](https://github.com/musashino205)
|
|
||||||
* [iwaim](https://github.com/iwaim)
|
|
||||||
* [valrus](https://github.com/valrus)
|
|
||||||
* [IMcD23](https://github.com/IMcD23)
|
|
||||||
* [yi0713](https://github.com/yi0713)
|
|
||||||
* [iblech](https://github.com/iblech)
|
|
||||||
* [usbsnowcrash](https://github.com/usbsnowcrash)
|
|
||||||
* [jack-michaud](https://github.com/jack-michaud)
|
|
||||||
* [Floppy](https://github.com/Floppy)
|
|
||||||
* [loomchild](https://github.com/loomchild)
|
|
||||||
* [jenkr55](https://github.com/jenkr55)
|
|
||||||
* [press5](https://github.com/press5)
|
|
||||||
* [TrollDecker](https://github.com/TrollDecker)
|
|
||||||
* [jmontane](https://github.com/jmontane)
|
|
||||||
* [jonathanklee](https://github.com/jonathanklee)
|
|
||||||
* [jguerder](https://github.com/jguerder)
|
|
||||||
* [Jehops](https://github.com/Jehops)
|
|
||||||
* [joshuap](https://github.com/joshuap)
|
|
||||||
* [Tiwy57](https://github.com/Tiwy57)
|
|
||||||
* [xuv](https://github.com/xuv)
|
|
||||||
* [June Sallou](mailto:jnsll@users.noreply.github.com)
|
|
||||||
* [j0k3r](https://github.com/j0k3r)
|
|
||||||
* [KEINOS](https://github.com/KEINOS)
|
|
||||||
* [futoase](https://github.com/futoase)
|
|
||||||
* [Pneumaticat](https://github.com/Pneumaticat)
|
|
||||||
* [Kit Redgrave](mailto:qwertyitis@gmail.com)
|
|
||||||
* [Knut Erik](mailto:abjectio@users.noreply.github.com)
|
|
||||||
* [mkody](https://github.com/mkody)
|
|
||||||
* [k0ta0uchi](https://github.com/k0ta0uchi)
|
|
||||||
* [KrzysiekJ](https://github.com/KrzysiekJ)
|
|
||||||
* [leowzukw](https://github.com/leowzukw)
|
|
||||||
* [Tak](https://github.com/Tak)
|
|
||||||
* [cacheflow](https://github.com/cacheflow)
|
|
||||||
* [ldidry](https://github.com/ldidry)
|
|
||||||
* [jemus42](https://github.com/jemus42)
|
|
||||||
* [lfuelling](https://github.com/lfuelling)
|
|
||||||
* [Grabacr07](https://github.com/Grabacr07)
|
|
||||||
* [mistermantas](https://github.com/mistermantas)
|
|
||||||
* [mareklach](https://github.com/mareklach)
|
|
||||||
* [wirehack7](https://github.com/wirehack7)
|
|
||||||
* [martymcguire](https://github.com/martymcguire)
|
|
||||||
* [marvinkopf](https://github.com/marvinkopf)
|
|
||||||
* [otsune](https://github.com/otsune)
|
|
||||||
* [mbugowski](https://github.com/mbugowski)
|
|
||||||
* [Mathias B](mailto:10813340+mathias-b@users.noreply.github.com)
|
|
||||||
* [matt-auckland](https://github.com/matt-auckland)
|
|
||||||
* [webroo](https://github.com/webroo)
|
|
||||||
* [matthiasbeyer](https://github.com/matthiasbeyer)
|
|
||||||
* [mattjmattj](https://github.com/mattjmattj)
|
|
||||||
* [mtparet](https://github.com/mtparet)
|
|
||||||
* [maximeborges](https://github.com/maximeborges)
|
|
||||||
* [minacle](https://github.com/minacle)
|
|
||||||
* [michaeljdeeb](https://github.com/michaeljdeeb)
|
|
||||||
* [Themimitoof](https://github.com/Themimitoof)
|
|
||||||
* [cyweo](https://github.com/cyweo)
|
|
||||||
* [Midgard](mailto:m1dgard@users.noreply.github.com)
|
|
||||||
* [mike-burns](https://github.com/mike-burns)
|
|
||||||
* [verymilan](https://github.com/verymilan)
|
|
||||||
* [milmazz](https://github.com/milmazz)
|
|
||||||
* [premist](https://github.com/premist)
|
|
||||||
* [Mnkai](https://github.com/Mnkai)
|
|
||||||
* [mitchhentges](https://github.com/mitchhentges)
|
|
||||||
* [mouse-reeve](https://github.com/mouse-reeve)
|
|
||||||
* [Mozinet-fr](https://github.com/Mozinet-fr)
|
|
||||||
* [lae](https://github.com/lae)
|
|
||||||
* [nosada](https://github.com/nosada)
|
|
||||||
* [Nanamachi](https://github.com/Nanamachi)
|
|
||||||
* [orinthe](https://github.com/orinthe)
|
|
||||||
* [NecroTechno](https://github.com/NecroTechno)
|
|
||||||
* [Dar13](https://github.com/Dar13)
|
|
||||||
* [ngerakines](https://github.com/ngerakines)
|
|
||||||
* [vonneudeck](https://github.com/vonneudeck)
|
|
||||||
* [Ninetailed](https://github.com/Ninetailed)
|
|
||||||
* [k24](https://github.com/k24)
|
|
||||||
* [noiob](https://github.com/noiob)
|
|
||||||
* [kwaio](https://github.com/kwaio)
|
|
||||||
* [norayr](https://github.com/norayr)
|
|
||||||
* [joyeusenoelle](https://github.com/joyeusenoelle)
|
|
||||||
* [OlivierNicole](https://github.com/OlivierNicole)
|
|
||||||
* [noppa](https://github.com/noppa)
|
|
||||||
* [Otakan951](https://github.com/Otakan951)
|
|
||||||
* [fahy](https://github.com/fahy)
|
|
||||||
* [PatrickRWells](mailto:32802366+patrickrwells@users.noreply.github.com)
|
|
||||||
* [Paul](mailto:naydex.mc+github@gmail.com)
|
|
||||||
* [Pete Keen](mailto:pete@petekeen.net)
|
|
||||||
* [Pierre-Morgan Gate](mailto:pgate@users.noreply.github.com)
|
|
||||||
* [Ratmir Karabut](mailto:rkarabut@sfmodern.ru)
|
|
||||||
* [Reto Kromer](mailto:retokromer@users.noreply.github.com)
|
|
||||||
* [Rey Tucker](mailto:git@reytucker.us)
|
|
||||||
* [Rob Watson](mailto:rfwatson@users.noreply.github.com)
|
|
||||||
* [Ryan Freebern](mailto:ryan@freebern.org)
|
|
||||||
* [Ryan Wade](mailto:ryan.wade@protonmail.com)
|
|
||||||
* [Ryo Kajiwara](mailto:kfe-fecn6.prussian@s01.info)
|
|
||||||
* [S.H](mailto:gamelinks007@gmail.com)
|
|
||||||
* [Sadiq Saif](mailto:staticsafe@users.noreply.github.com)
|
|
||||||
* [Sam Hewitt](mailto:hewittsamuel@gmail.com)
|
|
||||||
* [Satoshi KOJIMA](mailto:skoji@mac.com)
|
|
||||||
* [ScienJus](mailto:i@scienjus.com)
|
|
||||||
* [Scott Larkin](mailto:scott@codeclimate.com)
|
|
||||||
* [Sebastian Hübner](mailto:imolein@users.noreply.github.com)
|
|
||||||
* [Sebastian Morr](mailto:sebastian@morr.cc)
|
|
||||||
* [Sergei Č](mailto:noiwex1911@gmail.com)
|
|
||||||
* [Setuu](mailto:yuki764setuu@gmail.com)
|
|
||||||
* [Shaun Gillies](mailto:me@shaungillies.net)
|
|
||||||
* [Shin Adachi](mailto:shn@glucose.jp)
|
|
||||||
* [Shin Kojima](mailto:shin@kojima.org)
|
|
||||||
* [Sho Kusano](mailto:rosylilly@aduca.org)
|
|
||||||
* [Shouko Yu](mailto:imshouko@gmail.com)
|
|
||||||
* [Sina Mashek](mailto:sina@mashek.xyz)
|
|
||||||
* [Soshi Kato](mailto:mail@sossii.com)
|
|
||||||
* [Spanky](mailto:2788886+spankyworks@users.noreply.github.com)
|
|
||||||
* [Stanislas](mailto:angristan@pm.me)
|
|
||||||
* [StefOfficiel](mailto:pichard.stephane@free.fr)
|
|
||||||
* [Steven Tappert](mailto:admin@dark-it.net)
|
|
||||||
* [Svetlozar Todorov](mailto:svetlik@users.noreply.github.com)
|
|
||||||
* [Sébastien Santoro](mailto:dereckson@espace-win.org)
|
|
||||||
* [Tad Thorley](mailto:phaedryx@users.noreply.github.com)
|
|
||||||
* [Takayoshi Nishida](mailto:takayoshi.nishida@gmail.com)
|
|
||||||
* [Takayuki KUSANO](mailto:github@tkusano.jp)
|
|
||||||
* [TakesxiSximada](mailto:takesxi.sximada@gmail.com)
|
|
||||||
* [TheInventrix](mailto:theinventrix@users.noreply.github.com)
|
|
||||||
* [Thomas Alberola](mailto:thomas@needacoffee.fr)
|
|
||||||
* [Toby Deshane](mailto:fortyseven@users.noreply.github.com)
|
|
||||||
* [Toby Pinder](mailto:gigitrix@gmail.com)
|
|
||||||
* [Tomonori Murakami](mailto:crosslife777@gmail.com)
|
|
||||||
* [TomoyaShibata](mailto:wind.of.hometown@gmail.com)
|
|
||||||
* [Treyssat-Vincent Nino](mailto:treyssatvincent@users.noreply.github.com)
|
|
||||||
* [Udo Kramer](mailto:optik@fluffel.io)
|
|
||||||
* [Una](mailto:una@unascribed.com)
|
|
||||||
* [Ushitora Anqou](mailto:ushitora_anqou@yahoo.co.jp)
|
|
||||||
* [Valentin Lorentz](mailto:progval+git@progval.net)
|
|
||||||
* [Vladimir Mincev](mailto:vladimir@canicinteractive.com)
|
|
||||||
* [Waldir Pimenta](mailto:waldyrious@gmail.com)
|
|
||||||
* [Wesley Ellis](mailto:tahnok@gmail.com)
|
|
||||||
* [Wiktor](mailto:wiktor@metacode.biz)
|
|
||||||
* [Wonderfall](mailto:wonderfall@schrodinger.io)
|
|
||||||
* [YDrogen](mailto:ydrogen45@gmail.com)
|
|
||||||
* [YMHuang](mailto:ymhuang@fmbase.tw)
|
|
||||||
* [YOSHIOKA Eiichiro](mailto:yoshioka.eiichiro@gmail.com)
|
|
||||||
* [YOU](mailto:stackexchange.you@gmail.com)
|
|
||||||
* [YaQ](mailto:i_k_o_m_a_7@yahoo.co.jp)
|
|
||||||
* [Yanaken](mailto:yanakend@gmail.com)
|
|
||||||
* [Yann Klis](mailto:yann.klis@gmail.com)
|
|
||||||
* [Yeechan Lu](mailto:wz.bluesnow@gmail.com)
|
|
||||||
* [Yusuke Abe](mailto:moonset20@gmail.com)
|
|
||||||
* [Zachary Spector](mailto:logicaldash@gmail.com)
|
|
||||||
* [ZiiX](mailto:ziix@users.noreply.github.com)
|
|
||||||
* [asria-jp](mailto:is@alicematic.com)
|
|
||||||
* [ava](mailto:vladooku@users.noreply.github.com)
|
|
||||||
* [benklop](mailto:benklop@gmail.com)
|
|
||||||
* [bsky](mailto:git@imbsky.net)
|
|
||||||
* [caesarologia](mailto:lopesgemelli.1@gmail.com)
|
|
||||||
* [cbayerlein](mailto:c.bayerlein@gmail.com)
|
|
||||||
* [chrolis](mailto:chrolis@users.noreply.github.com)
|
|
||||||
* [cormo](mailto:cormorant2+github@gmail.com)
|
|
||||||
* [d0p1](mailto:dopi-sama@hush.com)
|
|
||||||
* [evilny0](mailto:evilny0@moomoocamp.net)
|
|
||||||
* [febrezo](mailto:felixbrezo@gmail.com)
|
|
||||||
* [fsubal](mailto:fsubal@users.noreply.github.com)
|
|
||||||
* [fusshi-](mailto:dikky1218@users.noreply.github.com)
|
|
||||||
* [gentaro](mailto:gentaroooo@gmail.com)
|
|
||||||
* [gol-cha](mailto:info@mevo.xyz)
|
|
||||||
* [hakoai](mailto:hk--76@qa2.so-net.ne.jp)
|
|
||||||
* [haosbvnker](mailto:github@chaosbunker.com)
|
|
||||||
* [isati](mailto:phil@juchnowi.cz)
|
|
||||||
* [jacob](mailto:jacobherringtondeveloper@gmail.com)
|
|
||||||
* [jenn kaplan](mailto:me@jkap.io)
|
|
||||||
* [jirayudech](mailto:jirayudech@gmail.com)
|
|
||||||
* [jomo](mailto:github@jomo.tv)
|
|
||||||
* [jooops](mailto:joops@autistici.org)
|
|
||||||
* [jukper](mailto:jukkaperanto@gmail.com)
|
|
||||||
* [jumoru](mailto:jumoru@mailbox.org)
|
|
||||||
* [karlyeurl](mailto:karl.yeurl@gmail.com)
|
|
||||||
* [kedama](mailto:32974885+kedamadq@users.noreply.github.com)
|
|
||||||
* [kodai](mailto:shirafuta.kodai@gmail.com)
|
|
||||||
* [koyu](mailto:me@koyu.space)
|
|
||||||
* [kuro5hin](mailto:rusty@kuro5hin.org)
|
|
||||||
* [luzpaz](mailto:luzpaz@users.noreply.github.com)
|
|
||||||
* [maxypy](mailto:maxime@mpigou.fr)
|
|
||||||
* [mhe](mailto:mail@marcus-herrmann.com)
|
|
||||||
* [mike castleman](mailto:m@mlcastle.net)
|
|
||||||
* [mimikun](mailto:dzdzble_effort_311@outlook.jp)
|
|
||||||
* [mohemohe](mailto:mohemohe@users.noreply.github.com)
|
|
||||||
* [mshrtkch](mailto:mshrtkch@users.noreply.github.com)
|
|
||||||
* [muan](mailto:muan@github.com)
|
|
||||||
* [namelessGonbai](mailto:43787036+namelessgonbai@users.noreply.github.com)
|
|
||||||
* [neetshin](mailto:neetshin@neetsh.in)
|
|
||||||
* [rch850](mailto:rich850@gmail.com)
|
|
||||||
* [roikale](mailto:roikale@users.noreply.github.com)
|
|
||||||
* [rysiekpl](mailto:rysiek@hackerspace.pl)
|
|
||||||
* [saturday06](mailto:dyob@lunaport.net)
|
|
||||||
* [scriptjunkie](mailto:scriptjunkie@scriptjunkie.us)
|
|
||||||
* [seekr](mailto:mario.drs@gmail.com)
|
|
||||||
* [sundevour](mailto:31990469+sundevour@users.noreply.github.com)
|
|
||||||
* [syui](mailto:syui@users.noreply.github.com)
|
|
||||||
* [tackeyy](mailto:mailto.takita.yusuke@gmail.com)
|
|
||||||
* [tateisu](mailto:tateisu@gmail.com)
|
|
||||||
* [tmyt](mailto:shigure@refy.net)
|
|
||||||
* [trevDev()](mailto:trev@trevdev.ca)
|
|
||||||
* [utam0k](mailto:k0ma@utam0k.jp)
|
|
||||||
* [vpzomtrrfrt](mailto:vpzomtrrfrt@gmail.com)
|
|
||||||
* [walfie](mailto:walfington@gmail.com)
|
|
||||||
* [y-temp4](mailto:y.temp4@gmail.com)
|
|
||||||
* [ymmtmdk](mailto:ymmtmdk@gmail.com)
|
|
||||||
* [yoshipc](mailto:yoooo@yoshipc.net)
|
|
||||||
* [Özcan Zafer AYAN](mailto:ozcanzaferayan@gmail.com)
|
|
||||||
* [ばん](mailto:detteiu0321@gmail.com)
|
|
||||||
* [みたらしだんご](mailto:mitarashidango@users.noreply.github.com)
|
|
||||||
* [りんすき](mailto:6533808+rinsuki@users.noreply.github.com)
|
|
||||||
* [ヨイツの賢狼ホロ | 3rd style](mailto:horo@yoitsu.moe)
|
|
||||||
* [猫吸血鬼ディフリス / 猫ロキP](mailto:deflis@gmail.com)
|
|
||||||
* [艮 鮟鱇](mailto:ushitora_anqou@yahoo.co.jp)
|
|
||||||
* [西小倉宏信](mailto:nishiko@mindia.jp)
|
|
||||||
* [雨宮美羽](mailto:k737566@gmail.com)
|
|
||||||
|
|
||||||
This document is provided for informational purposes only. Since it is only updated once per release, the version you are looking at may be currently out of date. To see the full list of contributors, consider looking at the [git history](https://github.com/tootsuite/mastodon/graphs/contributors) instead.
|
|
||||||
|
|
||||||
## Translators
|
|
||||||
|
|
||||||
Following people have contributed to translation of Mastodon:
|
|
||||||
|
|
||||||
- **Albanian**
|
|
||||||
- Besnik Bleta
|
|
||||||
- Aditoo
|
|
||||||
- **Arabic**
|
|
||||||
- ButterflyOfFire
|
|
||||||
- Aditoo
|
|
||||||
- Amrz0
|
|
||||||
- **Asturian**
|
|
||||||
- ButterflyOfFire
|
|
||||||
- Enol P.
|
|
||||||
- Aditoo
|
|
||||||
- **Basque**
|
|
||||||
- Osoitz
|
|
||||||
- Aditoo
|
|
||||||
- Aitzol
|
|
||||||
- ButterflyOfFire
|
|
||||||
- Peru Iparragirre
|
|
||||||
- Gorka Azkarate
|
|
||||||
- **Bengali**
|
|
||||||
- dxwc
|
|
||||||
- **Bulgarian**
|
|
||||||
- ButterflyOfFire
|
|
||||||
- Aditoo
|
|
||||||
- **Catalan**
|
|
||||||
- spla
|
|
||||||
- Aditoo
|
|
||||||
- ButterflyOfFire
|
|
||||||
- Joan Montané
|
|
||||||
- Jose Luis
|
|
||||||
- **Chinese (Hong Kong)**
|
|
||||||
- ButterflyOfFire
|
|
||||||
- Luzi Leung
|
|
||||||
- Aditoo
|
|
||||||
- **Chinese (Simplified)**
|
|
||||||
- Allen Zhong
|
|
||||||
- ButterflyOfFire
|
|
||||||
- SerCom_KC
|
|
||||||
- martialarts
|
|
||||||
- Kaitian Xie
|
|
||||||
- Aditoo
|
|
||||||
- pan93412
|
|
||||||
- **Chinese (Traditional)**
|
|
||||||
- Aditoo
|
|
||||||
- ButterflyOfFire
|
|
||||||
- James58899
|
|
||||||
- pan93412
|
|
||||||
- S1ttidoe477
|
|
||||||
- SHA265
|
|
||||||
- Jeff Huang
|
|
||||||
- **Corsican**
|
|
||||||
- Alix D. R.
|
|
||||||
- Aditoo
|
|
||||||
- ButterflyOfFire
|
|
||||||
- **Croatian**
|
|
||||||
- ButterflyOfFire
|
|
||||||
- Aditoo
|
|
||||||
- **Czech**
|
|
||||||
- Aditoo
|
|
||||||
- Marek Ľach
|
|
||||||
- ButterflyOfFire
|
|
||||||
- **Danish**
|
|
||||||
- Einhjeriar
|
|
||||||
- Rasmus Sæderup
|
|
||||||
- Aditoo
|
|
||||||
- ButterflyOfFire
|
|
||||||
- **Dutch**
|
|
||||||
- Albakham
|
|
||||||
- ButterflyOfFire
|
|
||||||
- jeroenpraat
|
|
||||||
- rscmbbng
|
|
||||||
- Aditoo
|
|
||||||
- Jelv
|
|
||||||
- **English**
|
|
||||||
- ButterflyOfFire
|
|
||||||
- Renato "Lond" Cerqueira
|
|
||||||
- **English (United Kingdom)**
|
|
||||||
- Albakham
|
|
||||||
- **Esperanto**
|
|
||||||
- Aditoo
|
|
||||||
- ButterflyOfFire
|
|
||||||
- Becci Cat
|
|
||||||
- Jeong Arm
|
|
||||||
- Mélanie Chauvel
|
|
||||||
- Vanege
|
|
||||||
- Martin Bodin
|
|
||||||
- tuxayo/Victor Grousset
|
|
||||||
- **Finnish**
|
|
||||||
- ButterflyOfFire
|
|
||||||
- Mikko Poussu
|
|
||||||
- Taru Luojola
|
|
||||||
- S Heija
|
|
||||||
- Aditoo
|
|
||||||
- Jonne Arjoranta
|
|
||||||
- **French**
|
|
||||||
- Albakham
|
|
||||||
- Alix D. R.
|
|
||||||
- ButterflyOfFire
|
|
||||||
- codl
|
|
||||||
- Leia
|
|
||||||
- Alda Marteau-Hardi
|
|
||||||
- Mélanie Chauvel
|
|
||||||
- Paul Marques Mota
|
|
||||||
- azenet
|
|
||||||
- Olivier Humbert
|
|
||||||
- Aditoo
|
|
||||||
- Jonathan Chan
|
|
||||||
- Letiteuf55
|
|
||||||
- Baptiste Jonglez
|
|
||||||
- goofy-mdn
|
|
||||||
- Jean-Baptiste Holcroft
|
|
||||||
- Technowix
|
|
||||||
- Martin Bodin
|
|
||||||
- Théodore
|
|
||||||
- Thibaut Girka
|
|
||||||
- Franck Paul
|
|
||||||
- Sylvhem
|
|
||||||
- **Galician**
|
|
||||||
- ButterflyOfFire
|
|
||||||
- Xose M.
|
|
||||||
- Aditoo
|
|
||||||
- manequim
|
|
||||||
- **Georgian**
|
|
||||||
- ButterflyOfFire
|
|
||||||
- Aditoo
|
|
||||||
- **German**
|
|
||||||
- Aditoo
|
|
||||||
- ButterflyOfFire
|
|
||||||
- Daniel
|
|
||||||
- averageunicorn
|
|
||||||
- Koyu Berteon
|
|
||||||
- larsreineke
|
|
||||||
- koyu
|
|
||||||
- Austin Jones
|
|
||||||
- lilo
|
|
||||||
- Benedikt Geißler
|
|
||||||
- ePirat
|
|
||||||
- Eugen Rochko
|
|
||||||
- Weblate Admin
|
|
||||||
- Patrick Figel
|
|
||||||
- **Greek**
|
|
||||||
- Dimitris Maroulidis
|
|
||||||
- Antonis
|
|
||||||
- Aditoo
|
|
||||||
- ButterflyOfFire
|
|
||||||
- Konstantinos Grevenitis
|
|
||||||
- **Hebrew**
|
|
||||||
- ButterflyOfFire
|
|
||||||
- Aditoo
|
|
||||||
- Ira
|
|
||||||
- Yaron Shahrabani
|
|
||||||
- **Hungarian**
|
|
||||||
- ButterflyOfFire
|
|
||||||
- Adam Paszternak
|
|
||||||
- Aditoo
|
|
||||||
- Tibike Miklós
|
|
||||||
- **Ido**
|
|
||||||
- ButterflyOfFire
|
|
||||||
- Aditoo
|
|
||||||
- **Indonesian**
|
|
||||||
- afachri
|
|
||||||
- ButterflyOfFire
|
|
||||||
- Dito Kurnia Pratama
|
|
||||||
- Eirworks
|
|
||||||
- Aditoo
|
|
||||||
- Alfiana Sibuea
|
|
||||||
- se7entime
|
|
||||||
- **Irish**
|
|
||||||
- Albakham
|
|
||||||
- Kevin Houlihan
|
|
||||||
- **Italian**
|
|
||||||
- Alessandro Levati
|
|
||||||
- Albakham
|
|
||||||
- ButterflyOfFire
|
|
||||||
- Marcin Mikołajczak
|
|
||||||
- Aditoo
|
|
||||||
- Giuseppe Pignataro
|
|
||||||
- Stefano
|
|
||||||
- **Japanese**
|
|
||||||
- Hinaloe
|
|
||||||
- 小鳥遊まりあ
|
|
||||||
- mayaeh
|
|
||||||
- osapon
|
|
||||||
- 森の子リスのミーコの大冒険
|
|
||||||
- Kumasun Morino
|
|
||||||
- Yamagishi Kazutoshi
|
|
||||||
- Aditoo
|
|
||||||
- ButterflyOfFire
|
|
||||||
- Jeong Arm
|
|
||||||
- unarist
|
|
||||||
- **Kazakh**
|
|
||||||
- arshat
|
|
||||||
- Aditoo
|
|
||||||
- **Korean**
|
|
||||||
- Aditoo
|
|
||||||
- Jeong Arm
|
|
||||||
- ButterflyOfFire
|
|
||||||
- Minori Hiraoka
|
|
||||||
- Yamagishi Kazutoshi
|
|
||||||
- **Lithuanian**
|
|
||||||
- Sarunas Medeikis
|
|
||||||
- **Malay**
|
|
||||||
- Muhammad Nur Hidayat (MNH48)
|
|
||||||
- Aditoo
|
|
||||||
- ButterflyOfFire
|
|
||||||
- **Norwegian (old code)**
|
|
||||||
- ButterflyOfFire
|
|
||||||
- Espen Rønnevik
|
|
||||||
- Aditoo
|
|
||||||
- Tale
|
|
||||||
- **Occitan**
|
|
||||||
- Aditoo
|
|
||||||
- ButterflyOfFire
|
|
||||||
- Quenti2
|
|
||||||
- Quentí
|
|
||||||
- Maxenç
|
|
||||||
- **Persian**
|
|
||||||
- Masoud Abkenar
|
|
||||||
- Aditoo
|
|
||||||
- ButterflyOfFire
|
|
||||||
- **Polish**
|
|
||||||
- Aditoo
|
|
||||||
- Albakham
|
|
||||||
- ButterflyOfFire
|
|
||||||
- Stasiek Michalski
|
|
||||||
- Marcin Mikołajczak
|
|
||||||
- Jakub Mendyk
|
|
||||||
- Marek Ľach
|
|
||||||
- krkk
|
|
||||||
- **Portuguese**
|
|
||||||
- Albakham
|
|
||||||
- João Pinheiro
|
|
||||||
- manequim
|
|
||||||
- Aditoo
|
|
||||||
- ButterflyOfFire
|
|
||||||
- Hugo Gameiro
|
|
||||||
- **Portuguese (Brazil)**
|
|
||||||
- Aditoo
|
|
||||||
- Albakham
|
|
||||||
- Anna e só
|
|
||||||
- Renato "Lond" Cerqueira
|
|
||||||
- André Andrade
|
|
||||||
- ButterflyOfFire
|
|
||||||
- **Romanian**
|
|
||||||
- adrianbblk
|
|
||||||
- ButterflyOfFire
|
|
||||||
- Aditoo
|
|
||||||
- **Russian**
|
|
||||||
- Albakham
|
|
||||||
- ButterflyOfFire
|
|
||||||
- Evgeny Petrov
|
|
||||||
- Aditoo
|
|
||||||
- Павел Гастелло
|
|
||||||
- Andrew Zyabin
|
|
||||||
- Yaron Shahrabani
|
|
||||||
- **Serbian**
|
|
||||||
- Branko Kokanovic
|
|
||||||
- Burekz Finezt
|
|
||||||
- Aditoo
|
|
||||||
- ButterflyOfFire
|
|
||||||
- **Serbian (latin)**
|
|
||||||
- ButterflyOfFire
|
|
||||||
- Aditoo
|
|
||||||
- **Slovak**
|
|
||||||
- Aditoo
|
|
||||||
- ButterflyOfFire
|
|
||||||
- Ivan Pleva
|
|
||||||
- Marek Ľach
|
|
||||||
- Peter
|
|
||||||
- **Slovenian**
|
|
||||||
- Kristijan Tkalec
|
|
||||||
- Aditoo
|
|
||||||
- ButterflyOfFire
|
|
||||||
- **Spanish**
|
|
||||||
- Albakham
|
|
||||||
- ButterflyOfFire
|
|
||||||
- Carlos Mondragon
|
|
||||||
- Antón López
|
|
||||||
- Max Winkler
|
|
||||||
- Pablo de la Concepción Sanz
|
|
||||||
- Sergio Soriano
|
|
||||||
- Angeles Broullón
|
|
||||||
- Lothar Wolf
|
|
||||||
- Aditoo
|
|
||||||
- David Charte
|
|
||||||
- Emmanuel
|
|
||||||
- **Swedish**
|
|
||||||
- ButterflyOfFire
|
|
||||||
- Isak Holmström
|
|
||||||
- Shellkr
|
|
||||||
- Aditoo
|
|
||||||
- Elias Mårtenson
|
|
||||||
- Stefan Midjich
|
|
||||||
- Tim Stahel
|
|
||||||
- Jonas Hultén
|
|
||||||
- **Telugu**
|
|
||||||
- avndp
|
|
||||||
- Ranjith Tellakula
|
|
||||||
- Aditoo
|
|
||||||
- ButterflyOfFire
|
|
||||||
- Joseph Nuthalapati
|
|
||||||
- **Thai**
|
|
||||||
- ButterflyOfFire
|
|
||||||
- parnikkapore
|
|
||||||
- Thai Localization
|
|
||||||
- Aditoo
|
|
||||||
- **Turkish**
|
|
||||||
- Ali Demirtas
|
|
||||||
- ButterflyOfFire
|
|
||||||
- Aditoo
|
|
||||||
- **Ukrainian**
|
|
||||||
- alexcleac
|
|
||||||
- ButterflyOfFire
|
|
||||||
- Aditoo
|
|
||||||
- Ivan Verchenko
|
|
||||||
- **Welsh**
|
|
||||||
- carl morris
|
|
||||||
- Jaz-Michael King
|
|
||||||
- Owain Rhys Lewis
|
|
||||||
- Rhoslyn Prys
|
|
||||||
- Aditoo
|
|
||||||
- ButterflyOfFire
|
|
||||||
- Renato "Lond" Cerqueira
|
|
||||||
- Albakham
|
|
||||||
- Kevin Beynon
|
|
||||||
- **Armenian**
|
|
||||||
- Aditoo
|
|
||||||
- ButterflyOfFire
|
|
||||||
- **Latvian**
|
|
||||||
- Aditoo
|
|
||||||
- ButterflyOfFire
|
|
||||||
- Maigonis
|
|
||||||
- **Tamil**
|
|
||||||
- Aditoo
|
|
||||||
- ButterflyOfFire
|
|
||||||
- Prasanna Venkadesh
|
|
29
Aptfile
@@ -1,29 +0,0 @@
|
|||||||
ffmpeg
|
|
||||||
libicu[0-9][0-9]
|
|
||||||
libicu-dev
|
|
||||||
libidn11
|
|
||||||
libidn11-dev
|
|
||||||
libpq-dev
|
|
||||||
libprotobuf-dev
|
|
||||||
libssl-dev
|
|
||||||
libxdamage1
|
|
||||||
libxfixes3
|
|
||||||
protobuf-compiler
|
|
||||||
zlib1g-dev
|
|
||||||
libcairo2
|
|
||||||
libcroco3
|
|
||||||
libdatrie1
|
|
||||||
libgdk-pixbuf2.0-0
|
|
||||||
libgraphite2-3
|
|
||||||
libharfbuzz0b
|
|
||||||
libpango-1.0-0
|
|
||||||
libpangocairo-1.0-0
|
|
||||||
libpangoft2-1.0-0
|
|
||||||
libpixman-1-0
|
|
||||||
librsvg2-2
|
|
||||||
libthai-data
|
|
||||||
libthai0
|
|
||||||
libvpx5
|
|
||||||
libxcb-render0
|
|
||||||
libxcb-shm0
|
|
||||||
libxrender1
|
|
909
CHANGELOG.md
@@ -1,909 +0,0 @@
|
|||||||
Changelog
|
|
||||||
=========
|
|
||||||
|
|
||||||
All notable changes to this project will be documented in this file.
|
|
||||||
|
|
||||||
## Unreleased
|
|
||||||
|
|
||||||
### Added
|
|
||||||
|
|
||||||
- Add "not available" label to unloaded media attachments in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/11715), [Gargron](https://github.com/tootsuite/mastodon/pull/11745))
|
|
||||||
- **Add profile directory to web UI** ([Gargron](https://github.com/tootsuite/mastodon/pull/11688), [mayaeh](https://github.com/tootsuite/mastodon/pull/11872))
|
|
||||||
- Add profile directory opt-in federation
|
|
||||||
- Add profile directory REST API
|
|
||||||
- Add special alert for throttled requests in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/11677))
|
|
||||||
- Add confirmation modal when logging out from the web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/11671))
|
|
||||||
- **Add audio player in web UI** ([Gargron](https://github.com/tootsuite/mastodon/pull/11644), [Gargron](https://github.com/tootsuite/mastodon/pull/11652), [Gargron](https://github.com/tootsuite/mastodon/pull/11654), [ThibG](https://github.com/tootsuite/mastodon/pull/11629))
|
|
||||||
- **Add autosuggestions for hashtags in web UI** ([Gargron](https://github.com/tootsuite/mastodon/pull/11422), [ThibG](https://github.com/tootsuite/mastodon/pull/11632), [Gargron](https://github.com/tootsuite/mastodon/pull/11764), [Gargron](https://github.com/tootsuite/mastodon/pull/11588), [Gargron](https://github.com/tootsuite/mastodon/pull/11442))
|
|
||||||
- **Add media editing modal with OCR tool in web UI** ([Gargron](https://github.com/tootsuite/mastodon/pull/11563), [Gargron](https://github.com/tootsuite/mastodon/pull/11566), [ThibG](https://github.com/tootsuite/mastodon/pull/11575), [ThibG](https://github.com/tootsuite/mastodon/pull/11576), [Gargron](https://github.com/tootsuite/mastodon/pull/11577), [Gargron](https://github.com/tootsuite/mastodon/pull/11573), [Gargron](https://github.com/tootsuite/mastodon/pull/11571))
|
|
||||||
- Add indicator of unread notifications to window title when web UI is out of focus ([Gargron](https://github.com/tootsuite/mastodon/pull/11560), [Gargron](https://github.com/tootsuite/mastodon/pull/11572))
|
|
||||||
- Add indicator for which options you voted for in a poll in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/11195))
|
|
||||||
- **Add search results pagination to web UI** ([Gargron](https://github.com/tootsuite/mastodon/pull/11409), [ThibG](https://github.com/tootsuite/mastodon/pull/11447))
|
|
||||||
- **Add option to disable real-time updates in web UI ("slow mode")** ([Gargron](https://github.com/tootsuite/mastodon/pull/9984), [ykzts](https://github.com/tootsuite/mastodon/pull/11880), [ThibG](https://github.com/tootsuite/mastodon/pull/11883), [Gargron](https://github.com/tootsuite/mastodon/pull/11898), [ThibG](https://github.com/tootsuite/mastodon/pull/11859))
|
|
||||||
- Add option to disable blurhash previews in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/11188))
|
|
||||||
- Add native smooth scrolling when supported in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/11207))
|
|
||||||
- Add search and sort functions to hashtag admin UI ([mayaeh](https://github.com/tootsuite/mastodon/pull/11829), [Gargron](https://github.com/tootsuite/mastodon/pull/11897), [mayaeh](https://github.com/tootsuite/mastodon/pull/11875))
|
|
||||||
- Add setting for default search engine indexing in admin UI ([brortao](https://github.com/tootsuite/mastodon/pull/11804))
|
|
||||||
- Add account bio to account view in admin UI ([ThibG](https://github.com/tootsuite/mastodon/pull/11473))
|
|
||||||
- **Add option to include reported statuses in warning e-mail from admin UI** ([Gargron](https://github.com/tootsuite/mastodon/pull/11639), [Gargron](https://github.com/tootsuite/mastodon/pull/11812), [Gargron](https://github.com/tootsuite/mastodon/pull/11741), [Gargron](https://github.com/tootsuite/mastodon/pull/11698), [mayaeh](https://github.com/tootsuite/mastodon/pull/11765))
|
|
||||||
- Add number of pending accounts and pending hashtags to dashboard in admin UI ([Gargron](https://github.com/tootsuite/mastodon/pull/11514))
|
|
||||||
- **Add account migration UI** ([Gargron](https://github.com/tootsuite/mastodon/pull/11846), [noellabo](https://github.com/tootsuite/mastodon/pull/11905), [noellabo](https://github.com/tootsuite/mastodon/pull/11907), [noellabo](https://github.com/tootsuite/mastodon/pull/11906), [noellabo](https://github.com/tootsuite/mastodon/pull/11902))
|
|
||||||
- **Add table of contents to about page** ([Gargron](https://github.com/tootsuite/mastodon/pull/11885), [ykzts](https://github.com/tootsuite/mastodon/pull/11941), [ykzts](https://github.com/tootsuite/mastodon/pull/11895), [Kjwon15](https://github.com/tootsuite/mastodon/pull/11916))
|
|
||||||
- **Add password challenge to 2FA settings, e-mail notifications** ([Gargron](https://github.com/tootsuite/mastodon/pull/11878))
|
|
||||||
- Add optional invite comments ([ThibG](https://github.com/tootsuite/mastodon/pull/10465))
|
|
||||||
- **Add optional public list of domain blocks with comments** ([ThibG](https://github.com/tootsuite/mastodon/pull/11298), [ThibG](https://github.com/tootsuite/mastodon/pull/11515), [Gargron](https://github.com/tootsuite/mastodon/pull/11908))
|
|
||||||
- Add an RSS feed for featured hashtags ([noellabo](https://github.com/tootsuite/mastodon/pull/10502))
|
|
||||||
- Add explanations to featured hashtags UI and profile ([Gargron](https://github.com/tootsuite/mastodon/pull/11586))
|
|
||||||
- **Add hashtag trends with admin and user settings** ([Gargron](https://github.com/tootsuite/mastodon/pull/11490), [Gargron](https://github.com/tootsuite/mastodon/pull/11502), [Gargron](https://github.com/tootsuite/mastodon/pull/11641), [Gargron](https://github.com/tootsuite/mastodon/pull/11594), [Gargron](https://github.com/tootsuite/mastodon/pull/11517), [mayaeh](https://github.com/tootsuite/mastodon/pull/11845), [Gargron](https://github.com/tootsuite/mastodon/pull/11774), [Gargron](https://github.com/tootsuite/mastodon/pull/11712), [Gargron](https://github.com/tootsuite/mastodon/pull/11791), [Gargron](https://github.com/tootsuite/mastodon/pull/11743), [Gargron](https://github.com/tootsuite/mastodon/pull/11740), [Gargron](https://github.com/tootsuite/mastodon/pull/11714), [ThibG](https://github.com/tootsuite/mastodon/pull/11631), [Sasha-Sorokin](https://github.com/tootsuite/mastodon/pull/11569), [Gargron](https://github.com/tootsuite/mastodon/pull/11524), [Gargron](https://github.com/tootsuite/mastodon/pull/11513))
|
|
||||||
- Add hashtag usage breakdown to admin UI
|
|
||||||
- Add batch actions for hashtags to admin UI
|
|
||||||
- Add trends to web UI
|
|
||||||
- Add trends to public pages
|
|
||||||
- Add user preference to hide trends
|
|
||||||
- Add admin setting to disable trends
|
|
||||||
- **Add categories for custom emojis** ([Gargron](https://github.com/tootsuite/mastodon/pull/11196), [Gargron](https://github.com/tootsuite/mastodon/pull/11793), [Gargron](https://github.com/tootsuite/mastodon/pull/11920), [highemerly](https://github.com/tootsuite/mastodon/pull/11876))
|
|
||||||
- Add custom emoji categories to emoji picker in web UI
|
|
||||||
- Add `category` to custom emojis in REST API
|
|
||||||
- Add batch actions for custom emojis in admin UI
|
|
||||||
- Add max image dimensions to error message ([raboof](https://github.com/tootsuite/mastodon/pull/11552))
|
|
||||||
- Add aac, m4a, 3gp, amr, wma to allowed audio formats ([Gargron](https://github.com/tootsuite/mastodon/pull/11342), [umonaca](https://github.com/tootsuite/mastodon/pull/11687))
|
|
||||||
- **Add search syntax for operators and phrases** ([Gargron](https://github.com/tootsuite/mastodon/pull/11411))
|
|
||||||
- **Add REST API for managing featured hashtags** ([noellabo](https://github.com/tootsuite/mastodon/pull/11778))
|
|
||||||
- **Add REST API for managing timeline read markers** ([Gargron](https://github.com/tootsuite/mastodon/pull/11762))
|
|
||||||
- Add `exclude_unreviewed` param to `GET /api/v2/search` REST API ([Gargron](https://github.com/tootsuite/mastodon/pull/11977))
|
|
||||||
- **Add ActivityPub secure mode** ([Gargron](https://github.com/tootsuite/mastodon/pull/11269), [ThibG](https://github.com/tootsuite/mastodon/pull/11332), [ThibG](https://github.com/tootsuite/mastodon/pull/11295))
|
|
||||||
- Add HTTP signatures to all outgoing ActivityPub GET requests ([Gargron](https://github.com/tootsuite/mastodon/pull/11284), [ThibG](https://github.com/tootsuite/mastodon/pull/11300))
|
|
||||||
- Add support for ActivityPub Audio activities ([ThibG](https://github.com/tootsuite/mastodon/pull/11189))
|
|
||||||
- Add ActivityPub actor representing the entire server ([ThibG](https://github.com/tootsuite/mastodon/pull/11321), [rtucker](https://github.com/tootsuite/mastodon/pull/11400), [ThibG](https://github.com/tootsuite/mastodon/pull/11561), [Gargron](https://github.com/tootsuite/mastodon/pull/11798))
|
|
||||||
- **Add whitelist mode** ([Gargron](https://github.com/tootsuite/mastodon/pull/11291), [mayaeh](https://github.com/tootsuite/mastodon/pull/11634))
|
|
||||||
- Add config of multipart threshold for S3 ([ykzts](https://github.com/tootsuite/mastodon/pull/11924), [ykzts](https://github.com/tootsuite/mastodon/pull/11944))
|
|
||||||
- Add health check endpoint for web ([ykzts](https://github.com/tootsuite/mastodon/pull/11770), [ykzts](https://github.com/tootsuite/mastodon/pull/11947))
|
|
||||||
- Add HTTP signature keyId to request log ([Gargron](https://github.com/tootsuite/mastodon/pull/11591))
|
|
||||||
- Add `SMTP_REPLY_TO` environment variable ([hugogameiro](https://github.com/tootsuite/mastodon/pull/11718))
|
|
||||||
- Add `tootctl preview_cards remove` command ([mayaeh](https://github.com/tootsuite/mastodon/pull/11320))
|
|
||||||
- Add `tootctl media refresh` command ([Gargron](https://github.com/tootsuite/mastodon/pull/11775))
|
|
||||||
- Add `tootctl cache recount` command ([Gargron](https://github.com/tootsuite/mastodon/pull/11597))
|
|
||||||
- Add option to exclude suspended domains from `tootctl domains crawl` ([dariusk](https://github.com/tootsuite/mastodon/pull/11454))
|
|
||||||
- Add soft delete for statuses for instant deletes through API ([Gargron](https://github.com/tootsuite/mastodon/pull/11623), [Gargron](https://github.com/tootsuite/mastodon/pull/11648))
|
|
||||||
- Add rails-level JSON caching ([Gargron](https://github.com/tootsuite/mastodon/pull/11333), [Gargron](https://github.com/tootsuite/mastodon/pull/11271))
|
|
||||||
- **Add request pool to improve delivery performance** ([Gargron](https://github.com/tootsuite/mastodon/pull/10353), [ykzts](https://github.com/tootsuite/mastodon/pull/11756))
|
|
||||||
- Add concurrent connection attempts to resolved IP addresses ([ThibG](https://github.com/tootsuite/mastodon/pull/11757))
|
|
||||||
- Add index for remember_token to improve login performance ([abcang](https://github.com/tootsuite/mastodon/pull/11881))
|
|
||||||
- **Add more accurate hashtag search** ([Gargron](https://github.com/tootsuite/mastodon/pull/11579), [Gargron](https://github.com/tootsuite/mastodon/pull/11427), [Gargron](https://github.com/tootsuite/mastodon/pull/11448))
|
|
||||||
- **Add more accurate account search** ([Gargron](https://github.com/tootsuite/mastodon/pull/11537), [Gargron](https://github.com/tootsuite/mastodon/pull/11580))
|
|
||||||
- **Add a spam check** ([Gargron](https://github.com/tootsuite/mastodon/pull/11217), [Gargron](https://github.com/tootsuite/mastodon/pull/11806), [ThibG](https://github.com/tootsuite/mastodon/pull/11296))
|
|
||||||
|
|
||||||
### Changed
|
|
||||||
|
|
||||||
- **Change conversations UI** ([Gargron](https://github.com/tootsuite/mastodon/pull/11896))
|
|
||||||
- Change dashboard to short number notation ([noellabo](https://github.com/tootsuite/mastodon/pull/11847), [noellabo](https://github.com/tootsuite/mastodon/pull/11911))
|
|
||||||
- Change REST API `GET /api/v1/timelines/public` to require authentication when public preview is off ([ThibG](https://github.com/tootsuite/mastodon/pull/11802))
|
|
||||||
- Change REST API `POST /api/v1/follow_requests/:id/(approve|reject)` to return relationship ([ThibG](https://github.com/tootsuite/mastodon/pull/11800))
|
|
||||||
- Change rate limit for media proxy ([ykzts](https://github.com/tootsuite/mastodon/pull/11814))
|
|
||||||
- Change unlisted custom emoji to not appear in autosuggestions ([Gargron](https://github.com/tootsuite/mastodon/pull/11818))
|
|
||||||
- Change max length of media descriptions from 420 to 1500 characters ([Gargron](https://github.com/tootsuite/mastodon/pull/11819), [ThibG](https://github.com/tootsuite/mastodon/pull/11836))
|
|
||||||
- **Change deletes to preserve soft-deleted statuses in unresolved reports** ([Gargron](https://github.com/tootsuite/mastodon/pull/11805))
|
|
||||||
- **Change tootctl to use inline parallelization instead of Sidekiq** ([Gargron](https://github.com/tootsuite/mastodon/pull/11776))
|
|
||||||
- **Change account deletion page to have better explanations** ([Gargron](https://github.com/tootsuite/mastodon/pull/11753), [Gargron](https://github.com/tootsuite/mastodon/pull/11763))
|
|
||||||
- Change hashtag component in web UI to show numbers for 2 last days ([Gargron](https://github.com/tootsuite/mastodon/pull/11742), [Gargron](https://github.com/tootsuite/mastodon/pull/11755), [Gargron](https://github.com/tootsuite/mastodon/pull/11754))
|
|
||||||
- Change OpenGraph description on sign-up page to reflect invite ([Gargron](https://github.com/tootsuite/mastodon/pull/11744))
|
|
||||||
- Change layout of public profile directory to be the same as in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/11705))
|
|
||||||
- Change detailed status child ordering to sort self-replies on top ([ThibG](https://github.com/tootsuite/mastodon/pull/11686))
|
|
||||||
- Change window resize handler to switch to/from mobile layout as soon as needed ([ThibG](https://github.com/tootsuite/mastodon/pull/11656))
|
|
||||||
- Change icon button styles to make hover/focus states more obvious ([ThibG](https://github.com/tootsuite/mastodon/pull/11474))
|
|
||||||
- Change contrast of status links that are not mentions or hashtags ([ThibG](https://github.com/tootsuite/mastodon/pull/11406))
|
|
||||||
- **Change hashtags to preserve first-used casing** ([Gargron](https://github.com/tootsuite/mastodon/pull/11416), [Gargron](https://github.com/tootsuite/mastodon/pull/11508), [Gargron](https://github.com/tootsuite/mastodon/pull/11504), [Gargron](https://github.com/tootsuite/mastodon/pull/11507), [Gargron](https://github.com/tootsuite/mastodon/pull/11441))
|
|
||||||
- **Change unconfirmed user login behaviour** ([Gargron](https://github.com/tootsuite/mastodon/pull/11375), [ThibG](https://github.com/tootsuite/mastodon/pull/11394), [Gargron](https://github.com/tootsuite/mastodon/pull/11860))
|
|
||||||
- **Change single-column mode to scroll the whole page** ([Gargron](https://github.com/tootsuite/mastodon/pull/11359), [Gargron](https://github.com/tootsuite/mastodon/pull/11894), [Gargron](https://github.com/tootsuite/mastodon/pull/11891), [ThibG](https://github.com/tootsuite/mastodon/pull/11655), [Gargron](https://github.com/tootsuite/mastodon/pull/11463), [Gargron](https://github.com/tootsuite/mastodon/pull/11458), [ThibG](https://github.com/tootsuite/mastodon/pull/11395), [Gargron](https://github.com/tootsuite/mastodon/pull/11418))
|
|
||||||
- Change `tootctl accounts follow` to only work with local accounts ([angristan](https://github.com/tootsuite/mastodon/pull/11592))
|
|
||||||
- Change Dockerfile ([Shleeble](https://github.com/tootsuite/mastodon/pull/11710), [ykzts](https://github.com/tootsuite/mastodon/pull/11768), [Shleeble](https://github.com/tootsuite/mastodon/pull/11707))
|
|
||||||
- Change supported Node versions to include v12 ([abcang](https://github.com/tootsuite/mastodon/pull/11706))
|
|
||||||
- Change Portuguese language from `pt` to `pt-PT` ([Gargron](https://github.com/tootsuite/mastodon/pull/11820))
|
|
||||||
- Change domain block silence to always require approval on follow ([ThibG](https://github.com/tootsuite/mastodon/pull/11975))
|
|
||||||
|
|
||||||
### Removed
|
|
||||||
|
|
||||||
- **Remove OStatus support** ([Gargron](https://github.com/tootsuite/mastodon/pull/11205), [Gargron](https://github.com/tootsuite/mastodon/pull/11303), [Gargron](https://github.com/tootsuite/mastodon/pull/11460), [ThibG](https://github.com/tootsuite/mastodon/pull/11280), [ThibG](https://github.com/tootsuite/mastodon/pull/11278))
|
|
||||||
- Remove Atom feeds and old URLs in the form of `GET /:username/updates/:id` ([Gargron](https://github.com/tootsuite/mastodon/pull/11247))
|
|
||||||
- Remove WebP support ([angristan](https://github.com/tootsuite/mastodon/pull/11589))
|
|
||||||
- Remove deprecated config options from Heroku and Scalingo ([ykzts](https://github.com/tootsuite/mastodon/pull/11925))
|
|
||||||
- Remove deprecated REST API `GET /api/v1/search` API ([Gargron](https://github.com/tootsuite/mastodon/pull/11823))
|
|
||||||
- Remove deprecated REST API `GET /api/v1/statuses/:id/card` ([Gargron](https://github.com/tootsuite/mastodon/pull/11213))
|
|
||||||
- Remove deprecated REST API `POST /api/v1/notifications/dismiss?id=:id` ([Gargron](https://github.com/tootsuite/mastodon/pull/11214))
|
|
||||||
- Remove deprecated REST API `GET /api/v1/timelines/direct` ([Gargron](https://github.com/tootsuite/mastodon/pull/11212))
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
|
|
||||||
- Fix manifest warning ([ykzts](https://github.com/tootsuite/mastodon/pull/11767))
|
|
||||||
- Fix admin UI for custom emoji not respecting GIF autoplay preference ([ThibG](https://github.com/tootsuite/mastodon/pull/11801))
|
|
||||||
- Fix page body not being scrollable in admin/settings layout ([Gargron](https://github.com/tootsuite/mastodon/pull/11893))
|
|
||||||
- Fix placeholder colors for inputs not being explicitly defined ([Gargron](https://github.com/tootsuite/mastodon/pull/11890))
|
|
||||||
- Fix incorrect enclosure length in RSS ([tsia](https://github.com/tootsuite/mastodon/pull/11889))
|
|
||||||
- Fix TOTP codes not being filtered from logs during enabling/disabling ([Gargron](https://github.com/tootsuite/mastodon/pull/11877))
|
|
||||||
- Fix webfinger response not returning 410 when account is suspended ([Gargron](https://github.com/tootsuite/mastodon/pull/11869))
|
|
||||||
- Fix ActivityPub Move handler queuing jobs that will fail if account is suspended ([Gargron](https://github.com/tootsuite/mastodon/pull/11864))
|
|
||||||
- Fix SSO login not using existing account when e-mail is verified ([Gargron](https://github.com/tootsuite/mastodon/pull/11862))
|
|
||||||
- Fix web UI allowing uploads past status limit via drag & drop ([Gargron](https://github.com/tootsuite/mastodon/pull/11863))
|
|
||||||
- Fix expiring polls not being displayed as such in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/11835))
|
|
||||||
- Fix 2FA challenge and password challenge for non-database users ([Gargron](https://github.com/tootsuite/mastodon/pull/11831), [Gargron](https://github.com/tootsuite/mastodon/pull/11943))
|
|
||||||
- Fix profile fields overflowing page width in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/11828))
|
|
||||||
- Fix web push subscriptions being deleted on rate limit or timeout ([Gargron](https://github.com/tootsuite/mastodon/pull/11826))
|
|
||||||
- Fix display of long poll options in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/11717), [ThibG](https://github.com/tootsuite/mastodon/pull/11833))
|
|
||||||
- Fix search API not resolving URL when `type` is given ([Gargron](https://github.com/tootsuite/mastodon/pull/11822))
|
|
||||||
- Fix hashtags being split by ZWNJ character ([Gargron](https://github.com/tootsuite/mastodon/pull/11821))
|
|
||||||
- Fix scroll position resetting when opening media modals in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/11815))
|
|
||||||
- Fix duplicate HTML IDs on about page ([ThibG](https://github.com/tootsuite/mastodon/pull/11803))
|
|
||||||
- Fix admin UI showing superfluous reject media/reports on suspended domain blocks ([ThibG](https://github.com/tootsuite/mastodon/pull/11749))
|
|
||||||
- Fix ActivityPub context not being dynamically computed ([ThibG](https://github.com/tootsuite/mastodon/pull/11746))
|
|
||||||
- Fix Mastodon logo style on hover on public pages' footer ([ThibG](https://github.com/tootsuite/mastodon/pull/11735))
|
|
||||||
- Fix height of dashboard counters ([ThibG](https://github.com/tootsuite/mastodon/pull/11736))
|
|
||||||
- Fix custom emoji animation on hover in web UI directory bios ([ThibG](https://github.com/tootsuite/mastodon/pull/11716))
|
|
||||||
- Fix non-numbers being passed to Redis and causing an error ([Gargron](https://github.com/tootsuite/mastodon/pull/11697))
|
|
||||||
- Fix error in REST API for an account's statuses ([Gargron](https://github.com/tootsuite/mastodon/pull/11700))
|
|
||||||
- Fix uncaught error when resource param is missing in Webfinger request ([Gargron](https://github.com/tootsuite/mastodon/pull/11701))
|
|
||||||
- Fix uncaught domain normalization error in remote follow ([Gargron](https://github.com/tootsuite/mastodon/pull/11703))
|
|
||||||
- Fix uncaught 422 and 500 errors ([Gargron](https://github.com/tootsuite/mastodon/pull/11590), [Gargron](https://github.com/tootsuite/mastodon/pull/11811))
|
|
||||||
- Fix uncaught parameter missing exceptions and missing error templates ([Gargron](https://github.com/tootsuite/mastodon/pull/11702))
|
|
||||||
- Fix encoding error when checking e-mail MX records ([Gargron](https://github.com/tootsuite/mastodon/pull/11696))
|
|
||||||
- Fix items in StatusContent render list not all having a key ([ThibG](https://github.com/tootsuite/mastodon/pull/11645))
|
|
||||||
- Fix remote and staff-removed statuses leaving media behind for a day ([Gargron](https://github.com/tootsuite/mastodon/pull/11638))
|
|
||||||
- Fix CSP needlessly allowing blob URLs in script-src ([ThibG](https://github.com/tootsuite/mastodon/pull/11620))
|
|
||||||
- Fix ignoring whole status because of one invalid hashtag ([Gargron](https://github.com/tootsuite/mastodon/pull/11621))
|
|
||||||
- Fix hidden statuses losing focus ([ThibG](https://github.com/tootsuite/mastodon/pull/11208))
|
|
||||||
- Fix loading bar being obscured by other elements in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/11598))
|
|
||||||
- Fix multiple issues with replies collection for pages further than self-replies ([ThibG](https://github.com/tootsuite/mastodon/pull/11582))
|
|
||||||
- Fix blurhash and autoplay not working on public pages ([Gargron](https://github.com/tootsuite/mastodon/pull/11585))
|
|
||||||
- Fix 422 being returned instead of 404 when POSTing to unmatched routes ([Gargron](https://github.com/tootsuite/mastodon/pull/11574), [Gargron](https://github.com/tootsuite/mastodon/pull/11704))
|
|
||||||
- Fix client-side resizing of image uploads ([ThibG](https://github.com/tootsuite/mastodon/pull/11570))
|
|
||||||
- Fix short number formatting for numbers above million in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/11559))
|
|
||||||
- Fix ActivityPub and REST API queries setting cookies and preventing caching ([ThibG](https://github.com/tootsuite/mastodon/pull/11539), [ThibG](https://github.com/tootsuite/mastodon/pull/11557), [ThibG](https://github.com/tootsuite/mastodon/pull/11336), [ThibG](https://github.com/tootsuite/mastodon/pull/11331))
|
|
||||||
- Fix some emojis in profile metadata labels are not emojified. ([kedamaDQ](https://github.com/tootsuite/mastodon/pull/11534))
|
|
||||||
- Fix account search always returning exact match on paginated results ([Gargron](https://github.com/tootsuite/mastodon/pull/11525))
|
|
||||||
- Fix acct URIs with IDN domains not being resolved ([Gargron](https://github.com/tootsuite/mastodon/pull/11520))
|
|
||||||
- Fix admin dashboard missing latest features ([Gargron](https://github.com/tootsuite/mastodon/pull/11505))
|
|
||||||
- Fix jumping of toot date when clicking spoiler button ([ariasuni](https://github.com/tootsuite/mastodon/pull/11449))
|
|
||||||
- Fix boost to original audience not working on mobile in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/11371))
|
|
||||||
- Fix handling of webfinger redirects in ResolveAccountService ([ThibG](https://github.com/tootsuite/mastodon/pull/11279))
|
|
||||||
- Fix URLs appearing twice in errors of ActivityPub::DeliveryWorker ([Gargron](https://github.com/tootsuite/mastodon/pull/11231))
|
|
||||||
- Fix support for HTTP proxies ([ThibG](https://github.com/tootsuite/mastodon/pull/11245))
|
|
||||||
- Fix HTTP requests to IPv6 hosts ([ThibG](https://github.com/tootsuite/mastodon/pull/11240))
|
|
||||||
- Fix error in ElasticSearch index import ([mayaeh](https://github.com/tootsuite/mastodon/pull/11192))
|
|
||||||
- Fix duplicate account error when seeding development database ([ysksn](https://github.com/tootsuite/mastodon/pull/11366))
|
|
||||||
- Fix performance of session clean-up scheduler ([abcang](https://github.com/tootsuite/mastodon/pull/11871))
|
|
||||||
- Fix older migrations not running ([zunda](https://github.com/tootsuite/mastodon/pull/11377))
|
|
||||||
- Fix URLs counting towards RTL detection ([ahangarha](https://github.com/tootsuite/mastodon/pull/11759))
|
|
||||||
- Fix unnecessary status re-rendering in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/11211))
|
|
||||||
- Fix http_parser.rb gem not being compiled when no network available ([petabyteboy](https://github.com/tootsuite/mastodon/pull/11444))
|
|
||||||
- Fix muted text color not applying to all text ([trwnh](https://github.com/tootsuite/mastodon/pull/11996))
|
|
||||||
- Fix follower/following lists resetting on back-navigation in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/11986))
|
|
||||||
|
|
||||||
## [2.9.3] - 2019-08-10
|
|
||||||
### Added
|
|
||||||
|
|
||||||
- Add GIF and WebP support for custom emojis ([Gargron](https://github.com/tootsuite/mastodon/pull/11519))
|
|
||||||
- Add logout link to dropdown menu in web UI ([koyuawsmbrtn](https://github.com/tootsuite/mastodon/pull/11353))
|
|
||||||
- Add indication that text search is unavailable in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/11112), [ThibG](https://github.com/tootsuite/mastodon/pull/11202))
|
|
||||||
- Add `suffix` to `Mastodon::Version` to help forks ([clarfon](https://github.com/tootsuite/mastodon/pull/11407))
|
|
||||||
- Add on-hover animation to animated custom emoji in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/11348), [ThibG](https://github.com/tootsuite/mastodon/pull/11404), [ThibG](https://github.com/tootsuite/mastodon/pull/11522))
|
|
||||||
- Add custom emoji support in profile metadata labels ([ThibG](https://github.com/tootsuite/mastodon/pull/11350))
|
|
||||||
|
|
||||||
### Changed
|
|
||||||
|
|
||||||
- Change default interface of web and streaming from 0.0.0.0 to 127.0.0.1 ([Gargron](https://github.com/tootsuite/mastodon/pull/11302), [zunda](https://github.com/tootsuite/mastodon/pull/11378), [Gargron](https://github.com/tootsuite/mastodon/pull/11351), [zunda](https://github.com/tootsuite/mastodon/pull/11326))
|
|
||||||
- Change the retry limit of web push notifications ([highemerly](https://github.com/tootsuite/mastodon/pull/11292))
|
|
||||||
- Change ActivityPub deliveries to not retry HTTP 501 errors ([Gargron](https://github.com/tootsuite/mastodon/pull/11233))
|
|
||||||
- Change language detection to include hashtags as words ([Gargron](https://github.com/tootsuite/mastodon/pull/11341))
|
|
||||||
- Change terms and privacy policy pages to always be accessible ([Gargron](https://github.com/tootsuite/mastodon/pull/11334))
|
|
||||||
- Change robots tag to include `noarchive` when user opts out of indexing ([Kjwon15](https://github.com/tootsuite/mastodon/pull/11421))
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
|
|
||||||
- Fix account domain block not clearing out notifications ([Gargron](https://github.com/tootsuite/mastodon/pull/11393))
|
|
||||||
- Fix incorrect locale sometimes being detected for browser ([Gargron](https://github.com/tootsuite/mastodon/pull/8657))
|
|
||||||
- Fix crash when saving invalid domain name ([Gargron](https://github.com/tootsuite/mastodon/pull/11528))
|
|
||||||
- Fix pinned statuses REST API returning pagination headers ([Gargron](https://github.com/tootsuite/mastodon/pull/11526))
|
|
||||||
- Fix "cancel follow request" button having unreadable text in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/11521))
|
|
||||||
- Fix image uploads being blank when canvas read access is blocked ([ThibG](https://github.com/tootsuite/mastodon/pull/11499))
|
|
||||||
- Fix avatars not being animated on hover when not logged in ([ThibG](https://github.com/tootsuite/mastodon/pull/11349))
|
|
||||||
- Fix overzealous sanitization of HTML lists ([ThibG](https://github.com/tootsuite/mastodon/pull/11354))
|
|
||||||
- Fix block crashing when a follow request exists ([ThibG](https://github.com/tootsuite/mastodon/pull/11288))
|
|
||||||
- Fix backup service crashing when an attachment is missing ([ThibG](https://github.com/tootsuite/mastodon/pull/11241))
|
|
||||||
- Fix account moderation action always sending e-mail notification ([Gargron](https://github.com/tootsuite/mastodon/pull/11242))
|
|
||||||
- Fix swiping columns on mobile sometimes failing in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/11200))
|
|
||||||
- Fix wrong actor URI being serialized into poll updates ([ThibG](https://github.com/tootsuite/mastodon/pull/11194))
|
|
||||||
- Fix statsd UDP sockets not being cleaned up in Sidekiq ([Gargron](https://github.com/tootsuite/mastodon/pull/11230))
|
|
||||||
- Fix expiration date of filters being set to "never" when editing them ([ThibG](https://github.com/tootsuite/mastodon/pull/11204))
|
|
||||||
- Fix support for MP4 files that are actually M4V files ([Gargron](https://github.com/tootsuite/mastodon/pull/11210))
|
|
||||||
- Fix `alerts` not being typecast correctly in push subscription in REST API ([Gargron](https://github.com/tootsuite/mastodon/pull/11343))
|
|
||||||
- Fix some notices staying on unrelated pages ([ThibG](https://github.com/tootsuite/mastodon/pull/11364))
|
|
||||||
- Fix unboosting sometimes preventing a boost from reappearing on feed ([ThibG](https://github.com/tootsuite/mastodon/pull/11405), [Gargron](https://github.com/tootsuite/mastodon/pull/11450))
|
|
||||||
- Fix only one middle dot being recognized in hashtags ([Gargron](https://github.com/tootsuite/mastodon/pull/11345), [ThibG](https://github.com/tootsuite/mastodon/pull/11363))
|
|
||||||
- Fix unnecessary SQL query performed on unauthenticated requests ([Gargron](https://github.com/tootsuite/mastodon/pull/11179))
|
|
||||||
- Fix incorrect timestamp displayed on featured tags ([Kjwon15](https://github.com/tootsuite/mastodon/pull/11477))
|
|
||||||
- Fix privacy dropdown active state when dropdown is placed on top of it ([ThibG](https://github.com/tootsuite/mastodon/pull/11495))
|
|
||||||
- Fix filters not being applied to poll options ([ThibG](https://github.com/tootsuite/mastodon/pull/11174))
|
|
||||||
- Fix keyboard navigation on various dropdowns ([ThibG](https://github.com/tootsuite/mastodon/pull/11511), [ThibG](https://github.com/tootsuite/mastodon/pull/11492), [ThibG](https://github.com/tootsuite/mastodon/pull/11491))
|
|
||||||
- Fix keyboard navigation in modals ([ThibG](https://github.com/tootsuite/mastodon/pull/11493))
|
|
||||||
- Fix image conversation being non-deterministic due to timestamps ([Gargron](https://github.com/tootsuite/mastodon/pull/11408))
|
|
||||||
- Fix web UI performance ([ThibG](https://github.com/tootsuite/mastodon/pull/11211), [ThibG](https://github.com/tootsuite/mastodon/pull/11234))
|
|
||||||
- Fix scrolling to compose form when not necessary in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/11246), [ThibG](https://github.com/tootsuite/mastodon/pull/11182))
|
|
||||||
- Fix save button being enabled when list title is empty in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/11475))
|
|
||||||
- Fix poll expiration not being pre-filled on delete & redraft in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/11203))
|
|
||||||
- Fix content warning sometimes being set when not requested in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/11206))
|
|
||||||
|
|
||||||
### Security
|
|
||||||
|
|
||||||
- Fix invites not being disabled upon account suspension ([ThibG](https://github.com/tootsuite/mastodon/pull/11412))
|
|
||||||
- Fix blocked domains still being able to fill database with account records ([Gargron](https://github.com/tootsuite/mastodon/pull/11219))
|
|
||||||
|
|
||||||
## [2.9.2] - 2019-06-22
|
|
||||||
### Added
|
|
||||||
|
|
||||||
- Add `short_description` and `approval_required` to `GET /api/v1/instance` ([Gargron](https://github.com/tootsuite/mastodon/pull/11146))
|
|
||||||
|
|
||||||
### Changed
|
|
||||||
|
|
||||||
- Change camera icon to paperclip icon in upload form ([koyuawsmbrtn](https://github.com/tootsuite/mastodon/pull/11149))
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
|
|
||||||
- Fix audio-only OGG and WebM files not being processed as such ([Gargron](https://github.com/tootsuite/mastodon/pull/11151))
|
|
||||||
- Fix audio not being downloaded from remote servers ([Gargron](https://github.com/tootsuite/mastodon/pull/11145))
|
|
||||||
|
|
||||||
## [2.9.1] - 2019-06-22
|
|
||||||
### Added
|
|
||||||
|
|
||||||
- Add moderation API ([Gargron](https://github.com/tootsuite/mastodon/pull/9387))
|
|
||||||
- Add audio uploads ([Gargron](https://github.com/tootsuite/mastodon/pull/11123), [Gargron](https://github.com/tootsuite/mastodon/pull/11141))
|
|
||||||
|
|
||||||
### Changed
|
|
||||||
|
|
||||||
- Change domain blocks to automatically support subdomains ([Gargron](https://github.com/tootsuite/mastodon/pull/11138))
|
|
||||||
- Change Nanobox configuration to bring it up to date ([danhunsaker](https://github.com/tootsuite/mastodon/pull/11083))
|
|
||||||
|
|
||||||
### Removed
|
|
||||||
|
|
||||||
- Remove expensive counters from federation page in admin UI ([Gargron](https://github.com/tootsuite/mastodon/pull/11139))
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
|
|
||||||
- Fix converted media being saved with original extension and mime type ([Gargron](https://github.com/tootsuite/mastodon/pull/11130))
|
|
||||||
- Fix layout of identity proofs settings ([acid-chicken](https://github.com/tootsuite/mastodon/pull/11126))
|
|
||||||
- Fix active scope only returning suspended users ([ThibG](https://github.com/tootsuite/mastodon/pull/11111))
|
|
||||||
- Fix sanitizer making block level elements unreadable ([Gargron](https://github.com/tootsuite/mastodon/pull/10836))
|
|
||||||
- Fix label for site theme not being translated in admin UI ([palindromordnilap](https://github.com/tootsuite/mastodon/pull/11121))
|
|
||||||
- Fix statuses not being filtered irreversibly in web UI under some circumstances ([ThibG](https://github.com/tootsuite/mastodon/pull/11113))
|
|
||||||
- Fix scrolling behaviour in compose form ([ThibG](https://github.com/tootsuite/mastodon/pull/11093))
|
|
||||||
|
|
||||||
## [2.9.0] - 2019-06-13
|
|
||||||
### Added
|
|
||||||
|
|
||||||
- **Add single-column mode in web UI** ([Gargron](https://github.com/tootsuite/mastodon/pull/10807), [Gargron](https://github.com/tootsuite/mastodon/pull/10848), [Gargron](https://github.com/tootsuite/mastodon/pull/11003), [Gargron](https://github.com/tootsuite/mastodon/pull/10961), [Hanage999](https://github.com/tootsuite/mastodon/pull/10915), [noellabo](https://github.com/tootsuite/mastodon/pull/10917), [abcang](https://github.com/tootsuite/mastodon/pull/10859), [Gargron](https://github.com/tootsuite/mastodon/pull/10820), [Gargron](https://github.com/tootsuite/mastodon/pull/10835), [Gargron](https://github.com/tootsuite/mastodon/pull/10809), [Gargron](https://github.com/tootsuite/mastodon/pull/10963), [noellabo](https://github.com/tootsuite/mastodon/pull/10883), [Hanage999](https://github.com/tootsuite/mastodon/pull/10839))
|
|
||||||
- Add waiting time to the list of pending accounts in admin UI ([Gargron](https://github.com/tootsuite/mastodon/pull/10985))
|
|
||||||
- Add a keyboard shortcut to hide/show media in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/10647), [Gargron](https://github.com/tootsuite/mastodon/pull/10838), [ThibG](https://github.com/tootsuite/mastodon/pull/10872))
|
|
||||||
- Add `account_id` param to `GET /api/v1/notifications` ([pwoolcoc](https://github.com/tootsuite/mastodon/pull/10796))
|
|
||||||
- Add confirmation modal for unboosting toots in web UI ([aurelien-reeves](https://github.com/tootsuite/mastodon/pull/10287))
|
|
||||||
- Add emoji suggestions to content warning and poll option fields in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/10555))
|
|
||||||
- Add `source` attribute to response of `DELETE /api/v1/statuses/:id` ([ThibG](https://github.com/tootsuite/mastodon/pull/10669))
|
|
||||||
- Add some caching for HTML versions of public status pages ([ThibG](https://github.com/tootsuite/mastodon/pull/10701))
|
|
||||||
- Add button to conveniently copy OAuth code ([ThibG](https://github.com/tootsuite/mastodon/pull/11065))
|
|
||||||
|
|
||||||
### Changed
|
|
||||||
|
|
||||||
- **Change default layout to single column in web UI** ([Gargron](https://github.com/tootsuite/mastodon/pull/10847))
|
|
||||||
- **Change light theme** ([Gargron](https://github.com/tootsuite/mastodon/pull/10992), [Gargron](https://github.com/tootsuite/mastodon/pull/10996), [yuzulabo](https://github.com/tootsuite/mastodon/pull/10754), [Gargron](https://github.com/tootsuite/mastodon/pull/10845))
|
|
||||||
- **Change preferences page into appearance, notifications, and other** ([Gargron](https://github.com/tootsuite/mastodon/pull/10977), [Gargron](https://github.com/tootsuite/mastodon/pull/10988))
|
|
||||||
- Change priority of delete activity forwards for replies and reblogs ([Gargron](https://github.com/tootsuite/mastodon/pull/11002))
|
|
||||||
- Change Mastodon logo to use primary text color of the given theme ([Gargron](https://github.com/tootsuite/mastodon/pull/10994))
|
|
||||||
- Change reblogs counter to be updated when boosted privately ([Gargron](https://github.com/tootsuite/mastodon/pull/10964))
|
|
||||||
- Change bio limit from 160 to 500 characters ([trwnh](https://github.com/tootsuite/mastodon/pull/10790))
|
|
||||||
- Change API rate limiting to reduce allowed unauthenticated requests ([ThibG](https://github.com/tootsuite/mastodon/pull/10860), [hinaloe](https://github.com/tootsuite/mastodon/pull/10868), [mayaeh](https://github.com/tootsuite/mastodon/pull/10867))
|
|
||||||
- Change help text of `tootctl emoji import` command to specify a gzipped TAR archive is required ([dariusk](https://github.com/tootsuite/mastodon/pull/11000))
|
|
||||||
- Change web UI to hide poll options behind content warnings ([ThibG](https://github.com/tootsuite/mastodon/pull/10983))
|
|
||||||
- Change silencing to ensure local effects and remote effects are the same for silenced local users ([ThibG](https://github.com/tootsuite/mastodon/pull/10575))
|
|
||||||
- Change `tootctl domains purge` to remove custom emoji as well ([Kjwon15](https://github.com/tootsuite/mastodon/pull/10721))
|
|
||||||
- Change Docker image to keep `apt` working ([SuperSandro2000](https://github.com/tootsuite/mastodon/pull/10830))
|
|
||||||
|
|
||||||
### Removed
|
|
||||||
|
|
||||||
- Remove `dist-upgrade` from Docker image ([SuperSandro2000](https://github.com/tootsuite/mastodon/pull/10822))
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
|
|
||||||
- Fix RTL layout not being RTL within the columns area in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/10990))
|
|
||||||
- Fix display of alternative text when a media attachment is not available in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/10981))
|
|
||||||
- Fix not being able to directly switch between list timelines in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/10973))
|
|
||||||
- Fix media sensitivity not being maintained in delete & redraft in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/10980))
|
|
||||||
- Fix emoji picker being always displayed in web UI ([noellabo](https://github.com/tootsuite/mastodon/pull/10979), [yuzulabo](https://github.com/tootsuite/mastodon/pull/10801), [wcpaez](https://github.com/tootsuite/mastodon/pull/10978))
|
|
||||||
- Fix potential private status leak through caching ([ThibG](https://github.com/tootsuite/mastodon/pull/10969))
|
|
||||||
- Fix refreshing featured toots when the new collection is empty in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/10971))
|
|
||||||
- Fix undoing domain block also undoing individual moderation on users from before the domain block ([ThibG](https://github.com/tootsuite/mastodon/pull/10660))
|
|
||||||
- Fix time not being local in the audit log ([yuzulabo](https://github.com/tootsuite/mastodon/pull/10751))
|
|
||||||
- Fix statuses removed by moderation re-appearing on subsequent fetches ([Kjwon15](https://github.com/tootsuite/mastodon/pull/10732))
|
|
||||||
- Fix misattribution of inlined announces if `attributedTo` isn't present in ActivityPub ([ThibG](https://github.com/tootsuite/mastodon/pull/10967))
|
|
||||||
- Fix `GET /api/v1/polls/:id` not requiring authentication for non-public polls ([Gargron](https://github.com/tootsuite/mastodon/pull/10960))
|
|
||||||
- Fix handling of blank poll options in ActivityPub ([ThibG](https://github.com/tootsuite/mastodon/pull/10946))
|
|
||||||
- Fix avatar preview aspect ratio on edit profile page ([Kjwon15](https://github.com/tootsuite/mastodon/pull/10931))
|
|
||||||
- Fix web push notifications not being sent for polls ([ThibG](https://github.com/tootsuite/mastodon/pull/10864))
|
|
||||||
- Fix cut off letters in last paragraph of statuses in web UI ([ariasuni](https://github.com/tootsuite/mastodon/pull/10821))
|
|
||||||
- Fix list not being automatically unpinned when it returns 404 in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/11045))
|
|
||||||
- Fix login sometimes redirecting to paths that are not pages ([Gargron](https://github.com/tootsuite/mastodon/pull/11019))
|
|
||||||
|
|
||||||
## [2.8.4] - 2019-05-24
|
|
||||||
### Fixed
|
|
||||||
|
|
||||||
- Fix delivery not retrying on some inbox errors that should be retriable ([ThibG](https://github.com/tootsuite/mastodon/pull/10812))
|
|
||||||
- Fix unnecessary 5 minute cooldowns on signature verifications in some cases ([ThibG](https://github.com/tootsuite/mastodon/pull/10813))
|
|
||||||
- Fix possible race condition when processing statuses ([ThibG](https://github.com/tootsuite/mastodon/pull/10815))
|
|
||||||
|
|
||||||
### Security
|
|
||||||
|
|
||||||
- Require specific OAuth scopes for specific endpoints of the streaming API, instead of merely requiring a token for all endpoints, and allow using WebSockets protocol negotiation to specify the access token instead of using a query string ([ThibG](https://github.com/tootsuite/mastodon/pull/10818))
|
|
||||||
|
|
||||||
## [2.8.3] - 2019-05-19
|
|
||||||
### Added
|
|
||||||
|
|
||||||
- Add `og:image:alt` OpenGraph tag ([BenLubar](https://github.com/tootsuite/mastodon/pull/10779))
|
|
||||||
- Add clickable area below avatar in statuses in web UI ([Dar13](https://github.com/tootsuite/mastodon/pull/10766))
|
|
||||||
- Add crossed-out eye icon on account gallery in web UI ([Kjwon15](https://github.com/tootsuite/mastodon/pull/10715))
|
|
||||||
- Add media description tooltip to thumbnails in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/10713))
|
|
||||||
|
|
||||||
### Changed
|
|
||||||
|
|
||||||
- Change "mark as sensitive" button into a checkbox for clarity ([ThibG](https://github.com/tootsuite/mastodon/pull/10748))
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
|
|
||||||
- Fix bug allowing users to publicly boost their private statuses ([ThibG](https://github.com/tootsuite/mastodon/pull/10775), [ThibG](https://github.com/tootsuite/mastodon/pull/10783))
|
|
||||||
- Fix performance in formatter by a little ([ThibG](https://github.com/tootsuite/mastodon/pull/10765))
|
|
||||||
- Fix some colors in the light theme ([yuzulabo](https://github.com/tootsuite/mastodon/pull/10754))
|
|
||||||
- Fix some colors of the high contrast theme ([yuzulabo](https://github.com/tootsuite/mastodon/pull/10711))
|
|
||||||
- Fix ambivalent active state of poll refresh button in web UI ([MaciekBaron](https://github.com/tootsuite/mastodon/pull/10720))
|
|
||||||
- Fix duplicate posting being possible from web UI ([hinaloe](https://github.com/tootsuite/mastodon/pull/10785))
|
|
||||||
- Fix "invited by" not showing up in admin UI ([ThibG](https://github.com/tootsuite/mastodon/pull/10791))
|
|
||||||
|
|
||||||
## [2.8.2] - 2019-05-05
|
|
||||||
### Added
|
|
||||||
|
|
||||||
- Add `SOURCE_TAG` environment variable ([ushitora-anqou](https://github.com/tootsuite/mastodon/pull/10698))
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
|
|
||||||
- Fix cropped hero image on frontpage ([BaptisteGelez](https://github.com/tootsuite/mastodon/pull/10702))
|
|
||||||
- Fix blurhash gem not compiling on some operating systems ([Gargron](https://github.com/tootsuite/mastodon/pull/10700))
|
|
||||||
- Fix unexpected CSS animations in some browsers ([ThibG](https://github.com/tootsuite/mastodon/pull/10699))
|
|
||||||
- Fix closing video modal scrolling timelines to top ([ThibG](https://github.com/tootsuite/mastodon/pull/10695))
|
|
||||||
|
|
||||||
## [2.8.1] - 2019-05-04
|
|
||||||
### Added
|
|
||||||
|
|
||||||
- Add link to existing domain block when trying to block an already-blocked domain ([ThibG](https://github.com/tootsuite/mastodon/pull/10663))
|
|
||||||
- Add button to view context to media modal when opened from account gallery in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/10676))
|
|
||||||
- Add ability to create multiple-choice polls in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/10603))
|
|
||||||
- Add `GITHUB_REPOSITORY` and `SOURCE_BASE_URL` environment variables ([rosylilly](https://github.com/tootsuite/mastodon/pull/10600))
|
|
||||||
- Add `/interact/` paths to `robots.txt` ([ThibG](https://github.com/tootsuite/mastodon/pull/10666))
|
|
||||||
- Add `blurhash` to the Attachment entity in the REST API ([Gargron](https://github.com/tootsuite/mastodon/pull/10630))
|
|
||||||
|
|
||||||
### Changed
|
|
||||||
|
|
||||||
- Change hidden media to be shown as a blurhash-based colorful gradient instead of a black box in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/10630))
|
|
||||||
- Change rejected media to be shown as a blurhash-based gradient instead of a list of filenames in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/10630))
|
|
||||||
- Change e-mail whitelist/blacklist to not be checked when invited ([Gargron](https://github.com/tootsuite/mastodon/pull/10683))
|
|
||||||
- Change cache header of REST API results to no-cache ([ThibG](https://github.com/tootsuite/mastodon/pull/10655))
|
|
||||||
- Change the "mark media as sensitive" button to be more obvious in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/10673), [Gargron](https://github.com/tootsuite/mastodon/pull/10682))
|
|
||||||
- Change account gallery in web UI to display 3 columns, open media modal ([Gargron](https://github.com/tootsuite/mastodon/pull/10667), [Gargron](https://github.com/tootsuite/mastodon/pull/10674))
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
|
|
||||||
- Fix LDAP/PAM/SAML/CAS users not being pre-approved ([Gargron](https://github.com/tootsuite/mastodon/pull/10621))
|
|
||||||
- Fix accounts created through tootctl not being always pre-approved ([Gargron](https://github.com/tootsuite/mastodon/pull/10684))
|
|
||||||
- Fix Sidekiq retrying ActivityPub processing jobs that fail validation ([ThibG](https://github.com/tootsuite/mastodon/pull/10614))
|
|
||||||
- Fix toots not being scrolled into view sometimes through keyboard selection ([ThibG](https://github.com/tootsuite/mastodon/pull/10593))
|
|
||||||
- Fix expired invite links being usable to bypass approval mode ([ThibG](https://github.com/tootsuite/mastodon/pull/10657))
|
|
||||||
- Fix not being able to save e-mail preference for new pending accounts ([Gargron](https://github.com/tootsuite/mastodon/pull/10622))
|
|
||||||
- Fix upload progressbar when image resizing is involved ([ThibG](https://github.com/tootsuite/mastodon/pull/10632))
|
|
||||||
- Fix block action not automatically cancelling pending follow request ([ThibG](https://github.com/tootsuite/mastodon/pull/10633))
|
|
||||||
- Fix stoplight logging to stderr separate from Rails logger ([Gargron](https://github.com/tootsuite/mastodon/pull/10624))
|
|
||||||
- Fix sign up button not saying sign up when invite is used ([Gargron](https://github.com/tootsuite/mastodon/pull/10623))
|
|
||||||
- Fix health checks in Docker Compose configuration ([fabianonline](https://github.com/tootsuite/mastodon/pull/10553))
|
|
||||||
- Fix modal items not being scrollable on touch devices ([kedamaDQ](https://github.com/tootsuite/mastodon/pull/10605))
|
|
||||||
- Fix Keybase configuration using wrong domain when a web domain is used ([BenLubar](https://github.com/tootsuite/mastodon/pull/10565))
|
|
||||||
- Fix avatar GIFs not being animated on-hover on public profiles ([hyenagirl64](https://github.com/tootsuite/mastodon/pull/10549))
|
|
||||||
- Fix OpenGraph parser not understanding some valid property meta tags ([da2x](https://github.com/tootsuite/mastodon/pull/10604))
|
|
||||||
- Fix wrong fonts being displayed when Roboto is installed on user's machine ([ThibG](https://github.com/tootsuite/mastodon/pull/10594))
|
|
||||||
- Fix confirmation modals being too narrow for a secondary action button ([ThibG](https://github.com/tootsuite/mastodon/pull/10586))
|
|
||||||
|
|
||||||
## [2.8.0] - 2019-04-10
|
|
||||||
### Added
|
|
||||||
|
|
||||||
- Add polls ([Gargron](https://github.com/tootsuite/mastodon/pull/10111), [ThibG](https://github.com/tootsuite/mastodon/pull/10155), [Gargron](https://github.com/tootsuite/mastodon/pull/10184), [ThibG](https://github.com/tootsuite/mastodon/pull/10196), [Gargron](https://github.com/tootsuite/mastodon/pull/10248), [ThibG](https://github.com/tootsuite/mastodon/pull/10255), [ThibG](https://github.com/tootsuite/mastodon/pull/10322), [Gargron](https://github.com/tootsuite/mastodon/pull/10138), [Gargron](https://github.com/tootsuite/mastodon/pull/10139), [Gargron](https://github.com/tootsuite/mastodon/pull/10144), [Gargron](https://github.com/tootsuite/mastodon/pull/10145),[Gargron](https://github.com/tootsuite/mastodon/pull/10146), [Gargron](https://github.com/tootsuite/mastodon/pull/10148), [Gargron](https://github.com/tootsuite/mastodon/pull/10151), [ThibG](https://github.com/tootsuite/mastodon/pull/10150), [Gargron](https://github.com/tootsuite/mastodon/pull/10168), [Gargron](https://github.com/tootsuite/mastodon/pull/10165), [Gargron](https://github.com/tootsuite/mastodon/pull/10172), [Gargron](https://github.com/tootsuite/mastodon/pull/10170), [Gargron](https://github.com/tootsuite/mastodon/pull/10171), [Gargron](https://github.com/tootsuite/mastodon/pull/10186), [Gargron](https://github.com/tootsuite/mastodon/pull/10189), [ThibG](https://github.com/tootsuite/mastodon/pull/10200), [rinsuki](https://github.com/tootsuite/mastodon/pull/10203), [Gargron](https://github.com/tootsuite/mastodon/pull/10213), [Gargron](https://github.com/tootsuite/mastodon/pull/10246), [Gargron](https://github.com/tootsuite/mastodon/pull/10265), [Gargron](https://github.com/tootsuite/mastodon/pull/10261), [ThibG](https://github.com/tootsuite/mastodon/pull/10333), [Gargron](https://github.com/tootsuite/mastodon/pull/10352), [ThibG](https://github.com/tootsuite/mastodon/pull/10140), [ThibG](https://github.com/tootsuite/mastodon/pull/10142), [ThibG](https://github.com/tootsuite/mastodon/pull/10141), [ThibG](https://github.com/tootsuite/mastodon/pull/10162), [ThibG](https://github.com/tootsuite/mastodon/pull/10161), [ThibG](https://github.com/tootsuite/mastodon/pull/10158), [ThibG](https://github.com/tootsuite/mastodon/pull/10156), [ThibG](https://github.com/tootsuite/mastodon/pull/10160), [Gargron](https://github.com/tootsuite/mastodon/pull/10185), [Gargron](https://github.com/tootsuite/mastodon/pull/10188), [ThibG](https://github.com/tootsuite/mastodon/pull/10195), [ThibG](https://github.com/tootsuite/mastodon/pull/10208), [Gargron](https://github.com/tootsuite/mastodon/pull/10187), [ThibG](https://github.com/tootsuite/mastodon/pull/10214), [ThibG](https://github.com/tootsuite/mastodon/pull/10209))
|
|
||||||
- Add follows & followers managing UI ([Gargron](https://github.com/tootsuite/mastodon/pull/10268), [Gargron](https://github.com/tootsuite/mastodon/pull/10308), [Gargron](https://github.com/tootsuite/mastodon/pull/10404), [Gargron](https://github.com/tootsuite/mastodon/pull/10293))
|
|
||||||
- Add identity proof integration with Keybase ([Gargron](https://github.com/tootsuite/mastodon/pull/10297), [xgess](https://github.com/tootsuite/mastodon/pull/10375), [Gargron](https://github.com/tootsuite/mastodon/pull/10338), [Gargron](https://github.com/tootsuite/mastodon/pull/10350), [Gargron](https://github.com/tootsuite/mastodon/pull/10414))
|
|
||||||
- Add option to overwrite imported data instead of merging ([Gargron](https://github.com/tootsuite/mastodon/pull/9962))
|
|
||||||
- Add featured hashtags to profiles ([Gargron](https://github.com/tootsuite/mastodon/pull/9755), [Gargron](https://github.com/tootsuite/mastodon/pull/10167), [Gargron](https://github.com/tootsuite/mastodon/pull/10249), [ThibG](https://github.com/tootsuite/mastodon/pull/10034))
|
|
||||||
- Add admission-based registrations mode ([Gargron](https://github.com/tootsuite/mastodon/pull/10250), [ThibG](https://github.com/tootsuite/mastodon/pull/10269), [Gargron](https://github.com/tootsuite/mastodon/pull/10264), [ThibG](https://github.com/tootsuite/mastodon/pull/10321), [Gargron](https://github.com/tootsuite/mastodon/pull/10349), [Gargron](https://github.com/tootsuite/mastodon/pull/10469))
|
|
||||||
- Add support for WebP uploads ([acid-chicken](https://github.com/tootsuite/mastodon/pull/9879))
|
|
||||||
- Add "copy link" item to status action bars in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/9983))
|
|
||||||
- Add list title editing in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/9748))
|
|
||||||
- Add a "Block & Report" button to the block confirmation dialog in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/10360))
|
|
||||||
- Add disappointed elephant when the page crashes in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/10275))
|
|
||||||
- Add ability to upload multiple files at once in web UI ([tmm576](https://github.com/tootsuite/mastodon/pull/9856))
|
|
||||||
- Add indication when you are not allowed to follow an account in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/10420), [Gargron](https://github.com/tootsuite/mastodon/pull/10491))
|
|
||||||
- Add validations to admin settings to catch common mistakes ([Gargron](https://github.com/tootsuite/mastodon/pull/10348), [ThibG](https://github.com/tootsuite/mastodon/pull/10354))
|
|
||||||
- Add `type`, `limit`, `offset`, `min_id`, `max_id`, `account_id` to search API ([Gargron](https://github.com/tootsuite/mastodon/pull/10091))
|
|
||||||
- Add a preferences API so apps can share basic behaviours ([Gargron](https://github.com/tootsuite/mastodon/pull/10109))
|
|
||||||
- Add `visibility` param to reblog REST API ([Gargron](https://github.com/tootsuite/mastodon/pull/9851), [ThibG](https://github.com/tootsuite/mastodon/pull/10302))
|
|
||||||
- Add `allowfullscreen` attribute to OEmbed iframe ([rinsuki](https://github.com/tootsuite/mastodon/pull/10370))
|
|
||||||
- Add `blocked_by` relationship to the REST API ([Gargron](https://github.com/tootsuite/mastodon/pull/10373))
|
|
||||||
- Add `tootctl statuses remove` to sweep unreferenced statuses ([Gargron](https://github.com/tootsuite/mastodon/pull/10063))
|
|
||||||
- Add `tootctl search deploy` to avoid ugly rake task syntax ([Gargron](https://github.com/tootsuite/mastodon/pull/10403))
|
|
||||||
- Add `tootctl self-destruct` to shut down server gracefully ([Gargron](https://github.com/tootsuite/mastodon/pull/10367))
|
|
||||||
- Add option to hide application used to toot ([ThibG](https://github.com/tootsuite/mastodon/pull/9897), [rinsuki](https://github.com/tootsuite/mastodon/pull/9994), [hinaloe](https://github.com/tootsuite/mastodon/pull/10086))
|
|
||||||
- Add `DB_SSLMODE` configuration variable ([sascha-sl](https://github.com/tootsuite/mastodon/pull/10210))
|
|
||||||
- Add click-to-copy UI to invites page ([Gargron](https://github.com/tootsuite/mastodon/pull/10259))
|
|
||||||
- Add self-replies fetching ([ThibG](https://github.com/tootsuite/mastodon/pull/10106), [ThibG](https://github.com/tootsuite/mastodon/pull/10128), [ThibG](https://github.com/tootsuite/mastodon/pull/10175), [ThibG](https://github.com/tootsuite/mastodon/pull/10201))
|
|
||||||
- Add rate limit for media proxy requests ([Gargron](https://github.com/tootsuite/mastodon/pull/10490))
|
|
||||||
- Add `tootctl emoji purge` ([Gargron](https://github.com/tootsuite/mastodon/pull/10481))
|
|
||||||
- Add `tootctl accounts approve` ([Gargron](https://github.com/tootsuite/mastodon/pull/10480))
|
|
||||||
- Add `tootctl accounts reset-relationships` ([noellabo](https://github.com/tootsuite/mastodon/pull/10483))
|
|
||||||
|
|
||||||
### Changed
|
|
||||||
|
|
||||||
- Change design of landing page ([Gargron](https://github.com/tootsuite/mastodon/pull/10232), [Gargron](https://github.com/tootsuite/mastodon/pull/10260), [ThibG](https://github.com/tootsuite/mastodon/pull/10284), [ThibG](https://github.com/tootsuite/mastodon/pull/10291), [koyuawsmbrtn](https://github.com/tootsuite/mastodon/pull/10356), [Gargron](https://github.com/tootsuite/mastodon/pull/10245))
|
|
||||||
- Change design of profile column in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/10337), [Aditoo17](https://github.com/tootsuite/mastodon/pull/10387), [ThibG](https://github.com/tootsuite/mastodon/pull/10390), [mayaeh](https://github.com/tootsuite/mastodon/pull/10379), [ThibG](https://github.com/tootsuite/mastodon/pull/10411))
|
|
||||||
- Change language detector threshold from 140 characters to 4 words ([Gargron](https://github.com/tootsuite/mastodon/pull/10376))
|
|
||||||
- Change language detector to always kick in for non-latin alphabets ([Gargron](https://github.com/tootsuite/mastodon/pull/10276))
|
|
||||||
- Change icons of features on admin dashboard ([Gargron](https://github.com/tootsuite/mastodon/pull/10366))
|
|
||||||
- Change DNS timeouts from 1s to 5s ([ThibG](https://github.com/tootsuite/mastodon/pull/10238))
|
|
||||||
- Change Docker image to use Ubuntu with jemalloc ([Sir-Boops](https://github.com/tootsuite/mastodon/pull/10100), [BenLubar](https://github.com/tootsuite/mastodon/pull/10212))
|
|
||||||
- Change public pages to be cacheable by proxies ([BenLubar](https://github.com/tootsuite/mastodon/pull/9059))
|
|
||||||
- Change the 410 gone response for suspended accounts to be cacheable by proxies ([ThibG](https://github.com/tootsuite/mastodon/pull/10339))
|
|
||||||
- Change web UI to not not empty timeline of blocked users on block ([ThibG](https://github.com/tootsuite/mastodon/pull/10359))
|
|
||||||
- Change JSON serializer to remove unused `@context` values ([Gargron](https://github.com/tootsuite/mastodon/pull/10378))
|
|
||||||
- Change GIFV file size limit to be the same as for other videos ([rinsuki](https://github.com/tootsuite/mastodon/pull/9924))
|
|
||||||
- Change Webpack to not use @babel/preset-env to compile node_modules ([ykzts](https://github.com/tootsuite/mastodon/pull/10289))
|
|
||||||
- Change web UI to use new Web Share Target API ([gol-cha](https://github.com/tootsuite/mastodon/pull/9963))
|
|
||||||
- Change ActivityPub reports to have persistent URIs ([ThibG](https://github.com/tootsuite/mastodon/pull/10303))
|
|
||||||
- Change `tootctl accounts cull --dry-run` to list accounts that would be deleted ([BenLubar](https://github.com/tootsuite/mastodon/pull/10460))
|
|
||||||
- Change format of CSV exports of follows and mutes to include extra settings ([ThibG](https://github.com/tootsuite/mastodon/pull/10495), [ThibG](https://github.com/tootsuite/mastodon/pull/10335))
|
|
||||||
- Change ActivityPub collections to be cacheable by proxies ([ThibG](https://github.com/tootsuite/mastodon/pull/10467))
|
|
||||||
- Change REST API and public profiles to not return follows/followers for users that have blocked you ([Gargron](https://github.com/tootsuite/mastodon/pull/10491))
|
|
||||||
- Change the groupings of menu items in settings navigation ([Gargron](https://github.com/tootsuite/mastodon/pull/10533))
|
|
||||||
|
|
||||||
### Removed
|
|
||||||
|
|
||||||
- Remove zopfli compression to speed up Webpack from 6min to 1min ([nolanlawson](https://github.com/tootsuite/mastodon/pull/10288))
|
|
||||||
- Remove stats.json generation to speed up Webpack ([nolanlawson](https://github.com/tootsuite/mastodon/pull/10290))
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
|
|
||||||
- Fix public timelines being broken by new toots when they are not mounted in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/10131))
|
|
||||||
- Fix quick filter settings not being saved when selecting a different filter in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/10296))
|
|
||||||
- Fix remote interaction dialogs being indexed by search engines ([Gargron](https://github.com/tootsuite/mastodon/pull/10240))
|
|
||||||
- Fix maxed-out invites not showing up as expired in UI ([Gargron](https://github.com/tootsuite/mastodon/pull/10274))
|
|
||||||
- Fix scrollbar styles on compose textarea ([Gargron](https://github.com/tootsuite/mastodon/pull/10292))
|
|
||||||
- Fix timeline merge workers being queued for remote users ([Gargron](https://github.com/tootsuite/mastodon/pull/10355))
|
|
||||||
- Fix alternative relay support regression ([Gargron](https://github.com/tootsuite/mastodon/pull/10398))
|
|
||||||
- Fix trying to fetch keys of unknown accounts on a self-delete from them ([ThibG](https://github.com/tootsuite/mastodon/pull/10326))
|
|
||||||
- Fix CAS `:service_validate_url` option ([enewhuis](https://github.com/tootsuite/mastodon/pull/10328))
|
|
||||||
- Fix race conditions when creating backups ([ThibG](https://github.com/tootsuite/mastodon/pull/10234))
|
|
||||||
- Fix whitespace not being stripped out of username before validation ([aurelien-reeves](https://github.com/tootsuite/mastodon/pull/10239))
|
|
||||||
- Fix n+1 query when deleting status ([Gargron](https://github.com/tootsuite/mastodon/pull/10247))
|
|
||||||
- Fix exiting follows not being rejected when suspending a remote account ([ThibG](https://github.com/tootsuite/mastodon/pull/10230))
|
|
||||||
- Fix the underlying button element in a disabled icon button not being disabled ([ThibG](https://github.com/tootsuite/mastodon/pull/10194))
|
|
||||||
- Fix race condition when streaming out deleted statuses ([ThibG](https://github.com/tootsuite/mastodon/pull/10280))
|
|
||||||
- Fix performance of admin federation UI by caching account counts ([Gargron](https://github.com/tootsuite/mastodon/pull/10374))
|
|
||||||
- Fix JS error on pages that don't define a CSRF token ([hinaloe](https://github.com/tootsuite/mastodon/pull/10383))
|
|
||||||
- Fix `tootctl accounts cull` sometimes removing accounts that are temporarily unreachable ([BenLubar](https://github.com/tootsuite/mastodon/pull/10460))
|
|
||||||
|
|
||||||
## [2.7.4] - 2019-03-05
|
|
||||||
### Fixed
|
|
||||||
|
|
||||||
- Fix web UI not cleaning up notifications after block ([Gargron](https://github.com/tootsuite/mastodon/pull/10108))
|
|
||||||
- Fix redundant HTTP requests when resolving private statuses ([ThibG](https://github.com/tootsuite/mastodon/pull/10115))
|
|
||||||
- Fix performance of account media query ([abcang](https://github.com/tootsuite/mastodon/pull/10121))
|
|
||||||
- Fix mention processing for unknown accounts ([ThibG](https://github.com/tootsuite/mastodon/pull/10125))
|
|
||||||
- Fix getting started column not scrolling on short screens ([trwnh](https://github.com/tootsuite/mastodon/pull/10075))
|
|
||||||
- Fix direct messages pagination in the web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/10126))
|
|
||||||
- Fix serialization of Announce activities ([ThibG](https://github.com/tootsuite/mastodon/pull/10129))
|
|
||||||
- Fix home timeline perpetually reloading when empty in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/10130))
|
|
||||||
- Fix lists export ([ThibG](https://github.com/tootsuite/mastodon/pull/10136))
|
|
||||||
- Fix edit profile page crash for suspended-then-unsuspended users ([ThibG](https://github.com/tootsuite/mastodon/pull/10178))
|
|
||||||
|
|
||||||
## [2.7.3] - 2019-02-23
|
|
||||||
### Added
|
|
||||||
|
|
||||||
- Add domain filter to the admin federation page ([ThibG](https://github.com/tootsuite/mastodon/pull/10071))
|
|
||||||
- Add quick link from admin account view to block/unblock instance ([ThibG](https://github.com/tootsuite/mastodon/pull/10073))
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
|
|
||||||
- Fix video player width not being updated to fit container width ([ThibG](https://github.com/tootsuite/mastodon/pull/10069))
|
|
||||||
- Fix domain filter being shown in admin page when local filter is active ([ThibG](https://github.com/tootsuite/mastodon/pull/10074))
|
|
||||||
- Fix crash when conversations have no valid participants ([ThibG](https://github.com/tootsuite/mastodon/pull/10078))
|
|
||||||
- Fix error when performing admin actions on no statuses ([ThibG](https://github.com/tootsuite/mastodon/pull/10094))
|
|
||||||
|
|
||||||
### Changed
|
|
||||||
|
|
||||||
- Change custom emojis to randomize stored file name ([hinaloe](https://github.com/tootsuite/mastodon/pull/10090))
|
|
||||||
|
|
||||||
## [2.7.2] - 2019-02-17
|
|
||||||
### Added
|
|
||||||
|
|
||||||
- Add support for IPv6 in e-mail validation ([zoc](https://github.com/tootsuite/mastodon/pull/10009))
|
|
||||||
- Add record of IP address used for signing up ([ThibG](https://github.com/tootsuite/mastodon/pull/10026))
|
|
||||||
- Add tight rate-limit for API deletions (30 per 30 minutes) ([Gargron](https://github.com/tootsuite/mastodon/pull/10042))
|
|
||||||
- Add support for embedded `Announce` objects attributed to the same actor ([ThibG](https://github.com/tootsuite/mastodon/pull/9998), [Gargron](https://github.com/tootsuite/mastodon/pull/10065))
|
|
||||||
- Add spam filter for `Create` and `Announce` activities ([Gargron](https://github.com/tootsuite/mastodon/pull/10005), [Gargron](https://github.com/tootsuite/mastodon/pull/10041), [Gargron](https://github.com/tootsuite/mastodon/pull/10062))
|
|
||||||
- Add `registrations` attribute to `GET /api/v1/instance` ([Gargron](https://github.com/tootsuite/mastodon/pull/10060))
|
|
||||||
- Add `vapid_key` to `POST /api/v1/apps` and `GET /api/v1/apps/verify_credentials` ([Gargron](https://github.com/tootsuite/mastodon/pull/10058))
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
|
|
||||||
- Fix link color and add link underlines in high-contrast theme ([Gargron](https://github.com/tootsuite/mastodon/pull/9949), [Gargron](https://github.com/tootsuite/mastodon/pull/10028))
|
|
||||||
- Fix unicode characters in URLs not being linkified ([JMendyk](https://github.com/tootsuite/mastodon/pull/8447), [hinaloe](https://github.com/tootsuite/mastodon/pull/9991))
|
|
||||||
- Fix URLs linkifier grabbing ending quotation as part of the link ([Gargron](https://github.com/tootsuite/mastodon/pull/9997))
|
|
||||||
- Fix authorized applications page design ([rinsuki](https://github.com/tootsuite/mastodon/pull/9969))
|
|
||||||
- Fix custom emojis not showing up in share page emoji picker ([rinsuki](https://github.com/tootsuite/mastodon/pull/9970))
|
|
||||||
- Fix too liberal application of whitespace in toots ([trwnh](https://github.com/tootsuite/mastodon/pull/9968))
|
|
||||||
- Fix misleading e-mail hint being displayed in admin view ([ThibG](https://github.com/tootsuite/mastodon/pull/9973))
|
|
||||||
- Fix tombstones not being cleared out ([abcang](https://github.com/tootsuite/mastodon/pull/9978))
|
|
||||||
- Fix some timeline jumps ([ThibG](https://github.com/tootsuite/mastodon/pull/9982), [ThibG](https://github.com/tootsuite/mastodon/pull/10001), [rinsuki](https://github.com/tootsuite/mastodon/pull/10046))
|
|
||||||
- Fix content warning input taking keyboard focus even when hidden ([hinaloe](https://github.com/tootsuite/mastodon/pull/10017))
|
|
||||||
- Fix hashtags select styling in default and high-contrast themes ([Gargron](https://github.com/tootsuite/mastodon/pull/10029))
|
|
||||||
- Fix style regressions on landing page ([Gargron](https://github.com/tootsuite/mastodon/pull/10030))
|
|
||||||
- Fix hashtag column not subscribing to stream on mount ([Gargron](https://github.com/tootsuite/mastodon/pull/10040))
|
|
||||||
- Fix relay enabling/disabling not resetting inbox availability status ([Gargron](https://github.com/tootsuite/mastodon/pull/10048))
|
|
||||||
- Fix mutes, blocks, domain blocks and follow requests not paginating ([Gargron](https://github.com/tootsuite/mastodon/pull/10057))
|
|
||||||
- Fix crash on public hashtag pages when streaming fails ([ThibG](https://github.com/tootsuite/mastodon/pull/10061))
|
|
||||||
|
|
||||||
### Changed
|
|
||||||
|
|
||||||
- Change icon for unlisted visibility level ([clarcharr](https://github.com/tootsuite/mastodon/pull/9952))
|
|
||||||
- Change queue of actor deletes from push to pull for non-follower recipients ([ThibG](https://github.com/tootsuite/mastodon/pull/10016))
|
|
||||||
- Change robots.txt to exclude media proxy URLs ([nightpool](https://github.com/tootsuite/mastodon/pull/10038))
|
|
||||||
- Change upload description input to allow line breaks ([BenLubar](https://github.com/tootsuite/mastodon/pull/10036))
|
|
||||||
- Change `dist/mastodon-streaming.service` to recommend running node without intermediary npm command ([nolanlawson](https://github.com/tootsuite/mastodon/pull/10032))
|
|
||||||
- Change conversations to always show names of other participants ([Gargron](https://github.com/tootsuite/mastodon/pull/10047))
|
|
||||||
- Change buttons on timeline preview to open the interaction dialog ([Gargron](https://github.com/tootsuite/mastodon/pull/10054))
|
|
||||||
- Change error graphic to hover-to-play ([Gargron](https://github.com/tootsuite/mastodon/pull/10055))
|
|
||||||
|
|
||||||
## [2.7.1] - 2019-01-28
|
|
||||||
### Fixed
|
|
||||||
|
|
||||||
- Fix SSO authentication not working due to missing agreement boolean ([Gargron](https://github.com/tootsuite/mastodon/pull/9915))
|
|
||||||
- Fix slow fallback of CopyAccountStats migration setting stats to 0 ([Gargron](https://github.com/tootsuite/mastodon/pull/9930))
|
|
||||||
- Fix wrong command in migration error message ([angristan](https://github.com/tootsuite/mastodon/pull/9877))
|
|
||||||
- Fix initial value of volume slider in video player and handle volume changes ([ThibG](https://github.com/tootsuite/mastodon/pull/9929))
|
|
||||||
- Fix missing hotkeys for notifications ([ThibG](https://github.com/tootsuite/mastodon/pull/9927))
|
|
||||||
- Fix being able to attach unattached media created by other users ([ThibG](https://github.com/tootsuite/mastodon/pull/9921))
|
|
||||||
- Fix unrescued SSL error during link verification ([renatolond](https://github.com/tootsuite/mastodon/pull/9914))
|
|
||||||
- Fix Firefox scrollbar color regression ([trwnh](https://github.com/tootsuite/mastodon/pull/9908))
|
|
||||||
- Fix scheduled status with media immediately creating a status ([ThibG](https://github.com/tootsuite/mastodon/pull/9894))
|
|
||||||
- Fix missing strong style for landing page description ([Kjwon15](https://github.com/tootsuite/mastodon/pull/9892))
|
|
||||||
|
|
||||||
## [2.7.0] - 2019-01-20
|
|
||||||
### Added
|
|
||||||
|
|
||||||
- Add link for adding a user to a list from their profile ([namelessGonbai](https://github.com/tootsuite/mastodon/pull/9062))
|
|
||||||
- Add joining several hashtags in a single column ([gdpelican](https://github.com/tootsuite/mastodon/pull/8904))
|
|
||||||
- Add volume sliders for videos ([sumdog](https://github.com/tootsuite/mastodon/pull/9366))
|
|
||||||
- Add a tooltip explaining what a locked account is ([pawelngei](https://github.com/tootsuite/mastodon/pull/9403))
|
|
||||||
- Add preloaded cache for common JSON-LD contexts ([ThibG](https://github.com/tootsuite/mastodon/pull/9412))
|
|
||||||
- Add profile directory ([Gargron](https://github.com/tootsuite/mastodon/pull/9427))
|
|
||||||
- Add setting to not group reblogs in home feed ([ThibG](https://github.com/tootsuite/mastodon/pull/9248))
|
|
||||||
- Add admin ability to remove a user's header image ([ThibG](https://github.com/tootsuite/mastodon/pull/9495))
|
|
||||||
- Add account hashtags to ActivityPub actor JSON ([Gargron](https://github.com/tootsuite/mastodon/pull/9450))
|
|
||||||
- Add error message for avatar image that's too large ([sumdog](https://github.com/tootsuite/mastodon/pull/9518))
|
|
||||||
- Add notification quick-filter bar ([pawelngei](https://github.com/tootsuite/mastodon/pull/9399))
|
|
||||||
- Add new first-time tutorial ([Gargron](https://github.com/tootsuite/mastodon/pull/9531))
|
|
||||||
- Add moderation warnings ([Gargron](https://github.com/tootsuite/mastodon/pull/9519))
|
|
||||||
- Add emoji codepoint mappings for v11.0 ([Gargron](https://github.com/tootsuite/mastodon/pull/9618))
|
|
||||||
- Add REST API for creating an account ([Gargron](https://github.com/tootsuite/mastodon/pull/9572))
|
|
||||||
- Add support for Malayalam in language filter ([tachyons](https://github.com/tootsuite/mastodon/pull/9624))
|
|
||||||
- Add exclude_reblogs option to account statuses API ([Gargron](https://github.com/tootsuite/mastodon/pull/9640))
|
|
||||||
- Add local followers page to admin account UI ([chr-1x](https://github.com/tootsuite/mastodon/pull/9610))
|
|
||||||
- Add healthcheck commands to docker-compose.yml ([BenLubar](https://github.com/tootsuite/mastodon/pull/9143))
|
|
||||||
- Add handler for Move activity to migrate followers ([Gargron](https://github.com/tootsuite/mastodon/pull/9629))
|
|
||||||
- Add CSV export for lists and domain blocks ([Gargron](https://github.com/tootsuite/mastodon/pull/9677))
|
|
||||||
- Add `tootctl accounts follow ACCT` ([Gargron](https://github.com/tootsuite/mastodon/pull/9414))
|
|
||||||
- Add scheduled statuses ([Gargron](https://github.com/tootsuite/mastodon/pull/9706))
|
|
||||||
- Add immutable caching for S3 objects ([nolanlawson](https://github.com/tootsuite/mastodon/pull/9722))
|
|
||||||
- Add cache to custom emojis API ([Gargron](https://github.com/tootsuite/mastodon/pull/9732))
|
|
||||||
- Add preview cards to non-detailed statuses on public pages ([Gargron](https://github.com/tootsuite/mastodon/pull/9714))
|
|
||||||
- Add `mod` and `moderator` to list of default reserved usernames ([Gargron](https://github.com/tootsuite/mastodon/pull/9713))
|
|
||||||
- Add quick links to the admin interface in the web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/8545))
|
|
||||||
- Add `tootctl domains crawl` ([Gargron](https://github.com/tootsuite/mastodon/pull/9809))
|
|
||||||
- Add attachment list fallback to public pages ([ThibG](https://github.com/tootsuite/mastodon/pull/9780))
|
|
||||||
- Add `tootctl --version` ([Gargron](https://github.com/tootsuite/mastodon/pull/9835))
|
|
||||||
- Add information about how to opt-in to the directory on the directory ([Gargron](https://github.com/tootsuite/mastodon/pull/9834))
|
|
||||||
- Add timeouts for S3 ([Gargron](https://github.com/tootsuite/mastodon/pull/9842))
|
|
||||||
- Add support for non-public reblogs from ActivityPub ([Gargron](https://github.com/tootsuite/mastodon/pull/9841))
|
|
||||||
- Add sending of `Reject` activity when sending a `Block` activity ([ThibG](https://github.com/tootsuite/mastodon/pull/9811))
|
|
||||||
|
|
||||||
### Changed
|
|
||||||
|
|
||||||
- Temporarily pause timeline if mouse moved recently ([lmorchard](https://github.com/tootsuite/mastodon/pull/9200))
|
|
||||||
- Change the password form order ([mayaeh](https://github.com/tootsuite/mastodon/pull/9267))
|
|
||||||
- Redesign admin UI for accounts ([Gargron](https://github.com/tootsuite/mastodon/pull/9340), [Gargron](https://github.com/tootsuite/mastodon/pull/9643))
|
|
||||||
- Redesign admin UI for instances/domain blocks ([Gargron](https://github.com/tootsuite/mastodon/pull/9645))
|
|
||||||
- Swap avatar and header input fields in profile page ([ThibG](https://github.com/tootsuite/mastodon/pull/9271))
|
|
||||||
- When posting in mobile mode, go back to previous history location ([ThibG](https://github.com/tootsuite/mastodon/pull/9502))
|
|
||||||
- Split out is_changing_upload from is_submitting ([ThibG](https://github.com/tootsuite/mastodon/pull/9536))
|
|
||||||
- Back to the getting-started when pins the timeline. ([kedamaDQ](https://github.com/tootsuite/mastodon/pull/9561))
|
|
||||||
- Allow unauthenticated REST API access to GET /api/v1/accounts/:id/statuses ([Gargron](https://github.com/tootsuite/mastodon/pull/9573))
|
|
||||||
- Limit maximum visibility of local silenced users to unlisted ([ThibG](https://github.com/tootsuite/mastodon/pull/9583))
|
|
||||||
- Change API error message for unconfirmed accounts ([noellabo](https://github.com/tootsuite/mastodon/pull/9625))
|
|
||||||
- Change the icon to "reply-all" when it's a reply to other accounts ([mayaeh](https://github.com/tootsuite/mastodon/pull/9378))
|
|
||||||
- Do not ignore federated reports targetting already-reported accounts ([ThibG](https://github.com/tootsuite/mastodon/pull/9534))
|
|
||||||
- Upgrade default Ruby version to 2.6.0 ([Gargron](https://github.com/tootsuite/mastodon/pull/9688))
|
|
||||||
- Change e-mail digest frequency ([Gargron](https://github.com/tootsuite/mastodon/pull/9689))
|
|
||||||
- Change Docker images for Tor support in docker-compose.yml ([Sir-Boops](https://github.com/tootsuite/mastodon/pull/9438))
|
|
||||||
- Display fallback link card thumbnail when none is given ([Gargron](https://github.com/tootsuite/mastodon/pull/9715))
|
|
||||||
- Change account bio length validation to ignore mention domains and URLs ([Gargron](https://github.com/tootsuite/mastodon/pull/9717))
|
|
||||||
- Use configured contact user for "anonymous" federation activities ([yukimochi](https://github.com/tootsuite/mastodon/pull/9661))
|
|
||||||
- Change remote interaction dialog to use specific actions instead of generic "interact" ([Gargron](https://github.com/tootsuite/mastodon/pull/9743))
|
|
||||||
- Always re-fetch public key when signature verification fails to support blind key rotation ([ThibG](https://github.com/tootsuite/mastodon/pull/9667))
|
|
||||||
- Make replies to boosts impossible, connect reply to original status instead ([valerauko](https://github.com/tootsuite/mastodon/pull/9129))
|
|
||||||
- Change e-mail MX validation to check both A and MX records against blacklist ([Gargron](https://github.com/tootsuite/mastodon/pull/9489))
|
|
||||||
- Hide floating action button on search and getting started pages ([tmm576](https://github.com/tootsuite/mastodon/pull/9826))
|
|
||||||
- Redesign public hashtag page to use a masonry layout ([Gargron](https://github.com/tootsuite/mastodon/pull/9822))
|
|
||||||
- Use `summary` as summary instead of content warning for converted ActivityPub objects ([Gargron](https://github.com/tootsuite/mastodon/pull/9823))
|
|
||||||
- Display a double reply arrow on public pages for toots that are replies ([ThibG](https://github.com/tootsuite/mastodon/pull/9808))
|
|
||||||
- Change admin UI right panel size to be wider ([Kjwon15](https://github.com/tootsuite/mastodon/pull/9768))
|
|
||||||
|
|
||||||
### Removed
|
|
||||||
|
|
||||||
- Remove links to bridge.joinmastodon.org (non-functional) ([Gargron](https://github.com/tootsuite/mastodon/pull/9608))
|
|
||||||
- Remove LD-Signatures from activities that do not need them ([ThibG](https://github.com/tootsuite/mastodon/pull/9659))
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
|
|
||||||
- Remove unused computation of reblog references from updateTimeline ([ThibG](https://github.com/tootsuite/mastodon/pull/9244))
|
|
||||||
- Fix loaded embeds resetting if a status arrives from API again ([ThibG](https://github.com/tootsuite/mastodon/pull/9270))
|
|
||||||
- Fix race condition causing shallow status with only a "favourited" attribute ([ThibG](https://github.com/tootsuite/mastodon/pull/9272))
|
|
||||||
- Remove intermediary arrays when creating hash maps from results ([Gargron](https://github.com/tootsuite/mastodon/pull/9291))
|
|
||||||
- Extract counters from accounts table to account_stats table to improve performance ([Gargron](https://github.com/tootsuite/mastodon/pull/9295))
|
|
||||||
- Change identities id column to a bigint ([Gargron](https://github.com/tootsuite/mastodon/pull/9371))
|
|
||||||
- Fix conversations API pagination ([ThibG](https://github.com/tootsuite/mastodon/pull/9407))
|
|
||||||
- Improve account suspension speed and completeness ([Gargron](https://github.com/tootsuite/mastodon/pull/9290))
|
|
||||||
- Fix thread depth computation in statuses_controller ([ThibG](https://github.com/tootsuite/mastodon/pull/9426))
|
|
||||||
- Fix database deadlocks by moving account stats update outside transaction ([ThibG](https://github.com/tootsuite/mastodon/pull/9437))
|
|
||||||
- Escape HTML in profile name preview in profile settings ([pawelngei](https://github.com/tootsuite/mastodon/pull/9446))
|
|
||||||
- Use same CORS policy for /@:username and /users/:username ([ThibG](https://github.com/tootsuite/mastodon/pull/9485))
|
|
||||||
- Make custom emoji domains case insensitive ([Esteth](https://github.com/tootsuite/mastodon/pull/9474))
|
|
||||||
- Various fixes to scrollable lists and media gallery ([ThibG](https://github.com/tootsuite/mastodon/pull/9501))
|
|
||||||
- Fix bootsnap cache directory being declared relatively ([Gargron](https://github.com/tootsuite/mastodon/pull/9511))
|
|
||||||
- Fix timeline pagination in the web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/9516))
|
|
||||||
- Fix padding on dropdown elements in preferences ([ThibG](https://github.com/tootsuite/mastodon/pull/9517))
|
|
||||||
- Make avatar and headers respect GIF autoplay settings ([ThibG](https://github.com/tootsuite/mastodon/pull/9515))
|
|
||||||
- Do no retry Web Push workers if the server returns a 4xx response ([Gargron](https://github.com/tootsuite/mastodon/pull/9434))
|
|
||||||
- Minor scrollable list fixes ([ThibG](https://github.com/tootsuite/mastodon/pull/9551))
|
|
||||||
- Ignore low-confidence CharlockHolmes guesses when parsing link cards ([ThibG](https://github.com/tootsuite/mastodon/pull/9510))
|
|
||||||
- Fix `tootctl accounts rotate` not updating public keys ([Gargron](https://github.com/tootsuite/mastodon/pull/9556))
|
|
||||||
- Fix CSP / X-Frame-Options for media players ([jomo](https://github.com/tootsuite/mastodon/pull/9558))
|
|
||||||
- Fix unnecessary loadMore calls when the end of a timeline has been reached ([ThibG](https://github.com/tootsuite/mastodon/pull/9581))
|
|
||||||
- Skip mailer job retries when a record no longer exists ([Gargron](https://github.com/tootsuite/mastodon/pull/9590))
|
|
||||||
- Fix composer not getting focus after reply confirmation dialog ([ThibG](https://github.com/tootsuite/mastodon/pull/9602))
|
|
||||||
- Fix signature verification stoplight triggering on non-timeout errors ([Gargron](https://github.com/tootsuite/mastodon/pull/9617))
|
|
||||||
- Fix ThreadResolveWorker getting queued with invalid URLs ([Gargron](https://github.com/tootsuite/mastodon/pull/9628))
|
|
||||||
- Fix crash when clearing uninitialized timeline ([ThibG](https://github.com/tootsuite/mastodon/pull/9662))
|
|
||||||
- Avoid duplicate work by merging ReplyDistributionWorker into DistributionWorker ([ThibG](https://github.com/tootsuite/mastodon/pull/9660))
|
|
||||||
- Skip full text search if it fails, instead of erroring out completely ([Kjwon15](https://github.com/tootsuite/mastodon/pull/9654))
|
|
||||||
- Fix profile metadata links not verifying correctly sometimes ([shrft](https://github.com/tootsuite/mastodon/pull/9673))
|
|
||||||
- Ensure blocked user unfollows blocker if Block/Undo-Block activities are processed out of order ([ThibG](https://github.com/tootsuite/mastodon/pull/9687))
|
|
||||||
- Fix unreadable text color in report modal for some statuses ([Gargron](https://github.com/tootsuite/mastodon/pull/9716))
|
|
||||||
- Stop GIFV timeline preview explicitly when it's opened in modal ([kedamaDQ](https://github.com/tootsuite/mastodon/pull/9749))
|
|
||||||
- Fix scrollbar width compensation ([ThibG](https://github.com/tootsuite/mastodon/pull/9824))
|
|
||||||
- Fix race conditions when processing deleted toots ([ThibG](https://github.com/tootsuite/mastodon/pull/9815))
|
|
||||||
- Fix SSO issues on WebKit browsers by disabling Same-Site cookie again ([moritzheiber](https://github.com/tootsuite/mastodon/pull/9819))
|
|
||||||
- Fix empty OEmbed error ([renatolond](https://github.com/tootsuite/mastodon/pull/9807))
|
|
||||||
- Fix drag & drop modal not disappearing sometimes ([hinaloe](https://github.com/tootsuite/mastodon/pull/9797))
|
|
||||||
- Fix statuses with content warnings being displayed in web push notifications sometimes ([ThibG](https://github.com/tootsuite/mastodon/pull/9778))
|
|
||||||
- Fix scroll-to-detailed status not working on public pages ([ThibG](https://github.com/tootsuite/mastodon/pull/9773))
|
|
||||||
- Fix media modal loading indicator ([ThibG](https://github.com/tootsuite/mastodon/pull/9771))
|
|
||||||
- Fix hashtag search results not having a permalink fallback in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/9810))
|
|
||||||
- Fix slightly cropped font on settings page dropdowns when using system font ([ariasuni](https://github.com/tootsuite/mastodon/pull/9839))
|
|
||||||
- Fix not being able to drag & drop text into forms ([tmm576](https://github.com/tootsuite/mastodon/pull/9840))
|
|
||||||
|
|
||||||
### Security
|
|
||||||
|
|
||||||
- Sanitize and sandbox toot embeds in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/9552))
|
|
||||||
- Add tombstones for remote statuses to prevent replay attacks ([ThibG](https://github.com/tootsuite/mastodon/pull/9830))
|
|
||||||
|
|
||||||
## [2.6.5] - 2018-12-01
|
|
||||||
### Changed
|
|
||||||
|
|
||||||
- Change lists to display replies to others on the list and list owner ([ThibG](https://github.com/tootsuite/mastodon/pull/9324))
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
|
|
||||||
- Fix failures caused by commonly-used JSON-LD contexts being unavailable ([ThibG](https://github.com/tootsuite/mastodon/pull/9412))
|
|
||||||
|
|
||||||
## [2.6.4] - 2018-11-30
|
|
||||||
### Fixed
|
|
||||||
|
|
||||||
- Fix yarn dependencies not installing due to yanked event-stream package ([Gargron](https://github.com/tootsuite/mastodon/pull/9401))
|
|
||||||
|
|
||||||
## [2.6.3] - 2018-11-30
|
|
||||||
### Added
|
|
||||||
|
|
||||||
- Add hyphen to characters allowed in remote usernames ([ThibG](https://github.com/tootsuite/mastodon/pull/9345))
|
|
||||||
|
|
||||||
### Changed
|
|
||||||
|
|
||||||
- Change server user count to exclude suspended accounts ([Gargron](https://github.com/tootsuite/mastodon/pull/9380))
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
|
|
||||||
- Fix ffmpeg processing sometimes stalling due to overfilled stdout buffer ([hugogameiro](https://github.com/tootsuite/mastodon/pull/9368))
|
|
||||||
- Fix missing DNS records raising the wrong kind of exception ([Gargron](https://github.com/tootsuite/mastodon/pull/9379))
|
|
||||||
- Fix already queued deliveries still trying to reach inboxes marked as unavailable ([Gargron](https://github.com/tootsuite/mastodon/pull/9358))
|
|
||||||
|
|
||||||
### Security
|
|
||||||
|
|
||||||
- Fix TLS handshake timeout not being enforced ([Gargron](https://github.com/tootsuite/mastodon/pull/9381))
|
|
||||||
|
|
||||||
## [2.6.2] - 2018-11-23
|
|
||||||
### Added
|
|
||||||
|
|
||||||
- Add Page to whitelisted ActivityPub types ([mbajur](https://github.com/tootsuite/mastodon/pull/9188))
|
|
||||||
- Add 20px to column width in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/9227))
|
|
||||||
- Add amount of freed disk space in `tootctl media remove` ([Gargron](https://github.com/tootsuite/mastodon/pull/9229), [Gargron](https://github.com/tootsuite/mastodon/pull/9239), [mayaeh](https://github.com/tootsuite/mastodon/pull/9288))
|
|
||||||
- Add "Show thread" link to self-replies ([Gargron](https://github.com/tootsuite/mastodon/pull/9228))
|
|
||||||
|
|
||||||
### Changed
|
|
||||||
|
|
||||||
- Change order of Atom and RSS links so Atom is first ([Alkarex](https://github.com/tootsuite/mastodon/pull/9302))
|
|
||||||
- Change Nginx configuration for Nanobox apps ([danhunsaker](https://github.com/tootsuite/mastodon/pull/9310))
|
|
||||||
- Change the follow action to appear instant in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/9220))
|
|
||||||
- Change how the ActiveRecord connection is instantiated in on_worker_boot ([Gargron](https://github.com/tootsuite/mastodon/pull/9238))
|
|
||||||
- Change `tootctl accounts cull` to always touch accounts so they can be skipped ([renatolond](https://github.com/tootsuite/mastodon/pull/9293))
|
|
||||||
- Change mime type comparison to ignore JSON-LD profile ([valerauko](https://github.com/tootsuite/mastodon/pull/9179))
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
|
|
||||||
- Fix web UI crash when conversation has no last status ([sammy8806](https://github.com/tootsuite/mastodon/pull/9207))
|
|
||||||
- Fix follow limit validator reporting lower number past threshold ([Gargron](https://github.com/tootsuite/mastodon/pull/9230))
|
|
||||||
- Fix form validation flash message color and input borders ([Gargron](https://github.com/tootsuite/mastodon/pull/9235))
|
|
||||||
- Fix invalid twitter:player cards being displayed ([ThibG](https://github.com/tootsuite/mastodon/pull/9254))
|
|
||||||
- Fix emoji update date being processed incorrectly ([ThibG](https://github.com/tootsuite/mastodon/pull/9255))
|
|
||||||
- Fix playing embed resetting if status is reloaded in web UI ([ThibG](https://github.com/tootsuite/mastodon/pull/9270), [Gargron](https://github.com/tootsuite/mastodon/pull/9275))
|
|
||||||
- Fix web UI crash when favouriting a deleted status ([ThibG](https://github.com/tootsuite/mastodon/pull/9272))
|
|
||||||
- Fix intermediary arrays being created for hash maps ([Gargron](https://github.com/tootsuite/mastodon/pull/9291))
|
|
||||||
- Fix filter ID not being a string in REST API ([Gargron](https://github.com/tootsuite/mastodon/pull/9303))
|
|
||||||
|
|
||||||
### Security
|
|
||||||
|
|
||||||
- Fix multiple remote account deletions being able to deadlock the database ([Gargron](https://github.com/tootsuite/mastodon/pull/9292))
|
|
||||||
- Fix HTTP connection timeout of 10s not being enforced ([Gargron](https://github.com/tootsuite/mastodon/pull/9329))
|
|
||||||
|
|
||||||
## [2.6.1] - 2018-10-30
|
|
||||||
### Fixed
|
|
||||||
|
|
||||||
- Fix resolving resources by URL not working due to a regression in [valerauko](https://github.com/tootsuite/mastodon/pull/9132) ([Gargron](https://github.com/tootsuite/mastodon/pull/9171))
|
|
||||||
- Fix reducer error in web UI when a conversation has no last status ([Gargron](https://github.com/tootsuite/mastodon/pull/9173))
|
|
||||||
|
|
||||||
## [2.6.0] - 2018-10-30
|
|
||||||
### Added
|
|
||||||
|
|
||||||
- Add link ownership verification ([Gargron](https://github.com/tootsuite/mastodon/pull/8703))
|
|
||||||
- Add conversations API ([Gargron](https://github.com/tootsuite/mastodon/pull/8832))
|
|
||||||
- Add limit for the number of people that can be followed from one account ([Gargron](https://github.com/tootsuite/mastodon/pull/8807))
|
|
||||||
- Add admin setting to customize mascot ([ashleyhull-versent](https://github.com/tootsuite/mastodon/pull/8766))
|
|
||||||
- Add support for more granular ActivityPub audiences from other software, i.e. circles ([Gargron](https://github.com/tootsuite/mastodon/pull/8950), [Gargron](https://github.com/tootsuite/mastodon/pull/9093), [Gargron](https://github.com/tootsuite/mastodon/pull/9150))
|
|
||||||
- Add option to block all reports from a domain ([Gargron](https://github.com/tootsuite/mastodon/pull/8830))
|
|
||||||
- Add user preference to always expand toots marked with content warnings ([webroo](https://github.com/tootsuite/mastodon/pull/8762))
|
|
||||||
- Add user preference to always hide all media ([fvh-P](https://github.com/tootsuite/mastodon/pull/8569))
|
|
||||||
- Add `force_login` param to OAuth authorize page ([Gargron](https://github.com/tootsuite/mastodon/pull/8655))
|
|
||||||
- Add `tootctl accounts backup` ([Gargron](https://github.com/tootsuite/mastodon/pull/8642), [Gargron](https://github.com/tootsuite/mastodon/pull/8811))
|
|
||||||
- Add `tootctl accounts create` ([Gargron](https://github.com/tootsuite/mastodon/pull/8642), [Gargron](https://github.com/tootsuite/mastodon/pull/8811))
|
|
||||||
- Add `tootctl accounts cull` ([Gargron](https://github.com/tootsuite/mastodon/pull/8642), [Gargron](https://github.com/tootsuite/mastodon/pull/8811))
|
|
||||||
- Add `tootctl accounts delete` ([Gargron](https://github.com/tootsuite/mastodon/pull/8642), [Gargron](https://github.com/tootsuite/mastodon/pull/8811))
|
|
||||||
- Add `tootctl accounts modify` ([Gargron](https://github.com/tootsuite/mastodon/pull/8642), [Gargron](https://github.com/tootsuite/mastodon/pull/8811))
|
|
||||||
- Add `tootctl accounts refresh` ([Gargron](https://github.com/tootsuite/mastodon/pull/8642), [Gargron](https://github.com/tootsuite/mastodon/pull/8811))
|
|
||||||
- Add `tootctl feeds build` ([Gargron](https://github.com/tootsuite/mastodon/pull/8642), [Gargron](https://github.com/tootsuite/mastodon/pull/8811))
|
|
||||||
- Add `tootctl feeds clear` ([Gargron](https://github.com/tootsuite/mastodon/pull/8642), [Gargron](https://github.com/tootsuite/mastodon/pull/8811))
|
|
||||||
- Add `tootctl settings registrations open` ([Gargron](https://github.com/tootsuite/mastodon/pull/8642), [Gargron](https://github.com/tootsuite/mastodon/pull/8811))
|
|
||||||
- Add `tootctl settings registrations close` ([Gargron](https://github.com/tootsuite/mastodon/pull/8642), [Gargron](https://github.com/tootsuite/mastodon/pull/8811))
|
|
||||||
- Add `min_id` param to REST API to support backwards pagination ([Gargron](https://github.com/tootsuite/mastodon/pull/8736))
|
|
||||||
- Add a confirmation dialog when hitting reply and the compose box isn't empty ([ThibG](https://github.com/tootsuite/mastodon/pull/8893))
|
|
||||||
- Add PostgreSQL disk space growth tracking in PGHero ([Gargron](https://github.com/tootsuite/mastodon/pull/8906))
|
|
||||||
- Add button for disabling local account to report quick actions bar ([Gargron](https://github.com/tootsuite/mastodon/pull/9024))
|
|
||||||
- Add Czech language ([Aditoo17](https://github.com/tootsuite/mastodon/pull/8594))
|
|
||||||
- Add `same-site` (`lax`) attribute to cookies ([sorin-davidoi](https://github.com/tootsuite/mastodon/pull/8626))
|
|
||||||
- Add support for styled scrollbars in Firefox Nightly ([sorin-davidoi](https://github.com/tootsuite/mastodon/pull/8653))
|
|
||||||
- Add highlight to the active tab in web UI profiles ([rhoio](https://github.com/tootsuite/mastodon/pull/8673))
|
|
||||||
- Add auto-focus for comment textarea in report modal ([ThibG](https://github.com/tootsuite/mastodon/pull/8689))
|
|
||||||
- Add auto-focus for emoji picker's search field ([ThibG](https://github.com/tootsuite/mastodon/pull/8688))
|
|
||||||
- Add nginx and systemd templates to `dist/` directory ([Gargron](https://github.com/tootsuite/mastodon/pull/8770))
|
|
||||||
- Add support for `/.well-known/change-password` ([Gargron](https://github.com/tootsuite/mastodon/pull/8828))
|
|
||||||
- Add option to override FFMPEG binary path ([sascha-sl](https://github.com/tootsuite/mastodon/pull/8855))
|
|
||||||
- Add `dns-prefetch` tag when using different host for assets or uploads ([Gargron](https://github.com/tootsuite/mastodon/pull/8942))
|
|
||||||
- Add `description` meta tag ([Gargron](https://github.com/tootsuite/mastodon/pull/8941))
|
|
||||||
- Add `Content-Security-Policy` header ([ThibG](https://github.com/tootsuite/mastodon/pull/8957))
|
|
||||||
- Add cache for the instance info API ([ykzts](https://github.com/tootsuite/mastodon/pull/8765))
|
|
||||||
- Add suggested follows to search screen in mobile layout ([Gargron](https://github.com/tootsuite/mastodon/pull/9010))
|
|
||||||
- Add CORS header to `/.well-known/*` routes ([BenLubar](https://github.com/tootsuite/mastodon/pull/9083))
|
|
||||||
- Add `card` attribute to statuses returned from REST API ([Gargron](https://github.com/tootsuite/mastodon/pull/9120))
|
|
||||||
- Add in-stream link preview ([Gargron](https://github.com/tootsuite/mastodon/pull/9120))
|
|
||||||
- Add support for ActivityPub `Page` objects ([mbajur](https://github.com/tootsuite/mastodon/pull/9121))
|
|
||||||
|
|
||||||
### Changed
|
|
||||||
|
|
||||||
- Change forms design ([Gargron](https://github.com/tootsuite/mastodon/pull/8703))
|
|
||||||
- Change reports overview to group by target account ([Gargron](https://github.com/tootsuite/mastodon/pull/8674))
|
|
||||||
- Change web UI to show "read more" link on overly long in-stream statuses ([lanodan](https://github.com/tootsuite/mastodon/pull/8205))
|
|
||||||
- Change design of direct messages column ([Gargron](https://github.com/tootsuite/mastodon/pull/8832), [Gargron](https://github.com/tootsuite/mastodon/pull/9022))
|
|
||||||
- Change home timelines to exclude DMs ([Gargron](https://github.com/tootsuite/mastodon/pull/8940))
|
|
||||||
- Change list timelines to exclude all replies ([cbayerlein](https://github.com/tootsuite/mastodon/pull/8683))
|
|
||||||
- Change admin accounts UI default sort to most recent ([Gargron](https://github.com/tootsuite/mastodon/pull/8813))
|
|
||||||
- Change documentation URL in the UI ([Gargron](https://github.com/tootsuite/mastodon/pull/8898))
|
|
||||||
- Change style of success and failure messages ([Gargron](https://github.com/tootsuite/mastodon/pull/8973))
|
|
||||||
- Change DM filtering to always allow DMs from staff ([qguv](https://github.com/tootsuite/mastodon/pull/8993))
|
|
||||||
- Change recommended Ruby version to 2.5.3 ([zunda](https://github.com/tootsuite/mastodon/pull/9003))
|
|
||||||
- Change docker-compose default to persist volumes in current directory ([Gargron](https://github.com/tootsuite/mastodon/pull/9055))
|
|
||||||
- Change character counters on edit profile page to input length limit ([Gargron](https://github.com/tootsuite/mastodon/pull/9100))
|
|
||||||
- Change notification filtering to always let through messages from staff ([Gargron](https://github.com/tootsuite/mastodon/pull/9152))
|
|
||||||
- Change "hide boosts from user" function also hiding notifications about boosts ([ThibG](https://github.com/tootsuite/mastodon/pull/9147))
|
|
||||||
- Change CSS `detailed-status__wrapper` class actually wrap the detailed status ([trwnh](https://github.com/tootsuite/mastodon/pull/8547))
|
|
||||||
|
|
||||||
### Deprecated
|
|
||||||
|
|
||||||
- `GET /api/v1/timelines/direct` → `GET /api/v1/conversations` ([Gargron](https://github.com/tootsuite/mastodon/pull/8832))
|
|
||||||
- `POST /api/v1/notifications/dismiss` → `POST /api/v1/notifications/:id/dismiss` ([Gargron](https://github.com/tootsuite/mastodon/pull/8905))
|
|
||||||
- `GET /api/v1/statuses/:id/card` → `card` attributed included in status ([Gargron](https://github.com/tootsuite/mastodon/pull/9120))
|
|
||||||
|
|
||||||
### Removed
|
|
||||||
|
|
||||||
- Remove "on this device" label in column push settings ([rhoio](https://github.com/tootsuite/mastodon/pull/8704))
|
|
||||||
- Remove rake tasks in favour of tootctl commands ([Gargron](https://github.com/tootsuite/mastodon/pull/8675))
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
|
|
||||||
- Fix remote statuses using instance's default locale if no language given ([Kjwon15](https://github.com/tootsuite/mastodon/pull/8861))
|
|
||||||
- Fix streaming API not exiting when port or socket is unavailable ([Gargron](https://github.com/tootsuite/mastodon/pull/9023))
|
|
||||||
- Fix network calls being performed in database transaction in ActivityPub handler ([Gargron](https://github.com/tootsuite/mastodon/pull/8951))
|
|
||||||
- Fix dropdown arrow position ([ThibG](https://github.com/tootsuite/mastodon/pull/8637))
|
|
||||||
- Fix first element of dropdowns being focused even if not using keyboard ([ThibG](https://github.com/tootsuite/mastodon/pull/8679))
|
|
||||||
- Fix tootctl requiring `bundle exec` invocation ([abcang](https://github.com/tootsuite/mastodon/pull/8619))
|
|
||||||
- Fix public pages not using animation preference for avatars ([renatolond](https://github.com/tootsuite/mastodon/pull/8614))
|
|
||||||
- Fix OEmbed/OpenGraph cards not understanding relative URLs ([ThibG](https://github.com/tootsuite/mastodon/pull/8669))
|
|
||||||
- Fix some dark emojis not having a white outline ([ThibG](https://github.com/tootsuite/mastodon/pull/8597))
|
|
||||||
- Fix media description not being displayed in various media modals ([ThibG](https://github.com/tootsuite/mastodon/pull/8678))
|
|
||||||
- Fix generated URLs of desktop notifications missing base URL ([GenbuHase](https://github.com/tootsuite/mastodon/pull/8758))
|
|
||||||
- Fix RTL styles ([mabkenar](https://github.com/tootsuite/mastodon/pull/8764), [mabkenar](https://github.com/tootsuite/mastodon/pull/8767), [mabkenar](https://github.com/tootsuite/mastodon/pull/8823), [mabkenar](https://github.com/tootsuite/mastodon/pull/8897), [mabkenar](https://github.com/tootsuite/mastodon/pull/9005), [mabkenar](https://github.com/tootsuite/mastodon/pull/9007), [mabkenar](https://github.com/tootsuite/mastodon/pull/9018), [mabkenar](https://github.com/tootsuite/mastodon/pull/9021), [mabkenar](https://github.com/tootsuite/mastodon/pull/9145), [mabkenar](https://github.com/tootsuite/mastodon/pull/9146))
|
|
||||||
- Fix crash in streaming API when tag param missing ([Gargron](https://github.com/tootsuite/mastodon/pull/8955))
|
|
||||||
- Fix hotkeys not working when no element is focused ([ThibG](https://github.com/tootsuite/mastodon/pull/8998))
|
|
||||||
- Fix some hotkeys not working on detailed status view ([ThibG](https://github.com/tootsuite/mastodon/pull/9006))
|
|
||||||
- Fix og:url on status pages ([ThibG](https://github.com/tootsuite/mastodon/pull/9047))
|
|
||||||
- Fix upload option buttons only being visible on hover ([Gargron](https://github.com/tootsuite/mastodon/pull/9074))
|
|
||||||
- Fix tootctl not returning exit code 1 on wrong arguments ([sascha-sl](https://github.com/tootsuite/mastodon/pull/9094))
|
|
||||||
- Fix preview cards for appearing for profiles mentioned in toot ([ThibG](https://github.com/tootsuite/mastodon/pull/6934), [ThibG](https://github.com/tootsuite/mastodon/pull/9158))
|
|
||||||
- Fix local accounts sometimes being duplicated as faux-remote ([Gargron](https://github.com/tootsuite/mastodon/pull/9109))
|
|
||||||
- Fix emoji search when the shortcode has multiple separators ([ThibG](https://github.com/tootsuite/mastodon/pull/9124))
|
|
||||||
- Fix dropdowns sometimes being partially obscured by other elements ([kedamaDQ](https://github.com/tootsuite/mastodon/pull/9126))
|
|
||||||
- Fix cache not updating when reply/boost/favourite counters or media sensitivity update ([Gargron](https://github.com/tootsuite/mastodon/pull/9119))
|
|
||||||
- Fix empty display name precedence over username in web UI ([Gargron](https://github.com/tootsuite/mastodon/pull/9163))
|
|
||||||
- Fix td instead of th in sessions table header ([Gargron](https://github.com/tootsuite/mastodon/pull/9162))
|
|
||||||
- Fix handling of content types with profile ([valerauko](https://github.com/tootsuite/mastodon/pull/9132))
|
|
||||||
|
|
||||||
## [2.5.2] - 2018-10-12
|
|
||||||
### Security
|
|
||||||
|
|
||||||
- Fix XSS vulnerability ([Gargron](https://github.com/tootsuite/mastodon/pull/8959))
|
|
||||||
|
|
||||||
## [2.5.1] - 2018-10-07
|
|
||||||
### Fixed
|
|
||||||
|
|
||||||
- Fix database migrations for PostgreSQL below 9.5 ([Gargron](https://github.com/tootsuite/mastodon/pull/8903))
|
|
||||||
- Fix class autoloading issue in ActivityPub Create handler ([Gargron](https://github.com/tootsuite/mastodon/pull/8820))
|
|
||||||
- Fix cache statistics not being sent via statsd when statsd enabled ([ykzts](https://github.com/tootsuite/mastodon/pull/8831))
|
|
||||||
- Bump puma from 3.11.4 to 3.12.0 ([dependabot[bot]](https://github.com/tootsuite/mastodon/pull/8883))
|
|
||||||
|
|
||||||
### Security
|
|
||||||
|
|
||||||
- Fix some local images not having their EXIF metadata stripped on upload ([ThibG](https://github.com/tootsuite/mastodon/pull/8714))
|
|
||||||
- Fix being able to enable a disabled relay via ActivityPub Accept handler ([ThibG](https://github.com/tootsuite/mastodon/pull/8864))
|
|
||||||
- Bump nokogiri from 1.8.4 to 1.8.5 ([dependabot[bot]](https://github.com/tootsuite/mastodon/pull/8881))
|
|
||||||
- Fix being able to report statuses not belonging to the reported account ([ThibG](https://github.com/tootsuite/mastodon/pull/8916))
|
|
@@ -1,46 +0,0 @@
|
|||||||
# Contributor Covenant Code of Conduct
|
|
||||||
|
|
||||||
## Our Pledge
|
|
||||||
|
|
||||||
In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation.
|
|
||||||
|
|
||||||
## Our Standards
|
|
||||||
|
|
||||||
Examples of behavior that contributes to creating a positive environment include:
|
|
||||||
|
|
||||||
* Using welcoming and inclusive language
|
|
||||||
* Being respectful of differing viewpoints and experiences
|
|
||||||
* Gracefully accepting constructive criticism
|
|
||||||
* Focusing on what is best for the community
|
|
||||||
* Showing empathy towards other community members
|
|
||||||
|
|
||||||
Examples of unacceptable behavior by participants include:
|
|
||||||
|
|
||||||
* The use of sexualized language or imagery and unwelcome sexual attention or advances
|
|
||||||
* Trolling, insulting/derogatory comments, and personal or political attacks
|
|
||||||
* Public or private harassment
|
|
||||||
* Publishing others' private information, such as a physical or electronic address, without explicit permission
|
|
||||||
* Other conduct which could reasonably be considered inappropriate in a professional setting
|
|
||||||
|
|
||||||
## Our Responsibilities
|
|
||||||
|
|
||||||
Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.
|
|
||||||
|
|
||||||
Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.
|
|
||||||
|
|
||||||
## Scope
|
|
||||||
|
|
||||||
This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.
|
|
||||||
|
|
||||||
## Enforcement
|
|
||||||
|
|
||||||
Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at eugen@zeonfederated.com. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.
|
|
||||||
|
|
||||||
Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.
|
|
||||||
|
|
||||||
## Attribution
|
|
||||||
|
|
||||||
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version]
|
|
||||||
|
|
||||||
[homepage]: http://contributor-covenant.org
|
|
||||||
[version]: http://contributor-covenant.org/version/1/4/
|
|
@@ -1,39 +1,51 @@
|
|||||||
Contributing
|
CONTRIBUTING
|
||||||
============
|
============
|
||||||
|
|
||||||
Thank you for considering contributing to Mastodon 🐘
|
There are three ways in which you can contribute to this repository:
|
||||||
|
|
||||||
You can contribute in the following ways:
|
1. By improving the documentation
|
||||||
|
2. By working on the back-end application
|
||||||
|
3. By working on the front-end application
|
||||||
|
|
||||||
- Finding and reporting bugs
|
Choosing what to work on in a large open source project is not easy. The list of [GitHub issues](https://github.com/tootsuite/mastodon/issues) may provide some ideas, but not every feature request has been greenlit. Likewise, not every change or feature that resolves a personal itch will be merged into the main repository. Some communication ahead of time may be wise. If your addition creates a new feature or setting, or otherwise changes how things work in some substantial way, please remember to submit a correlating pull request to document your changes in the [documentation](http://github.com/tootsuite/documentation).
|
||||||
- Translating the Mastodon interface into various languages
|
|
||||||
- Contributing code to Mastodon by fixing bugs or implementing features
|
|
||||||
- Improving the documentation
|
|
||||||
|
|
||||||
If your contributions are accepted into Mastodon, you can request to be paid through [our OpenCollective](https://opencollective.com/mastodon).
|
Below are the guidelines for working on pull requests:
|
||||||
|
|
||||||
## Bug reports
|
## General
|
||||||
|
|
||||||
Bug reports and feature suggestions can be submitted to [GitHub Issues](https://github.com/tootsuite/mastodon/issues). Please make sure that you are not submitting duplicates, and that a similar report or request has not already been resolved or rejected in the past using the search function. Please also use descriptive, concise titles.
|
- 2 spaces indentation
|
||||||
|
|
||||||
## Translations
|
|
||||||
|
|
||||||
You can submit translations via [Crowdin](https://crowdin.com/project/mastodon). They are periodically merged into the codebase.
|
|
||||||
|
|
||||||
[][crowdin]
|
|
||||||
|
|
||||||
## Pull requests
|
|
||||||
|
|
||||||
Please use clean, concise titles for your pull requests. We use commit squashing, so the final commit in the master branch will carry the title of the pull request.
|
|
||||||
|
|
||||||
The smaller the set of changes in the pull request is, the quicker it can be reviewed and merged. Splitting tasks into multiple smaller pull requests is often preferable.
|
|
||||||
|
|
||||||
**Pull requests that do not pass automated checks may not be reviewed**. In particular, you need to keep in mind:
|
|
||||||
|
|
||||||
- Unit and integration tests (rspec, jest)
|
|
||||||
- Code style rules (rubocop, eslint)
|
|
||||||
- Normalization of locale files (i18n-tasks)
|
|
||||||
|
|
||||||
## Documentation
|
## Documentation
|
||||||
|
|
||||||
The [Mastodon documentation](https://docs.joinmastodon.org) is a statically generated site. You can [submit merge requests to mastodon/docs](https://source.joinmastodon.org/mastodon/docs).
|
- No spelling mistakes
|
||||||
|
- No orthographic mistakes
|
||||||
|
- No Markdown syntax errors
|
||||||
|
|
||||||
|
## Requirements
|
||||||
|
|
||||||
|
- Ruby
|
||||||
|
- Node.js
|
||||||
|
- PostgreSQL
|
||||||
|
- Redis
|
||||||
|
- Nginx (optional)
|
||||||
|
|
||||||
|
## Back-end application
|
||||||
|
|
||||||
|
It is expected that you have a working development environment set up. The development environment includes [rubocop](https://github.com/bbatsov/rubocop), which checks your Ruby code for compliance with our style guide and best practices. Sublime Text, likely like other editors, has a [Rubocop plugin](https://github.com/pderichs/sublime_rubocop) that runs checks on files as you edit them. The codebase also has a test suite.
|
||||||
|
|
||||||
|
* The codebase is not perfect, at the time of writing, but it is expected that you do not introduce new code style violations
|
||||||
|
* The rspec test suite must pass
|
||||||
|
* To the extent that it is possible, verify your changes. In the best case, by adding new tests to the test suite. At the very least, by running the server or console and checking it manually
|
||||||
|
* If you are introducing new strings to the user interface, they must be using localization methods
|
||||||
|
|
||||||
|
If your code has syntax errors that won't let it run, it's a good sign that the pull request isn't ready for submission yet.
|
||||||
|
|
||||||
|
## Front-end application
|
||||||
|
|
||||||
|
It is expected that you have a working development environment set up (see back-end application section). This project includes an ESLint configuration file, with which you can lint your changes.
|
||||||
|
|
||||||
|
* Avoid grave ESLint violations
|
||||||
|
* Verify that your changes work
|
||||||
|
* If you are introducing new strings, they must be using localization methods
|
||||||
|
|
||||||
|
If the JavaScript or CSS assets won't compile due to a syntax error, it's a good sign that the pull request isn't ready for submission yet.
|
||||||
|
2
Capfile
@@ -1,4 +1,3 @@
|
|||||||
# frozen_string_literal: true
|
|
||||||
require 'capistrano/setup'
|
require 'capistrano/setup'
|
||||||
require 'capistrano/deploy'
|
require 'capistrano/deploy'
|
||||||
require 'capistrano/scm/git'
|
require 'capistrano/scm/git'
|
||||||
@@ -9,6 +8,7 @@ require 'capistrano/rbenv'
|
|||||||
require 'capistrano/bundler'
|
require 'capistrano/bundler'
|
||||||
require 'capistrano/yarn'
|
require 'capistrano/yarn'
|
||||||
require 'capistrano/rails/assets'
|
require 'capistrano/rails/assets'
|
||||||
|
require 'capistrano/faster_assets'
|
||||||
require 'capistrano/rails/migrations'
|
require 'capistrano/rails/migrations'
|
||||||
|
|
||||||
Dir.glob('lib/capistrano/tasks/*.rake').each { |r| import r }
|
Dir.glob('lib/capistrano/tasks/*.rake').each { |r| import r }
|
||||||
|
153
Dockerfile
@@ -1,125 +1,44 @@
|
|||||||
FROM ubuntu:18.04 as build-dep
|
FROM ruby:2.4.1-alpine
|
||||||
|
|
||||||
# Use bash for the shell
|
LABEL maintainer="https://github.com/tootsuite/mastodon" \
|
||||||
SHELL ["bash", "-c"]
|
description="A GNU Social-compatible microblogging server"
|
||||||
|
|
||||||
# Install Node
|
ENV RAILS_ENV=production \
|
||||||
ENV NODE_VER="12.9.1"
|
NODE_ENV=production
|
||||||
RUN echo "Etc/UTC" > /etc/localtime && \
|
|
||||||
apt update && \
|
|
||||||
apt -y install wget python && \
|
|
||||||
cd ~ && \
|
|
||||||
wget https://nodejs.org/download/release/v$NODE_VER/node-v$NODE_VER-linux-x64.tar.gz && \
|
|
||||||
tar xf node-v$NODE_VER-linux-x64.tar.gz && \
|
|
||||||
rm node-v$NODE_VER-linux-x64.tar.gz && \
|
|
||||||
mv node-v$NODE_VER-linux-x64 /opt/node
|
|
||||||
|
|
||||||
# Install jemalloc
|
EXPOSE 3000 4000
|
||||||
ENV JE_VER="5.2.1"
|
|
||||||
RUN apt update && \
|
|
||||||
apt -y install make autoconf gcc g++ && \
|
|
||||||
cd ~ && \
|
|
||||||
wget https://github.com/jemalloc/jemalloc/archive/$JE_VER.tar.gz && \
|
|
||||||
tar xf $JE_VER.tar.gz && \
|
|
||||||
cd jemalloc-$JE_VER && \
|
|
||||||
./autogen.sh && \
|
|
||||||
./configure --prefix=/opt/jemalloc && \
|
|
||||||
make -j$(nproc) > /dev/null && \
|
|
||||||
make install_bin install_include install_lib
|
|
||||||
|
|
||||||
# Install ruby
|
WORKDIR /mastodon
|
||||||
ENV RUBY_VER="2.6.4"
|
|
||||||
ENV CPPFLAGS="-I/opt/jemalloc/include"
|
|
||||||
ENV LDFLAGS="-L/opt/jemalloc/lib/"
|
|
||||||
RUN apt update && \
|
|
||||||
apt -y install build-essential \
|
|
||||||
bison libyaml-dev libgdbm-dev libreadline-dev \
|
|
||||||
libncurses5-dev libffi-dev zlib1g-dev libssl-dev && \
|
|
||||||
cd ~ && \
|
|
||||||
wget https://cache.ruby-lang.org/pub/ruby/${RUBY_VER%.*}/ruby-$RUBY_VER.tar.gz && \
|
|
||||||
tar xf ruby-$RUBY_VER.tar.gz && \
|
|
||||||
cd ruby-$RUBY_VER && \
|
|
||||||
./configure --prefix=/opt/ruby \
|
|
||||||
--with-jemalloc \
|
|
||||||
--with-shared \
|
|
||||||
--disable-install-doc && \
|
|
||||||
ln -s /opt/jemalloc/lib/* /usr/lib/ && \
|
|
||||||
make -j$(nproc) > /dev/null && \
|
|
||||||
make install
|
|
||||||
|
|
||||||
ENV PATH="${PATH}:/opt/ruby/bin:/opt/node/bin"
|
COPY Gemfile Gemfile.lock package.json yarn.lock /mastodon/
|
||||||
|
|
||||||
RUN npm install -g yarn && \
|
RUN echo "@edge https://nl.alpinelinux.org/alpine/edge/main" >> /etc/apk/repositories \
|
||||||
gem install bundler && \
|
&& BUILD_DEPS=" \
|
||||||
apt update && \
|
postgresql-dev \
|
||||||
apt -y install git libicu-dev libidn11-dev \
|
libxml2-dev \
|
||||||
libpq-dev libprotobuf-dev protobuf-compiler
|
libxslt-dev \
|
||||||
|
python \
|
||||||
|
build-base" \
|
||||||
|
&& apk -U upgrade && apk add \
|
||||||
|
$BUILD_DEPS \
|
||||||
|
nodejs@edge \
|
||||||
|
nodejs-npm@edge \
|
||||||
|
libpq \
|
||||||
|
libxml2 \
|
||||||
|
libxslt \
|
||||||
|
ffmpeg \
|
||||||
|
file \
|
||||||
|
imagemagick@edge \
|
||||||
|
ca-certificates \
|
||||||
|
&& npm install -g npm@3 && npm install -g yarn \
|
||||||
|
&& bundle install --deployment --without test development \
|
||||||
|
&& yarn --ignore-optional \
|
||||||
|
&& yarn cache clean \
|
||||||
|
&& npm -g cache clean \
|
||||||
|
&& update-ca-certificates \
|
||||||
|
&& apk del $BUILD_DEPS \
|
||||||
|
&& rm -rf /tmp/* /var/cache/apk/*
|
||||||
|
|
||||||
COPY Gemfile* package.json yarn.lock /opt/mastodon/
|
COPY . /mastodon
|
||||||
|
|
||||||
RUN cd /opt/mastodon && \
|
VOLUME /mastodon/public/system /mastodon/public/assets
|
||||||
bundle install -j$(nproc) --deployment --without development test && \
|
|
||||||
yarn install --pure-lockfile
|
|
||||||
|
|
||||||
FROM ubuntu:18.04
|
|
||||||
|
|
||||||
# Copy over all the langs needed for runtime
|
|
||||||
COPY --from=build-dep /opt/node /opt/node
|
|
||||||
COPY --from=build-dep /opt/ruby /opt/ruby
|
|
||||||
COPY --from=build-dep /opt/jemalloc /opt/jemalloc
|
|
||||||
|
|
||||||
# Add more PATHs to the PATH
|
|
||||||
ENV PATH="${PATH}:/opt/ruby/bin:/opt/node/bin:/opt/mastodon/bin"
|
|
||||||
|
|
||||||
# Create the mastodon user
|
|
||||||
ARG UID=991
|
|
||||||
ARG GID=991
|
|
||||||
RUN apt update && \
|
|
||||||
echo "Etc/UTC" > /etc/localtime && \
|
|
||||||
ln -s /opt/jemalloc/lib/* /usr/lib/ && \
|
|
||||||
apt install -y whois wget && \
|
|
||||||
addgroup --gid $GID mastodon && \
|
|
||||||
useradd -m -u $UID -g $GID -d /opt/mastodon mastodon && \
|
|
||||||
echo "mastodon:`head /dev/urandom | tr -dc A-Za-z0-9 | head -c 24 | mkpasswd -s -m sha-256`" | chpasswd
|
|
||||||
|
|
||||||
# Install mastodon runtime deps
|
|
||||||
RUN apt -y --no-install-recommends install \
|
|
||||||
libssl1.1 libpq5 imagemagick ffmpeg \
|
|
||||||
libicu60 libprotobuf10 libidn11 libyaml-0-2 \
|
|
||||||
file ca-certificates tzdata libreadline7 && \
|
|
||||||
apt -y install gcc && \
|
|
||||||
ln -s /opt/mastodon /mastodon && \
|
|
||||||
gem install bundler && \
|
|
||||||
rm -rf /var/cache && \
|
|
||||||
rm -rf /var/lib/apt/lists/*
|
|
||||||
|
|
||||||
# Add tini
|
|
||||||
ENV TINI_VERSION="0.18.0"
|
|
||||||
ENV TINI_SUM="12d20136605531b09a2c2dac02ccee85e1b874eb322ef6baf7561cd93f93c855"
|
|
||||||
ADD https://github.com/krallin/tini/releases/download/v${TINI_VERSION}/tini /tini
|
|
||||||
RUN echo "$TINI_SUM tini" | sha256sum -c -
|
|
||||||
RUN chmod +x /tini
|
|
||||||
|
|
||||||
# Copy over mastodon source, and dependencies from building, and set permissions
|
|
||||||
COPY --chown=mastodon:mastodon . /opt/mastodon
|
|
||||||
COPY --from=build-dep --chown=mastodon:mastodon /opt/mastodon /opt/mastodon
|
|
||||||
|
|
||||||
# Run mastodon services in prod mode
|
|
||||||
ENV RAILS_ENV="production"
|
|
||||||
ENV NODE_ENV="production"
|
|
||||||
|
|
||||||
# Tell rails to serve static files
|
|
||||||
ENV RAILS_SERVE_STATIC_FILES="true"
|
|
||||||
ENV BIND="0.0.0.0"
|
|
||||||
|
|
||||||
# Set the run user
|
|
||||||
USER mastodon
|
|
||||||
|
|
||||||
# Precompile assets
|
|
||||||
RUN cd ~ && \
|
|
||||||
OTP_SECRET=precompile_placeholder SECRET_KEY_BASE=precompile_placeholder rails assets:precompile && \
|
|
||||||
yarn cache clean
|
|
||||||
|
|
||||||
# Set the work dir and the container entry point
|
|
||||||
WORKDIR /opt/mastodon
|
|
||||||
ENTRYPOINT ["/tini", "--"]
|
|
||||||
|
216
Gemfile
@@ -1,156 +1,106 @@
|
|||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
source 'https://rubygems.org'
|
source 'https://rubygems.org'
|
||||||
ruby '>= 2.4.0', '< 2.7.0'
|
ruby '>= 2.3.0', '< 2.5.0'
|
||||||
|
|
||||||
gem 'pkg-config', '~> 1.3'
|
gem 'pkg-config'
|
||||||
|
|
||||||
gem 'puma', '~> 4.2'
|
gem 'rails', '~> 5.0.2'
|
||||||
gem 'rails', '~> 5.2.3'
|
gem 'sass-rails', '~> 5.0'
|
||||||
gem 'thor', '~> 0.20'
|
gem 'uglifier', '>= 1.3.0'
|
||||||
|
gem 'jquery-rails'
|
||||||
|
gem 'puma'
|
||||||
|
|
||||||
gem 'hamlit-rails', '~> 0.2'
|
gem 'hamlit-rails'
|
||||||
gem 'pg', '~> 1.1'
|
gem 'pg'
|
||||||
gem 'makara', '~> 0.4'
|
gem 'pghero'
|
||||||
gem 'pghero', '~> 2.3'
|
gem 'dotenv-rails'
|
||||||
gem 'dotenv-rails', '~> 2.7'
|
gem 'font-awesome-rails'
|
||||||
|
gem 'best_in_place', '~> 3.0.1'
|
||||||
|
|
||||||
gem 'aws-sdk-s3', '~> 1.48', require: false
|
gem 'paperclip', '~> 5.1'
|
||||||
gem 'fog-core', '<= 2.1.0'
|
gem 'paperclip-av-transcoder'
|
||||||
gem 'fog-openstack', '~> 0.3', require: false
|
gem 'aws-sdk', '>= 2.0'
|
||||||
gem 'paperclip', '~> 6.0'
|
|
||||||
gem 'paperclip-av-transcoder', '~> 0.6'
|
|
||||||
gem 'streamio-ffmpeg', '~> 3.0'
|
|
||||||
gem 'blurhash', '~> 0.1'
|
|
||||||
|
|
||||||
gem 'active_model_serializers', '~> 0.10'
|
gem 'addressable'
|
||||||
gem 'addressable', '~> 2.7'
|
gem 'devise'
|
||||||
gem 'bootsnap', '~> 1.4', require: false
|
gem 'devise-two-factor'
|
||||||
gem 'browser'
|
gem 'doorkeeper'
|
||||||
gem 'charlock_holmes', '~> 0.7.6'
|
gem 'fast_blank'
|
||||||
gem 'iso-639'
|
gem 'goldfinger'
|
||||||
gem 'chewy', '~> 5.1'
|
gem 'hiredis'
|
||||||
gem 'cld3', '~> 3.2.4'
|
gem 'htmlentities'
|
||||||
gem 'devise', '~> 4.7'
|
gem 'http'
|
||||||
gem 'devise-two-factor', '~> 3.1'
|
gem 'http_accept_language'
|
||||||
|
gem 'httplog'
|
||||||
group :pam_authentication, optional: true do
|
gem 'kaminari'
|
||||||
gem 'devise_pam_authenticatable2', '~> 9.2'
|
gem 'link_header'
|
||||||
end
|
gem 'local_time'
|
||||||
|
gem 'nokogiri'
|
||||||
gem 'net-ldap', '~> 0.10'
|
gem 'oj'
|
||||||
gem 'omniauth-cas', '~> 1.1'
|
|
||||||
gem 'omniauth-saml', '~> 1.10'
|
|
||||||
gem 'omniauth', '~> 1.9'
|
|
||||||
|
|
||||||
gem 'discard', '~> 1.1'
|
|
||||||
gem 'doorkeeper', '~> 5.2'
|
|
||||||
gem 'fast_blank', '~> 1.0'
|
|
||||||
gem 'fastimage'
|
|
||||||
gem 'goldfinger', '~> 2.1'
|
|
||||||
gem 'hiredis', '~> 0.6'
|
|
||||||
gem 'redis-namespace', '~> 1.5'
|
|
||||||
gem 'health_check', git: 'https://github.com/ianheggie/health_check', ref: '0b799ead604f900ed50685e9b2d469cd2befba5b'
|
|
||||||
gem 'htmlentities', '~> 4.3'
|
|
||||||
gem 'http', '~> 3.3'
|
|
||||||
gem 'http_accept_language', '~> 2.1'
|
|
||||||
gem 'http_parser.rb', '~> 0.6', git: 'https://github.com/tmm1/http_parser.rb', ref: '54b17ba8c7d8d20a16dfc65d1775241833219cf2', submodules: true
|
|
||||||
gem 'httplog', '~> 1.3'
|
|
||||||
gem 'idn-ruby', require: 'idn'
|
|
||||||
gem 'kaminari', '~> 1.1'
|
|
||||||
gem 'link_header', '~> 0.0'
|
|
||||||
gem 'mime-types', '~> 3.3', require: 'mime/types/columnar'
|
|
||||||
gem 'nilsimsa', git: 'https://github.com/witgo/nilsimsa', ref: 'fd184883048b922b176939f851338d0a4971a532'
|
|
||||||
gem 'nokogiri', '~> 1.10'
|
|
||||||
gem 'nsa', '~> 0.2'
|
|
||||||
gem 'oj', '~> 3.9'
|
|
||||||
gem 'ostatus2', '~> 2.0'
|
gem 'ostatus2', '~> 2.0'
|
||||||
gem 'ox', '~> 2.11'
|
gem 'ox'
|
||||||
gem 'parslet'
|
gem 'rabl'
|
||||||
gem 'posix-spawn', git: 'https://github.com/rtomayko/posix-spawn', ref: '58465d2e213991f8afb13b984854a49fcdcc980c'
|
gem 'rack-attack'
|
||||||
gem 'pundit', '~> 2.1'
|
gem 'rack-cors', require: 'rack/cors'
|
||||||
gem 'premailer-rails'
|
gem 'rack-timeout'
|
||||||
gem 'rack-attack', '~> 6.1'
|
gem 'rails-i18n'
|
||||||
gem 'rack-cors', '~> 1.0', require: 'rack/cors'
|
gem 'rails-settings-cached'
|
||||||
gem 'rails-i18n', '~> 5.1'
|
gem 'redis', '~>3.2', require: ['redis', 'redis/connection/hiredis']
|
||||||
gem 'rails-settings-cached', '~> 0.6'
|
gem 'rqrcode'
|
||||||
gem 'redis', '~> 4.1', require: ['redis', 'redis/connection/hiredis']
|
gem 'ruby-oembed', require: 'oembed'
|
||||||
gem 'mario-redis-lock', '~> 1.2', require: 'redis_lock'
|
gem 'sanitize'
|
||||||
gem 'rqrcode', '~> 0.10'
|
gem 'sidekiq'
|
||||||
gem 'ruby-progressbar', '~> 1.10'
|
gem 'sidekiq-scheduler'
|
||||||
gem 'sanitize', '~> 5.1'
|
gem 'sidekiq-unique-jobs'
|
||||||
gem 'sidekiq', '~> 5.2'
|
gem 'simple-navigation'
|
||||||
gem 'sidekiq-scheduler', '~> 3.0'
|
gem 'simple_form'
|
||||||
gem 'sidekiq-unique-jobs', '~> 6.0'
|
gem 'sprockets-rails', require: 'sprockets/railtie'
|
||||||
gem 'sidekiq-bulk', '~>0.2.0'
|
gem 'statsd-instrument'
|
||||||
gem 'simple-navigation', '~> 4.1'
|
gem 'twitter-text'
|
||||||
gem 'simple_form', '~> 4.1'
|
gem 'tzinfo-data'
|
||||||
gem 'sprockets-rails', '~> 3.2', require: 'sprockets/railtie'
|
gem 'whatlanguage'
|
||||||
gem 'stoplight', '~> 2.1.3'
|
|
||||||
gem 'strong_migrations', '~> 0.4'
|
|
||||||
gem 'tty-command', '~> 0.8', require: false
|
|
||||||
gem 'tty-prompt', '~> 0.19', require: false
|
|
||||||
gem 'twitter-text', '~> 1.14'
|
|
||||||
gem 'tzinfo-data', '~> 1.2019'
|
|
||||||
gem 'webpacker', '~> 4.0'
|
|
||||||
gem 'webpush'
|
|
||||||
|
|
||||||
gem 'json-ld', git: 'https://github.com/ruby-rdf/json-ld.git', ref: 'e742697a0906e74e8bb777ef98137bc3955d981d'
|
gem 'react-rails'
|
||||||
gem 'json-ld-preloaded', '~> 3.0'
|
gem 'browserify-rails'
|
||||||
gem 'rdf-normalize', '~> 0.3'
|
gem 'autoprefixer-rails'
|
||||||
|
|
||||||
group :development, :test do
|
group :development, :test do
|
||||||
gem 'fabrication', '~> 2.20'
|
gem 'rspec-rails'
|
||||||
gem 'fuubar', '~> 2.4'
|
gem 'pry-rails'
|
||||||
gem 'i18n-tasks', '~> 0.9', require: false
|
gem 'fuubar'
|
||||||
gem 'pry-byebug', '~> 3.7'
|
gem 'fabrication'
|
||||||
gem 'pry-rails', '~> 0.3'
|
gem 'i18n-tasks', '~> 0.9.6'
|
||||||
gem 'rspec-rails', '~> 3.8'
|
|
||||||
end
|
|
||||||
|
|
||||||
group :production, :test do
|
|
||||||
gem 'private_address_check', '~> 0.5'
|
|
||||||
end
|
end
|
||||||
|
|
||||||
group :test do
|
group :test do
|
||||||
gem 'capybara', '~> 3.29'
|
gem 'capybara'
|
||||||
gem 'climate_control', '~> 0.2'
|
gem 'faker'
|
||||||
gem 'faker', '~> 2.4'
|
gem 'microformats2'
|
||||||
gem 'microformats', '~> 4.1'
|
gem 'rails-controller-testing'
|
||||||
gem 'rails-controller-testing', '~> 1.0'
|
gem 'rspec-sidekiq'
|
||||||
gem 'rspec-sidekiq', '~> 3.0'
|
gem 'simplecov', require: false
|
||||||
gem 'simplecov', '~> 0.17', require: false
|
gem 'webmock'
|
||||||
gem 'webmock', '~> 3.7'
|
|
||||||
gem 'parallel_tests', '~> 2.29'
|
|
||||||
end
|
end
|
||||||
|
|
||||||
group :development do
|
group :development do
|
||||||
gem 'active_record_query_trace', '~> 1.6'
|
gem 'rubocop', require: false
|
||||||
gem 'annotate', '~> 2.7'
|
gem 'better_errors'
|
||||||
gem 'better_errors', '~> 2.5'
|
gem 'binding_of_caller'
|
||||||
gem 'binding_of_caller', '~> 0.7'
|
gem 'letter_opener'
|
||||||
gem 'bullet', '~> 6.0'
|
gem 'letter_opener_web'
|
||||||
gem 'letter_opener', '~> 1.7'
|
gem 'bullet'
|
||||||
gem 'letter_opener_web', '~> 1.3'
|
gem 'active_record_query_trace'
|
||||||
gem 'memory_profiler'
|
|
||||||
gem 'rubocop', '~> 0.74', require: false
|
|
||||||
gem 'rubocop-rails', '~> 2.3', require: false
|
|
||||||
gem 'brakeman', '~> 4.6', require: false
|
|
||||||
gem 'bundler-audit', '~> 0.6', require: false
|
|
||||||
|
|
||||||
gem 'capistrano', '~> 3.11'
|
gem 'capistrano', '3.8.0'
|
||||||
gem 'capistrano-rails', '~> 1.4'
|
gem 'capistrano-rails'
|
||||||
gem 'capistrano-rbenv', '~> 2.1'
|
gem 'capistrano-rbenv'
|
||||||
gem 'capistrano-yarn', '~> 2.0'
|
gem 'capistrano-yarn'
|
||||||
|
gem 'capistrano-faster-assets', '~> 1.0'
|
||||||
gem 'derailed_benchmarks'
|
|
||||||
gem 'stackprof'
|
|
||||||
end
|
end
|
||||||
|
|
||||||
group :production do
|
group :production do
|
||||||
gem 'lograge', '~> 0.11'
|
gem 'rails_12factor'
|
||||||
gem 'redis-rails', '~> 5.0'
|
gem 'redis-rails'
|
||||||
|
gem 'lograge'
|
||||||
end
|
end
|
||||||
|
|
||||||
gem 'concurrent-ruby', require: false
|
|
||||||
gem 'connection_pool', require: false
|
|
||||||
|
1074
Gemfile.lock
6
ISSUE_TEMPLATE.md
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
[Issue text goes here].
|
||||||
|
|
||||||
|
* * * *
|
||||||
|
|
||||||
|
- [ ] I searched or browsed the repo’s other issues to ensure this is not a duplicate.
|
||||||
|
- [ ] This bug happens on a [tagged release](https://github.com/tootsuite/mastodon/releases) and not on `master` (If you're a user, don't worry about this).
|
14
Procfile
@@ -1,14 +1,2 @@
|
|||||||
web: if [ "$RUN_STREAMING" != "true" ]; then BIND=0.0.0.0 bundle exec puma -C config/puma.rb; else BIND=0.0.0.0 node ./streaming; fi
|
web: bundle exec puma -C config/puma.rb
|
||||||
worker: bundle exec sidekiq
|
worker: bundle exec sidekiq
|
||||||
|
|
||||||
# For the streaming API, you need a separate app that shares Postgres and Redis:
|
|
||||||
#
|
|
||||||
# heroku create
|
|
||||||
# heroku buildpacks:add heroku/nodejs
|
|
||||||
# heroku config:set RUN_STREAMING=true
|
|
||||||
# heroku addons:attach <main-app>::DATABASE
|
|
||||||
# heroku addons:attach <main-app>::REDIS
|
|
||||||
#
|
|
||||||
# and let the main app use the separate app:
|
|
||||||
#
|
|
||||||
# heroku config:set STREAMING_API_BASE_URL=wss://<streaming-app>.herokuapp.com -a <main-app>
|
|
||||||
|
@@ -1,4 +0,0 @@
|
|||||||
web: env PORT=3000 bundle exec puma -C config/puma.rb
|
|
||||||
sidekiq: env PORT=3000 bundle exec sidekiq
|
|
||||||
stream: env PORT=4000 yarn run start
|
|
||||||
webpack: ./bin/webpack-dev-server --listen-host 0.0.0.0
|
|
111
README.md
@@ -1,95 +1,66 @@
|
|||||||

|
Mastodon
|
||||||
========
|
========
|
||||||
|
|
||||||
[][releases]
|
[][travis]
|
||||||
[][circleci]
|
[][code_climate]
|
||||||
[][code_climate]
|
|
||||||
[][crowdin]
|
|
||||||
[][docker]
|
|
||||||
|
|
||||||
[releases]: https://github.com/tootsuite/mastodon/releases
|
[travis]: https://travis-ci.org/tootsuite/mastodon
|
||||||
[circleci]: https://circleci.com/gh/tootsuite/mastodon
|
|
||||||
[code_climate]: https://codeclimate.com/github/tootsuite/mastodon
|
[code_climate]: https://codeclimate.com/github/tootsuite/mastodon
|
||||||
[crowdin]: https://crowdin.com/project/mastodon
|
|
||||||
[docker]: https://hub.docker.com/r/tootsuite/mastodon/
|
|
||||||
|
|
||||||
Mastodon is a **free, open-source social network server** based on ActivityPub. Follow friends and discover new ones. Publish anything you want: links, pictures, text, video. All servers of Mastodon are interoperable as a federated network, i.e. users on one server can seamlessly communicate with users from another one. This includes non-Mastodon software that also implements ActivityPub!
|
Mastodon is a free, open-source social network server. A decentralized solution to commercial platforms, it avoids the risks of a single company monopolizing your communication. Anyone can run Mastodon and participate in the social network seamlessly.
|
||||||
|
|
||||||
Click below to **learn more** in a video:
|
An alternative implementation of the GNU social project. Based on [ActivityStreams](https://en.wikipedia.org/wiki/Activity_Streams_(format)), [Webfinger](https://en.wikipedia.org/wiki/WebFinger), [PubsubHubbub](https://en.wikipedia.org/wiki/PubSubHubbub) and [Salmon](https://en.wikipedia.org/wiki/Salmon_(protocol)).
|
||||||
|
|
||||||
[][youtube_demo]
|
Click on the screenshot to watch a demo of the UI:
|
||||||
|
|
||||||
[youtube_demo]: https://www.youtube.com/watch?v=IPSbNdBmWKE
|
[][youtube_demo]
|
||||||
|
|
||||||
## Navigation
|
[youtube_demo]: https://www.youtube.com/watch?v=YO1jQ8_rAMU
|
||||||
|
|
||||||
- [Project homepage 🐘](https://joinmastodon.org)
|
The project focus is a clean REST API and a good user interface. Ruby on Rails is used for the back-end, while React.js and Redux are used for the dynamic front-end. A static front-end for public resources (profiles and statuses) is also provided.
|
||||||
- [Support the development via Patreon][patreon]
|
|
||||||
- [View sponsors](https://joinmastodon.org/sponsors)
|
|
||||||
- [Blog](https://blog.joinmastodon.org)
|
|
||||||
- [Documentation](https://docs.joinmastodon.org)
|
|
||||||
- [Browse Mastodon servers](https://joinmastodon.org/#getting-started)
|
|
||||||
- [Browse Mastodon apps](https://joinmastodon.org/apps)
|
|
||||||
|
|
||||||
[patreon]: https://www.patreon.com/mastodon
|
If you would like, you can [support the development of this project on Patreon][patreon]. Alternatively, you can donate to this BTC address: `17j2g7vpgHhLuXhN4bueZFCvdxxieyRVWd`
|
||||||
|
|
||||||
|
[patreon]: https://www.patreon.com/user?u=619786
|
||||||
|
|
||||||
|
## Resources
|
||||||
|
|
||||||
|
- [List of Mastodon instances](https://github.com/tootsuite/documentation/blob/master/Using-Mastodon/List-of-Mastodon-instances.md)
|
||||||
|
- [Use this tool to find Twitter friends on Mastodon](https://mastodon-bridge.herokuapp.com)
|
||||||
|
- [API overview](https://github.com/tootsuite/documentation/blob/master/Using-the-API/API.md)
|
||||||
|
- [Frequently Asked Questions](https://github.com/tootsuite/documentation/blob/master/Using-Mastodon/FAQ.md)
|
||||||
|
- [List of apps](https://github.com/tootsuite/documentation/blob/master/Using-Mastodon/Apps.md)
|
||||||
|
|
||||||
## Features
|
## Features
|
||||||
|
|
||||||
<img src="https://docs.joinmastodon.org/elephant.svg" align="right" width="30%" />
|
- **Fully interoperable with GNU social and any OStatus platform**
|
||||||
|
Whatever implements Atom feeds, ActivityStreams, Salmon, PubSubHubbub and Webfinger is part of the network
|
||||||
**No vendor lock-in: Fully interoperable with any conforming platform**
|
- **Real-time timeline updates**
|
||||||
|
See the updates of people you're following appear in real-time in the UI via WebSockets
|
||||||
It doesn't have to be Mastodon, whatever implements ActivityPub is part of the social network! [Learn more](https://blog.joinmastodon.org/2018/06/why-activitypub-is-the-future/)
|
- **Federated thread resolving**
|
||||||
|
If someone you follow replies to a user unknown to the server, the server fetches the full thread so you can view it without leaving the UI
|
||||||
**Real-time, chronological timeline updates**
|
- **Media attachments like images and WebM**
|
||||||
|
Upload and view images and WebM videos attached to the updates
|
||||||
See the updates of people you're following appear in real-time in the UI via WebSockets. There's a firehose view as well!
|
- **OAuth2 and a straightforward REST API**
|
||||||
|
Mastodon acts as an OAuth2 provider so 3rd party apps can use the API, which is RESTful and simple
|
||||||
**Media attachments like images and short videos**
|
- **Background processing for long-running tasks**
|
||||||
|
Mastodon tries to be as fast and responsive as possible, so all long-running tasks that can be delegated to background processing, are
|
||||||
Upload and view images and WebM/MP4 videos attached to the updates. Videos with no audio track are treated like GIFs; normal videos are looped - like vines!
|
- **Deployable via Docker**
|
||||||
|
You don't need to mess with dependencies and configuration if you want to try Mastodon, if you have Docker and Docker Compose the deployment is extremely easy
|
||||||
**Safety and moderation tools**
|
|
||||||
|
|
||||||
Private posts, locked accounts, phrase filtering, muting, blocking and all sorts of other features, along with a reporting and moderation system. [Learn more](https://blog.joinmastodon.org/2018/07/cage-the-mastodon/)
|
|
||||||
|
|
||||||
**OAuth2 and a straightforward REST API**
|
|
||||||
|
|
||||||
Mastodon acts as an OAuth2 provider so 3rd party apps can use the REST and Streaming APIs, resulting in a rich app ecosystem with a lot of choice!
|
|
||||||
|
|
||||||
## Deployment
|
## Deployment
|
||||||
|
|
||||||
**Tech stack:**
|
There are guides in the documentation repository for [deploying on various platforms](https://github.com/tootsuite/documentation#running-mastodon).
|
||||||
|
|
||||||
- **Ruby on Rails** powers the REST API and other web pages
|
|
||||||
- **React.js** and Redux are used for the dynamic parts of the interface
|
|
||||||
- **Node.js** powers the streaming API
|
|
||||||
|
|
||||||
**Requirements:**
|
|
||||||
|
|
||||||
- **PostgreSQL** 9.5+
|
|
||||||
- **Redis**
|
|
||||||
- **Ruby** 2.4+
|
|
||||||
- **Node.js** 8+
|
|
||||||
|
|
||||||
The repository includes deployment configurations for **Docker and docker-compose**, but also a few specific platforms like **Heroku**, **Scalingo**, and **Nanobox**. The [**stand-alone** installation guide](https://docs.joinmastodon.org/administration/installation/) is available in the documentation.
|
|
||||||
|
|
||||||
A **Vagrant** configuration is included for development purposes.
|
|
||||||
|
|
||||||
## Contributing
|
## Contributing
|
||||||
|
|
||||||
Mastodon is **free, open source software** licensed under **AGPLv3**.
|
You can open issues for bugs you've found or features you think are missing. You can also submit pull requests to this repository. [Here are the guidelines for code contributions](CONTRIBUTING.md)
|
||||||
|
|
||||||
You can open issues for bugs you've found or features you think are missing. You can also submit pull requests to this repository, or submit translations using Weblate. To get started, take a look at [CONTRIBUTING.md](CONTRIBUTING.md). If your contributions are accepted into Mastodon, you can request to be paid through [our OpenCollective](https://opencollective.com/mastodon).
|
|
||||||
|
|
||||||
**IRC channel**: #mastodon on irc.freenode.net
|
**IRC channel**: #mastodon on irc.freenode.net
|
||||||
|
|
||||||
## License
|
## Extra credits
|
||||||
|
|
||||||
Copyright (C) 2016-2019 Eugen Rochko & other Mastodon contributors (see [AUTHORS.md](AUTHORS.md))
|
- The [Emoji One](https://github.com/Ranks/emojione) pack has been used for the emojis
|
||||||
|
- The error page image courtesy of [Dopatwo](https://www.youtube.com/user/dopatwo)
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
|

|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Affero General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
|
67
Vagrantfile
vendored
@@ -1,8 +1,6 @@
|
|||||||
# -*- mode: ruby -*-
|
# -*- mode: ruby -*-
|
||||||
# vi: set ft=ruby :
|
# vi: set ft=ruby :
|
||||||
|
|
||||||
ENV["PORT"] ||= "3000"
|
|
||||||
|
|
||||||
$provision = <<SCRIPT
|
$provision = <<SCRIPT
|
||||||
|
|
||||||
cd /vagrant # This is where the host folder/repo is mounted
|
cd /vagrant # This is where the host folder/repo is mounted
|
||||||
@@ -12,10 +10,10 @@ curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
|
|||||||
sudo apt-add-repository 'deb https://dl.yarnpkg.com/debian/ stable main'
|
sudo apt-add-repository 'deb https://dl.yarnpkg.com/debian/ stable main'
|
||||||
|
|
||||||
# Add repo for NodeJS
|
# Add repo for NodeJS
|
||||||
curl -sL https://deb.nodesource.com/setup_8.x | sudo bash -
|
curl -sL https://deb.nodesource.com/setup_4.x | sudo bash -
|
||||||
|
|
||||||
# Add firewall rule to redirect 80 to PORT and save
|
# Add firewall rule to redirect 80 to 3000 and save
|
||||||
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port #{ENV["PORT"]}
|
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 3000
|
||||||
echo iptables-persistent iptables-persistent/autosave_v4 boolean true | sudo debconf-set-selections
|
echo iptables-persistent iptables-persistent/autosave_v4 boolean true | sudo debconf-set-selections
|
||||||
echo iptables-persistent iptables-persistent/autosave_v6 boolean true | sudo debconf-set-selections
|
echo iptables-persistent iptables-persistent/autosave_v6 boolean true | sudo debconf-set-selections
|
||||||
sudo apt-get install iptables-persistent -y
|
sudo apt-get install iptables-persistent -y
|
||||||
@@ -33,57 +31,38 @@ sudo apt-get install \
|
|||||||
redis-tools \
|
redis-tools \
|
||||||
postgresql \
|
postgresql \
|
||||||
postgresql-contrib \
|
postgresql-contrib \
|
||||||
protobuf-compiler \
|
|
||||||
yarn \
|
yarn \
|
||||||
libicu-dev \
|
|
||||||
libidn11-dev \
|
|
||||||
libprotobuf-dev \
|
|
||||||
libreadline-dev \
|
libreadline-dev \
|
||||||
libpam0g-dev \
|
|
||||||
-y
|
-y
|
||||||
|
|
||||||
# Install rvm
|
# Install rvm
|
||||||
|
cd /vagrant
|
||||||
read RUBY_VERSION < .ruby-version
|
read RUBY_VERSION < .ruby-version
|
||||||
|
gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3
|
||||||
gpg_command="gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB"
|
curl -sSL https://get.rvm.io | bash -s stable --ruby=$RUBY_VERSION
|
||||||
$($gpg_command)
|
|
||||||
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
|
|
||||||
source /home/vagrant/.rvm/scripts/rvm
|
source /home/vagrant/.rvm/scripts/rvm
|
||||||
|
|
||||||
# Install Ruby
|
|
||||||
rvm reinstall ruby-$RUBY_VERSION --disable-binary
|
|
||||||
|
|
||||||
# Configure database
|
# Configure database
|
||||||
sudo -u postgres createuser -U postgres vagrant -s
|
sudo -u postgres createuser -U postgres vagrant -s
|
||||||
sudo -u postgres createdb -U postgres mastodon_development
|
sudo -u postgres createdb -U postgres mastodon_development
|
||||||
|
|
||||||
# Install gems and node modules
|
# Install gems and node modules
|
||||||
gem install bundler foreman
|
gem install bundler
|
||||||
bundle install
|
bundle install
|
||||||
yarn install
|
yarn install
|
||||||
|
|
||||||
# Build Mastodon
|
# Build Mastodon
|
||||||
export $(cat ".env.vagrant" | xargs)
|
export $(cat ".env.vagrant" | xargs)
|
||||||
bundle exec rails db:setup
|
bundle exec rails db:setup
|
||||||
|
bundle exec rails assets:precompile
|
||||||
# Configure automatic loading of environment variable
|
|
||||||
echo 'export $(cat "/vagrant/.env.vagrant" | xargs)' >> ~/.bash_profile
|
|
||||||
|
|
||||||
SCRIPT
|
SCRIPT
|
||||||
|
|
||||||
$start = <<SCRIPT
|
$start = <<SCRIPT
|
||||||
|
|
||||||
echo 'To start server'
|
cd /vagrant
|
||||||
echo ' $ vagrant ssh -c "cd /vagrant && foreman start"'
|
export $(cat ".env.vagrant" | xargs)
|
||||||
|
rails s -d -b 0.0.0.0
|
||||||
|
|
||||||
SCRIPT
|
SCRIPT
|
||||||
|
|
||||||
@@ -91,14 +70,11 @@ VAGRANTFILE_API_VERSION = "2"
|
|||||||
|
|
||||||
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
|
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
|
||||||
|
|
||||||
config.vm.box = "ubuntu/xenial64"
|
config.vm.box = "ubuntu/trusty64"
|
||||||
|
|
||||||
config.vm.provider :virtualbox do |vb|
|
config.vm.provider :virtualbox do |vb|
|
||||||
vb.name = "mastodon"
|
vb.name = "mastodon"
|
||||||
vb.customize ["modifyvm", :id, "--memory", "2048"]
|
vb.customize ["modifyvm", :id, "--memory", "1024"]
|
||||||
# Increase the number of CPUs. Uncomment and adjust to
|
|
||||||
# increase performance
|
|
||||||
# vb.customize ["modifyvm", :id, "--cpus", "3"]
|
|
||||||
|
|
||||||
# Disable VirtualBox DNS proxy to skip long-delay IPv6 resolutions.
|
# Disable VirtualBox DNS proxy to skip long-delay IPv6 resolutions.
|
||||||
# https://github.com/mitchellh/vagrant/issues/1172
|
# https://github.com/mitchellh/vagrant/issues/1172
|
||||||
@@ -111,30 +87,25 @@ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
|
|||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
config.vm.hostname = "mastodon.dev"
|
||||||
|
|
||||||
# This uses the vagrant-hostsupdater plugin, and lets you
|
# This uses the vagrant-hostsupdater plugin, and lets you
|
||||||
# access the development site at http://mastodon.local.
|
# access the development site at http://mastodon.dev.
|
||||||
# If you change it, also change it in .env.vagrant before provisioning
|
|
||||||
# the vagrant server to update the development build.
|
|
||||||
#
|
|
||||||
# To install:
|
# To install:
|
||||||
# $ vagrant plugin install vagrant-hostsupdater
|
# $ vagrant plugin install vagrant-hostsupdater
|
||||||
config.vm.hostname = "mastodon.local"
|
|
||||||
|
|
||||||
if defined?(VagrantPlugins::HostsUpdater)
|
if defined?(VagrantPlugins::HostsUpdater)
|
||||||
config.vm.network :private_network, ip: "192.168.42.42", nictype: "virtio"
|
config.vm.network :private_network, ip: "192.168.42.42", nictype: "virtio"
|
||||||
config.hostsupdater.remove_on_suspend = false
|
config.hostsupdater.remove_on_suspend = false
|
||||||
end
|
end
|
||||||
|
|
||||||
if config.vm.networks.any? { |type, options| type == :private_network }
|
if config.vm.networks.any? { |type, options| type == :private_network }
|
||||||
config.vm.synced_folder ".", "/vagrant", type: "nfs", mount_options: ['rw', 'vers=3', 'tcp', 'actimeo=1']
|
config.vm.synced_folder ".", "/vagrant", type: "nfs", mount_options: ['rw', 'vers=3', 'tcp']
|
||||||
else
|
else
|
||||||
config.vm.synced_folder ".", "/vagrant"
|
config.vm.synced_folder ".", "/vagrant"
|
||||||
end
|
end
|
||||||
|
|
||||||
# Otherwise, you can access the site at http://localhost:3000 and http://localhost:4000 , http://localhost:8080
|
# Otherwise, you can access the site at http://localhost:3000
|
||||||
config.vm.network :forwarded_port, guest: 3000, host: 3000
|
config.vm.network :forwarded_port, guest: 80, host: 3000
|
||||||
config.vm.network :forwarded_port, guest: 4000, host: 4000
|
|
||||||
config.vm.network :forwarded_port, guest: 8080, host: 8080
|
|
||||||
|
|
||||||
# Full provisioning script, only runs on first 'vagrant up' or with 'vagrant provision'
|
# Full provisioning script, only runs on first 'vagrant up' or with 'vagrant provision'
|
||||||
config.vm.provision :shell, inline: $provision, privileged: false
|
config.vm.provision :shell, inline: $provision, privileged: false
|
||||||
|
14
app.json
@@ -2,7 +2,7 @@
|
|||||||
"name": "Mastodon",
|
"name": "Mastodon",
|
||||||
"description": "A GNU Social-compatible microblogging server",
|
"description": "A GNU Social-compatible microblogging server",
|
||||||
"repository": "https://github.com/tootsuite/mastodon",
|
"repository": "https://github.com/tootsuite/mastodon",
|
||||||
"logo": "https://github.com/tootsuite.png",
|
"logo": "https://github.com/tootsuite/mastodon/raw/master/app/assets/images/logo.png",
|
||||||
"env": {
|
"env": {
|
||||||
"HEROKU": {
|
"HEROKU": {
|
||||||
"description": "Leave this as true",
|
"description": "Leave this as true",
|
||||||
@@ -13,6 +13,15 @@
|
|||||||
"description": "The domain that your Mastodon instance will run on (this can be appname.herokuapp.com or a custom domain)",
|
"description": "The domain that your Mastodon instance will run on (this can be appname.herokuapp.com or a custom domain)",
|
||||||
"required": true
|
"required": true
|
||||||
},
|
},
|
||||||
|
"LOCAL_HTTPS": {
|
||||||
|
"description": "Will your domain support HTTPS? (Automatic for herokuapp, requires manual configuration for custom domains)",
|
||||||
|
"value": "false",
|
||||||
|
"required": true
|
||||||
|
},
|
||||||
|
"PAPERCLIP_SECRET": {
|
||||||
|
"description": "The secret key for storing media files",
|
||||||
|
"generator": "secret"
|
||||||
|
},
|
||||||
"SECRET_KEY_BASE": {
|
"SECRET_KEY_BASE": {
|
||||||
"description": "The secret key base",
|
"description": "The secret key base",
|
||||||
"generator": "secret"
|
"generator": "secret"
|
||||||
@@ -85,9 +94,6 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"buildpacks": [
|
"buildpacks": [
|
||||||
{
|
|
||||||
"url": "https://github.com/heroku/heroku-buildpack-apt"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"url": "heroku/nodejs"
|
"url": "heroku/nodejs"
|
||||||
},
|
},
|
||||||
|
BIN
app/assets/fonts/montserrat/Montserrat-Regular.eot
Normal file
BIN
app/assets/fonts/roboto-mono/robotomono-regular-webfont.eot
Normal file
Before Width: | Height: | Size: 339 KiB After Width: | Height: | Size: 339 KiB |
BIN
app/assets/fonts/roboto/roboto-bold-webfont.eot
Normal file
Before Width: | Height: | Size: 1.5 MiB After Width: | Height: | Size: 1.5 MiB |
BIN
app/assets/fonts/roboto/roboto-italic-webfont.eot
Normal file
Before Width: | Height: | Size: 1.5 MiB After Width: | Height: | Size: 1.5 MiB |
BIN
app/assets/fonts/roboto/roboto-medium-webfont.eot
Normal file
Before Width: | Height: | Size: 1.5 MiB After Width: | Height: | Size: 1.5 MiB |
BIN
app/assets/fonts/roboto/roboto-regular-webfont.eot
Normal file
Before Width: | Height: | Size: 1.4 MiB After Width: | Height: | Size: 1.4 MiB |
BIN
app/assets/images/background-photo.jpg
Normal file
After Width: | Height: | Size: 258 KiB |
BIN
app/assets/images/boost_sprite.png
Normal file
After Width: | Height: | Size: 1.3 KiB |
BIN
app/assets/images/elephant-friend.png
Normal file
After Width: | Height: | Size: 24 KiB |
BIN
app/assets/images/fluffy-elephant-friend.png
Normal file
After Width: | Height: | Size: 59 KiB |
BIN
app/assets/images/logo.png
Normal file
After Width: | Height: | Size: 7.6 KiB |
1
app/assets/images/logo.svg
Normal file
@@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1000 1000" height="1000" width="1000"><path d="M500 0a500 500 0 0 0-353.553 146.447 500 500 0 1 0 707.106 707.106A500 500 0 0 0 500 0zm-.059 280.05h107.12c-19.071 13.424-26.187 51.016-27.12 73.843V562.05c0 44.32-35.68 80-80 80s-80-35.68-80-80v-202c0-44.32 35.68-80 80-80zm-.441 52c-15.464 0-28 12.537-28 28 0 15.465 12.536 28 28 28s28-12.535 28-28c0-15.463-12.536-28-28-28zm-279.059 7.9c44.32 0 80 35.68 80 80v206.157c.933 22.827 8.049 60.42 27.12 73.842H220.44c-44.32 0-80-35.68-80-80v-200c0-44.32 35.68-80 80-80zm559.12 0c44.32 0 80 35.68 80 80v200c0 44.32-35.68 80-80 80H672.44c19.071-13.424 26.187-51.016 27.12-73.843V419.95c0-44.32 35.68-80 80-80zM220 392c-15.464 0-28 12.536-28 28s12.536 28 28 28 28-12.536 28-28-12.536-28-28-28zm560 0c-15.464 0-28 12.536-28 28s12.536 28 28 28 28-12.536 28-28-12.536-28-28-28zm-280.5 40.05c-15.464 0-28 12.537-28 28 0 15.465 12.536 28 28 28s28-12.535 28-28c0-15.463-12.536-28-28-28zM220 491.95c-15.464 0-28 12.535-28 28 0 15.463 12.536 28 28 28s28-12.537 28-28c0-15.465-12.536-28-28-28zm560 0c-15.464 0-28 12.535-28 28 0 15.463 12.536 28 28 28s28-12.537 28-28c0-15.465-12.536-28-28-28zM499.5 532c-15.464 0-28 12.536-28 28s12.536 28 28 28 28-12.536 28-28-12.536-28-28-28zM220 591.95c-15.464 0-28 12.535-28 28 0 15.463 12.536 28 28 28s28-12.537 28-28c0-15.465-12.536-28-28-28zm560 0c-15.464 0-28 12.535-28 28 0 15.463 12.536 28 28 28s28-12.537 28-28c0-15.465-12.536-28-28-28z" fill="#189efc"/></svg>
|
After Width: | Height: | Size: 1.5 KiB |
BIN
app/assets/images/mastodon-getting-started.png
Normal file
After Width: | Height: | Size: 34 KiB |
BIN
app/assets/images/mastodon-not-found.png
Normal file
After Width: | Height: | Size: 19 KiB |
BIN
app/assets/images/mastodon.jpg
Normal file
After Width: | Height: | Size: 131 KiB |
BIN
app/assets/images/mastodon_small.jpg
Normal file
After Width: | Height: | Size: 25 KiB |
BIN
app/assets/images/screenshot.png
Normal file
After Width: | Height: | Size: 244 KiB |
BIN
app/assets/images/void.png
Normal file
After Width: | Height: | Size: 174 B |
15
app/assets/javascripts/application.js
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
// This is a manifest file that'll be compiled into application.js, which will include all the files
|
||||||
|
// listed below.
|
||||||
|
//
|
||||||
|
// Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
|
||||||
|
// or any plugin's vendor/assets/javascripts directory can be referenced here using a relative path.
|
||||||
|
//
|
||||||
|
// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
|
||||||
|
// compiled file.
|
||||||
|
//
|
||||||
|
// Read Sprockets README (https://github.com/rails/sprockets#sprockets-directives) for details
|
||||||
|
// about supported directives.
|
||||||
|
//
|
||||||
|
//= require jquery2
|
||||||
|
//= require jquery_ujs
|
||||||
|
//= require components
|
9
app/assets/javascripts/application_public.js
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
//= require jquery2
|
||||||
|
//= require jquery_ujs
|
||||||
|
//= require extras
|
||||||
|
//= require best_in_place
|
||||||
|
//= require local_time
|
||||||
|
|
||||||
|
$(function () {
|
||||||
|
$(".best_in_place").best_in_place();
|
||||||
|
});
|
15
app/assets/javascripts/components.js
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
//= require_self
|
||||||
|
//= require react_ujs
|
||||||
|
|
||||||
|
window.React = require('react');
|
||||||
|
window.ReactDOM = require('react-dom');
|
||||||
|
window.Perf = require('react-addons-perf');
|
||||||
|
|
||||||
|
if (!window.Intl) {
|
||||||
|
require('intl');
|
||||||
|
require('intl/locale-data/jsonp/en.js');
|
||||||
|
}
|
||||||
|
|
||||||
|
//= require_tree ./components
|
||||||
|
|
||||||
|
window.Mastodon = require('./components/containers/mastodon');
|
762
app/assets/javascripts/components/actions/accounts.jsx
Normal file
@@ -0,0 +1,762 @@
|
|||||||
|
import api, { getLinks } from '../api'
|
||||||
|
import Immutable from 'immutable';
|
||||||
|
|
||||||
|
export const ACCOUNT_FETCH_REQUEST = 'ACCOUNT_FETCH_REQUEST';
|
||||||
|
export const ACCOUNT_FETCH_SUCCESS = 'ACCOUNT_FETCH_SUCCESS';
|
||||||
|
export const ACCOUNT_FETCH_FAIL = 'ACCOUNT_FETCH_FAIL';
|
||||||
|
|
||||||
|
export const ACCOUNT_FOLLOW_REQUEST = 'ACCOUNT_FOLLOW_REQUEST';
|
||||||
|
export const ACCOUNT_FOLLOW_SUCCESS = 'ACCOUNT_FOLLOW_SUCCESS';
|
||||||
|
export const ACCOUNT_FOLLOW_FAIL = 'ACCOUNT_FOLLOW_FAIL';
|
||||||
|
|
||||||
|
export const ACCOUNT_UNFOLLOW_REQUEST = 'ACCOUNT_UNFOLLOW_REQUEST';
|
||||||
|
export const ACCOUNT_UNFOLLOW_SUCCESS = 'ACCOUNT_UNFOLLOW_SUCCESS';
|
||||||
|
export const ACCOUNT_UNFOLLOW_FAIL = 'ACCOUNT_UNFOLLOW_FAIL';
|
||||||
|
|
||||||
|
export const ACCOUNT_BLOCK_REQUEST = 'ACCOUNT_BLOCK_REQUEST';
|
||||||
|
export const ACCOUNT_BLOCK_SUCCESS = 'ACCOUNT_BLOCK_SUCCESS';
|
||||||
|
export const ACCOUNT_BLOCK_FAIL = 'ACCOUNT_BLOCK_FAIL';
|
||||||
|
|
||||||
|
export const ACCOUNT_UNBLOCK_REQUEST = 'ACCOUNT_UNBLOCK_REQUEST';
|
||||||
|
export const ACCOUNT_UNBLOCK_SUCCESS = 'ACCOUNT_UNBLOCK_SUCCESS';
|
||||||
|
export const ACCOUNT_UNBLOCK_FAIL = 'ACCOUNT_UNBLOCK_FAIL';
|
||||||
|
|
||||||
|
export const ACCOUNT_MUTE_REQUEST = 'ACCOUNT_MUTE_REQUEST';
|
||||||
|
export const ACCOUNT_MUTE_SUCCESS = 'ACCOUNT_MUTE_SUCCESS';
|
||||||
|
export const ACCOUNT_MUTE_FAIL = 'ACCOUNT_MUTE_FAIL';
|
||||||
|
|
||||||
|
export const ACCOUNT_UNMUTE_REQUEST = 'ACCOUNT_UNMUTE_REQUEST';
|
||||||
|
export const ACCOUNT_UNMUTE_SUCCESS = 'ACCOUNT_UNMUTE_SUCCESS';
|
||||||
|
export const ACCOUNT_UNMUTE_FAIL = 'ACCOUNT_UNMUTE_FAIL';
|
||||||
|
|
||||||
|
export const ACCOUNT_TIMELINE_FETCH_REQUEST = 'ACCOUNT_TIMELINE_FETCH_REQUEST';
|
||||||
|
export const ACCOUNT_TIMELINE_FETCH_SUCCESS = 'ACCOUNT_TIMELINE_FETCH_SUCCESS';
|
||||||
|
export const ACCOUNT_TIMELINE_FETCH_FAIL = 'ACCOUNT_TIMELINE_FETCH_FAIL';
|
||||||
|
|
||||||
|
export const ACCOUNT_TIMELINE_EXPAND_REQUEST = 'ACCOUNT_TIMELINE_EXPAND_REQUEST';
|
||||||
|
export const ACCOUNT_TIMELINE_EXPAND_SUCCESS = 'ACCOUNT_TIMELINE_EXPAND_SUCCESS';
|
||||||
|
export const ACCOUNT_TIMELINE_EXPAND_FAIL = 'ACCOUNT_TIMELINE_EXPAND_FAIL';
|
||||||
|
|
||||||
|
export const FOLLOWERS_FETCH_REQUEST = 'FOLLOWERS_FETCH_REQUEST';
|
||||||
|
export const FOLLOWERS_FETCH_SUCCESS = 'FOLLOWERS_FETCH_SUCCESS';
|
||||||
|
export const FOLLOWERS_FETCH_FAIL = 'FOLLOWERS_FETCH_FAIL';
|
||||||
|
|
||||||
|
export const FOLLOWERS_EXPAND_REQUEST = 'FOLLOWERS_EXPAND_REQUEST';
|
||||||
|
export const FOLLOWERS_EXPAND_SUCCESS = 'FOLLOWERS_EXPAND_SUCCESS';
|
||||||
|
export const FOLLOWERS_EXPAND_FAIL = 'FOLLOWERS_EXPAND_FAIL';
|
||||||
|
|
||||||
|
export const FOLLOWING_FETCH_REQUEST = 'FOLLOWING_FETCH_REQUEST';
|
||||||
|
export const FOLLOWING_FETCH_SUCCESS = 'FOLLOWING_FETCH_SUCCESS';
|
||||||
|
export const FOLLOWING_FETCH_FAIL = 'FOLLOWING_FETCH_FAIL';
|
||||||
|
|
||||||
|
export const FOLLOWING_EXPAND_REQUEST = 'FOLLOWING_EXPAND_REQUEST';
|
||||||
|
export const FOLLOWING_EXPAND_SUCCESS = 'FOLLOWING_EXPAND_SUCCESS';
|
||||||
|
export const FOLLOWING_EXPAND_FAIL = 'FOLLOWING_EXPAND_FAIL';
|
||||||
|
|
||||||
|
export const RELATIONSHIPS_FETCH_REQUEST = 'RELATIONSHIPS_FETCH_REQUEST';
|
||||||
|
export const RELATIONSHIPS_FETCH_SUCCESS = 'RELATIONSHIPS_FETCH_SUCCESS';
|
||||||
|
export const RELATIONSHIPS_FETCH_FAIL = 'RELATIONSHIPS_FETCH_FAIL';
|
||||||
|
|
||||||
|
export const FOLLOW_REQUESTS_FETCH_REQUEST = 'FOLLOW_REQUESTS_FETCH_REQUEST';
|
||||||
|
export const FOLLOW_REQUESTS_FETCH_SUCCESS = 'FOLLOW_REQUESTS_FETCH_SUCCESS';
|
||||||
|
export const FOLLOW_REQUESTS_FETCH_FAIL = 'FOLLOW_REQUESTS_FETCH_FAIL';
|
||||||
|
|
||||||
|
export const FOLLOW_REQUESTS_EXPAND_REQUEST = 'FOLLOW_REQUESTS_EXPAND_REQUEST';
|
||||||
|
export const FOLLOW_REQUESTS_EXPAND_SUCCESS = 'FOLLOW_REQUESTS_EXPAND_SUCCESS';
|
||||||
|
export const FOLLOW_REQUESTS_EXPAND_FAIL = 'FOLLOW_REQUESTS_EXPAND_FAIL';
|
||||||
|
|
||||||
|
export const FOLLOW_REQUEST_AUTHORIZE_REQUEST = 'FOLLOW_REQUEST_AUTHORIZE_REQUEST';
|
||||||
|
export const FOLLOW_REQUEST_AUTHORIZE_SUCCESS = 'FOLLOW_REQUEST_AUTHORIZE_SUCCESS';
|
||||||
|
export const FOLLOW_REQUEST_AUTHORIZE_FAIL = 'FOLLOW_REQUEST_AUTHORIZE_FAIL';
|
||||||
|
|
||||||
|
export const FOLLOW_REQUEST_REJECT_REQUEST = 'FOLLOW_REQUEST_REJECT_REQUEST';
|
||||||
|
export const FOLLOW_REQUEST_REJECT_SUCCESS = 'FOLLOW_REQUEST_REJECT_SUCCESS';
|
||||||
|
export const FOLLOW_REQUEST_REJECT_FAIL = 'FOLLOW_REQUEST_REJECT_FAIL';
|
||||||
|
|
||||||
|
export function fetchAccount(id) {
|
||||||
|
return (dispatch, getState) => {
|
||||||
|
dispatch(fetchRelationships([id]));
|
||||||
|
|
||||||
|
if (getState().getIn(['accounts', id], null) !== null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
dispatch(fetchAccountRequest(id));
|
||||||
|
|
||||||
|
api(getState).get(`/api/v1/accounts/${id}`).then(response => {
|
||||||
|
dispatch(fetchAccountSuccess(response.data));
|
||||||
|
}).catch(error => {
|
||||||
|
dispatch(fetchAccountFail(id, error));
|
||||||
|
});
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function fetchAccountTimeline(id, replace = false) {
|
||||||
|
return (dispatch, getState) => {
|
||||||
|
const ids = getState().getIn(['timelines', 'accounts_timelines', id, 'items'], Immutable.List());
|
||||||
|
const newestId = ids.size > 0 ? ids.first() : null;
|
||||||
|
|
||||||
|
let params = '';
|
||||||
|
let skipLoading = false;
|
||||||
|
|
||||||
|
if (newestId !== null && !replace) {
|
||||||
|
params = `?since_id=${newestId}`;
|
||||||
|
skipLoading = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
dispatch(fetchAccountTimelineRequest(id, skipLoading));
|
||||||
|
|
||||||
|
api(getState).get(`/api/v1/accounts/${id}/statuses${params}`).then(response => {
|
||||||
|
dispatch(fetchAccountTimelineSuccess(id, response.data, replace, skipLoading));
|
||||||
|
}).catch(error => {
|
||||||
|
dispatch(fetchAccountTimelineFail(id, error, skipLoading));
|
||||||
|
});
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function expandAccountTimeline(id) {
|
||||||
|
return (dispatch, getState) => {
|
||||||
|
const lastId = getState().getIn(['timelines', 'accounts_timelines', id, 'items'], Immutable.List()).last();
|
||||||
|
|
||||||
|
dispatch(expandAccountTimelineRequest(id));
|
||||||
|
|
||||||
|
api(getState).get(`/api/v1/accounts/${id}/statuses`, {
|
||||||
|
params: {
|
||||||
|
limit: 10,
|
||||||
|
max_id: lastId
|
||||||
|
}
|
||||||
|
}).then(response => {
|
||||||
|
const next = getLinks(response).refs.find(link => link.rel === 'next');
|
||||||
|
dispatch(expandAccountTimelineSuccess(id, response.data, next));
|
||||||
|
}).catch(error => {
|
||||||
|
dispatch(expandAccountTimelineFail(id, error));
|
||||||
|
});
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function fetchAccountRequest(id) {
|
||||||
|
return {
|
||||||
|
type: ACCOUNT_FETCH_REQUEST,
|
||||||
|
id
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function fetchAccountSuccess(account) {
|
||||||
|
return {
|
||||||
|
type: ACCOUNT_FETCH_SUCCESS,
|
||||||
|
account
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function fetchAccountFail(id, error) {
|
||||||
|
return {
|
||||||
|
type: ACCOUNT_FETCH_FAIL,
|
||||||
|
id,
|
||||||
|
error,
|
||||||
|
skipAlert: true
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function followAccount(id) {
|
||||||
|
return (dispatch, getState) => {
|
||||||
|
dispatch(followAccountRequest(id));
|
||||||
|
|
||||||
|
api(getState).post(`/api/v1/accounts/${id}/follow`).then(response => {
|
||||||
|
dispatch(followAccountSuccess(response.data));
|
||||||
|
}).catch(error => {
|
||||||
|
dispatch(followAccountFail(error));
|
||||||
|
});
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function unfollowAccount(id) {
|
||||||
|
return (dispatch, getState) => {
|
||||||
|
dispatch(unfollowAccountRequest(id));
|
||||||
|
|
||||||
|
api(getState).post(`/api/v1/accounts/${id}/unfollow`).then(response => {
|
||||||
|
dispatch(unfollowAccountSuccess(response.data));
|
||||||
|
}).catch(error => {
|
||||||
|
dispatch(unfollowAccountFail(error));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
export function followAccountRequest(id) {
|
||||||
|
return {
|
||||||
|
type: ACCOUNT_FOLLOW_REQUEST,
|
||||||
|
id
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function followAccountSuccess(relationship) {
|
||||||
|
return {
|
||||||
|
type: ACCOUNT_FOLLOW_SUCCESS,
|
||||||
|
relationship
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function followAccountFail(error) {
|
||||||
|
return {
|
||||||
|
type: ACCOUNT_FOLLOW_FAIL,
|
||||||
|
error
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function unfollowAccountRequest(id) {
|
||||||
|
return {
|
||||||
|
type: ACCOUNT_UNFOLLOW_REQUEST,
|
||||||
|
id
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function unfollowAccountSuccess(relationship) {
|
||||||
|
return {
|
||||||
|
type: ACCOUNT_UNFOLLOW_SUCCESS,
|
||||||
|
relationship
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function unfollowAccountFail(error) {
|
||||||
|
return {
|
||||||
|
type: ACCOUNT_UNFOLLOW_FAIL,
|
||||||
|
error
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function fetchAccountTimelineRequest(id, skipLoading) {
|
||||||
|
return {
|
||||||
|
type: ACCOUNT_TIMELINE_FETCH_REQUEST,
|
||||||
|
id,
|
||||||
|
skipLoading
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function fetchAccountTimelineSuccess(id, statuses, replace, skipLoading) {
|
||||||
|
return {
|
||||||
|
type: ACCOUNT_TIMELINE_FETCH_SUCCESS,
|
||||||
|
id,
|
||||||
|
statuses,
|
||||||
|
replace,
|
||||||
|
skipLoading
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function fetchAccountTimelineFail(id, error, skipLoading) {
|
||||||
|
return {
|
||||||
|
type: ACCOUNT_TIMELINE_FETCH_FAIL,
|
||||||
|
id,
|
||||||
|
error,
|
||||||
|
skipLoading,
|
||||||
|
skipAlert: error.response.status === 404
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function expandAccountTimelineRequest(id) {
|
||||||
|
return {
|
||||||
|
type: ACCOUNT_TIMELINE_EXPAND_REQUEST,
|
||||||
|
id
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function expandAccountTimelineSuccess(id, statuses, next) {
|
||||||
|
return {
|
||||||
|
type: ACCOUNT_TIMELINE_EXPAND_SUCCESS,
|
||||||
|
id,
|
||||||
|
statuses,
|
||||||
|
next
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function expandAccountTimelineFail(id, error) {
|
||||||
|
return {
|
||||||
|
type: ACCOUNT_TIMELINE_EXPAND_FAIL,
|
||||||
|
id,
|
||||||
|
error
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function blockAccount(id) {
|
||||||
|
return (dispatch, getState) => {
|
||||||
|
dispatch(blockAccountRequest(id));
|
||||||
|
|
||||||
|
api(getState).post(`/api/v1/accounts/${id}/block`).then(response => {
|
||||||
|
// Pass in entire statuses map so we can use it to filter stuff in different parts of the reducers
|
||||||
|
dispatch(blockAccountSuccess(response.data, getState().get('statuses')));
|
||||||
|
}).catch(error => {
|
||||||
|
dispatch(blockAccountFail(id, error));
|
||||||
|
});
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function unblockAccount(id) {
|
||||||
|
return (dispatch, getState) => {
|
||||||
|
dispatch(unblockAccountRequest(id));
|
||||||
|
|
||||||
|
api(getState).post(`/api/v1/accounts/${id}/unblock`).then(response => {
|
||||||
|
dispatch(unblockAccountSuccess(response.data));
|
||||||
|
}).catch(error => {
|
||||||
|
dispatch(unblockAccountFail(id, error));
|
||||||
|
});
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function blockAccountRequest(id) {
|
||||||
|
return {
|
||||||
|
type: ACCOUNT_BLOCK_REQUEST,
|
||||||
|
id
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function blockAccountSuccess(relationship, statuses) {
|
||||||
|
return {
|
||||||
|
type: ACCOUNT_BLOCK_SUCCESS,
|
||||||
|
relationship,
|
||||||
|
statuses
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function blockAccountFail(error) {
|
||||||
|
return {
|
||||||
|
type: ACCOUNT_BLOCK_FAIL,
|
||||||
|
error
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function unblockAccountRequest(id) {
|
||||||
|
return {
|
||||||
|
type: ACCOUNT_UNBLOCK_REQUEST,
|
||||||
|
id
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function unblockAccountSuccess(relationship) {
|
||||||
|
return {
|
||||||
|
type: ACCOUNT_UNBLOCK_SUCCESS,
|
||||||
|
relationship
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function unblockAccountFail(error) {
|
||||||
|
return {
|
||||||
|
type: ACCOUNT_UNBLOCK_FAIL,
|
||||||
|
error
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
export function muteAccount(id) {
|
||||||
|
return (dispatch, getState) => {
|
||||||
|
dispatch(muteAccountRequest(id));
|
||||||
|
|
||||||
|
api(getState).post(`/api/v1/accounts/${id}/mute`).then(response => {
|
||||||
|
// Pass in entire statuses map so we can use it to filter stuff in different parts of the reducers
|
||||||
|
dispatch(muteAccountSuccess(response.data, getState().get('statuses')));
|
||||||
|
}).catch(error => {
|
||||||
|
dispatch(muteAccountFail(id, error));
|
||||||
|
});
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function unmuteAccount(id) {
|
||||||
|
return (dispatch, getState) => {
|
||||||
|
dispatch(unmuteAccountRequest(id));
|
||||||
|
|
||||||
|
api(getState).post(`/api/v1/accounts/${id}/unmute`).then(response => {
|
||||||
|
dispatch(unmuteAccountSuccess(response.data));
|
||||||
|
}).catch(error => {
|
||||||
|
dispatch(unmuteAccountFail(id, error));
|
||||||
|
});
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function muteAccountRequest(id) {
|
||||||
|
return {
|
||||||
|
type: ACCOUNT_MUTE_REQUEST,
|
||||||
|
id
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function muteAccountSuccess(relationship, statuses) {
|
||||||
|
return {
|
||||||
|
type: ACCOUNT_MUTE_SUCCESS,
|
||||||
|
relationship,
|
||||||
|
statuses
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function muteAccountFail(error) {
|
||||||
|
return {
|
||||||
|
type: ACCOUNT_MUTE_FAIL,
|
||||||
|
error
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function unmuteAccountRequest(id) {
|
||||||
|
return {
|
||||||
|
type: ACCOUNT_UNMUTE_REQUEST,
|
||||||
|
id
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function unmuteAccountSuccess(relationship) {
|
||||||
|
return {
|
||||||
|
type: ACCOUNT_UNMUTE_SUCCESS,
|
||||||
|
relationship
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function unmuteAccountFail(error) {
|
||||||
|
return {
|
||||||
|
type: ACCOUNT_UNMUTE_FAIL,
|
||||||
|
error
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
export function fetchFollowers(id) {
|
||||||
|
return (dispatch, getState) => {
|
||||||
|
dispatch(fetchFollowersRequest(id));
|
||||||
|
|
||||||
|
api(getState).get(`/api/v1/accounts/${id}/followers`).then(response => {
|
||||||
|
const next = getLinks(response).refs.find(link => link.rel === 'next');
|
||||||
|
|
||||||
|
dispatch(fetchFollowersSuccess(id, response.data, next ? next.uri : null));
|
||||||
|
dispatch(fetchRelationships(response.data.map(item => item.id)));
|
||||||
|
}).catch(error => {
|
||||||
|
dispatch(fetchFollowersFail(id, error));
|
||||||
|
});
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function fetchFollowersRequest(id) {
|
||||||
|
return {
|
||||||
|
type: FOLLOWERS_FETCH_REQUEST,
|
||||||
|
id
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function fetchFollowersSuccess(id, accounts, next) {
|
||||||
|
return {
|
||||||
|
type: FOLLOWERS_FETCH_SUCCESS,
|
||||||
|
id,
|
||||||
|
accounts,
|
||||||
|
next
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function fetchFollowersFail(id, error) {
|
||||||
|
return {
|
||||||
|
type: FOLLOWERS_FETCH_FAIL,
|
||||||
|
id,
|
||||||
|
error
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function expandFollowers(id) {
|
||||||
|
return (dispatch, getState) => {
|
||||||
|
const url = getState().getIn(['user_lists', 'followers', id, 'next']);
|
||||||
|
|
||||||
|
if (url === null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
dispatch(expandFollowersRequest(id));
|
||||||
|
|
||||||
|
api(getState).get(url).then(response => {
|
||||||
|
const next = getLinks(response).refs.find(link => link.rel === 'next');
|
||||||
|
|
||||||
|
dispatch(expandFollowersSuccess(id, response.data, next ? next.uri : null));
|
||||||
|
dispatch(fetchRelationships(response.data.map(item => item.id)));
|
||||||
|
}).catch(error => {
|
||||||
|
dispatch(expandFollowersFail(id, error));
|
||||||
|
});
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function expandFollowersRequest(id) {
|
||||||
|
return {
|
||||||
|
type: FOLLOWERS_EXPAND_REQUEST,
|
||||||
|
id
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function expandFollowersSuccess(id, accounts, next) {
|
||||||
|
return {
|
||||||
|
type: FOLLOWERS_EXPAND_SUCCESS,
|
||||||
|
id,
|
||||||
|
accounts,
|
||||||
|
next
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function expandFollowersFail(id, error) {
|
||||||
|
return {
|
||||||
|
type: FOLLOWERS_EXPAND_FAIL,
|
||||||
|
id,
|
||||||
|
error
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function fetchFollowing(id) {
|
||||||
|
return (dispatch, getState) => {
|
||||||
|
dispatch(fetchFollowingRequest(id));
|
||||||
|
|
||||||
|
api(getState).get(`/api/v1/accounts/${id}/following`).then(response => {
|
||||||
|
const next = getLinks(response).refs.find(link => link.rel === 'next');
|
||||||
|
|
||||||
|
dispatch(fetchFollowingSuccess(id, response.data, next ? next.uri : null));
|
||||||
|
dispatch(fetchRelationships(response.data.map(item => item.id)));
|
||||||
|
}).catch(error => {
|
||||||
|
dispatch(fetchFollowingFail(id, error));
|
||||||
|
});
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function fetchFollowingRequest(id) {
|
||||||
|
return {
|
||||||
|
type: FOLLOWING_FETCH_REQUEST,
|
||||||
|
id
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function fetchFollowingSuccess(id, accounts, next) {
|
||||||
|
return {
|
||||||
|
type: FOLLOWING_FETCH_SUCCESS,
|
||||||
|
id,
|
||||||
|
accounts,
|
||||||
|
next
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function fetchFollowingFail(id, error) {
|
||||||
|
return {
|
||||||
|
type: FOLLOWING_FETCH_FAIL,
|
||||||
|
id,
|
||||||
|
error
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function expandFollowing(id) {
|
||||||
|
return (dispatch, getState) => {
|
||||||
|
const url = getState().getIn(['user_lists', 'following', id, 'next']);
|
||||||
|
|
||||||
|
if (url === null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
dispatch(expandFollowingRequest(id));
|
||||||
|
|
||||||
|
api(getState).get(url).then(response => {
|
||||||
|
const next = getLinks(response).refs.find(link => link.rel === 'next');
|
||||||
|
|
||||||
|
dispatch(expandFollowingSuccess(id, response.data, next ? next.uri : null));
|
||||||
|
dispatch(fetchRelationships(response.data.map(item => item.id)));
|
||||||
|
}).catch(error => {
|
||||||
|
dispatch(expandFollowingFail(id, error));
|
||||||
|
});
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function expandFollowingRequest(id) {
|
||||||
|
return {
|
||||||
|
type: FOLLOWING_EXPAND_REQUEST,
|
||||||
|
id
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function expandFollowingSuccess(id, accounts, next) {
|
||||||
|
return {
|
||||||
|
type: FOLLOWING_EXPAND_SUCCESS,
|
||||||
|
id,
|
||||||
|
accounts,
|
||||||
|
next
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function expandFollowingFail(id, error) {
|
||||||
|
return {
|
||||||
|
type: FOLLOWING_EXPAND_FAIL,
|
||||||
|
id,
|
||||||
|
error
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function fetchRelationships(accountIds) {
|
||||||
|
return (dispatch, getState) => {
|
||||||
|
const loadedRelationships = getState().get('relationships');
|
||||||
|
const newAccountIds = accountIds.filter(id => loadedRelationships.get(id, null) === null);
|
||||||
|
|
||||||
|
if (newAccountIds.length === 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
dispatch(fetchRelationshipsRequest(newAccountIds));
|
||||||
|
|
||||||
|
api(getState).get(`/api/v1/accounts/relationships?${newAccountIds.map(id => `id[]=${id}`).join('&')}`).then(response => {
|
||||||
|
dispatch(fetchRelationshipsSuccess(response.data));
|
||||||
|
}).catch(error => {
|
||||||
|
dispatch(fetchRelationshipsFail(error));
|
||||||
|
});
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function fetchRelationshipsRequest(ids) {
|
||||||
|
return {
|
||||||
|
type: RELATIONSHIPS_FETCH_REQUEST,
|
||||||
|
ids,
|
||||||
|
skipLoading: true
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function fetchRelationshipsSuccess(relationships) {
|
||||||
|
return {
|
||||||
|
type: RELATIONSHIPS_FETCH_SUCCESS,
|
||||||
|
relationships,
|
||||||
|
skipLoading: true
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function fetchRelationshipsFail(error) {
|
||||||
|
return {
|
||||||
|
type: RELATIONSHIPS_FETCH_FAIL,
|
||||||
|
error,
|
||||||
|
skipLoading: true
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function fetchFollowRequests() {
|
||||||
|
return (dispatch, getState) => {
|
||||||
|
dispatch(fetchFollowRequestsRequest());
|
||||||
|
|
||||||
|
api(getState).get('/api/v1/follow_requests').then(response => {
|
||||||
|
const next = getLinks(response).refs.find(link => link.rel === 'next');
|
||||||
|
dispatch(fetchFollowRequestsSuccess(response.data, next ? next.uri : null))
|
||||||
|
}).catch(error => dispatch(fetchFollowRequestsFail(error)));
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function fetchFollowRequestsRequest() {
|
||||||
|
return {
|
||||||
|
type: FOLLOW_REQUESTS_FETCH_REQUEST
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function fetchFollowRequestsSuccess(accounts, next) {
|
||||||
|
return {
|
||||||
|
type: FOLLOW_REQUESTS_FETCH_SUCCESS,
|
||||||
|
accounts,
|
||||||
|
next
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function fetchFollowRequestsFail(error) {
|
||||||
|
return {
|
||||||
|
type: FOLLOW_REQUESTS_FETCH_FAIL,
|
||||||
|
error
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function expandFollowRequests() {
|
||||||
|
return (dispatch, getState) => {
|
||||||
|
const url = getState().getIn(['user_lists', 'follow_requests', 'next']);
|
||||||
|
|
||||||
|
if (url === null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
dispatch(expandFollowRequestsRequest());
|
||||||
|
|
||||||
|
api(getState).get(url).then(response => {
|
||||||
|
const next = getLinks(response).refs.find(link => link.rel === 'next');
|
||||||
|
dispatch(expandFollowRequestsSuccess(response.data, next ? next.uri : null))
|
||||||
|
}).catch(error => dispatch(expandFollowRequestsFail(error)));
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function expandFollowRequestsRequest() {
|
||||||
|
return {
|
||||||
|
type: FOLLOW_REQUESTS_EXPAND_REQUEST
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function expandFollowRequestsSuccess(accounts, next) {
|
||||||
|
return {
|
||||||
|
type: FOLLOW_REQUESTS_EXPAND_SUCCESS,
|
||||||
|
accounts,
|
||||||
|
next
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function expandFollowRequestsFail(error) {
|
||||||
|
return {
|
||||||
|
type: FOLLOW_REQUESTS_EXPAND_FAIL,
|
||||||
|
error
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function authorizeFollowRequest(id) {
|
||||||
|
return (dispatch, getState) => {
|
||||||
|
dispatch(authorizeFollowRequestRequest(id));
|
||||||
|
|
||||||
|
api(getState)
|
||||||
|
.post(`/api/v1/follow_requests/${id}/authorize`)
|
||||||
|
.then(response => dispatch(authorizeFollowRequestSuccess(id)))
|
||||||
|
.catch(error => dispatch(authorizeFollowRequestFail(id, error)));
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function authorizeFollowRequestRequest(id) {
|
||||||
|
return {
|
||||||
|
type: FOLLOW_REQUEST_AUTHORIZE_REQUEST,
|
||||||
|
id
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function authorizeFollowRequestSuccess(id) {
|
||||||
|
return {
|
||||||
|
type: FOLLOW_REQUEST_AUTHORIZE_SUCCESS,
|
||||||
|
id
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function authorizeFollowRequestFail(id, error) {
|
||||||
|
return {
|
||||||
|
type: FOLLOW_REQUEST_AUTHORIZE_FAIL,
|
||||||
|
id,
|
||||||
|
error
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
export function rejectFollowRequest(id) {
|
||||||
|
return (dispatch, getState) => {
|
||||||
|
dispatch(rejectFollowRequestRequest(id));
|
||||||
|
|
||||||
|
api(getState)
|
||||||
|
.post(`/api/v1/follow_requests/${id}/reject`)
|
||||||
|
.then(response => dispatch(rejectFollowRequestSuccess(id)))
|
||||||
|
.catch(error => dispatch(rejectFollowRequestFail(id, error)));
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function rejectFollowRequestRequest(id) {
|
||||||
|
return {
|
||||||
|
type: FOLLOW_REQUEST_REJECT_REQUEST,
|
||||||
|
id
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function rejectFollowRequestSuccess(id) {
|
||||||
|
return {
|
||||||
|
type: FOLLOW_REQUEST_REJECT_SUCCESS,
|
||||||
|
id
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function rejectFollowRequestFail(id, error) {
|
||||||
|
return {
|
||||||
|
type: FOLLOW_REQUEST_REJECT_FAIL,
|
||||||
|
id,
|
||||||
|
error
|
||||||
|
};
|
||||||
|
};
|
24
app/assets/javascripts/components/actions/alerts.jsx
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
export const ALERT_SHOW = 'ALERT_SHOW';
|
||||||
|
export const ALERT_DISMISS = 'ALERT_DISMISS';
|
||||||
|
export const ALERT_CLEAR = 'ALERT_CLEAR';
|
||||||
|
|
||||||
|
export function dismissAlert(alert) {
|
||||||
|
return {
|
||||||
|
type: ALERT_DISMISS,
|
||||||
|
alert
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function clearAlert() {
|
||||||
|
return {
|
||||||
|
type: ALERT_CLEAR
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function showAlert(title, message) {
|
||||||
|
return {
|
||||||
|
type: ALERT_SHOW,
|
||||||
|
title,
|
||||||
|
message
|
||||||
|
};
|
||||||
|
};
|
82
app/assets/javascripts/components/actions/blocks.jsx
Normal file
@@ -0,0 +1,82 @@
|
|||||||
|
import api, { getLinks } from '../api'
|
||||||
|
import { fetchRelationships } from './accounts';
|
||||||
|
|
||||||
|
export const BLOCKS_FETCH_REQUEST = 'BLOCKS_FETCH_REQUEST';
|
||||||
|
export const BLOCKS_FETCH_SUCCESS = 'BLOCKS_FETCH_SUCCESS';
|
||||||
|
export const BLOCKS_FETCH_FAIL = 'BLOCKS_FETCH_FAIL';
|
||||||
|
|
||||||
|
export const BLOCKS_EXPAND_REQUEST = 'BLOCKS_EXPAND_REQUEST';
|
||||||
|
export const BLOCKS_EXPAND_SUCCESS = 'BLOCKS_EXPAND_SUCCESS';
|
||||||
|
export const BLOCKS_EXPAND_FAIL = 'BLOCKS_EXPAND_FAIL';
|
||||||
|
|
||||||
|
export function fetchBlocks() {
|
||||||
|
return (dispatch, getState) => {
|
||||||
|
dispatch(fetchBlocksRequest());
|
||||||
|
|
||||||
|
api(getState).get('/api/v1/blocks').then(response => {
|
||||||
|
const next = getLinks(response).refs.find(link => link.rel === 'next');
|
||||||
|
dispatch(fetchBlocksSuccess(response.data, next ? next.uri : null));
|
||||||
|
dispatch(fetchRelationships(response.data.map(item => item.id)));
|
||||||
|
}).catch(error => dispatch(fetchBlocksFail(error)));
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function fetchBlocksRequest() {
|
||||||
|
return {
|
||||||
|
type: BLOCKS_FETCH_REQUEST
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function fetchBlocksSuccess(accounts, next) {
|
||||||
|
return {
|
||||||
|
type: BLOCKS_FETCH_SUCCESS,
|
||||||
|
accounts,
|
||||||
|
next
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function fetchBlocksFail(error) {
|
||||||
|
return {
|
||||||
|
type: BLOCKS_FETCH_FAIL,
|
||||||
|
error
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function expandBlocks() {
|
||||||
|
return (dispatch, getState) => {
|
||||||
|
const url = getState().getIn(['user_lists', 'blocks', 'next']);
|
||||||
|
|
||||||
|
if (url === null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
dispatch(expandBlocksRequest());
|
||||||
|
|
||||||
|
api(getState).get(url).then(response => {
|
||||||
|
const next = getLinks(response).refs.find(link => link.rel === 'next');
|
||||||
|
dispatch(expandBlocksSuccess(response.data, next ? next.uri : null));
|
||||||
|
dispatch(fetchRelationships(response.data.map(item => item.id)));
|
||||||
|
}).catch(error => dispatch(expandBlocksFail(error)));
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function expandBlocksRequest() {
|
||||||
|
return {
|
||||||
|
type: BLOCKS_EXPAND_REQUEST
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function expandBlocksSuccess(accounts, next) {
|
||||||
|
return {
|
||||||
|
type: BLOCKS_EXPAND_SUCCESS,
|
||||||
|
accounts,
|
||||||
|
next
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function expandBlocksFail(error) {
|
||||||
|
return {
|
||||||
|
type: BLOCKS_EXPAND_FAIL,
|
||||||
|
error
|
||||||
|
};
|
||||||
|
};
|
52
app/assets/javascripts/components/actions/cards.jsx
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
import api from '../api';
|
||||||
|
|
||||||
|
export const STATUS_CARD_FETCH_REQUEST = 'STATUS_CARD_FETCH_REQUEST';
|
||||||
|
export const STATUS_CARD_FETCH_SUCCESS = 'STATUS_CARD_FETCH_SUCCESS';
|
||||||
|
export const STATUS_CARD_FETCH_FAIL = 'STATUS_CARD_FETCH_FAIL';
|
||||||
|
|
||||||
|
export function fetchStatusCard(id) {
|
||||||
|
return (dispatch, getState) => {
|
||||||
|
if (getState().getIn(['cards', id], null) !== null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
dispatch(fetchStatusCardRequest(id));
|
||||||
|
|
||||||
|
api(getState).get(`/api/v1/statuses/${id}/card`).then(response => {
|
||||||
|
if (!response.data.url) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
dispatch(fetchStatusCardSuccess(id, response.data));
|
||||||
|
}).catch(error => {
|
||||||
|
dispatch(fetchStatusCardFail(id, error));
|
||||||
|
});
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function fetchStatusCardRequest(id) {
|
||||||
|
return {
|
||||||
|
type: STATUS_CARD_FETCH_REQUEST,
|
||||||
|
id,
|
||||||
|
skipLoading: true
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function fetchStatusCardSuccess(id, card) {
|
||||||
|
return {
|
||||||
|
type: STATUS_CARD_FETCH_SUCCESS,
|
||||||
|
id,
|
||||||
|
card,
|
||||||
|
skipLoading: true
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function fetchStatusCardFail(id, error) {
|
||||||
|
return {
|
||||||
|
type: STATUS_CARD_FETCH_FAIL,
|
||||||
|
id,
|
||||||
|
error,
|
||||||
|
skipLoading: true,
|
||||||
|
skipAlert: true
|
||||||
|
};
|
||||||
|
};
|
279
app/assets/javascripts/components/actions/compose.jsx
Normal file
@@ -0,0 +1,279 @@
|
|||||||
|
import api from '../api';
|
||||||
|
|
||||||
|
import { updateTimeline } from './timelines';
|
||||||
|
|
||||||
|
import * as emojione from 'emojione';
|
||||||
|
|
||||||
|
export const COMPOSE_CHANGE = 'COMPOSE_CHANGE';
|
||||||
|
export const COMPOSE_SUBMIT_REQUEST = 'COMPOSE_SUBMIT_REQUEST';
|
||||||
|
export const COMPOSE_SUBMIT_SUCCESS = 'COMPOSE_SUBMIT_SUCCESS';
|
||||||
|
export const COMPOSE_SUBMIT_FAIL = 'COMPOSE_SUBMIT_FAIL';
|
||||||
|
export const COMPOSE_REPLY = 'COMPOSE_REPLY';
|
||||||
|
export const COMPOSE_REPLY_CANCEL = 'COMPOSE_REPLY_CANCEL';
|
||||||
|
export const COMPOSE_MENTION = 'COMPOSE_MENTION';
|
||||||
|
export const COMPOSE_UPLOAD_REQUEST = 'COMPOSE_UPLOAD_REQUEST';
|
||||||
|
export const COMPOSE_UPLOAD_SUCCESS = 'COMPOSE_UPLOAD_SUCCESS';
|
||||||
|
export const COMPOSE_UPLOAD_FAIL = 'COMPOSE_UPLOAD_FAIL';
|
||||||
|
export const COMPOSE_UPLOAD_PROGRESS = 'COMPOSE_UPLOAD_PROGRESS';
|
||||||
|
export const COMPOSE_UPLOAD_UNDO = 'COMPOSE_UPLOAD_UNDO';
|
||||||
|
|
||||||
|
export const COMPOSE_SUGGESTIONS_CLEAR = 'COMPOSE_SUGGESTIONS_CLEAR';
|
||||||
|
export const COMPOSE_SUGGESTIONS_READY = 'COMPOSE_SUGGESTIONS_READY';
|
||||||
|
export const COMPOSE_SUGGESTION_SELECT = 'COMPOSE_SUGGESTION_SELECT';
|
||||||
|
|
||||||
|
export const COMPOSE_MOUNT = 'COMPOSE_MOUNT';
|
||||||
|
export const COMPOSE_UNMOUNT = 'COMPOSE_UNMOUNT';
|
||||||
|
|
||||||
|
export const COMPOSE_SENSITIVITY_CHANGE = 'COMPOSE_SENSITIVITY_CHANGE';
|
||||||
|
export const COMPOSE_SPOILERNESS_CHANGE = 'COMPOSE_SPOILERNESS_CHANGE';
|
||||||
|
export const COMPOSE_SPOILER_TEXT_CHANGE = 'COMPOSE_SPOILER_TEXT_CHANGE';
|
||||||
|
export const COMPOSE_VISIBILITY_CHANGE = 'COMPOSE_VISIBILITY_CHANGE';
|
||||||
|
export const COMPOSE_LISTABILITY_CHANGE = 'COMPOSE_LISTABILITY_CHANGE';
|
||||||
|
|
||||||
|
export const COMPOSE_EMOJI_INSERT = 'COMPOSE_EMOJI_INSERT';
|
||||||
|
|
||||||
|
export function changeCompose(text) {
|
||||||
|
return {
|
||||||
|
type: COMPOSE_CHANGE,
|
||||||
|
text: text
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function replyCompose(status, router) {
|
||||||
|
return (dispatch, getState) => {
|
||||||
|
dispatch({
|
||||||
|
type: COMPOSE_REPLY,
|
||||||
|
status: status
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!getState().getIn(['compose', 'mounted'])) {
|
||||||
|
router.push('/statuses/new');
|
||||||
|
}
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function cancelReplyCompose() {
|
||||||
|
return {
|
||||||
|
type: COMPOSE_REPLY_CANCEL
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function mentionCompose(account, router) {
|
||||||
|
return (dispatch, getState) => {
|
||||||
|
dispatch({
|
||||||
|
type: COMPOSE_MENTION,
|
||||||
|
account: account
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!getState().getIn(['compose', 'mounted'])) {
|
||||||
|
router.push('/statuses/new');
|
||||||
|
}
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function submitCompose() {
|
||||||
|
return function (dispatch, getState) {
|
||||||
|
const status = emojione.shortnameToUnicode(getState().getIn(['compose', 'text'], ''));
|
||||||
|
if (!status || !status.length) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
dispatch(submitComposeRequest());
|
||||||
|
api(getState).post('/api/v1/statuses', {
|
||||||
|
status,
|
||||||
|
in_reply_to_id: getState().getIn(['compose', 'in_reply_to'], null),
|
||||||
|
media_ids: getState().getIn(['compose', 'media_attachments']).map(item => item.get('id')),
|
||||||
|
sensitive: getState().getIn(['compose', 'sensitive']),
|
||||||
|
spoiler_text: getState().getIn(['compose', 'spoiler_text'], ''),
|
||||||
|
visibility: getState().getIn(['compose', 'privacy'])
|
||||||
|
}, {
|
||||||
|
headers: {
|
||||||
|
'Idempotency-Key': getState().getIn(['compose', 'idempotencyKey'])
|
||||||
|
}
|
||||||
|
}).then(function (response) {
|
||||||
|
dispatch(submitComposeSuccess({ ...response.data }));
|
||||||
|
|
||||||
|
// To make the app more responsive, immediately get the status into the columns
|
||||||
|
dispatch(updateTimeline('home', { ...response.data }));
|
||||||
|
|
||||||
|
if (response.data.in_reply_to_id === null && response.data.visibility === 'public') {
|
||||||
|
if (getState().getIn(['timelines', 'community', 'loaded'])) {
|
||||||
|
dispatch(updateTimeline('community', { ...response.data }));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (getState().getIn(['timelines', 'public', 'loaded'])) {
|
||||||
|
dispatch(updateTimeline('public', { ...response.data }));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}).catch(function (error) {
|
||||||
|
dispatch(submitComposeFail(error));
|
||||||
|
});
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function submitComposeRequest() {
|
||||||
|
return {
|
||||||
|
type: COMPOSE_SUBMIT_REQUEST
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function submitComposeSuccess(status) {
|
||||||
|
return {
|
||||||
|
type: COMPOSE_SUBMIT_SUCCESS,
|
||||||
|
status: status
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function submitComposeFail(error) {
|
||||||
|
return {
|
||||||
|
type: COMPOSE_SUBMIT_FAIL,
|
||||||
|
error: error
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function uploadCompose(files) {
|
||||||
|
return function (dispatch, getState) {
|
||||||
|
if (getState().getIn(['compose', 'media_attachments']).size > 3) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
dispatch(uploadComposeRequest());
|
||||||
|
|
||||||
|
let data = new FormData();
|
||||||
|
data.append('file', files[0]);
|
||||||
|
|
||||||
|
api(getState).post('/api/v1/media', data, {
|
||||||
|
onUploadProgress: function (e) {
|
||||||
|
dispatch(uploadComposeProgress(e.loaded, e.total));
|
||||||
|
}
|
||||||
|
}).then(function (response) {
|
||||||
|
dispatch(uploadComposeSuccess(response.data));
|
||||||
|
}).catch(function (error) {
|
||||||
|
dispatch(uploadComposeFail(error));
|
||||||
|
});
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function uploadComposeRequest() {
|
||||||
|
return {
|
||||||
|
type: COMPOSE_UPLOAD_REQUEST,
|
||||||
|
skipLoading: true
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function uploadComposeProgress(loaded, total) {
|
||||||
|
return {
|
||||||
|
type: COMPOSE_UPLOAD_PROGRESS,
|
||||||
|
loaded: loaded,
|
||||||
|
total: total
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function uploadComposeSuccess(media) {
|
||||||
|
return {
|
||||||
|
type: COMPOSE_UPLOAD_SUCCESS,
|
||||||
|
media: media,
|
||||||
|
skipLoading: true
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function uploadComposeFail(error) {
|
||||||
|
return {
|
||||||
|
type: COMPOSE_UPLOAD_FAIL,
|
||||||
|
error: error,
|
||||||
|
skipLoading: true
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function undoUploadCompose(media_id) {
|
||||||
|
return {
|
||||||
|
type: COMPOSE_UPLOAD_UNDO,
|
||||||
|
media_id: media_id
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function clearComposeSuggestions() {
|
||||||
|
return {
|
||||||
|
type: COMPOSE_SUGGESTIONS_CLEAR
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function fetchComposeSuggestions(token) {
|
||||||
|
return (dispatch, getState) => {
|
||||||
|
api(getState).get('/api/v1/accounts/search', {
|
||||||
|
params: {
|
||||||
|
q: token,
|
||||||
|
resolve: false,
|
||||||
|
limit: 4
|
||||||
|
}
|
||||||
|
}).then(response => {
|
||||||
|
dispatch(readyComposeSuggestions(token, response.data));
|
||||||
|
});
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function readyComposeSuggestions(token, accounts) {
|
||||||
|
return {
|
||||||
|
type: COMPOSE_SUGGESTIONS_READY,
|
||||||
|
token,
|
||||||
|
accounts
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function selectComposeSuggestion(position, token, accountId) {
|
||||||
|
return (dispatch, getState) => {
|
||||||
|
const completion = getState().getIn(['accounts', accountId, 'acct']);
|
||||||
|
|
||||||
|
dispatch({
|
||||||
|
type: COMPOSE_SUGGESTION_SELECT,
|
||||||
|
position,
|
||||||
|
token,
|
||||||
|
completion
|
||||||
|
});
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function mountCompose() {
|
||||||
|
return {
|
||||||
|
type: COMPOSE_MOUNT
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function unmountCompose() {
|
||||||
|
return {
|
||||||
|
type: COMPOSE_UNMOUNT
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function changeComposeSensitivity() {
|
||||||
|
return {
|
||||||
|
type: COMPOSE_SENSITIVITY_CHANGE,
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function changeComposeSpoilerness() {
|
||||||
|
return {
|
||||||
|
type: COMPOSE_SPOILERNESS_CHANGE
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function changeComposeSpoilerText(text) {
|
||||||
|
return {
|
||||||
|
type: COMPOSE_SPOILER_TEXT_CHANGE,
|
||||||
|
text
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function changeComposeVisibility(value) {
|
||||||
|
return {
|
||||||
|
type: COMPOSE_VISIBILITY_CHANGE,
|
||||||
|
value
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function insertEmojiCompose(position, emoji) {
|
||||||
|
return {
|
||||||
|
type: COMPOSE_EMOJI_INSERT,
|
||||||
|
position,
|
||||||
|
emoji
|
||||||
|
};
|
||||||
|
};
|
83
app/assets/javascripts/components/actions/favourites.jsx
Normal file
@@ -0,0 +1,83 @@
|
|||||||
|
import api, { getLinks } from '../api'
|
||||||
|
|
||||||
|
export const FAVOURITED_STATUSES_FETCH_REQUEST = 'FAVOURITED_STATUSES_FETCH_REQUEST';
|
||||||
|
export const FAVOURITED_STATUSES_FETCH_SUCCESS = 'FAVOURITED_STATUSES_FETCH_SUCCESS';
|
||||||
|
export const FAVOURITED_STATUSES_FETCH_FAIL = 'FAVOURITED_STATUSES_FETCH_FAIL';
|
||||||
|
|
||||||
|
export const FAVOURITED_STATUSES_EXPAND_REQUEST = 'FAVOURITED_STATUSES_EXPAND_REQUEST';
|
||||||
|
export const FAVOURITED_STATUSES_EXPAND_SUCCESS = 'FAVOURITED_STATUSES_EXPAND_SUCCESS';
|
||||||
|
export const FAVOURITED_STATUSES_EXPAND_FAIL = 'FAVOURITED_STATUSES_EXPAND_FAIL';
|
||||||
|
|
||||||
|
export function fetchFavouritedStatuses() {
|
||||||
|
return (dispatch, getState) => {
|
||||||
|
dispatch(fetchFavouritedStatusesRequest());
|
||||||
|
|
||||||
|
api(getState).get('/api/v1/favourites').then(response => {
|
||||||
|
const next = getLinks(response).refs.find(link => link.rel === 'next');
|
||||||
|
dispatch(fetchFavouritedStatusesSuccess(response.data, next ? next.uri : null));
|
||||||
|
}).catch(error => {
|
||||||
|
dispatch(fetchFavouritedStatusesFail(error));
|
||||||
|
});
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function fetchFavouritedStatusesRequest() {
|
||||||
|
return {
|
||||||
|
type: FAVOURITED_STATUSES_FETCH_REQUEST
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function fetchFavouritedStatusesSuccess(statuses, next) {
|
||||||
|
return {
|
||||||
|
type: FAVOURITED_STATUSES_FETCH_SUCCESS,
|
||||||
|
statuses,
|
||||||
|
next
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function fetchFavouritedStatusesFail(error) {
|
||||||
|
return {
|
||||||
|
type: FAVOURITED_STATUSES_FETCH_FAIL,
|
||||||
|
error
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function expandFavouritedStatuses() {
|
||||||
|
return (dispatch, getState) => {
|
||||||
|
const url = getState().getIn(['status_lists', 'favourites', 'next'], null);
|
||||||
|
|
||||||
|
if (url === null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
dispatch(expandFavouritedStatusesRequest());
|
||||||
|
|
||||||
|
api(getState).get(url).then(response => {
|
||||||
|
const next = getLinks(response).refs.find(link => link.rel === 'next');
|
||||||
|
dispatch(expandFavouritedStatusesSuccess(response.data, next ? next.uri : null));
|
||||||
|
}).catch(error => {
|
||||||
|
dispatch(expandFavouritedStatusesFail(error));
|
||||||
|
});
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function expandFavouritedStatusesRequest() {
|
||||||
|
return {
|
||||||
|
type: FAVOURITED_STATUSES_EXPAND_REQUEST
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function expandFavouritedStatusesSuccess(statuses, next) {
|
||||||
|
return {
|
||||||
|
type: FAVOURITED_STATUSES_EXPAND_SUCCESS,
|
||||||
|
statuses,
|
||||||
|
next
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function expandFavouritedStatusesFail(error) {
|
||||||
|
return {
|
||||||
|
type: FAVOURITED_STATUSES_EXPAND_FAIL,
|
||||||
|
error
|
||||||
|
};
|
||||||
|
};
|
235
app/assets/javascripts/components/actions/interactions.jsx
Normal file
@@ -0,0 +1,235 @@
|
|||||||
|
import api from '../api'
|
||||||
|
|
||||||
|
export const REBLOG_REQUEST = 'REBLOG_REQUEST';
|
||||||
|
export const REBLOG_SUCCESS = 'REBLOG_SUCCESS';
|
||||||
|
export const REBLOG_FAIL = 'REBLOG_FAIL';
|
||||||
|
|
||||||
|
export const FAVOURITE_REQUEST = 'FAVOURITE_REQUEST';
|
||||||
|
export const FAVOURITE_SUCCESS = 'FAVOURITE_SUCCESS';
|
||||||
|
export const FAVOURITE_FAIL = 'FAVOURITE_FAIL';
|
||||||
|
|
||||||
|
export const UNREBLOG_REQUEST = 'UNREBLOG_REQUEST';
|
||||||
|
export const UNREBLOG_SUCCESS = 'UNREBLOG_SUCCESS';
|
||||||
|
export const UNREBLOG_FAIL = 'UNREBLOG_FAIL';
|
||||||
|
|
||||||
|
export const UNFAVOURITE_REQUEST = 'UNFAVOURITE_REQUEST';
|
||||||
|
export const UNFAVOURITE_SUCCESS = 'UNFAVOURITE_SUCCESS';
|
||||||
|
export const UNFAVOURITE_FAIL = 'UNFAVOURITE_FAIL';
|
||||||
|
|
||||||
|
export const REBLOGS_FETCH_REQUEST = 'REBLOGS_FETCH_REQUEST';
|
||||||
|
export const REBLOGS_FETCH_SUCCESS = 'REBLOGS_FETCH_SUCCESS';
|
||||||
|
export const REBLOGS_FETCH_FAIL = 'REBLOGS_FETCH_FAIL';
|
||||||
|
|
||||||
|
export const FAVOURITES_FETCH_REQUEST = 'FAVOURITES_FETCH_REQUEST';
|
||||||
|
export const FAVOURITES_FETCH_SUCCESS = 'FAVOURITES_FETCH_SUCCESS';
|
||||||
|
export const FAVOURITES_FETCH_FAIL = 'FAVOURITES_FETCH_FAIL';
|
||||||
|
|
||||||
|
export function reblog(status) {
|
||||||
|
return function (dispatch, getState) {
|
||||||
|
dispatch(reblogRequest(status));
|
||||||
|
|
||||||
|
api(getState).post(`/api/v1/statuses/${status.get('id')}/reblog`).then(function (response) {
|
||||||
|
// The reblog API method returns a new status wrapped around the original. In this case we are only
|
||||||
|
// interested in how the original is modified, hence passing it skipping the wrapper
|
||||||
|
dispatch(reblogSuccess(status, response.data.reblog));
|
||||||
|
}).catch(function (error) {
|
||||||
|
dispatch(reblogFail(status, error));
|
||||||
|
});
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function unreblog(status) {
|
||||||
|
return (dispatch, getState) => {
|
||||||
|
dispatch(unreblogRequest(status));
|
||||||
|
|
||||||
|
api(getState).post(`/api/v1/statuses/${status.get('id')}/unreblog`).then(response => {
|
||||||
|
dispatch(unreblogSuccess(status, response.data));
|
||||||
|
}).catch(error => {
|
||||||
|
dispatch(unreblogFail(status, error));
|
||||||
|
});
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function reblogRequest(status) {
|
||||||
|
return {
|
||||||
|
type: REBLOG_REQUEST,
|
||||||
|
status: status
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function reblogSuccess(status, response) {
|
||||||
|
return {
|
||||||
|
type: REBLOG_SUCCESS,
|
||||||
|
status: status,
|
||||||
|
response: response
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function reblogFail(status, error) {
|
||||||
|
return {
|
||||||
|
type: REBLOG_FAIL,
|
||||||
|
status: status,
|
||||||
|
error: error
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function unreblogRequest(status) {
|
||||||
|
return {
|
||||||
|
type: UNREBLOG_REQUEST,
|
||||||
|
status: status
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function unreblogSuccess(status, response) {
|
||||||
|
return {
|
||||||
|
type: UNREBLOG_SUCCESS,
|
||||||
|
status: status,
|
||||||
|
response: response
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function unreblogFail(status, error) {
|
||||||
|
return {
|
||||||
|
type: UNREBLOG_FAIL,
|
||||||
|
status: status,
|
||||||
|
error: error
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function favourite(status) {
|
||||||
|
return function (dispatch, getState) {
|
||||||
|
dispatch(favouriteRequest(status));
|
||||||
|
|
||||||
|
api(getState).post(`/api/v1/statuses/${status.get('id')}/favourite`).then(function (response) {
|
||||||
|
dispatch(favouriteSuccess(status, response.data));
|
||||||
|
}).catch(function (error) {
|
||||||
|
dispatch(favouriteFail(status, error));
|
||||||
|
});
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function unfavourite(status) {
|
||||||
|
return (dispatch, getState) => {
|
||||||
|
dispatch(unfavouriteRequest(status));
|
||||||
|
|
||||||
|
api(getState).post(`/api/v1/statuses/${status.get('id')}/unfavourite`).then(response => {
|
||||||
|
dispatch(unfavouriteSuccess(status, response.data));
|
||||||
|
}).catch(error => {
|
||||||
|
dispatch(unfavouriteFail(status, error));
|
||||||
|
});
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function favouriteRequest(status) {
|
||||||
|
return {
|
||||||
|
type: FAVOURITE_REQUEST,
|
||||||
|
status: status
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function favouriteSuccess(status, response) {
|
||||||
|
return {
|
||||||
|
type: FAVOURITE_SUCCESS,
|
||||||
|
status: status,
|
||||||
|
response: response
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function favouriteFail(status, error) {
|
||||||
|
return {
|
||||||
|
type: FAVOURITE_FAIL,
|
||||||
|
status: status,
|
||||||
|
error: error
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function unfavouriteRequest(status) {
|
||||||
|
return {
|
||||||
|
type: UNFAVOURITE_REQUEST,
|
||||||
|
status: status
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function unfavouriteSuccess(status, response) {
|
||||||
|
return {
|
||||||
|
type: UNFAVOURITE_SUCCESS,
|
||||||
|
status: status,
|
||||||
|
response: response
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function unfavouriteFail(status, error) {
|
||||||
|
return {
|
||||||
|
type: UNFAVOURITE_FAIL,
|
||||||
|
status: status,
|
||||||
|
error: error
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function fetchReblogs(id) {
|
||||||
|
return (dispatch, getState) => {
|
||||||
|
dispatch(fetchReblogsRequest(id));
|
||||||
|
|
||||||
|
api(getState).get(`/api/v1/statuses/${id}/reblogged_by`).then(response => {
|
||||||
|
dispatch(fetchReblogsSuccess(id, response.data));
|
||||||
|
}).catch(error => {
|
||||||
|
dispatch(fetchReblogsFail(id, error));
|
||||||
|
});
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function fetchReblogsRequest(id) {
|
||||||
|
return {
|
||||||
|
type: REBLOGS_FETCH_REQUEST,
|
||||||
|
id
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function fetchReblogsSuccess(id, accounts) {
|
||||||
|
return {
|
||||||
|
type: REBLOGS_FETCH_SUCCESS,
|
||||||
|
id,
|
||||||
|
accounts
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function fetchReblogsFail(id, error) {
|
||||||
|
return {
|
||||||
|
type: REBLOGS_FETCH_FAIL,
|
||||||
|
error
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function fetchFavourites(id) {
|
||||||
|
return (dispatch, getState) => {
|
||||||
|
dispatch(fetchFavouritesRequest(id));
|
||||||
|
|
||||||
|
api(getState).get(`/api/v1/statuses/${id}/favourited_by`).then(response => {
|
||||||
|
dispatch(fetchFavouritesSuccess(id, response.data));
|
||||||
|
}).catch(error => {
|
||||||
|
dispatch(fetchFavouritesFail(id, error));
|
||||||
|
});
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function fetchFavouritesRequest(id) {
|
||||||
|
return {
|
||||||
|
type: FAVOURITES_FETCH_REQUEST,
|
||||||
|
id
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function fetchFavouritesSuccess(id, accounts) {
|
||||||
|
return {
|
||||||
|
type: FAVOURITES_FETCH_SUCCESS,
|
||||||
|
id,
|
||||||
|
accounts
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function fetchFavouritesFail(id, error) {
|
||||||
|
return {
|
||||||
|
type: FAVOURITES_FETCH_FAIL,
|
||||||
|
error
|
||||||
|
};
|
||||||
|
};
|
16
app/assets/javascripts/components/actions/modal.jsx
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
export const MODAL_OPEN = 'MODAL_OPEN';
|
||||||
|
export const MODAL_CLOSE = 'MODAL_CLOSE';
|
||||||
|
|
||||||
|
export function openModal(type, props) {
|
||||||
|
return {
|
||||||
|
type: MODAL_OPEN,
|
||||||
|
modalType: type,
|
||||||
|
modalProps: props
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function closeModal() {
|
||||||
|
return {
|
||||||
|
type: MODAL_CLOSE
|
||||||
|
};
|
||||||
|
};
|