# This workflow is provided via the organization template repository
#
# https://github.com/nextcloud/.github
# https://docs.github.com/en/actions/learn-github-actions/sharing-workflows-with-your-organization
#
# SPDX-FileCopyrightText: 2021-2024 Nextcloud GmbH and Nextcloud contributors
# SPDX-License-Identifier: MIT

name: Compile Command
on:
  issue_comment:
    types: [created]

jobs:
  init:
    runs-on: ubuntu-latest

    # On pull requests and if the comment starts with `/compile`
    if: github.event.issue.pull_request != '' && startsWith(github.event.comment.body, '/compile')

    outputs:
      git_path: ${{ steps.git-path.outputs.path }}
      arg1: ${{ steps.command.outputs.arg1 }}
      arg2: ${{ steps.command.outputs.arg2 }}
      head_ref: ${{ steps.comment-branch.outputs.head_ref }}
      base_ref: ${{ steps.comment-branch.outputs.base_ref }}

    steps:
      - name: Get repository from pull request comment
        uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1
        id: get-repository
        with:
          github-token: ${{secrets.GITHUB_TOKEN}}
          script: |
            const pull = await github.rest.pulls.get({
              owner: context.repo.owner,
              repo: context.repo.repo,
              pull_number: context.issue.number
            });

            const repositoryName = pull.data.head?.repo?.full_name
            console.log(repositoryName)
            return repositoryName

      - name: Disabled on forks
        if: ${{ fromJSON(steps.get-repository.outputs.result) != github.repository }}
        run: |
          echo 'Can not execute /compile on forks'
          exit 1

      - name: Check actor permission
        uses: skjnldsv/check-actor-permission@69e92a3c4711150929bca9fcf34448c5bf5526e7 # v2
        with:
          require: write

      - name: Add reaction on start
        uses: peter-evans/create-or-update-comment@71345be0265236311c031f5c7866368bd1eff043 # v4.0.0
        with:
          token: ${{ secrets.COMMAND_BOT_PAT }}
          repository: ${{ github.event.repository.full_name }}
          comment-id: ${{ github.event.comment.id }}
          reactions: '+1'

      - name: Parse command
        uses: skjnldsv/parse-command-comment@5c955203c52424151e6d0e58fb9de8a9f6a605a1 # v2
        id: command

      # Init path depending on which command is run
      - name: Init path
        id: git-path
        run: |
          if ${{ startsWith(steps.command.outputs.arg1, '/') }}; then
            echo "path=${{steps.command.outputs.arg1}}" >> $GITHUB_OUTPUT
          else
            echo "path=${{steps.command.outputs.arg2}}" >> $GITHUB_OUTPUT
          fi

      - name: Init branch
        uses: xt0rted/pull-request-comment-branch@e8b8daa837e8ea7331c0003c9c316a64c6d8b0b1 # v3.0.0
        id: comment-branch

      - name: Add reaction on failure
        uses: peter-evans/create-or-update-comment@71345be0265236311c031f5c7866368bd1eff043 # v4.0.0
        if: failure()
        with:
          token: ${{ secrets.COMMAND_BOT_PAT }}
          repository: ${{ github.event.repository.full_name }}
          comment-id: ${{ github.event.comment.id }}
          reactions: '-1'

  process:
    runs-on: ubuntu-latest
    needs: init

    steps:
      - name: Restore cached git repository
        uses: buildjet/cache@3e70d19e31d6a8030aeddf6ed8dbe601f94d09f4 # v4.0.2
        with:
          path: .git
          key: git-repo

      - name: Checkout ${{ needs.init.outputs.head_ref }}
        uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
        with:
          persist-credentials: true
          token: ${{ secrets.COMMAND_BOT_PAT }}
          fetch-depth: 0
          ref: ${{ needs.init.outputs.head_ref }}

      - name: Setup git
        run: |
          git config --local user.email 'nextcloud-command@users.noreply.github.com'
          git config --local user.name 'nextcloud-command'

      - name: Read package.json node and npm engines version
        uses: skjnldsv/read-package-engines-version-actions@06d6baf7d8f41934ab630e97d9e6c0bc9c9ac5e4 # v3
        id: package-engines-versions
        with:
          fallbackNode: '^20'
          fallbackNpm: '^10'

      - name: Set up node ${{ steps.package-engines-versions.outputs.nodeVersion }}
        uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4.2.0
        with:
          node-version: ${{ steps.package-engines-versions.outputs.nodeVersion }}
          cache: npm

      - name: Set up npm ${{ steps.package-engines-versions.outputs.npmVersion }}
        run: npm i -g 'npm@${{ steps.package-engines-versions.outputs.npmVersion }}'

      - name: Rebase to ${{ needs.init.outputs.base_ref }}
        if: ${{ contains(needs.init.outputs.arg1, 'rebase') }}
        run: |
          git fetch origin '${{ needs.init.outputs.base_ref }}:${{ needs.init.outputs.base_ref }}'
          git rebase 'origin/${{ needs.init.outputs.base_ref }}'

      - name: Install dependencies & build
        env:
          CYPRESS_INSTALL_BINARY: 0
          PUPPETEER_SKIP_DOWNLOAD: true
        run: |
          npm ci
          npm run build --if-present

      - name: Commit default
        if: ${{ !contains(needs.init.outputs.arg1, 'fixup') && !contains(needs.init.outputs.arg1, 'amend') }}
        run: |
          git add '${{ github.workspace }}${{ needs.init.outputs.git_path }}'
          git commit --signoff -m 'chore(assets): Recompile assets'

      - name: Commit fixup
        if: ${{ contains(needs.init.outputs.arg1, 'fixup') }}
        run: |
          git add '${{ github.workspace }}${{ needs.init.outputs.git_path }}'
          git commit --fixup=HEAD --signoff

      - name: Commit amend
        if: ${{ contains(needs.init.outputs.arg1, 'amend') }}
        run: |
          git add '${{ github.workspace }}${{ needs.init.outputs.git_path }}'
          git commit --amend --no-edit --signoff
          # Remove any [skip ci] from the amended commit
          git commit --amend -m "$(git log -1 --format='%B' | sed '/\[skip ci\]/d')"

      - name: Push normally
        if: ${{ !contains(needs.init.outputs.arg1, 'rebase') && !contains(needs.init.outputs.arg1, 'amend') }}
        run: git push origin '${{ needs.init.outputs.head_ref }}'

      - name: Force push
        if: ${{ contains(needs.init.outputs.arg1, 'rebase') || contains(needs.init.outputs.arg1, 'amend') }}
        run: git push --force origin '${{ needs.init.outputs.head_ref }}'

      - name: Add reaction on failure
        uses: peter-evans/create-or-update-comment@71345be0265236311c031f5c7866368bd1eff043 # v4.0.0
        if: failure()
        with:
          token: ${{ secrets.COMMAND_BOT_PAT }}
          repository: ${{ github.event.repository.full_name }}
          comment-id: ${{ github.event.comment.id }}
          reactions: '-1'