on:
  schedule:
    - cron: '0 0 * * 6'
  workflow_dispatch:

name: Periodic checks/tasks

env:
  CARGO_ARGS: --no-default-features --features stdlib,zlib,importlib,encodings,ssl,jit
  PYTHON_VERSION: "3.12.0"

jobs:
  # codecov collects code coverage data from the rust tests, python snippets and python test suite.
  # This is done using cargo-llvm-cov, which is a wrapper around llvm-cov.
  codecov:
    name: Collect code coverage data
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: dtolnay/rust-toolchain@stable
      - uses: taiki-e/install-action@cargo-llvm-cov
      - uses: actions/setup-python@v5
        with:
          python-version: ${{ env.PYTHON_VERSION }}
      - run: sudo apt-get update && sudo apt-get -y install lcov
      - name: Run cargo-llvm-cov with Rust tests.
        run: cargo llvm-cov --no-report --workspace --exclude rustpython_wasm --verbose --no-default-features --features stdlib,zlib,importlib,encodings,ssl,jit
      - name: Run cargo-llvm-cov with Python snippets.
        run: python scripts/cargo-llvm-cov.py
        continue-on-error: true
      - name: Run cargo-llvm-cov with Python test suite.
        run: cargo llvm-cov --no-report run -- -m test -u all --slowest --fail-env-changed 
        continue-on-error: true
      - name: Prepare code coverage data
        run: cargo llvm-cov report --lcov --output-path='codecov.lcov'
      - name: Upload to Codecov
        uses: codecov/codecov-action@v5
        with:
          file: ./codecov.lcov

  testdata:
    name: Collect regression test data
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: dtolnay/rust-toolchain@stable
      - name: build rustpython
        run: cargo build --release --verbose
      - name: collect tests data
        run: cargo run --release extra_tests/jsontests.py
        env:
          RUSTPYTHONPATH: ${{ github.workspace }}/Lib
      - name: upload tests data to the website
        env:
          SSHKEY: ${{ secrets.ACTIONS_TESTS_DATA_DEPLOY_KEY }}
          GITHUB_ACTOR: ${{ github.actor }}
        run: |
          echo "$SSHKEY" >~/github_key
          chmod 600 ~/github_key
          export GIT_SSH_COMMAND="ssh -i ~/github_key"

          git clone git@github.com:RustPython/rustpython.github.io.git website
          cd website
          cp ../extra_tests/cpython_tests_results.json ./_data/regrtests_results.json
          git add ./_data/regrtests_results.json
          if git -c user.name="Github Actions" -c user.email="actions@github.com" commit -m "Update regression test results" --author="$GITHUB_ACTOR"; then
            git push
          fi

  whatsleft:
    name: Collect what is left data
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: dtolnay/rust-toolchain@stable
      - uses: actions/setup-python@v5
        with:
          python-version: ${{ env.PYTHON_VERSION }}
      - name: build rustpython
        run: cargo build --release --verbose
      - name: Collect what is left data
        run: |
          chmod +x ./whats_left.py
          ./whats_left.py > whats_left.temp
        env:
          RUSTPYTHONPATH: ${{ github.workspace }}/Lib
      - name: Upload data to the website
        env:
          SSHKEY: ${{ secrets.ACTIONS_TESTS_DATA_DEPLOY_KEY }}
          GITHUB_ACTOR: ${{ github.actor }}
        run: |
          echo "$SSHKEY" >~/github_key
          chmod 600 ~/github_key
          export GIT_SSH_COMMAND="ssh -i ~/github_key"

          git clone git@github.com:RustPython/rustpython.github.io.git website
          cd website
          [ -f ./_data/whats_left.temp ] && cp ./_data/whats_left.temp ./_data/whats_left_lastrun.temp
          cp ../whats_left.temp ./_data/whats_left.temp
          git add -A
          if git -c user.name="Github Actions" -c user.email="actions@github.com" commit -m "Update what is left results" --author="$GITHUB_ACTOR"; then
            git push
          fi

  benchmark:
    name: Collect benchmark data
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: dtolnay/rust-toolchain@stable
      - uses: actions/setup-python@v5
        with:
          python-version: 3.9
      - run: cargo install cargo-criterion
      - name: build benchmarks
        run: cargo build --release --benches
      - name: collect execution benchmark data
        run: cargo criterion --bench execution
      - name: collect microbenchmarks data
        run: cargo criterion --bench microbenchmarks
      - name: restructure generated files
        run: |
          cd ./target/criterion/reports
          find -type d -name cpython | xargs rm -rf
          find -type d -name rustpython | xargs rm -rf
          find -mindepth 2 -maxdepth 2 -name violin.svg | xargs rm -rf
          find -type f -not -name violin.svg | xargs rm -rf
          for file in $(find -type f -name violin.svg); do mv $file $(echo $file | sed -E "s_\./([^/]+)/([^/]+)/violin\.svg_./\1/\2.svg_"); done
          find -mindepth 2 -maxdepth 2 -type d | xargs rm -rf
          cd ..
          mv reports/* .
          rmdir reports
      - name: upload benchmark data to the website
        env:
          SSHKEY: ${{ secrets.ACTIONS_TESTS_DATA_DEPLOY_KEY }}
        run: |
          echo "$SSHKEY" >~/github_key
          chmod 600 ~/github_key
          export GIT_SSH_COMMAND="ssh -i ~/github_key"

          git clone git@github.com:RustPython/rustpython.github.io.git website
          cd website
          rm -rf ./assets/criterion
          cp -r ../target/criterion ./assets/criterion
          git add ./assets/criterion
          if git -c user.name="Github Actions" -c user.email="actions@github.com" commit -m "Update benchmark results"; then
            git push
          fi
