GemStone Search: retire the standalone Find Class picker and add an exact match mode #333
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Roadmap | |
| # Regenerates ROADMAP.md from the `roadmap`-labeled tracker issues (see | |
| # scripts/generate-roadmap.mjs) whenever a tracker changes, and pushes the | |
| # result straight to main. That push to main by the actions bot is | |
| # intentional: ROADMAP.md is a generated artifact of the tracker issues, so | |
| # committing it directly (rather than via a PR) is what keeps it from | |
| # drifting. There is no push-triggered loop risk: `issues:` events are not | |
| # fired by commits, and this workflow has no `push:` trigger (the | |
| # paths-ignore equivalent of excluding ROADMAP.md is therefore moot). | |
| on: | |
| issues: | |
| types: | |
| - opened | |
| - edited | |
| - labeled | |
| - unlabeled | |
| - milestoned | |
| - demilestoned | |
| - closed | |
| - reopened | |
| workflow_dispatch: | |
| # zizmor(excessive-permissions): an explicit permissions block is required | |
| # instead of relying on the default GITHUB_TOKEN scope. `contents: write` | |
| # is needed to push the regenerated ROADMAP.md to main. | |
| permissions: | |
| contents: write | |
| # Rapid label/milestone churn queues one pending regeneration instead of | |
| # racing pushes: in-flight runs are cancelled in favor of the newest event, | |
| # which regenerates from the latest issue state anyway. | |
| concurrency: | |
| group: roadmap-regen | |
| cancel-in-progress: true | |
| jobs: | |
| regenerate: | |
| name: Regenerate ROADMAP.md | |
| timeout-minutes: 5 | |
| # Only proceed when the triggering issue has (or, for `unlabeled`, had) | |
| # the `roadmap` label — other issue traffic is irrelevant to the roadmap. | |
| # Filtered in-job because `on.issues` has no label filter. | |
| if: >- | |
| github.event_name == 'workflow_dispatch' || | |
| contains(github.event.issue.labels.*.name, 'roadmap') || | |
| github.event.label.name == 'roadmap' | |
| runs-on: ubuntu-latest | |
| steps: | |
| # zizmor(unpinned-uses): actions must be pinned to a commit SHA, not | |
| # a mutable tag like @v7. Credentials are persisted deliberately — | |
| # this job's whole purpose is to push the regenerated file to main. | |
| - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.0 # zizmor: ignore[artipacked] -- the push step below needs the token | |
| with: | |
| ref: main | |
| persist-credentials: true | |
| - name: Setup Node.js | |
| # zizmor(unpinned-uses): actions must be pinned to a commit SHA, | |
| # not a mutable tag like @v6 | |
| uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0 | |
| with: | |
| node-version-file: '.nvmrc' | |
| # No `npm ci`: the generator uses only Node built-ins (global fetch). | |
| - name: Regenerate ROADMAP.md | |
| env: | |
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
| run: node scripts/generate-roadmap.mjs | |
| - name: Commit and push if changed | |
| run: | | |
| if git diff --quiet -- ROADMAP.md; then | |
| echo "ROADMAP.md unchanged; nothing to push." | |
| exit 0 | |
| fi | |
| git config user.name "github-actions[bot]" | |
| git config user.email "41898282+github-actions[bot]@users.noreply.github.com" | |
| git add ROADMAP.md | |
| git commit -m "Regenerate ROADMAP.md from tracker issues" | |
| # A run may still race a human push to main; rebase-and-retry | |
| # rather than failing on a non-fast-forward. | |
| for attempt in 1 2 3; do | |
| if git push origin main; then | |
| exit 0 | |
| fi | |
| echo "Push attempt $attempt failed; rebasing onto latest main..." | |
| git pull --rebase origin main | |
| done | |
| git push origin main |