Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ jobs:
- name: Build HTML
shell: bash -l {0}
run: |
jb build lectures --path-output ./ -n --keep-going
jb build lectures --path-output ./ -n -W --keep-going
- name: Upload Execution Reports
uses: actions/upload-artifact@v7
if: failure()
Expand Down
18 changes: 13 additions & 5 deletions .github/workflows/rebase-translations.yml
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
# Rebase Translation PRs
#
# Install this workflow in the TARGET (translated) repository.
# When a translation-sync PR is merged, this workflow automatically
# rebases other open translation-sync PRs against the updated main branch.
# When a translation PR is merged, this workflow automatically rebases the
# other open translation PRs against the updated main branch. It covers both
# kinds this tool creates: `translation-sync-*` branches from the Action's sync
# mode, and `resync/*` branches from the CLI's `forward --github`.
#
# This eliminates merge conflicts caused by multiple upstream PRs
# modifying the same files. See: https://github.com/QuantEcon/action-translation/issues/63
Expand All @@ -17,10 +19,16 @@ on:

jobs:
rebase:
# Only run when a translation-sync PR is merged
# Only run when a translation PR is merged. Both prefixes must be listed:
# sync mode creates `translation-sync-*`, while the CLI's `forward --github`
# creates `resync/*`, and a wave of resync PRs goes stale the same way.
# Keep this in step with `isTranslationBranch` in the action's src/branch-naming.ts
# — this `if` decides whether the job runs, that predicate decides which open PRs
# it then rebases, so a prefix matching only one of them is a no-op run.
if: >
github.event.pull_request.merged == true &&
startsWith(github.event.pull_request.head.ref, 'translation-sync-')
(startsWith(github.event.pull_request.head.ref, 'translation-sync-') ||
startsWith(github.event.pull_request.head.ref, 'resync/'))
runs-on: ubuntu-latest

permissions:
Expand All @@ -34,7 +42,7 @@ jobs:

steps:
- name: Rebase open translation PRs
uses: QuantEcon/action-translation@v0.16.1
uses: QuantEcon/action-translation@v0
with:
mode: rebase
anthropic-api-key: ${{ secrets.ANTHROPIC_API_KEY }}
Expand Down
54 changes: 28 additions & 26 deletions .github/workflows/review-translations.yml
Original file line number Diff line number Diff line change
@@ -1,48 +1,50 @@
# Review Translations — Quality check on translation PRs
# When a PR is opened/updated that carries the 'action-translation' label,
# this workflow runs a quality review and posts a comment.
#
# Mirrors the upstream template in action-translation
# docs/user/tutorials/connect-existing.md — keep it in step with that.
name: Review Translations

on:
pull_request:
types: [opened, synchronize, labeled, reopened]

# Serialise reviews per PR.
#
# The sync action creates the PR and then applies its labels in a separate call,
# so a single sync fires `opened` plus one `labeled` event per label, all within
# a couple of seconds. Every one of those starts a full review, and the action's
# "update the existing comment, else create one" logic is a check-then-act with
# no lock — concurrent runs all observe "no comment yet" and each create one.
# See QuantEcon/lecture-python-programming.fr#6, which collected two review
# comments this way, and QuantEcon/action-translation#96 for the upstream bug.
#
# cancel-in-progress is deliberately false. The labels are applied in one API
# call, so event ordering is not guaranteed; if 'automated' arrived last it would
# cancel the in-flight review for 'action-translation' and then skip its own job
# via the filter below, leaving no review at all. Queuing instead means the first
# run creates the comment and any later run updates it — one comment, always.
concurrency:
group: review-translations-${{ github.event.pull_request.number }}
cancel-in-progress: false

jobs:
review:
# Require the 'action-translation' label, and — for `labeled` events — ignore
# labels other than that one. Without the second clause the 'automated' label
# fires a second, redundant review of the identical diff.
if: >-
# Ignore `labeled` events for every other label: a sync adds its labels in a single
# addLabels call, but GitHub emits one `labeled` event per label, and each would
# otherwise start a full (billed) review of the same diff.
if: >
contains(github.event.pull_request.labels.*.name, 'action-translation') &&
(github.event.action != 'labeled' ||
github.event.label.name == 'action-translation')
(github.event.action != 'labeled' || github.event.label.name == 'action-translation')
runs-on: ubuntu-latest

# v0.17.0's review dedupe deletes superseded comments, which needs pull-requests: write.
permissions:
contents: read
pull-requests: write

# One review per PR — supersede an in-flight review instead of running both.
# Job-level (not workflow-level) on purpose: the group is entered only after the `if`
# above has passed, so a `labeled` event for 'automated' skips out without cancelling
# the real review. At workflow level it would cancel first and skip second, leaving none.
#
# This supersedes the workflow-level `cancel-in-progress: false` previously used here,
# whose rationale — that an 'automated' label event would cancel the real review and
# then skip its own job, leaving none — was reasoned from the docs and never tested.
# Production disproved it: across ~15 live opportunities on lecture-intro.zh-cn the
# 'automated' event skipped without cancelling and a review was posted every time.
concurrency:
group: review-translations-${{ github.event.pull_request.number }}
cancel-in-progress: true

steps:
- uses: actions/checkout@v7
Comment thread
mmcky marked this conversation as resolved.
with:
fetch-depth: 2

- uses: QuantEcon/action-translation@v0.16.1
- uses: QuantEcon/action-translation@v0
with:
mode: review
source-repo: QuantEcon/lecture-python-programming
Expand Down
Loading