diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 41329b26f..689c7202f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -20,9 +20,9 @@ concurrency: jobs: typescript: - name: TypeScript + name: Type and style check runs-on: ubuntu-22.04 - timeout-minutes: 3 + timeout-minutes: 7 permissions: {} steps: - name: Checkout repository @@ -36,6 +36,15 @@ jobs: - name: Perform typechecks run: pnpm typecheck + - name: Perform style check + run: |- + set -eux + pnpm autoformat only-frontend + if [ -n "$(git diff --name-only --cached)" ]; then + echo "Some files are not correctly formatted. Please run 'pnpm autoformat' and commit the changes." >&2 + exit 1 + fi + eslint: name: ESLint runs-on: ubuntu-22.04 @@ -56,7 +65,7 @@ jobs: cypress: name: Cypress runs-on: macos-14 - timeout-minutes: 30 + timeout-minutes: 45 permissions: {} steps: - name: Checkout repository @@ -174,11 +183,20 @@ jobs: run: cargo fmt --all -- --check clippy: - name: Clippy (${{ matrix.platform }}) - runs-on: ${{ matrix.platform }} strategy: + fail-fast: true matrix: - platform: [ubuntu-22.04, macos-14, windows-latest] + settings: + - host: macos-13 + target: x86_64-apple-darwin + - host: macos-14 + target: aarch64-apple-darwin + - host: windows-latest + target: x86_64-pc-windows-msvc + - host: ubuntu-22.04 + target: x86_64-unknown-linux-gnu + name: Clippy (${{ matrix.settings.host }}) + runs-on: ${{ matrix.settings.host }} permissions: contents: read timeout-minutes: 45 @@ -223,6 +241,7 @@ jobs: - 'extensions/*/**' - 'Cargo.toml' - 'Cargo.lock' + - '.github/workflows/ci.yml' - name: Setup System and Rust if: steps.filter.outcome != 'success' || steps.filter.outputs.changes == 'true' @@ -232,22 +251,15 @@ jobs: - name: Run Clippy if: steps.filter.outcome != 'success' || steps.filter.outputs.changes == 'true' - uses: actions-rs-plus/clippy-check@v2 + uses: giraffate/clippy-action@v1 with: - args: --workspace --all-features --locked + reporter: github-pr-review + tool_name: 'Clippy (${{ matrix.settings.host }})' + filter_mode: diff_context + github_token: ${{ secrets.GITHUB_TOKEN }} + clippy_flags: --workspace --all-features --locked + fail_on_error: true - # test: - # name: Test (${{ matrix.platform }}) - # runs-on: ${{ matrix.platform }} - # strategy: - # matrix: - # platform: [ubuntu-22.04, macos-latest, windows-latest] - # steps: - # - name: Checkout repository - # uses: actions/checkout@v4 - # - # - name: Setup - # uses: ./.github/actions/setup - # - # - name: Test - # run: cargo test --workspace --all-features + # - name: Run tests + # if: steps.filter.outcome != 'success' || steps.filter.outputs.changes == 'true' + # run: cargo test --workspace --all-features --locked --target ${{ matrix.settings.target }} diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 09a0f8ae1..5f18dec67 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -97,6 +97,8 @@ After cleaning out your build artifacts using `pnpm clean`, `git clean`, or `car Make sure to read the [guidelines](https://spacedrive.com/docs/developers/prerequisites/guidelines) to ensure that your code follows a similar style to ours. +After you finish making your changes and committed them to your branch, make sure to execute `pnpm autoformat` to fix any style inconsistency in your code. + ##### Mobile App To run the mobile app: diff --git a/package.json b/package.json index 421958aac..6622fbdaf 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,8 @@ "lint:fix": "turbo run lint -- --fix", "clean": "cargo clean; git clean -qfX .", "test-data": "./scripts/test-data.sh", - "i18n:sync": "npx i18next-locales-sync -p en -s $(find ./interface/locales -wholename '*/common.json' | awk -F'/' '$4 != \"en\" { ORS=\" \"; print $4 }') -l ./interface/locales" + "i18n:sync": "npx i18next-locales-sync -p en -s $(find ./interface/locales -wholename '*/common.json' | awk -F'/' '$4 != \"en\" { ORS=\" \"; print $4 }') -l ./interface/locales", + "autoformat": "./scripts/autoformat.sh" }, "pnpm": { "patchedDependencies": { diff --git a/scripts/autoformat.sh b/scripts/autoformat.sh new file mode 100755 index 000000000..f335468ea --- /dev/null +++ b/scripts/autoformat.sh @@ -0,0 +1,75 @@ +#!/usr/bin/env bash + +set -Eeumo pipefail + +has() { + command -v "$1" >/dev/null 2>&1 +} + +handle_exit() { + _exit=$? + set +e + trap '' SIGINT + trap - EXIT + if [ "$_exit" -ne 0 ]; then + git restore --staged . + git restore . + fi + exit "$_exit" +} + +cleanup() { + set +e + trap '' SIGINT + trap - EXIT + jobs -p | xargs kill -SIGTERM + git restore --staged . + git restore . + kill -- -$$ 2>/dev/null +} + +if ! has git pnpm; then + echo "Missing at on of the required dependencies: git, pnpm" >&2 + exit 1 +fi + +__dirname="$(CDPATH='' cd "$(dirname "$0")" && pwd -P)" + +# Change to the root directory of the repository +cd "$__dirname/.." + +if [ -n "$(git diff --name-only HEAD)" ] || [ -n "$(git ls-files --others --exclude-standard)" ]; then + echo "Uncommitted changes found. Please commit or stash your changes before running this script." >&2 + exit 1 +fi + +# Find the common ancestor of the current branch and main +if [ -n "${CI:-}" ]; then + ancestor="HEAD" +elif ! ancestor="$(git merge-base HEAD origin/main)"; then + echo "Failed to find the common ancestor of the current branch and main." >&2 + exit 1 +fi + +# Handle errors and cleanup after formating has started +trap 'handle_exit' EXIT +trap 'cleanup' SIGINT + +# Run the linter and formatter for frontend +# Use a background processes to avoid pnpm weird handling of CTRL+C +pnpm run -r lint --fix & +wait +pnpm run format & +wait + +if [ "${1:-}" != "only-frontend" ]; then + # Run clippy and formatter for backend + cargo clippy --fix --all --all-targets --all-features --allow-dirty --allow-staged + cargo fmt --all +fi + +# Add all fixes for changes made in this branch +git diff --cached --name-only "$ancestor" | xargs git add + +# Restore unrelated changes +git restore .