name: Update Components

on:
  workflow_dispatch:
  schedule:
    - cron: "0 * * * *"

jobs:
  update-components:
    runs-on: ubuntu-latest
    steps:
      - name: Check out code
        uses: actions/checkout@v2

      - name: Update component versions
        id: update
        run: |
          PR_BODY=""

          bump_version() {
            local RELEASE_VERSION=$(curl -s https://api.github.com/repos/fluxcd/$1/releases | jq -r 'sort_by(.published_at) | .[-1] | .tag_name')
            local CURRENT_VERSION=$(sed -n "s/.*$1\/archive\/\(.*\).zip.*/\1/p;n" manifests/bases/$1/kustomization.yaml)

            if [[ "${RELEASE_VERSION}" != "${CURRENT_VERSION}" ]]; then
              # bump kustomize
              sed -i "s/\($1\/archive\/\)v.*\(.zip\/\/$1-\).*\(\/config.*\)/\1${RELEASE_VERSION}\2${RELEASE_VERSION/v}\3/g" "manifests/bases/$1/kustomization.yaml"

              if [[ ! -z $(go list -m all | grep "github.com/fluxcd/$1/api" | awk '{print $2}') ]]; then
                # bump go mod
                go mod edit -require="github.com/fluxcd/$1/api@${RELEASE_VERSION}"
              fi

              PR_BODY="$PR_BODY- $1 to ${RELEASE_VERSION}%0A"
            fi
          }

          {
            # bump controller versions
            bump_version helm-controller
            bump_version kustomize-controller
            bump_version source-controller
            bump_version notification-controller

            # add missing and remove unused modules
            go mod tidy

            # diff change
            git diff

            # export PR_BODY for PR
            echo "::set-output name=pr_body::$PR_BODY"
          }

      - name: Create Pull Request
        id: cpr
        uses: peter-evans/create-pull-request@v3
        with:
            token: ${{ secrets.BOT_GITHUB_TOKEN }}
            commit-message: Update toolkit components
            committer: GitHub <noreply@github.com>
            author: fluxcdbot <fluxcdbot@users.noreply.github.com>
            title: Update toolkit components
            body: |
              ${{ steps.update.outputs.pr_body }}

              Auto-generated by [create-pull-request][1]

              [1]: https://github.com/peter-evans/create-pull-request
            branch: update-components
            reviewers: ${{ secrets.ASSIGNEES }}

      - name: Check output
        run: |
          echo "Pull Request Number - ${{ steps.cpr.outputs.pull-request-number }}"