on:
push:
branches: [main]
- paths-ignore: ["docs/**", "tests/**", "**.md", "**.rst"]
+ paths: ["src/**", "setup.*", "pyproject.toml", ".github/workflows/*"]
pull_request:
- paths-ignore: ["docs/**", "tests/**", "**.md", "**.rst"]
-
- workflow_dispatch:
- inputs:
- baseline:
- description: >
- The baseline revision. Pro-tip, use `.pypi` to use the latest version
- on PyPI or `.XXX` to use a PR.
- required: true
- default: main
- baseline-args:
- description: "Custom Black arguments (eg. -l 79)"
- required: false
- target:
- description: >
- The target revision to compare against the baseline. Same tip applies here.
- required: true
- target-args:
- description: "Custom Black arguments (eg. -S)"
- required: false
+ paths: ["src/**", "setup.*", "pyproject.toml", ".github/workflows/*"]
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.run_id }}
cancel-in-progress: true
jobs:
+ configure:
+ runs-on: ubuntu-latest
+ outputs:
+ matrix: ${{ steps.set-config.outputs.matrix }}
+
+ steps:
+ - uses: actions/checkout@v3
+ - uses: actions/setup-python@v4
+ with:
+ python-version: "*"
+
+ - name: Install diff-shades and support dependencies
+ run: |
+ python -m pip install click packaging urllib3
+ python -m pip install https://github.com/ichard26/diff-shades/archive/stable.zip
+
+ - name: Calculate run configuration & metadata
+ id: set-config
+ env:
+ GITHUB_TOKEN: ${{ github.token }}
+ run: >
+ python scripts/diff_shades_gha_helper.py config ${{ github.event_name }} ${{ matrix.mode }}
+
analysis:
- name: analysis / linux
+ name: analysis / ${{ matrix.mode }}
+ needs: configure
runs-on: ubuntu-latest
env:
# Clang is less picky with the C code it's given than gcc (and may
# generate faster binaries too).
CC: clang-12
+ strategy:
+ fail-fast: false
+ matrix:
+ include: ${{ fromJson(needs.configure.outputs.matrix )}}
steps:
- name: Checkout this repository (full clone)
- uses: actions/checkout@v2
+ uses: actions/checkout@v3
with:
+ # The baseline revision could be rather old so a full clone is ideal.
fetch-depth: 0
- - uses: actions/setup-python@v2
+ - uses: actions/setup-python@v4
+ with:
+ python-version: "*"
- name: Install diff-shades and support dependencies
run: |
- python -m pip install pip --upgrade
python -m pip install https://github.com/ichard26/diff-shades/archive/stable.zip
python -m pip install click packaging urllib3
python -m pip install -r .github/mypyc-requirements.txt
git config user.name "diff-shades-gha"
git config user.email "diff-shades-gha@example.com"
- - name: Calculate run configuration & metadata
- id: config
- env:
- GITHUB_TOKEN: ${{ github.token }}
- run: >
- python helper.py config ${{ github.event_name }}
- ${{ github.event.inputs.baseline }} ${{ github.event.inputs.target }}
- --baseline-args "${{ github.event.inputs.baseline-args }}"
-
- name: Attempt to use cached baseline analysis
id: baseline-cache
- uses: actions/cache@v2.1.7
+ uses: actions/cache@v3
with:
- path: ${{ steps.config.outputs.baseline-analysis }}
- key: ${{ steps.config.outputs.baseline-cache-key }}
+ path: ${{ matrix.baseline-analysis }}
+ key: ${{ matrix.baseline-cache-key }}
- name: Build and install baseline revision
if: steps.baseline-cache.outputs.cache-hit != 'true'
env:
GITHUB_TOKEN: ${{ github.token }}
run: >
- ${{ steps.config.outputs.baseline-setup-cmd }}
+ ${{ matrix.baseline-setup-cmd }}
&& python setup.py --use-mypyc bdist_wheel
&& python -m pip install dist/*.whl && rm build dist -r
if: steps.baseline-cache.outputs.cache-hit != 'true'
run: >
diff-shades analyze -v --work-dir projects-cache/
- ${{ steps.config.outputs.baseline-analysis }} -- ${{ github.event.inputs.baseline-args }}
+ ${{ matrix.baseline-analysis }} ${{ matrix.force-flag }}
- name: Build and install target revision
env:
GITHUB_TOKEN: ${{ github.token }}
run: >
- ${{ steps.config.outputs.target-setup-cmd }}
+ ${{ matrix.target-setup-cmd }}
&& python setup.py --use-mypyc bdist_wheel
&& python -m pip install dist/*.whl
- name: Analyze target revision
run: >
diff-shades analyze -v --work-dir projects-cache/
- ${{ steps.config.outputs.target-analysis }} --repeat-projects-from
- ${{ steps.config.outputs.baseline-analysis }} -- ${{ github.event.inputs.target-args }}
+ ${{ matrix.target-analysis }} --repeat-projects-from
+ ${{ matrix.baseline-analysis }} ${{ matrix.force-flag }}
- name: Generate HTML diff report
run: >
- diff-shades --dump-html diff.html compare --diff --quiet
- ${{ steps.config.outputs.baseline-analysis }} ${{ steps.config.outputs.target-analysis }}
+ diff-shades --dump-html diff.html compare --diff
+ ${{ matrix.baseline-analysis }} ${{ matrix.target-analysis }}
- name: Upload diff report
- uses: actions/upload-artifact@v2
+ uses: actions/upload-artifact@v3
with:
- name: diff.html
+ name: ${{ matrix.mode }}-diff.html
path: diff.html
- name: Upload baseline analysis
- uses: actions/upload-artifact@v2
+ uses: actions/upload-artifact@v3
with:
- name: ${{ steps.config.outputs.baseline-analysis }}
- path: ${{ steps.config.outputs.baseline-analysis }}
+ name: ${{ matrix.baseline-analysis }}
+ path: ${{ matrix.baseline-analysis }}
- name: Upload target analysis
- uses: actions/upload-artifact@v2
+ uses: actions/upload-artifact@v3
with:
- name: ${{ steps.config.outputs.target-analysis }}
- path: ${{ steps.config.outputs.target-analysis }}
+ name: ${{ matrix.target-analysis }}
+ path: ${{ matrix.target-analysis }}
- name: Generate summary file (PR only)
- if: github.event_name == 'pull_request'
+ if: github.event_name == 'pull_request' && matrix.mode == 'preview-changes'
run: >
python helper.py comment-body
- ${{ steps.config.outputs.baseline-analysis }} ${{ steps.config.outputs.target-analysis }}
- ${{ steps.config.outputs.baseline-sha }} ${{ steps.config.outputs.target-sha }}
+ ${{ matrix.baseline-analysis }} ${{ matrix.target-analysis }}
+ ${{ matrix.baseline-sha }} ${{ matrix.target-sha }}
${{ github.event.pull_request.number }}
- name: Upload summary file (PR only)
- if: github.event_name == 'pull_request'
- uses: actions/upload-artifact@v2
+ if: github.event_name == 'pull_request' && matrix.mode == 'preview-changes'
+ uses: actions/upload-artifact@v3
with:
name: .pr-comment.json
path: .pr-comment.json
- # This is last so the diff-shades-comment workflow can still work even if we
- # end up detecting failed files and failing the run.
- - name: Check for failed files in both analyses
+ - name: Verify zero changes (PR only)
+ if: matrix.mode == 'assert-no-changes'
+ run: >
+ diff-shades compare --check ${{ matrix.baseline-analysis }} ${{ matrix.target-analysis }}
+ || (echo "Please verify you didn't change the stable code style unintentionally!" && exit 1)
+
+ - name: Check for failed files for target revision
+ # Even if the previous step failed, we should still check for failed files.
+ if: always()
run: >
- diff-shades show-failed --check --show-log ${{ steps.config.outputs.baseline-analysis }};
- diff-shades show-failed --check --show-log ${{ steps.config.outputs.target-analysis }}
+ diff-shades show-failed --check --show-log ${{ matrix.target-analysis }}