Conflicts: - `.github/workflows/build-image.yml`: Upstream switched to pushing to both DockerHub and GitHub Container Repository, while glitch-soc was already pushing to the latter only. Updated our configuration to be slightly more consistent with upstream's naming and styling, but kept our behavior. - `Gemfile.lock`: Updated dependencies textually too close to glitch-soc only hcaptcha dependency. Updated dependencies as upstream did. - `README.md`: Upstream updated its README, but we have a completely different one. Kept our README, though it probably should be reworked at some point. - `app/views/auth/sessions/two_factor.html.haml`: Minor style fix upstream that's on a line glitch-soc removed because of its different theming system. Kept our file as is. - `spec/controllers/health_controller_spec.rb`: This file apparently did not exist upstream, upstream created it with different contents but it is functionally the same. Switched to upstream's version of the file. - `spec/presenters/instance_presenter_spec.rb`: Upstream changed the specs around `GITHUB_REPOSITORY`, while glitch-soc had its own code because it's a fork and does not have the same default source URL. Took upstream's change, but with glitch-soc's repo as the default case. - `yarn.lock`: Upstream dependencies textually too close to a glitch-soc only one. Updated dependencies as upstream did.closed-social-glitch-2
@ -1,128 +0,0 @@ | |||
version: 2.1 | |||
orbs: | |||
ruby: circleci/ruby@2.0.0 | |||
node: circleci/node@5.0.3 | |||
executors: | |||
default: | |||
parameters: | |||
ruby-version: | |||
type: string | |||
docker: | |||
- image: cimg/ruby:<< parameters.ruby-version >> | |||
environment: | |||
BUNDLE_JOBS: 3 | |||
BUNDLE_RETRY: 3 | |||
CONTINUOUS_INTEGRATION: true | |||
DB_HOST: localhost | |||
DB_USER: root | |||
DISABLE_SIMPLECOV: true | |||
RAILS_ENV: test | |||
- image: cimg/postgres:14.5 | |||
environment: | |||
POSTGRES_USER: root | |||
POSTGRES_HOST_AUTH_METHOD: trust | |||
- image: cimg/redis:7.0 | |||
commands: | |||
install-system-dependencies: | |||
steps: | |||
- run: | |||
name: Install system dependencies | |||
command: | | |||
sudo apt-get update | |||
sudo apt-get install -y libicu-dev libidn11-dev | |||
install-ruby-dependencies: | |||
parameters: | |||
ruby-version: | |||
type: string | |||
steps: | |||
- run: | |||
command: | | |||
bundle config clean 'true' | |||
bundle config frozen 'true' | |||
bundle config without 'development production' | |||
name: Set bundler settings | |||
- ruby/install-deps: | |||
bundler-version: '2.3.26' | |||
key: ruby<< parameters.ruby-version >>-gems-v2 | |||
wait-db: | |||
steps: | |||
- run: | |||
command: dockerize -wait tcp://localhost:5432 -wait tcp://localhost:6379 -timeout 1m | |||
name: Wait for PostgreSQL and Redis | |||
jobs: | |||
build: | |||
docker: | |||
- image: cimg/ruby:3.2-node | |||
environment: | |||
RAILS_ENV: test | |||
steps: | |||
- checkout | |||
- install-system-dependencies | |||
- install-ruby-dependencies: | |||
ruby-version: '3.2' | |||
- node/install-packages: | |||
cache-version: v1 | |||
pkg-manager: yarn | |||
- run: | |||
command: | | |||
export NODE_OPTIONS=--openssl-legacy-provider | |||
./bin/rails assets:precompile | |||
name: Precompile assets | |||
- persist_to_workspace: | |||
paths: | |||
- public/assets | |||
- public/packs-test | |||
root: . | |||
test: | |||
parameters: | |||
ruby-version: | |||
type: string | |||
executor: | |||
name: default | |||
ruby-version: << parameters.ruby-version >> | |||
environment: | |||
ALLOW_NOPAM: true | |||
PAM_ENABLED: true | |||
PAM_DEFAULT_SERVICE: pam_test | |||
PAM_CONTROLLED_SERVICE: pam_test_controlled | |||
parallelism: 4 | |||
steps: | |||
- checkout | |||
- install-system-dependencies | |||
- run: | |||
command: sudo apt-get install -y ffmpeg imagemagick libmagickcore-dev libmagickwand-dev libjpeg-dev libpng-dev libtiff-dev libwebp-dev libpam-dev | |||
name: Install additional system dependencies | |||
- run: | |||
command: bundle config with 'pam_authentication' | |||
name: Enable PAM authentication | |||
- install-ruby-dependencies: | |||
ruby-version: << parameters.ruby-version >> | |||
- attach_workspace: | |||
at: . | |||
- wait-db | |||
- run: | |||
command: ./bin/rails db:create db:schema:load db:seed | |||
name: Load database schema | |||
- ruby/rspec-test | |||
workflows: | |||
version: 2 | |||
build-and-test: | |||
jobs: | |||
- build | |||
- test: | |||
matrix: | |||
parameters: | |||
ruby-version: | |||
- '2.7' | |||
- '3.0' | |||
- '3.1' | |||
- '3.2' | |||
name: test-ruby<< matrix.ruby-version >> | |||
requires: | |||
- build |
@ -0,0 +1,17 @@ | |||
{ | |||
"problemMatcher": [ | |||
{ | |||
"owner": "haml-lint", | |||
"severity": "warning", | |||
"pattern": [ | |||
{ | |||
"regexp": "^(.*):(\\d+)\\s\\[W]\\s(.*):\\s(.*)$", | |||
"file": 1, | |||
"line": 2, | |||
"code": 3, | |||
"message": 4 | |||
} | |||
] | |||
} | |||
] | |||
} |
@ -0,0 +1,44 @@ | |||
name: Haml Linting | |||
on: | |||
push: | |||
branches-ignore: | |||
- 'dependabot/**' | |||
paths: | |||
- '.github/workflows/haml-lint-problem-matcher.json' | |||
- '.github/workflows/lint-haml.yml' | |||
- '.haml-lint*.yml' | |||
- '.rubocop*.yml' | |||
- '.ruby-version' | |||
- '**/*.haml' | |||
- 'Gemfile*' | |||
pull_request: | |||
paths: | |||
- '.github/workflows/haml-lint-problem-matcher.json' | |||
- '.github/workflows/lint-haml.yml' | |||
- '.haml-lint*.yml' | |||
- '.rubocop*.yml' | |||
- '.ruby-version' | |||
- '**/*.haml' | |||
- 'Gemfile*' | |||
jobs: | |||
lint: | |||
runs-on: ubuntu-latest | |||
steps: | |||
- name: Clone repository | |||
uses: actions/checkout@v3 | |||
- name: Install native Ruby dependencies | |||
run: sudo apt-get install -y libicu-dev libidn11-dev | |||
- name: Set up Ruby | |||
uses: ruby/setup-ruby@v1 | |||
with: | |||
ruby-version: .ruby-version | |||
bundler-cache: true | |||
- name: Run haml-lint | |||
run: | | |||
echo "::add-matcher::.github/workflows/haml-lint-problem-matcher.json" | |||
bundle exec haml-lint |
@ -0,0 +1,141 @@ | |||
name: Ruby Testing | |||
on: | |||
push: | |||
branches-ignore: | |||
- 'dependabot/**' | |||
pull_request: | |||
env: | |||
BUNDLE_CLEAN: true | |||
BUNDLE_FROZEN: true | |||
BUNDLE_WITHOUT: 'development production' | |||
concurrency: | |||
group: ${{ github.workflow }}-${{ github.ref }} | |||
cancel-in-progress: true | |||
jobs: | |||
build: | |||
runs-on: ubuntu-latest | |||
env: | |||
RAILS_ENV: test | |||
steps: | |||
- uses: actions/checkout@v3 | |||
- name: Set up Node.js | |||
uses: actions/setup-node@v3 | |||
with: | |||
cache: yarn | |||
node-version-file: '.nvmrc' | |||
- name: Install native Ruby dependencies | |||
run: sudo apt-get install -y libicu-dev libidn11-dev | |||
- name: Set up bundler cache | |||
uses: ruby/setup-ruby@v1 | |||
with: | |||
ruby-version: .ruby-version | |||
bundler-cache: true | |||
- run: yarn install --frozen-lockfile | |||
- name: Precompile assets | |||
# Previously had set this, but it's not supported | |||
# export NODE_OPTIONS=--openssl-legacy-provider | |||
run: |- | |||
./bin/rails assets:precompile | |||
- uses: actions/upload-artifact@v3 | |||
with: | |||
path: |- | |||
./public/assets | |||
./public/packs-test | |||
name: ${{ github.sha }} | |||
retention-days: 0 | |||
test: | |||
runs-on: ubuntu-latest | |||
needs: | |||
- build | |||
services: | |||
postgres: | |||
image: postgres:14-alpine | |||
env: | |||
POSTGRES_PASSWORD: postgres | |||
POSTGRES_USER: postgres | |||
options: >- | |||
--health-cmd pg_isready | |||
--health-interval 10s | |||
--health-timeout 5s | |||
--health-retries 5 | |||
ports: | |||
- 5432:5432 | |||
redis: | |||
image: redis:7-alpine | |||
options: >- | |||
--health-cmd "redis-cli ping" | |||
--health-interval 10s | |||
--health-timeout 5s | |||
--health-retries 5 | |||
ports: | |||
- 6379:6379 | |||
env: | |||
DB_HOST: localhost | |||
DB_USER: postgres | |||
DB_PASS: postgres | |||
DISABLE_SIMPLECOV: true | |||
RAILS_ENV: test | |||
ALLOW_NOPAM: true | |||
PAM_ENABLED: true | |||
PAM_DEFAULT_SERVICE: pam_test | |||
PAM_CONTROLLED_SERVICE: pam_test_controlled | |||
BUNDLE_WITH: 'pam_authentication' | |||
CI_JOBS: ${{ matrix.ci_job }}/4 | |||
strategy: | |||
fail-fast: false | |||
matrix: | |||
ruby-version: | |||
- '2.7' | |||
- '3.0' | |||
- '3.1' | |||
- '.ruby-version' | |||
ci_job: | |||
- 1 | |||
- 2 | |||
- 3 | |||
- 4 | |||
steps: | |||
- uses: actions/checkout@v3 | |||
- uses: actions/download-artifact@v3 | |||
with: | |||
path: './public' | |||
name: ${{ github.sha }} | |||
- name: Install native Ruby dependencies | |||
run: sudo apt-get install -y libicu-dev libidn11-dev | |||
- name: Install additional system dependencies | |||
run: sudo apt-get install -y ffmpeg imagemagick libpam-dev | |||
- name: Set up bundler cache | |||
uses: ruby/setup-ruby@v1 | |||
with: | |||
ruby-version: ${{ matrix.ruby-version}} | |||
bundler-cache: true | |||
- name: Update system gems | |||
if: matrix.ruby-version == '2.7' | |||
run: gem update --system | |||
- name: Load database schema | |||
run: './bin/rails db:create db:schema:load db:seed' | |||
- run: bundle exec rake rspec_chunked |
@ -1,108 +1,9 @@ | |||
# Whether to ignore frontmatter at the beginning of HAML documents for | |||
# frameworks such as Jekyll/Middleman | |||
skip_frontmatter: false | |||
inherits_from: .haml-lint_todo.yml | |||
exclude: | |||
- 'vendor/**/*' | |||
- 'spec/**/*' | |||
- 'lib/templates/**/*' | |||
- 'app/views/kaminari/**/*' | |||
- lib/templates/haml/scaffold/_form.html.haml | |||
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 |
@ -0,0 +1,128 @@ | |||
# This configuration was generated by | |||
# `haml-lint --auto-gen-config` | |||
# on 2023-02-11 02:16:03 -0500 using Haml-Lint version 0.45.0. | |||
# The point is for the user to remove these configuration records | |||
# one by one as the lints are removed from the code base. | |||
# Note that changes in the inspected code, or installation of new | |||
# versions of Haml-Lint, may require this file to be generated again. | |||
linters: | |||
# Offense count: 76 | |||
RuboCop: | |||
exclude: | |||
- 'app/views/accounts/_og.html.haml' | |||
- 'app/views/admin/account_actions/new.html.haml' | |||
- 'app/views/admin/account_warnings/_account_warning.html.haml' | |||
- 'app/views/admin/accounts/index.html.haml' | |||
- 'app/views/admin/accounts/show.html.haml' | |||
- 'app/views/admin/action_logs/index.html.haml' | |||
- 'app/views/admin/announcements/edit.html.haml' | |||
- 'app/views/admin/announcements/new.html.haml' | |||
- 'app/views/admin/change_emails/show.html.haml' | |||
- 'app/views/admin/custom_emojis/index.html.haml' | |||
- 'app/views/admin/dashboard/index.html.haml' | |||
- 'app/views/admin/disputes/appeals/_appeal.html.haml' | |||
- 'app/views/admin/domain_blocks/edit.html.haml' | |||
- 'app/views/admin/domain_blocks/new.html.haml' | |||
- 'app/views/admin/ip_blocks/new.html.haml' | |||
- 'app/views/admin/reports/actions/preview.html.haml' | |||
- 'app/views/admin/reports/index.html.haml' | |||
- 'app/views/admin/reports/show.html.haml' | |||
- 'app/views/admin/roles/_form.html.haml' | |||
- 'app/views/admin/settings/about/show.html.haml' | |||
- 'app/views/admin/settings/appearance/show.html.haml' | |||
- 'app/views/admin/settings/registrations/show.html.haml' | |||
- 'app/views/admin/statuses/show.html.haml' | |||
- 'app/views/application/_card.html.haml' | |||
- 'app/views/application/_sidebar.html.haml' | |||
- 'app/views/auth/registrations/_sessions.html.haml' | |||
- 'app/views/auth/registrations/new.html.haml' | |||
- 'app/views/auth/sessions/new.html.haml' | |||
- 'app/views/disputes/strikes/show.html.haml' | |||
- 'app/views/filters/_filter_fields.html.haml' | |||
- 'app/views/invites/_form.html.haml' | |||
- 'app/views/layouts/application.html.haml' | |||
- 'app/views/layouts/error.html.haml' | |||
- 'app/views/layouts/mailer.html.haml' | |||
- 'app/views/notification_mailer/_status.html.haml' | |||
- 'app/views/notification_mailer/favourite.html.haml' | |||
- 'app/views/notification_mailer/follow_request.html.haml' | |||
- 'app/views/oauth/authorizations/new.html.haml' | |||
- 'app/views/oauth/authorized_applications/index.html.haml' | |||
- 'app/views/settings/applications/_fields.html.haml' | |||
- 'app/views/settings/imports/show.html.haml' | |||
- 'app/views/settings/login_activities/_login_activity.html.haml' | |||
- 'app/views/settings/preferences/appearance/show.html.haml' | |||
- 'app/views/settings/preferences/other/show.html.haml' | |||
- 'app/views/settings/preferences/other/show.html.haml' | |||
- 'app/views/statuses_cleanup/show.html.haml' | |||
- 'app/views/statuses/_detailed_status.html.haml' | |||
- 'app/views/statuses/_og_image.html.haml' | |||
- 'app/views/statuses/_poll.html.haml' | |||
- 'app/views/statuses/_status.html.haml' | |||
- 'app/views/statuses/show.html.haml' | |||
- 'app/views/user_mailer/suspicious_sign_in.html.haml' | |||
- 'app/views/user_mailer/warning.html.haml' | |||
- 'app/views/user_mailer/webauthn_credential_added.html.haml' | |||
- 'app/views/user_mailer/webauthn_credential_deleted.html.haml' | |||
# Offense count: 918 | |||
LineLength: | |||
enabled: false | |||
# Offense count: 22 | |||
UnnecessaryStringOutput: | |||
exclude: | |||
- 'app/views/accounts/show.html.haml' | |||
- 'app/views/admin/custom_emojis/_custom_emoji.html.haml' | |||
- 'app/views/admin/relays/_relay.html.haml' | |||
- 'app/views/admin/rules/_rule.html.haml' | |||
- 'app/views/admin/statuses/index.html.haml' | |||
- 'app/views/auth/registrations/_sessions.html.haml' | |||
- 'app/views/disputes/strikes/show.html.haml' | |||
- 'app/views/notification_mailer/_status.html.haml' | |||
- 'app/views/settings/two_factor_authentication_methods/index.html.haml' | |||
- 'app/views/statuses/_detailed_status.html.haml' | |||
- 'app/views/statuses/_poll.html.haml' | |||
- 'app/views/statuses/_simple_status.html.haml' | |||
- 'app/views/user_mailer/suspicious_sign_in.html.haml' | |||
- 'app/views/user_mailer/webauthn_credential_added.html.haml' | |||
- 'app/views/user_mailer/webauthn_credential_deleted.html.haml' | |||
- 'app/views/user_mailer/welcome.html.haml' | |||
# Offense count: 3 | |||
ViewLength: | |||
exclude: | |||
- 'app/views/admin/accounts/show.html.haml' | |||
- 'app/views/admin/reports/show.html.haml' | |||
- 'app/views/disputes/strikes/show.html.haml' | |||
# Offense count: 43 | |||
InstanceVariables: | |||
exclude: | |||
- 'app/views/admin/reports/_actions.html.haml' | |||
- 'app/views/admin/roles/_form.html.haml' | |||
- 'app/views/admin/webhooks/_form.html.haml' | |||
- 'app/views/application/_sidebar.html.haml' | |||
- 'app/views/auth/registrations/_sessions.html.haml' | |||
- 'app/views/auth/registrations/_status.html.haml' | |||
- 'app/views/auth/sessions/two_factor/_otp_authentication_form.html.haml' | |||
- 'app/views/authorize_interactions/_post_follow_actions.html.haml' | |||
- 'app/views/invites/_form.html.haml' | |||
- 'app/views/relationships/_account.html.haml' | |||
- 'app/views/shared/_og.html.haml' | |||
- 'app/views/statuses/_status.html.haml' | |||
# Offense count: 6 | |||
ConsecutiveSilentScripts: | |||
exclude: | |||
- 'app/views/admin/settings/shared/_links.html.haml' | |||
- 'app/views/settings/login_activities/_login_activity.html.haml' | |||
- 'app/views/statuses/_poll.html.haml' | |||
# Offense count: 3 | |||
IdNames: | |||
exclude: | |||
- 'app/views/authorize_interactions/error.html.haml' | |||
- 'app/views/oauth/authorizations/error.html.haml' | |||
- 'app/views/shared/_error_messages.html.haml' |
@ -1,69 +0,0 @@ | |||
# frozen_string_literal: true | |||
class TOCGenerator | |||
TARGET_ELEMENTS = %w(h1 h2 h3 h4 h5 h6).freeze | |||
LISTED_ELEMENTS = %w(h2 h3).freeze | |||
class Section | |||
attr_accessor :depth, :title, :children, :anchor | |||
def initialize(depth, title, anchor) | |||
@depth = depth | |||
@title = title | |||
@children = [] | |||
@anchor = anchor | |||
end | |||
delegate :<<, to: :children | |||
end | |||
def initialize(source_html) | |||
@source_html = source_html | |||
@processed = false | |||
@target_html = '' | |||
@headers = [] | |||
@slugs = Hash.new { |h, k| h[k] = 0 } | |||
end | |||
def html | |||
parse_and_transform unless @processed | |||
@target_html | |||
end | |||
def toc | |||
parse_and_transform unless @processed | |||
@headers | |||
end | |||
private | |||
def parse_and_transform | |||
return if @source_html.blank? | |||
parsed_html = Nokogiri::HTML.fragment(@source_html) | |||
parsed_html.traverse do |node| | |||
next unless TARGET_ELEMENTS.include?(node.name) | |||
anchor = node['id'] || node.text.parameterize.presence || 'sec' | |||
@slugs[anchor] += 1 | |||
anchor = "#{anchor}-#{@slugs[anchor]}" if @slugs[anchor] > 1 | |||
node['id'] = anchor | |||
next unless LISTED_ELEMENTS.include?(node.name) | |||
depth = node.name[1..-1] | |||
latest_section = @headers.last | |||
if latest_section.nil? || latest_section.depth >= depth | |||
@headers << Section.new(depth, node.text, anchor) | |||
else | |||
latest_section << Section.new(depth, node.text, anchor) | |||
end | |||
end | |||
@target_html = parsed_html.to_s | |||
@processed = true | |||
end | |||
end |
@ -1,16 +0,0 @@ | |||
.hero-widget | |||
.hero-widget__img | |||
= image_tag @instance_presenter.thumbnail&.file&.url(:'@1x') || asset_pack_path('media/images/preview.png'), alt: @instance_presenter.title | |||
.hero-widget__text | |||
%p= @instance_presenter.description.html_safe.presence || t('about.about_mastodon_html') | |||
- if Setting.trends && !(user_signed_in? && !current_user.setting_trends) | |||
- trends = Trends.tags.query.allowed.limit(3) | |||
- unless trends.empty? | |||
.endorsements-widget.trends-widget | |||
%h4.emojify= t('footer.trending_now') | |||
- trends.each do |tag| | |||
= react_component :hashtag, hashtag: ActiveModelSerializers::SerializableResource.new(tag, serializer: REST::TagSerializer, scope: current_user, scope_name: :current_user).as_json |
@ -1,9 +1,11 @@ | |||
-# Link to the "Next" page | |||
-# available local variables | |||
-# url: url to the next page | |||
-# current_page: a page object for the currently displayed page | |||
-# total_pages: total number of pages | |||
-# per_page: number of items to fetch per page | |||
-# remote: data-remote | |||
-# | |||
Link to the "Next" page | |||
available local variables | |||
url: url to the next page | |||
current_page: a page object for the currently displayed page | |||
total_pages: total number of pages | |||
per_page: number of items to fetch per page | |||
remote: data-remote | |||
%span.next | |||
= link_to_unless current_page.last?, safe_join([t('pagination.next'), fa_icon('chevron-right')], ' '), url, rel: 'next', remote: remote |
@ -1,9 +1,10 @@ | |||
-# Link to the "Previous" page | |||
-# available local variables | |||
-# url: url to the previous page | |||
-# current_page: a page object for the currently displayed page | |||
-# total_pages: total number of pages | |||
-# per_page: number of items to fetch per page | |||
-# remote: data-remote | |||
-# | |||
Link to the "Previous" page | |||
available local variables | |||
url: url to the previous page | |||
current_page: a page object for the currently displayed page | |||
total_pages: total number of pages | |||
per_page: number of items to fetch per page | |||
remote: data-remote | |||
%span.prev | |||
= link_to_unless current_page.first?, safe_join([fa_icon('chevron-left'), t('pagination.prev')], ' '), url, rel: 'prev', remote: remote |