From bfb272d15b43601c7d06a8f996f5630091e5b42c Mon Sep 17 00:00:00 2001 From: Taiki Endo Date: Fri, 9 Dec 2022 22:01:42 +0900 Subject: [PATCH] Add spell-check to CI --- .cspell.json | 49 +++++++++ .github/.cspell/organization-dictionary.txt | 109 ++++++++++++++++++++ .github/.cspell/project-dictionary.txt | 3 + .github/.cspell/rust-dependencies.txt | 0 .gitignore | 3 - README.md | 4 +- tools/publish.sh | 3 + tools/tidy.sh | 70 +++++++++---- 8 files changed, 216 insertions(+), 25 deletions(-) create mode 100644 .cspell.json create mode 100644 .github/.cspell/organization-dictionary.txt create mode 100644 .github/.cspell/project-dictionary.txt create mode 100644 .github/.cspell/rust-dependencies.txt diff --git a/.cspell.json b/.cspell.json new file mode 100644 index 0000000..b11d0b4 --- /dev/null +++ b/.cspell.json @@ -0,0 +1,49 @@ +{ + "version": "0.2", + "gitignoreRoot": ".", + "useGitignore": true, + "dictionaryDefinitions": [ + { + "name": "organization-dictionary", + "path": "./.github/.cspell/organization-dictionary.txt", + "addWords": true + }, + { + "name": "project-dictionary", + "path": "./.github/.cspell/project-dictionary.txt", + "addWords": true + }, + { + "name": "rust-dependencies", + "path": "./.github/.cspell/rust-dependencies.txt", + "addWords": true + } + ], + "dictionaries": [ + "organization-dictionary", + "project-dictionary", + "rust-dependencies" + ], + "ignoreRegExpList": [ + // Copyright notice + "Copyright ((\\(c\\)|\\(C\\)|©) )?.*", + // GHA actions/workflows + "uses: .+@", + // GHA context (repo name, owner name, etc.) + "github.\\w+ (=|!)= '.+'", + // GH username + "( |\\[)@[\\w_-]+", + // Git config username + "git config user.name .*", + // Cargo.toml authors + "authors *= *\\[.*\\]", + "\".* <[\\w_.+-]+@[\\w.-]+>\"" + ], + "languageSettings": [ + { + "languageId": ["*"], + "dictionaries": ["rust"] + } + ], + "ignorePaths": [] +} diff --git a/.github/.cspell/organization-dictionary.txt b/.github/.cspell/organization-dictionary.txt new file mode 100644 index 0000000..38113a7 --- /dev/null +++ b/.github/.cspell/organization-dictionary.txt @@ -0,0 +1,109 @@ +// This is a dictionary shared by projects under https://github.com/taiki-e. +// It is not intended for manual editing. + +endo +taiki + +// tool name and its configs or options +asan +cflags +clippy +codegen +cxxflags +exitcode +miri +miriflags +msan +retag +rustc +rustdoc +rustdocflags +rustflags +rustfmt +rustsec +rustup +valgrind +xcompile +Zdoctest +Zmiri + +// Rust target triple +aarch +androideabi +armeb +armebv +armv +asmjs +atmega +bpfeb +bpfel +cuda +eabi +eabihf +emscripten +espidf +fortanix +gnuabi +gnueabi +gnueabihf +gnullvm +gnuspe +gnux +illumos +imac +macabi +mipsel +mipsisa +msvc +muslabi +musleabi +musleabihf +nvptx +openwrt +riscv +softfloat +sparcv +thumbeb +thumbebv +thumbv +tvos +uclibc +uclibceabi +uclibceabihf +uefi +vxworks +wasi +watchos +xous + +// Rust other +alloc +canonicalize +consts +deque +doctest +hasher +inlateout +intrinsics +lateout +msrv +peekable +punct +repr +rfind +rfold +splitn +uninit + +// Other +connrefused +cygwin +euxo +msys +noninteractive +noprofile +norc +pipefail +powerset +proto +tlsv diff --git a/.github/.cspell/project-dictionary.txt b/.github/.cspell/project-dictionary.txt new file mode 100644 index 0000000..02384c1 --- /dev/null +++ b/.github/.cspell/project-dictionary.txt @@ -0,0 +1,3 @@ +coreutils +gtar +toolchains diff --git a/.github/.cspell/rust-dependencies.txt b/.github/.cspell/rust-dependencies.txt new file mode 100644 index 0000000..e69de29 diff --git a/.gitignore b/.gitignore index 8779295..33da979 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,3 @@ -node_modules -package-lock.json -package.json # For platform and editor specific settings, it is recommended to add to # a global .gitignore file. diff --git a/README.md b/README.md index 6351c97..95e53c2 100644 --- a/README.md +++ b/README.md @@ -207,8 +207,8 @@ jobs: ### Other examples -- [taiki-e/cargo-hack](https://github.com/taiki-e/cargo-hack/blob/202e6e59d491c9202ce148c9ef423853267226db/.github/workflows/release.yml#L25-L45) -- [tokio-rs/tracing](https://github.com/tokio-rs/tracing/blob/2aa0cb010d8a7fa0de610413b5acd4557a00dd34/.github/workflows/release.yml#L10-L24) +- [cargo-hack](https://github.com/taiki-e/cargo-hack/blob/202e6e59d491c9202ce148c9ef423853267226db/.github/workflows/release.yml#L25-L45) +- [tracing](https://github.com/tokio-rs/tracing/blob/2aa0cb010d8a7fa0de610413b5acd4557a00dd34/.github/workflows/release.yml#L10-L24) ## Compatibility diff --git a/tools/publish.sh b/tools/publish.sh index 53fbe1e..c531724 100755 --- a/tools/publish.sh +++ b/tools/publish.sh @@ -3,6 +3,9 @@ set -euo pipefail IFS=$'\n\t' cd "$(dirname "$0")"/.. +# shellcheck disable=SC2154 +trap 's=$?; echo >&2 "$0: Error on line "${LINENO}": ${BASH_COMMAND}"; exit ${s}' ERR + # Publish a new release. # # USAGE: diff --git a/tools/tidy.sh b/tools/tidy.sh index c702532..bd6cc08 100755 --- a/tools/tidy.sh +++ b/tools/tidy.sh @@ -4,13 +4,16 @@ set -euo pipefail IFS=$'\n\t' cd "$(dirname "$0")"/.. +# shellcheck disable=SC2154 +trap 's=$?; echo >&2 "$0: Error on line "${LINENO}": ${BASH_COMMAND}"; exit ${s}' ERR + # USAGE: # ./tools/tidy.sh # # Note: This script requires the following tools: # - shfmt # - shellcheck -# - npm (if any of YAML/JavaScript/JSON exists) +# - npm # - jq and yq (if this repository uses bors) # - clang-format (if any of C/C++ exists) # @@ -21,14 +24,10 @@ cd "$(dirname "$0")"/.. x() { local cmd="$1" shift - if [[ -n "${verbose:-}" ]]; then - ( - set -x - "${cmd}" "$@" - ) - else + ( + set -x "${cmd}" "$@" - fi + ) } check_diff() { if [[ -n "${CI:-}" ]]; then @@ -50,17 +49,10 @@ warn() { should_fail=1 } -if [[ "${1:-}" == "-v" ]]; then - shift - verbose=1 -fi -if [[ -n "${CI:-}" ]]; then - verbose=1 -fi if [[ $# -gt 0 ]]; then cat </dev/null; then - if [[ ! -e node_modules/.bin/prettier ]]; then - x npm install prettier &>/dev/null - fi x npx prettier -l -w $(git ls-files '*.yml') $(git ls-files '*.js') $(git ls-files '*.json') check_diff $(git ls-files '*.yml') $(git ls-files '*.js') $(git ls-files '*.json') else warn "'npm' is not installed" fi - if [[ -e .github/workflows/ci.yml ]] && grep -q '# tidy:needs' .github/workflows/ci.yml; then + if [[ -e .github/workflows/ci.yml ]] && grep -q '# tidy:needs' .github/workflows/ci.yml && ! grep -Eq '# *needs: \[' .github/workflows/ci.yml; then if type -P jq &>/dev/null && type -P yq &>/dev/null; then # shellcheck disable=SC2207 jobs_actual=($(yq '.jobs' .github/workflows/ci.yml | jq -r 'keys_unsorted[]')) @@ -133,6 +122,47 @@ else warn "'shellcheck' is not installed" fi +# Spell check (if config exists) +if [[ -f .cspell.json ]]; then + if type -P npm &>/dev/null; then + if [[ -f Cargo.toml ]]; then + metadata=$(cargo metadata --format-version=1 --all-features --no-deps) + dependencies='' + for id in $(jq <<<"${metadata}" '.workspace_members[]'); do + dependencies+=$'\n' + dependencies+=$(jq <<<"${metadata}" ".packages[] | select(.id == ${id})" | jq -r '.dependencies[].name') + done + cat >.github/.cspell/rust-dependencies.txt <>.github/.cspell/rust-dependencies.txt + check_diff .github/.cspell/rust-dependencies.txt + else + touch .github/.cspell/rust-dependencies.txt + fi + + x npx cspell --no-progress $(git ls-files) + + for dictionary in .github/.cspell/*.txt; do + if [[ "${dictionary}" == .github/.cspell/project-dictionary.txt ]]; then + continue + fi + dup=$(sed '/^$/d' .github/.cspell/project-dictionary.txt "${dictionary}" | LC_ALL=C sort -f | uniq -d -i | (grep -v '//.*' || true)) + if [[ -n "${dup}" ]]; then + warn "duplicated words in dictionaries; please remove the following words from .github/.cspell/project-dictionary.txt" + echo "=======================================" + echo "${dup}" + echo "=======================================" + fi + done + else + warn "'npm' is not installed" + fi +fi + if [[ -n "${should_fail:-}" ]]; then exit 1 fi