name: Binary size difference

on:
  pull_request:

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true

jobs:
  sizediff:
    runs-on: ubuntu-22.04
    permissions:
      pull-requests: write
    steps:
      # Prepare, install tools
      - name: Add GOBIN to $PATH
        run: |
          echo "$HOME/go/bin" >> $GITHUB_PATH
      - name: Checkout
        uses: actions/checkout@v4
        with:
          fetch-depth: 0 # fetch all history (no sparse checkout)
          submodules: true
      - name: Install apt dependencies
        run: ./.github/workflows/sizediff-install-pkgs.sh
      - name: Restore LLVM source cache
        uses: actions/cache@v4
        id: cache-llvm-source
        with:
          key: llvm-source-18-sizediff-v1
          path: |
            llvm-project/compiler-rt
      - name: Download LLVM source
        if: steps.cache-llvm-source.outputs.cache-hit != 'true'
        run: make llvm-source
      - name: Cache Go
        uses: actions/cache@v4
        with:
          key: go-cache-linux-sizediff-v2-${{ hashFiles('go.mod') }}
          path: |
            ~/.cache/go-build
            ~/go/pkg/mod
      - run: make gen-device -j4
      - name: Download drivers repo
        run: git clone https://github.com/tinygo-org/drivers.git
      - name: Save HEAD
        run: git branch github-actions-saved-HEAD HEAD

      # Compute sizes for the PR branch
      - name: Build tinygo binary for the PR branch
        run: go install
      - name: Determine binary sizes on the PR branch
        run: (cd drivers; make smoke-test XTENSA=0 | tee sizes-pr.txt)

      # Compute sizes for the dev branch
      - name: Checkout dev branch
        run: |
          git reset --hard origin/dev
          git checkout --no-recurse-submodules `git merge-base HEAD origin/dev`
      - name: Install apt dependencies on the dev branch
        # this is only needed on a PR that changes the LLVM version
        run: ./.github/workflows/sizediff-install-pkgs.sh
      - name: Build tinygo binary for the dev branch
        run: go install
      - name: Determine binary sizes on the dev branch
        run: (cd drivers; make smoke-test XTENSA=0 | tee sizes-dev.txt)

      # Create comment
      # TODO: add a summary, something like:
      #  - overall size difference (percent)
      #  - number of binaries that grew / shrank / remained the same
      #  - don't show the full diff when no binaries changed
      - name: Calculate size diff
        run: ./tools/sizediff drivers/sizes-dev.txt drivers/sizes-pr.txt | tee sizediff.txt
      - name: Create comment
        run: |
          echo "Size difference with the dev branch:" > comment.txt
          echo "<details><summary>Binary size difference</summary>" >> comment.txt
          echo "<pre>" >> comment.txt
          cat sizediff.txt >> comment.txt
          echo "</pre></details>" >> comment.txt
      - name: Comment contents
        run: cat comment.txt
      - name: Add comment
        if: ${{ github.event.pull_request.head.repo.full_name == github.event.pull_request.base.repo.full_name }}
        uses: thollander/actions-comment-pull-request@v2.3.1
        with:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          filePath: comment.txt
          comment_tag: sizediff
