name: Models as Data on: workflow_dispatch: inputs: projects: description: "The projects to generate models for" required: true default: '["netty/netty"]' pull_request: branches: - main paths: - "java/ql/src/utils/model-generator/**/*.*" jobs: model-diff: name: Model Difference runs-on: ubuntu-latest if: github.repository == 'github/codeql' strategy: matrix: # large # ["google/guava", "spring-projects/spring-framework", "apache/poi"] # others # ["FasterXML/jackson-core", "FasterXML/jackson-databind", "google/gson", "JodaOrg/joda-time" slug: ${{fromJson(github.event.inputs.projects || '["apache/commons-codec", "apache/commons-io", "apache/commons-beanutils", "apache/commons-logging", "apache/commons-fileupload", "apache/commons-lang", "apache/commons-validator", "apache/commons-csv", "apache/dubbo"]' )}} steps: - name: Clone self (github/codeql) for prhead uses: actions/checkout@v2 if: github.event.pull_request with: path: codeql-prhead ref: ${{ github.base_ref }} - name: Clone self (github/codeql) with main uses: actions/checkout@v2 with: path: codeql-head ref: ${{ github.ref }} - uses: ./codeql-head/.github/actions/fetch-codeql - name: Download database env: SLUG: ${{ matrix.slug }} run: | set -x mkdir lib-dbs SHORTNAME=${SLUG//[^a-zA-Z0-9_]/} projectId=`curl -s https://lgtm.com/api/v1.0/projects/g/${SLUG} | jq .id` curl -L "https://lgtm.com/api/v1.0/snapshots/$projectId/java" -o "$SHORTNAME.zip" unzip -q -d "$SHORTNAME-db" "$SHORTNAME.zip" mkdir "lib-dbs/$SHORTNAME/" mv "$SHORTNAME-db/"`ls -1 "$SHORTNAME-db"`/* "lib-dbs/$SHORTNAME/" - name: Generate Models (PR and HEAD) run: | set -x mkdir tmp-models MODELS=`pwd`/tmp-models DATABASES=`pwd`/lib-dbs analyzeDatabaseWithCheckout() { QL_VARIANT=$1 DATABASE=$2 cd codeql-$QL_VARIANT SHORTNAME=`basename $DATABASE` python java/ql/src/utils/model-generator/GenerateFlowModel.py $DATABASE $MODELS/${SHORTNAME}.qll mv $MODELS/${SHORTNAME}.qll $MODELS/${SHORTNAME}_${QL_VARIANT}.qll cd .. } for d in $DATABASES/*/ ; do ls -1 "$d" analyzeDatabaseWithCheckout "head" $d if [[ "$GITHUB_EVENT_NAME" == "pull_request" ]] then analyzeDatabaseWithCheckout "prhead" $d fi done - name: Install diff2html run: | npm install -g diff2html-cli - name: Generate Model Diff if: github.event.pull_request run: | set -x MODELS=`pwd`/tmp-models ls -1 tmp-models/ for m in $MODELS/*_prhead.qll ; do t="${m/prhead/"head"}" basename=`basename $m` name="diff_${basename/_prhead.qll/""}" (diff -w -u $m $t | diff2html -i stdin -F $MODELS/$name.html) || true done - uses: actions/upload-artifact@v2 with: name: models path: tmp-models/*.qll retention-days: 20 - uses: actions/upload-artifact@v2 with: name: diffs path: tmp-models/*.html retention-days: 20