mirror of
https://github.com/nlohmann/json.git
synced 2026-07-06 18:45:09 +00:00
972f5cc10b
When a PR is not amalgamated/formatted, the astyle version friction (see the recurring blocker across many PRs) means contributors often struggle to reproduce the exact fix locally. The check now regenerates the amalgamation and formatting, captures the difference as a patch, and uploads it as the `amalgamation-patch` artifact. The failure comment links to that artifact and tells contributors to run `git apply amalgamation.patch`, so they no longer need to install the pinned astyle version themselves. The pass/fail verdict is unchanged: the same PRs fail as before, and a correctly amalgamated PR uploads nothing and passes. Signed-off-by: Niels Lohmann <mail@nlohmann.me> Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
99 lines
3.4 KiB
YAML
99 lines
3.4 KiB
YAML
name: "Check amalgamation"
|
|
|
|
on:
|
|
pull_request:
|
|
|
|
permissions:
|
|
contents: read
|
|
|
|
jobs:
|
|
save:
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- name: Harden Runner
|
|
uses: step-security/harden-runner@9af89fc71515a100421586dfdb3dc9c984fbf411 # v2.19.4
|
|
with:
|
|
egress-policy: audit
|
|
|
|
- name: Save PR number
|
|
run: |
|
|
mkdir -p ./pr
|
|
echo ${{ github.event.number }} > ./pr/number
|
|
echo ${{ github.event.pull_request.user.login }} > ./pr/author
|
|
- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
|
with:
|
|
name: pr
|
|
path: pr/
|
|
|
|
check:
|
|
runs-on: ubuntu-latest
|
|
env:
|
|
MAIN_DIR: ${{ github.workspace }}/main
|
|
INCLUDE_DIR: ${{ github.workspace }}/main/single_include/nlohmann
|
|
TOOL_DIR: ${{ github.workspace }}/tools/tools/amalgamate
|
|
|
|
steps:
|
|
- name: Harden Runner
|
|
uses: step-security/harden-runner@9af89fc71515a100421586dfdb3dc9c984fbf411 # v2.19.4
|
|
with:
|
|
egress-policy: audit
|
|
|
|
- name: Checkout pull request
|
|
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
|
with:
|
|
path: main
|
|
ref: ${{ github.event.pull_request.head.sha }}
|
|
persist-credentials: false
|
|
|
|
- name: Checkout tools
|
|
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
|
with:
|
|
path: tools
|
|
ref: develop
|
|
persist-credentials: false
|
|
|
|
- name: Install astyle
|
|
run: |
|
|
python3 -mvenv venv
|
|
venv/bin/pip3 install -r $MAIN_DIR/tools/astyle/requirements.txt
|
|
|
|
- name: Regenerate amalgamation and formatting
|
|
run: |
|
|
cd $MAIN_DIR
|
|
|
|
python3 $TOOL_DIR/amalgamate.py -c $TOOL_DIR/config_json.json -s .
|
|
python3 $TOOL_DIR/amalgamate.py -c $TOOL_DIR/config_json_fwd.json -s .
|
|
|
|
${{ github.workspace }}/venv/bin/astyle --project=tools/astyle/.astylerc --suffix=none --quiet \
|
|
$INCLUDE_DIR/json.hpp $INCLUDE_DIR/json_fwd.hpp
|
|
|
|
${{ github.workspace }}/venv/bin/astyle --project=tools/astyle/.astylerc --suffix=none --quiet \
|
|
$(find docs/examples include tests -type f \( -name '*.hpp' -o -name '*.cpp' -o -name '*.cu' \) -not -path 'tests/thirdparty/*' -not -path 'tests/abi/include/nlohmann/*' | sort)
|
|
|
|
- name: Build patch and check for differences
|
|
id: diff
|
|
run: |
|
|
cd $MAIN_DIR
|
|
mkdir -p ${{ github.workspace }}/patch
|
|
git diff --patch --no-color > ${{ github.workspace }}/patch/amalgamation.patch
|
|
if [ -s ${{ github.workspace }}/patch/amalgamation.patch ]; then
|
|
echo "The source code has not been amalgamated/formatted correctly. Diff:"
|
|
cat ${{ github.workspace }}/patch/amalgamation.patch
|
|
echo "has_diff=true" >> "$GITHUB_OUTPUT"
|
|
else
|
|
echo "has_diff=false" >> "$GITHUB_OUTPUT"
|
|
fi
|
|
|
|
# Uploaded so contributors can fix their PR with `git apply amalgamation.patch`
|
|
# instead of installing the pinned astyle version locally.
|
|
- name: Upload patch
|
|
if: steps.diff.outputs.has_diff == 'true'
|
|
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
|
with:
|
|
name: amalgamation-patch
|
|
path: patch/amalgamation.patch
|
|
|
|
- name: Fail if not amalgamated/formatted
|
|
if: steps.diff.outputs.has_diff == 'true'
|
|
run: exit 1
|