# Builds and deploys the site if the build was successful
#
# This job builds the website and deploys the build artifacts to the 'content' directory
# Any additional files that are not part of the site build but should be published (e.g. website configuration files) must be handled explicitly
# See step "Move additional resources to build directory" and sub-steps "Dropping old site resources" and "Adding new site configuration" of the 'publish' step
name: Build & Deploy Site

# Conditions necessary to trigger a build
on:
  push:
    # Only run for pushes to the following branches
    #
    # Including the branch that is pushed by this action will lead to an infinite loop
    branches:
      - 'master'

    # Only build if a file in one of these paths has been changed
    paths:
      - 'src/main/asciidoc/**'
      - 'src/main/template/**'
      - '.asf.yaml.publish'
      - '.htaccess'


jobs:
  deploy-site:
    name: Build & Deploy Site
    runs-on: ubuntu-latest
    defaults:
      run:
        shell: bash

    env:
      # The name of the branch used to publish the website build artifacts
      BRANCH_NAME: publish

    steps:
      - name: Checkout
        uses: actions/checkout@v2
        with:
          fetch-depth: 1


      - name: Build Site
        run: |
          mvn clean package


      # Determines the short sha of the commit that triggered the build
      - name: Determine Short SHA
        if: success()
        id: short-sha
        run: |
          short_sha=$(git rev-parse --short=10 $GITHUB_SHA)
          echo "::set-output name=SHORT_SHA::$short_sha"


      # Determines the author data of the HEAD commit
      # Sets up the author data to be used for the site deploy commit
      - name: Determine HEAD Commit Author Data
        if: success()
        id: author-data
        run: |
          echo "Reading author data"
          author_name=$(git log -1 --format='%aN' HEAD)
          author_email=$(git log -1 --format='%aE' HEAD)

          echo "Setting up author data to use for deploy commit"
          git config user.name $author_name
          git config user.email $author_email


      # Adds additional configuration files that are supposed to be included in the page deploy to the build directory
      #
      # This ensures that such files are preserved when checking out the publish branch
      - name: Add Additional Resources to Build Directory
        if: success()
        run: |
          cp -v .asf.yaml.publish target/site/.asf.yaml
          cp -v .htaccess target/site/


      - name: Check Out Site Branch
        if: success()
        run: |
          git fetch origin ${{ env.BRANCH_NAME }}
          git checkout -b ${{ env.BRANCH_NAME }} origin/${{ env.BRANCH_NAME }}


      # Drops all existing files and folders except the base folder and the resources excluded by the regex
      # This ensures that old configuration files that were removed on the master will be removed from the site branch as well
      # Additional resources to exclude can be added by modifying the regex or adding new regex by using "-a -not -regex '...'"
      - name: Drop Old Site Resources
        if: success()
        run: |
          find . \
            -mindepth 1 -regextype posix-extended \
            -not -regex '^\./(target|.git)(/.*)?$' \
            -delete -print


      # Moves additional configuration files that were added to the build directory to their target directory
      # In general, this should move all resources touched in the step 'Add additional resources to build directory'
      - name: Add New Site Configuration
        if: success()
        run: |
          mv -v target/site/.asf.yaml ./
          mv -v target/site/.htaccess ./


      # Moves the new site resources from the build directory to the content directory
      - name: Add New Site Resources
        if: success()
        run: |
          mkdir -v content
          mv -v target/site/* content/

          # Explicitly removes build dir
          # This checks whether there are any remaining resources that were not moved to the correct location
          # Drops the rest of the resources in the target directory if there are any
          echo
          echo "Removing site build directory"

          if rmdir -v target/site
            then
              echo
              echo "Removing remaining build directories"
              rm -r -v target

            else
              echo
              echo "Failed due to resources remaining in site build directory:"
              tree target/site

              exit 1
          fi


      - name: Stage Changes
        id: stage-changes
        if: success()
        run: |
          git add -v -A

          if $(git diff -s --cached --exit-code)
            then
              # nothing staged
              echo "Nothing to commit"
              has_staged_changes=false
            else
              # something staged
              has_staged_changes=true
          fi

          echo "::set-output name=HAS_STAGED_CHANGES::$has_staged_changes"


      # Publishes the build results
      # Does nothing if there is nothing to publish
      - name: Publish Results
        if: success() && steps.stage-changes.outputs.HAS_STAGED_CHANGES == 'true'
        run: |
          echo "Committing changes"
          git commit -m "Auto-deploy site for commit ${{ steps.short-sha.outputs.SHORT_SHA }}"
          echo

          echo "Pushing site branch"
          git push origin ${{ env.BRANCH_NAME }}
