| name: diff-shades |
| |
| on: |
| push: |
| branches: [main] |
| paths: |
| - src/** |
| - pyproject.toml |
| - scripts/diff_shades_gha_helper.py |
| - .github/workflows/diff_shades.yml |
| - .github/workflows/diff_shades_comment.yml |
| |
| pull_request: |
| paths: |
| - src/** |
| - pyproject.toml |
| - scripts/diff_shades_gha_helper.py |
| - .github/workflows/diff_shades.yml |
| - .github/workflows/diff_shades_comment.yml |
| |
| concurrency: |
| group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.run_id }} |
| cancel-in-progress: true |
| |
| env: |
| HATCH_BUILD_HOOKS_ENABLE: "1" |
| # Clang is less picky with the C code it's given than gcc (and may generate faster |
| # binaries too). |
| CC: clang-18 |
| |
| permissions: {} |
| |
| jobs: |
| configure: |
| runs-on: ubuntu-latest |
| outputs: |
| matrix: ${{ steps.set-config.outputs.matrix }} |
| |
| steps: |
| - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 |
| with: |
| persist-credentials: false |
| |
| - name: Set up Python |
| uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 |
| with: |
| python-version: "3.14" |
| pip-version: "25.3" |
| pip-install: --group diff-shades --group diff-shades-comment |
| |
| - name: Calculate run configuration & metadata |
| id: set-config |
| env: |
| GITHUB_TOKEN: ${{ github.token }} |
| run: python scripts/diff_shades_gha_helper.py config |
| |
| analysis-base: |
| name: analysis / base / ${{ matrix.mode }} |
| needs: configure |
| runs-on: ubuntu-latest |
| strategy: |
| fail-fast: false |
| matrix: |
| include: ${{ fromJson(needs.configure.outputs.matrix) }} |
| |
| steps: |
| - name: Checkout this repository (full clone) |
| uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 |
| with: |
| # The baseline revision could be rather old so a full clone is ideal. |
| fetch-depth: 0 |
| persist-credentials: false |
| |
| - name: Set up Python |
| uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 |
| with: |
| python-version: "3.14" |
| pip-version: "25.3" |
| pip-install: --group diff-shades |
| |
| - name: Configure git |
| run: | |
| git config user.name "diff-shades-gha" |
| git config user.email "diff-shades-gha@example.com" |
| |
| - name: Attempt to use cached baseline analysis |
| id: baseline-cache |
| uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5 |
| with: |
| 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: | |
| ${{ matrix.baseline-setup-cmd }} |
| python -m pip install . |
| |
| - name: Analyze baseline revision |
| if: steps.baseline-cache.outputs.cache-hit != 'true' |
| run: |
| diff-shades analyze ${{ matrix.baseline-analysis }} --work-dir projects-cache/ |
| --force-${{ matrix.style }}-style -v |
| |
| - name: Upload baseline analysis |
| uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 |
| with: |
| name: ${{ matrix.baseline-analysis }} |
| path: ${{ matrix.baseline-analysis }} |
| |
| analysis-target: |
| name: analysis / target / ${{ matrix.mode }} |
| needs: configure |
| runs-on: ubuntu-latest |
| strategy: |
| fail-fast: false |
| matrix: |
| include: ${{ fromJson(needs.configure.outputs.matrix) }} |
| |
| steps: |
| - name: Checkout this repository (full clone) |
| uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 |
| with: |
| # The baseline revision could be rather old so a full clone is ideal. |
| fetch-depth: 0 |
| persist-credentials: false |
| |
| - name: Set up Python |
| uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 |
| with: |
| python-version: "3.14" |
| pip-version: "25.3" |
| pip-install: --group diff-shades |
| |
| - name: Configure git |
| run: | |
| git config user.name "diff-shades-gha" |
| git config user.email "diff-shades-gha@example.com" |
| |
| - name: Build and install target revision |
| env: |
| GITHUB_TOKEN: ${{ github.token }} |
| run: | |
| ${{ matrix.target-setup-cmd }} |
| python -m pip install . |
| |
| # Pull it from previous runs - we're NOT trying to get it from this run |
| # (but it wouldn't cause problems if we theoretically did) |
| - name: Attempt to find baseline analysis |
| id: baseline-cache |
| uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5 |
| with: |
| path: ${{ matrix.baseline-analysis }} |
| key: ${{ matrix.baseline-cache-key }} |
| |
| - name: Analyze target revision (with repeated projects) |
| if: steps.baseline-cache.outputs.cache-hit == 'true' |
| run: | |
| diff-shades analyze ${{ matrix.target-analysis }} --work-dir projects-cache/ \ |
| --force-${{ matrix.style }}-style -v \ |
| --repeat-projects-from ${{ matrix.baseline-analysis }} |
| |
| - name: Analyze target revision (without repeated projects) |
| if: steps.baseline-cache.outputs.cache-hit != 'true' |
| run: |
| diff-shades analyze ${{ matrix.target-analysis }} --work-dir projects-cache/ |
| --force-${{ matrix.style }}-style -v |
| |
| - name: Upload target analysis |
| uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 |
| with: |
| name: ${{ matrix.target-analysis }} |
| path: ${{ matrix.target-analysis }} |
| |
| - name: Check for failed files for target revision |
| run: diff-shades show-failed --check --show-log ${{ matrix.target-analysis }} |
| |
| compare: |
| name: compare / ${{ matrix.mode }} |
| needs: ["configure", "analysis-base", "analysis-target"] |
| if: ${{ !cancelled() }} |
| runs-on: ubuntu-latest |
| strategy: |
| fail-fast: false |
| matrix: |
| include: ${{ fromJson(needs.configure.outputs.matrix) }} |
| |
| steps: |
| - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 |
| with: |
| persist-credentials: false |
| |
| - uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 |
| with: |
| merge-multiple: true |
| |
| - name: Set up Python |
| uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 |
| with: |
| python-version: "3.14" |
| pip-version: "25.3" |
| pip-install: --group diff-shades --group diff-shades-comment |
| |
| - name: Generate HTML diff report |
| run: | |
| diff-shades --dump-html diff.html \ |
| compare --diff ${{ matrix.baseline-analysis }} ${{ matrix.target-analysis }} |
| |
| - name: Upload diff report |
| uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 |
| with: |
| name: ${{ matrix.style }}-diff.html |
| path: diff.html |
| |
| - name: Generate summary file (PR only) |
| if: github.event_name == 'pull_request' |
| env: |
| GITHUB_TOKEN: ${{ github.token }} |
| run: | |
| python scripts/diff_shades_gha_helper.py comment-body \ |
| ${{ matrix.baseline-analysis }} ${{ matrix.target-analysis }} \ |
| ${{ matrix.style }} ${{ matrix.mode }} |
| |
| - name: Upload summary file (PR only) |
| if: github.event_name == 'pull_request' |
| uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 |
| with: |
| name: .${{ matrix.style }}.pr-comment.md |
| path: .${{ matrix.style }}.pr-comment.md |
| include-hidden-files: true |
| |
| - 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) |