name: "CodeQL"

on:
  push:
    branches: [ "master" ]
  pull_request:
    # The branches below must be a subset of the branches above
    branches: [ "master" ]
  schedule:
    - cron: '18 15 * * 0'

permissions:
  contents: read

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}-${{ github.event_name }}
  cancel-in-progress: ${{ github.event_name == 'pull_request' }}

jobs:
  analyze:
    name: Analyze
    runs-on: 'ubuntu-latest'
    timeout-minutes: 360
    permissions:
      actions: read
      contents: read
      security-events: write

    strategy:
      fail-fast: false
      matrix:
        language: [ 'cpp', 'java', 'javascript', 'python' ]
        # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby', 'swift' ]

    steps:

    - name: Harden Runner
      uses: step-security/harden-runner@f4a75cfd619ee5ce8d5b864b0d183aff3c69b55a # v2.13.1
      with:
        egress-policy: audit

    - name: Checkout repository
      uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0

    # Initializes the CodeQL tools for scanning.
    - name: Initialize CodeQL
      uses: github/codeql-action/init@f443b600d91635bebf5b0d9ebc620189c0d6fba5 # v3.29.5
      with:
        languages: ${{ matrix.language }}
        # CodeQL is currently crashing on files with large lists:
        #   https://github.com/github/codeql/issues/13656
        config: |
          paths-ignore:
            - research
            - js/test_data.*

    - if: matrix.language == 'cpp'
      name: Build CPP
      uses: github/codeql-action/autobuild@f443b600d91635bebf5b0d9ebc620189c0d6fba5 # v3.29.5

    - if: matrix.language == 'cpp' || matrix.language == 'java'
      name: Build Java
      run: |
        cd ${GITHUB_WORKSPACE}/java
        bazelisk build --spawn_strategy=local --nouse_action_cache -c opt ...:all

    - if: matrix.language == 'javascript'
      name: Build JS
      uses: github/codeql-action/autobuild@f443b600d91635bebf5b0d9ebc620189c0d6fba5 # v3.29.5

    - if: matrix.language == 'cpp' || matrix.language == 'python'
      name: Build Python
      run: |
        python setup.py build_ext

    - name: Perform CodeQL Analysis
      uses: github/codeql-action/analyze@f443b600d91635bebf5b0d9ebc620189c0d6fba5 # v3.29.5
      with:
        category: "/language:${{matrix.language}}"
        ref: "${{ github.ref != 'master' && github.ref || '/refs/heads/master' }}"
        sha: "${{ github.sha }}"
