# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.

name: Comment Bot

on:
  # TODO(kszucs): support pull_request_review_comment
  issue_comment:
    types:
      - created
      - edited

jobs:
  crossbow:
    name: Listen!
    if: startsWith(github.event.comment.body, '@github-actions crossbow')
    runs-on: ubuntu-latest
    steps:
      - name: Checkout Arrow
        uses: actions/checkout@v2
        with:
          path: arrow
      - name: Set up Python
        uses: actions/setup-python@v2
        with:
          python-version: 3.8
      - name: Install Archery and Crossbow dependencies
        run: pip install -e arrow/dev/archery[bot]
      - name: Handle Github comment event
        env:
          ARROW_GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          CROSSBOW_GITHUB_TOKEN: ${{ secrets.CROSSBOW_GITHUB_TOKEN }}
        run: |
          archery trigger-bot \
            --event-name ${{ github.event_name }} \
            --event-payload ${{ github.event_path }}

  autotune:
    name: "Fix all the things"
    if: startsWith(github.event.comment.body, '@github-actions autotune')
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - uses: r-lib/actions/pr-fetch@master
        with:
          repo-token: ${{ secrets.GITHUB_TOKEN }}
      - name: See what is different
        run: |
          set -ex
          git remote add upstream https://github.com/apache/arrow
          git fetch upstream
          changed() {
            git diff --name-only HEAD..upstream/master | grep -e "$1" >/dev/null 2>&1
          }
          if changed '^r/.*\.R$'; then
            echo "R_DOCS=true" >> $GITHUB_ENV
          fi
          if changed 'cmake' || changed 'CMake'; then
            echo "CMAKE_FORMAT=true" >> $GITHUB_ENV
          fi
          if changed '^cpp/src'; then
            echo "CLANG_FORMAT_CPP=true" >> $GITHUB_ENV
          fi
          if changed '^r/src'; then
            echo "CLANG_FORMAT_R=true" >> $GITHUB_ENV
          fi
      - name: Run cmake_format
        if: env.CMAKE_FORMAT == 'true' || endsWith(github.event.comment.body, 'everything')
        run: |
          set -ex
          export PATH=/home/runner/.local/bin:$PATH
          python3 -m pip install --upgrade pip setuptools wheel
          python3 -m pip install -r dev/archery/requirements-lint.txt
          python3 run-cmake-format.py
      - name: Run clang-format on cpp
        if: env.CLANG_FORMAT_CPP == 'true' || endsWith(github.event.comment.body, 'everything')
        run: |
          . .env # To get the clang version we use
          cpp/build-support/run_clang_format.py \
              --clang_format_binary=clang-format-${CLANG_TOOLS} \
              --exclude_glob=cpp/build-support/lint_exclusions.txt \
              --source_dir=cpp/src --quiet --fix
      - name: Run clang-format on r
        if: env.CLANG_FORMAT_R == 'true' || endsWith(github.event.comment.body, 'everything')
        run: |
          . .env # To get the clang version we use
          cpp/build-support/run_clang_format.py \
              --clang_format_binary=clang-format-${CLANG_TOOLS} \
              --exclude_glob=cpp/build-support/lint_exclusions.txt \
              --source_dir=r/src --quiet --fix
      - uses: r-lib/actions/setup-r@v1
        if: env.R_DOCS == 'true' || endsWith(github.event.comment.body, 'everything')
      - name: Update R docs
        if: env.R_DOCS == 'true' || endsWith(github.event.comment.body, 'everything')
        shell: Rscript {0}
        run: |
          source("ci/etc/rprofile")
          install.packages(c("remotes", "roxygen2"))
          remotes::install_deps("r")
          roxygen2::roxygenize("r")
      - name: Commit results
        run: |
          git config user.name "$(git log -1 --pretty=format:%an)"
          git config user.email "$(git log -1 --pretty=format:%ae)"
          git commit -a -m 'Autoformat/render all the things [automated commit]' || echo "No changes to commit"
      - uses: r-lib/actions/pr-push@master
        with:
          repo-token: ${{ secrets.GITHUB_TOKEN }}

  rebase:
    name: "Rebase"
    if: startsWith(github.event.comment.body, '@github-actions rebase')
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - uses: r-lib/actions/pr-fetch@master
        with:
          repo-token: ${{ secrets.GITHUB_TOKEN }}
      - name: Rebase on ${{ github.repository }} master
        run: |
          set -ex
          git config user.name "$(git log -1 --pretty=format:%an)"
          git config user.email "$(git log -1 --pretty=format:%ae)"
          git remote add upstream https://github.com/${{ github.repository }}
          git fetch --unshallow upstream master
          git rebase upstream/master
      - uses: r-lib/actions/pr-push@master
        with:
          repo-token: ${{ secrets.GITHUB_TOKEN }}
          args: "--force"
