diff --git a/.clippy.toml b/.clippy.toml index ee470c2..b3fd5ee 100644 --- a/.clippy.toml +++ b/.clippy.toml @@ -3,3 +3,4 @@ allow-expect-in-tests = true single-char-binding-names-threshold = 2 upper-case-acronyms-aggressive = true allow-indexing-slicing-in-tests = true +check-incompatible-msrv-in-tests = true diff --git a/.forgejo/workflows/publish.yaml b/.forgejo/workflows/publish.yaml index 8a2a961..083f85f 100644 --- a/.forgejo/workflows/publish.yaml +++ b/.forgejo/workflows/publish.yaml @@ -9,10 +9,21 @@ on: type: boolean required: false default: true + linux: + description: 'Build Linux binaries' + type: boolean + required: false + default: true + windows: + description: 'Build Windows binary' + type: boolean + required: false + default: true jobs: publish: runs-on: docker + if: ${{ inputs.linux }} timeout-minutes: 20 container: image: rust:slim @@ -31,10 +42,18 @@ jobs: rustup component add --toolchain nightly rustfmt clippy rustup target add x86_64-unknown-linux-gnu rustup target add x86_64-unknown-linux-musl - rustup target add x86_64-pc-windows-msvc - name: Setup additional tooling - run: .forgejo/workflows/setup-tools.sh + run: | + curl -L https://github.com/cargo-bins/cargo-binstall/releases/latest/download/cargo-binstall-x86_64-unknown-linux-musl.tgz | tar zxf - -C /usr/local/bin + cargo binstall --no-confirm \ + cargo-audit@0.22.1 \ + cargo-deny@0.19.8 \ + cargo-llvm-cov@0.6.21 \ + cargo-msrv@0.19.3 \ + just@1.51.0 \ + taplo-cli@0.10.0 \ + typos-cli@1.47.2 - name: Setup CI user run: | @@ -50,9 +69,6 @@ jobs: - name: Build x64 Linux musl release binary run: just release-build-musl - - name: Build x64 Windows MSVC release binary - run: just release-build-msvc - - name: Calculate SHA-256 hashes run: just shasum @@ -78,6 +94,48 @@ jobs: --user jutty:${{ secrets.GJD_REGISTRY_TOKEN }} \ --upload-file target/x86_64-unknown-linux-gnu/release/en $url + publish-windows: + runs-on: docker + if: ${{ inputs.windows }} + timeout-minutes: 20 + container: + image: messense/cargo-xwin + steps: + - name: Install action dependencies + run: apt-get install --no-install-recommends --update -y nodejs curl git + + - name: Checkout code + uses: actions/checkout@v6 + with: + fetch-tags: true + + - name: Setup Rust toolchain + run: | + target="x86_64-pc-windows-msvc" + version=$(cat Cargo.toml | grep '^rust-version' | cut -d \" -f 2) + rustup toolchain install --force-non-host "$version-$target" + rustup default "$version-$target" + + - name: Setup additional tooling + run: | + curl -L https://github.com/cargo-bins/cargo-binstall/releases/latest/download/cargo-binstall-x86_64-unknown-linux-musl.tgz | tar zxf - -C /usr/local/bin + cargo binstall --no-confirm \ + just@1.51.0 + + - name: Setup CI user + run: | + useradd -m ci && chown -R ci:ci . + git config --global --add safe.directory "$PWD" + + - name: Run Windows tests + run: just ci test-windows + + - name: Build x64 Windows MSVC release binary + run: just release-build-msvc + + - name: Calculate SHA-256 hashes + run: just shasum + - name: Publish x64 Windows MSVC binary to git.jutty.dev registry if: ${{ inputs.upload }} run: | diff --git a/.forgejo/workflows/setup-tools.sh b/.forgejo/workflows/setup-tools.sh deleted file mode 100755 index 55f0707..0000000 --- a/.forgejo/workflows/setup-tools.sh +++ /dev/null @@ -1,81 +0,0 @@ -#!/usr/bin/env sh - -set -eu - -JUST_VERSION="1.51.0" -JUST_SHA256SUM="c8f085ca3e885723c341d06243fc291b5abfdc8bbe3b2c076b117de490387b59" -CARGO_LLVM_COV_VERSION="0.6.21" -CARGO_LLVM_COV_SHA256SUM="57f491aedf7cdb261538ceb49cbb1ee9d27df7ca205a5e1a009caaf5cb911afb" -CARGO_AUDIT_VERSION="0.22.1" -CARGO_AUDIT_TAG="cargo-audit%2Fv$CARGO_AUDIT_VERSION" -CARGO_AUDIT_SHA256SUM="1890badd5f15831a9af4b074399fcd21e6f7c0fe42c84e9254cdffc9f813765c" -TAPLO_VERSION="0.10.0" -TAPLO_SHA256SUM="8fe196b894ccf9072f98d4e1013a180306e17d244830b03986ee5e8eabeb6156" -TYPOS_VERSION="1.47.2" -TYPOS_SHA256SUM="7aef58932fc123b4cf4b40d86468e89a3297d80169051d7cfd13a235e05fc426" -CARGO_DENY_VERSION="0.19.8" -CARGO_DENY_SHA256SUM="70e769ae3872e34d45132b17040859175e11401dc12dddb0303e0b8c7d088f3f" -CARGO_XWIN_VERSION="0.23.0" -CARGO_XWIN_SHA256SUM="74a216f64f10ea81c909f02d6b1a84cd0fda8de4c87ee52fe63ba76ab2392b75" - -TRIPLE="x86_64-unknown-linux-gnu" -TRIPLE_MUSL="x86_64-unknown-linux-musl" - -fetch() { - repo="$1" - tag="$2" - filename="$3" - digest="$4" - binary="$5" - renamed_binary="${6:-$binary}" - - [ -d /tmp/tools ] || mkdir -p /tmp/tools - - curl -fsSLO --output-dir /tmp \ - -w '%{stderr}HTTP %{response_code} %{url}\n' \ - "https://github.com/$repo/releases/download/$tag/$filename" - - printf '%s %s\n' "$digest" "/tmp/$filename" > /tmp/digest - sha256sum --check /tmp/digest - - if printf '%s' "$filename" | grep -qE '\.tar\.|\.tgz$'; then - tar xf "/tmp/$filename" -C /tmp/tools - elif printf '%s' "$filename" | grep -q '\.gz$'; then - gunzip -c "/tmp/$filename" > "/tmp/tools/$binary" - else - echo "Fatal: can't determine how to unpack $filename" - exit 1 - fi - - find /tmp/tools -type f -name "$binary" \ - -exec mv -v '{}' "/usr/local/bin/$renamed_binary" ';' - chmod +x "/usr/local/bin/$renamed_binary" -} - -fetch casey/just "$JUST_VERSION" \ - "just-$JUST_VERSION-$TRIPLE_MUSL.tar.gz" \ - "$JUST_SHA256SUM" just - -fetch taiki-e/cargo-llvm-cov "v$CARGO_LLVM_COV_VERSION" \ - "cargo-llvm-cov-$TRIPLE.tar.gz" \ - "$CARGO_LLVM_COV_SHA256SUM" cargo-llvm-cov - -fetch rustsec/rustsec "$CARGO_AUDIT_TAG" \ - "cargo-audit-$TRIPLE-v$CARGO_AUDIT_VERSION.tgz" \ - "$CARGO_AUDIT_SHA256SUM" cargo-audit - -fetch tamasfe/taplo "$TAPLO_VERSION" \ - "taplo-linux-x86_64.gz" \ - "$TAPLO_SHA256SUM" taplo-linux-x86_64 taplo - -fetch crate-ci/typos "v$TYPOS_VERSION" \ - "typos-v$TYPOS_VERSION-$TRIPLE_MUSL.tar.gz" \ - "$TYPOS_SHA256SUM" typos - -fetch EmbarkStudios/cargo-deny "$CARGO_DENY_VERSION" \ - cargo-deny-$CARGO_DENY_VERSION-$TRIPLE_MUSL.tar.gz \ - "$CARGO_DENY_SHA256SUM" cargo-deny - -fetch rust-cross/cargo-xwin "v$CARGO_XWIN_VERSION" \ - cargo-xwin-v$CARGO_XWIN_VERSION.$TRIPLE_MUSL.tar.gz \ - "$CARGO_XWIN_SHA256SUM" cargo-xwin diff --git a/.forgejo/workflows/verify.yaml b/.forgejo/workflows/verify.yaml index 82244d8..b15fa2f 100644 --- a/.forgejo/workflows/verify.yaml +++ b/.forgejo/workflows/verify.yaml @@ -40,7 +40,7 @@ jobs: useradd -m ci && chown -R ci:ci . git config --global --add safe.directory "$PWD" - - name: Text matching checks + - name: Text matches run: just ci todos-assess version-assess spell - name: Schema lint run: just ci schema-lint @@ -50,10 +50,12 @@ jobs: run: just ci format-assess - name: Lint run: just ci lint-assess + - name: MSRV + run: just ci msrv-assess - name: Cargo check run: just ci check - name: Test run: just ci test - - name: Assess test coverage + - name: Coverage run: just ci cover-assess diff --git a/.justfile b/.justfile index 6353791..a790e94 100644 --- a/.justfile +++ b/.justfile @@ -72,6 +72,17 @@ assess-run-watch-quick: alias rq := assess-run-watch-quick +# Determine the Minimum Supported Rust Version +[group: 'develop'] +msrv-find: + @{{ make_msrv("find", musl_target) }} + @{{ make_msrv("find", glibc_target) }} + @{{ make_msrv("find", msvc_target) }} + +make_msrv(command, target) := f"printf '{{ target }}: '; " + \ + f"cargo msrv {{ command }} --target {{ target }} --output-format minimal " \ + + f"-- {{ maybe_xwin(target) }} build --ignore-rust-version" + [private] test-cover-quick: {{ cover_cmd }} --no-report -- --test 'serial_tests::' --test-threads 1 @@ -321,6 +332,8 @@ test-windows pattern="": -{{ xwin_test(pattern) }} --timings --doc -{{ xwin_test(pattern) }} --timings --lib -- --skip 'serial_tests::' +xwin_test(pattern) := f"cargo-xwin test {{ pattern }} --target {{ msvc_target }}" + # Run tests with unfiltered output [group: 'assess'] test-output pattern="": @@ -361,7 +374,7 @@ verify: fi {{ just_cmd }} \ todos-assess version-assess spell schema-lint deny \ - format-assess lint-assess check \ + format-assess lint-assess msrv-assess check \ test "" cover-assess alias v := verify @@ -387,6 +400,15 @@ version-assess remote="false": update alias va := version-assess +# Assess if the current Minimum Supported Rust Version is accurate +[group: 'assess'] +msrv-assess: + {{ make_msrv("verify", musl_target) }} + {{ make_msrv("verify", glibc_target) }} + if rustup toolchain list | grep -q {{ msvc_target }}; then \ + {{ make_msrv("verify", msvc_target) }} \ + fi + # Find TODOs [group: 'assess'] todos-assess: @@ -448,6 +470,9 @@ release-build target=default_target: --timings --target {{ target }} --locked --release du -h target/{{ target }}/release/{{ with_suffix("en", target) }} +maybe_xwin(target) := if target == msvc_target { "cargo-xwin" } else { "cargo" } +with_suffix(file, target) := if target == msvc_target { f"{{ file }}.exe" } else { file } + alias rb := release-build # glibc release build @@ -501,7 +526,7 @@ msvc_target := "x86_64-pc-windows-msvc" default_target := musl_target debug_vars := 'DEBUG=${DEBUG:-} DEBUG_FILTER=${DEBUG_FILTER:-} RUST_BACKTRACE=${RUST_BACKTRACE:-} RUSTFLAGS=${RUSTFLAGS:-}' -just_cmd := 'just --timestamp --explain --command-color green' +just_cmd := 'just --timestamp --command-color green' just_cmd_no_ts := 'just --explain --command-color green' watch_cmd := "watchexec -qc -r -e rs,toml,html,css --color always -- " cover_cmd := 'cargo llvm-cov --color always --ignore-filename-regex "main\.rs|log\.rs"' @@ -513,11 +538,6 @@ lockfile_version := ``` | grep version | cut -d '"' -f 2 ``` -## FUNCTIONS -with_suffix(file, target) := if target == msvc_target { f"{{ file }}.exe" } else { file } -maybe_xwin(target) := if target == msvc_target { "cargo-xwin" } else { "cargo" } -xwin_test(pattern) := f"cargo-xwin test {{ pattern }} --target {{ msvc_target }}" - ## OPTIONS set unstable set lazy diff --git a/Cargo.toml b/Cargo.toml index 833205b..a99994e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,7 +9,7 @@ homepage = "https://en.jutty.dev" documentation = "https://en.jutty.dev/node/Documentation" edition = "2024" -rust-version= "1.94.0" +rust-version= "1.91.1" [features] serial-tests = [] @@ -96,7 +96,6 @@ float_cmp_const = "warn" fn_to_numeric_cast_any = "warn" format_collect = "warn" format_push_string = "warn" -from_iter_instead_of_collect = "warn" get_unwrap = "warn" if_not_else = "warn" if_then_some_else_none = "warn" @@ -105,6 +104,7 @@ ignored_unit_patterns = "warn" implicit_clone = "warn" implicit_hasher = "warn" imprecise_flops = "warn" +incompatible_msrv = "warn" inconsistent_struct_constructor = "warn" index_refutable_slice = "warn" indexing_slicing = "warn"