name: "Check" on: pull_request: types: - opened - edited - reopened - synchronize - ready_for_review branches: - develop - 'ls-release/**' merge_group: env: ACTIONS_STEP_DEBUG: '${{ secrets.ACTIONS_STEP_DEBUG }}' jobs: version: name: "PyProject Package Version" runs-on: ubuntu-latest steps: - uses: hmarr/debug-action@v3.0.0 - name: Validate uses: actions/github-script@v8 with: github-token: ${{ secrets.GIT_PAT }} script: | const { repo, owner } = context.repo; const head_sha = '${{ github.event.merge_group.head_sha || github.event.pull_request.merge_commit_sha || github.event.pull_request.head.sha || github.event.after }}' const base_sha = '${{ github.event.merge_group.base_sha || github.event.pull_request.base.sha || github.event.before }}' const pyProjectPath = 'pyproject.toml'; async function getPoetryVersion(ref) { const {data: commit} = await github.rest.repos.getCommit({ owner, repo, ref, }); const pyprojectBlob = await github.rest.repos.getContent({ owner: owner, repo: repo, ref: commit.sha, path: pyProjectPath, }); const pyproject = Buffer.from(pyprojectBlob.data.content, pyprojectBlob.data.encoding).toString("utf8"); const matchVersion = pyproject.match(/^version\s*=\s*"(?.*)"/m); return matchVersion.groups.version; } async function parseVersion(a) { const match = a.match(/(?\d+)?\.(?\d+)?\.(?\d+)?(?\.dev|\.post)?(?\d+)?/); return [ match.groups.x * 1, match.groups.y * 1, match.groups.z * 1, {'.dev': -1, '.post': 1}[match.groups.t] || 0, match.groups.n * 1 || 0, ]; } async function compareVersions(a, b) { const a_parsed = await parseVersion(a); const b_parsed = await parseVersion(b); for (let i = 0; i < a_parsed.length; i++) { if (a_parsed[i] === b_parsed[i]) continue; return b_parsed[i] - a_parsed[i]; } return 0; } const base_version = await getPoetryVersion(base_sha); console.log(`Base version: ${base_version}`); const head_version = await getPoetryVersion(head_sha); console.log(`Head version: ${head_version}`); const compare = await compareVersions(base_version, head_version); if (compare < 0) { const error_msg = `It is prohibited to downgrade version`; core.error(error_msg, {file: pyProjectPath,}); throw error_msg; }