mirror of
https://github.com/github/codeql.git
synced 2026-02-12 05:01:06 +01:00
This is a developer QoL improvement, where running codegen will skip writing (and especially formatting) any files that were not changed. **Why?** While code generation in itself was pretty much instant, QL formatting of generated code was starting to take a long time. This made unconditionally running codegen quite annoying, for example before each test run as part of an IDE workflow or as part of the pre-commit hook. **How?** This was not completely straightforward as we could not work with the contents of the file prior to code generation as that was already post-processed by the QL formatting, so we had no chance of comparing the output of template rendering with that. We therefore store the hashes of the files _prior_ to QL formatting in a checked-in file (`swift/ql/.generated.list`). We can therefore load those hashes at the beginning of code generation, use them to compare the template rendering output and update them in this special registry file. **What else?** We also extend this mechanism to detect accidental modification of generated files in a more robust way. Before this patch, we were doing it with a rough regexp based heuristic. Now, we just store the hashes of the files _after_ QL formatting in the same checked file, so we can check that and stop generation if a generated file was modified, or a stub was modified without removing the `// generated` header.
122 lines
3.7 KiB
YAML
122 lines
3.7 KiB
YAML
name: "Swift"
|
|
|
|
on:
|
|
pull_request:
|
|
paths:
|
|
- "swift/**"
|
|
- "misc/bazel/**"
|
|
- "*.bazel*"
|
|
- .github/workflows/swift.yml
|
|
- .github/actions/fetch-codeql/action.yml
|
|
- codeql-workspace.yml
|
|
- .pre-commit-config.yaml
|
|
- "!**/*.md"
|
|
- "!**/*.qhelp"
|
|
branches:
|
|
- main
|
|
|
|
jobs:
|
|
changes:
|
|
runs-on: ubuntu-latest
|
|
outputs:
|
|
codegen: ${{ steps.filter.outputs.codegen }}
|
|
ql: ${{ steps.filter.outputs.ql }}
|
|
steps:
|
|
- uses: dorny/paths-filter@4512585405083f25c027a35db413c2b3b9006d50
|
|
id: filter
|
|
with:
|
|
filters: |
|
|
codegen:
|
|
- '.github/workflows/swift.yml'
|
|
- "misc/bazel/**"
|
|
- "*.bazel*"
|
|
- 'swift/actions/setup-env/**'
|
|
- '.pre-commit-config.yaml'
|
|
- 'swift/codegen/**'
|
|
- 'swift/schema.py'
|
|
- 'swift/**/*.dbscheme'
|
|
- 'swift/ql/lib/codeql/swift/elements.qll'
|
|
- 'swift/ql/lib/codeql/swift/elements/**'
|
|
- 'swift/ql/lib/codeql/swift/generated/**'
|
|
- 'swift/ql/test/extractor-tests/generated/**'
|
|
- 'swift/ql/.generated.list'
|
|
ql:
|
|
- 'github/workflows/swift.yml'
|
|
- 'swift/**/*.ql'
|
|
- 'swift/**/*.qll'
|
|
# not using a matrix as you cannot depend on a specific job in a matrix, and we want to start linux checks
|
|
# without waiting for the macOS build
|
|
build-and-test-macos:
|
|
runs-on: macos-12-xl
|
|
steps:
|
|
- uses: actions/checkout@v3
|
|
- uses: ./swift/actions/create-extractor-pack
|
|
- uses: ./swift/actions/run-quick-tests
|
|
- uses: ./swift/actions/print-unextracted
|
|
build-and-test-linux:
|
|
runs-on: ubuntu-20.04
|
|
steps:
|
|
- uses: actions/checkout@v3
|
|
- uses: ./swift/actions/create-extractor-pack
|
|
- uses: ./swift/actions/run-quick-tests
|
|
- uses: ./swift/actions/print-unextracted
|
|
qltests-linux:
|
|
needs: build-and-test-linux
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@v3
|
|
- uses: ./swift/actions/run-ql-tests
|
|
qltests-macos:
|
|
needs: build-and-test-macos
|
|
runs-on: macos-12-xl
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
slice: ["1/2", "2/2"]
|
|
steps:
|
|
- uses: actions/checkout@v3
|
|
- uses: ./swift/actions/run-ql-tests
|
|
with:
|
|
flags: --slice ${{ matrix.slice }}
|
|
integration-tests-linux:
|
|
needs: build-and-test-linux
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@v3
|
|
- uses: ./swift/actions/run-integration-tests
|
|
integration-tests-macos:
|
|
needs: build-and-test-macos
|
|
runs-on: macos-12-xl
|
|
steps:
|
|
- uses: actions/checkout@v3
|
|
- uses: ./swift/actions/run-integration-tests
|
|
codegen:
|
|
runs-on: ubuntu-latest
|
|
needs: changes
|
|
if: ${{ needs.changes.outputs.codegen == 'true' }}
|
|
steps:
|
|
- uses: actions/checkout@v3
|
|
- uses: ./swift/actions/setup-env
|
|
- uses: pre-commit/action@v3.0.0
|
|
name: Check that python code is properly formatted
|
|
with:
|
|
extra_args: autopep8 --all-files
|
|
- uses: ./.github/actions/fetch-codeql
|
|
- uses: pre-commit/action@v3.0.0
|
|
name: Check that QL generated code was checked in
|
|
with:
|
|
extra_args: swift-codegen --all-files
|
|
- name: Generate C++ files
|
|
run: |
|
|
bazel run //swift/codegen:codegen -- --generate=trap,cpp --cpp-output=$PWD/generated-cpp-files
|
|
- uses: actions/upload-artifact@v3
|
|
with:
|
|
name: swift-generated-cpp-files
|
|
path: generated-cpp-files/**
|
|
database-upgrade-scripts:
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@v3
|
|
- uses: ./.github/actions/fetch-codeql
|
|
- uses: ./swift/actions/database-upgrade-scripts
|