New GitHub workflow to enforce linear pull requests

When combined with GitHub's "Require branches to be up to date before
merging" setting, this forces semi-linear merging.  This check can be
disabled by adding the "pr-permit-nonlinear" label to the PR.
This commit is contained in:
Richard Hansen 2024-12-24 20:36:24 -05:00
parent 4d7d6ae48e
commit 07289d5c48

31
.github/workflows/pr.yml vendored Normal file
View file

@ -0,0 +1,31 @@
name: Pull Request
on:
pull_request:
types:
- labeled
- opened
- reopened
- synchronize
- unlabeled
jobs:
linear-history:
if: ${{ !contains(github.event.pull_request.labels.*.name, 'pr-permit-nonlinear') }}
name: Linear History
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: No new merge commits
run: |
log() { printf %s\\n "$*" >&2; }
error() { log "ERROR: $@"; }
fatal() { error "$@"; exit 1; }
try() { log "Running command $@"; "$@" || fatal "'$@' failed"; }
out=$(try git rev-list -n 1 --merges '${{ github.event.pull_request.base.sha }}..${{ github.event.pull_request.head.sha }}') || exit 1
[ -z "${out}" ] || {
error "pull request includes a merge commit and does not have the 'pr-permit-nonlinear' label"
git show "${out}" >&2
exit 1
}