diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 677aed445..b6ac30e8e 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -55,14 +55,22 @@ jobs: - run: cargo fmt --check --all - run: cargo doc --workspace --no-deps + # region: check-min-version min-version: name: Check minimum Rust version runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: dtolnay/rust-toolchain@1.83.0 + - name: Install Node.js + uses: actions/setup-node@v4 + with: + node-version: 22 + - name: Check MSRV + run: yarn check-msrv + - uses: dtolnay/rust-toolchain@1.82.0 - uses: Swatinem/rust-cache@v2 - run: cargo check --workspace + # end-region: check-min-version build: strategy: diff --git a/package.json b/package.json index ad7f52cde..3d50d82a5 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,8 @@ "docs:rs": "cargo doc --workspace --no-deps", "test:grammar": "cd syntaxes/textmate && yarn run test", "build:typlite": "cargo build --bin typlite", - "typlite": "target/debug/typlite" + "typlite": "target/debug/typlite", + "check-msrv": "node scripts/check-msrv.mjs" }, "dependencies": {}, "devDependencies": { diff --git a/scripts/check-msrv.mjs b/scripts/check-msrv.mjs new file mode 100644 index 000000000..574fce965 --- /dev/null +++ b/scripts/check-msrv.mjs @@ -0,0 +1,39 @@ +import fs from 'fs'; + +const ciFile = fs.readFileSync('.github/workflows/release.yml', 'utf-8'); + +const checkMinVersion = ciFile.match(/# region: check-min-version([\s\S]+?)# end-region: check-min-version/mg); +if (!checkMinVersion) { + console.error('Check minimum version not found'); + process.exit(1); +} + +const ciCheck = checkMinVersion[0]; +// dtolnay/rust-toolchain@1.83.0 +const ciCheckedVersion = ciCheck.match(/dtolnay\/rust-toolchain@(\d+\.\d+\.\d+)/)[1]; + +const cargoToml = fs.readFileSync('Cargo.toml', 'utf-8'); +// rust-version = "1.82" +const cargoSpecifiedVersion = cargoToml.match(/rust-version = "(\d+\.\d+)"/)[1]; + +function parseVersion(version) { + const versions = version.split('.').map(Number); + if (versions.length === 2) { + versions.push(0); + } + if (versions.length !== 3) { + throw new Error(`Invalid version: ${version}`); + } + return versions; +} + +const specified = parseVersion(cargoSpecifiedVersion); +const checked = parseVersion(ciCheckedVersion); +if ( + specified[0] < checked[0] || + (specified[0] === checked[0] && specified[1] < checked[1]) || + (specified[0] === checked[0] && specified[1] === checked[1] && specified[2] < checked[2]) +) { + console.error(`Specified version ${cargoSpecifiedVersion} is less than checked version ${ciCheckedVersion}`); + process.exit(1); +}