#
# 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.
#

#
# This action will check that an extension release candidate is ready for the vote
# (verify checksums, verify the release signature, rc tag is exist etc.).
#

name: "Extension Check Release Candidate"

on:
  workflow_dispatch:
    inputs:
      extension-name:
        description: 'The name of Ignite Extension (e.g. ignite-aws-ext)'
        required: true
      release-version:
        description: 'The Extension release version (e.g. 1.0.0)'
        required: true

env:
  SERVER_URL: 'https://dist.apache.org/repos/dist/dev/ignite/ignite-extensions/'

jobs:
  check:
    if: github.repository == 'apache/ignite-extensions'
    runs-on: ubuntu-latest
    steps:
      - name: Setup Inputs
        id: vars
        shell: bash
        # see https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html
        run: |
          name=${{ github.event.inputs.extension-name }}
          ver=${{ github.event.inputs.release-version }}
          mod_ver=$(echo ${ver} | sed -e 's/^[[:space:]]*//')
          mod_name=$(echo ${name} | sed -e 's/^[[:space:]]*//')
          mod_dir=modules/${name#"ignite-"}
          echo "Extension Version:     $mod_ver"
          echo "Extension Module Name: $mod_name"
          echo "Extension Directory:   $mod_dir"
          echo "EXTENSION_VERSION=${mod_ver}" >> $GITHUB_ENV
          echo "EXTENSION_NAME=${mod_name}" >> $GITHUB_ENV
          echo "EXTENSION_DIR=${mod_dir}" >> $GITHUB_ENV

      - name: Checkout Release Branch
        uses: actions/checkout@v3
        with:
          ref: 'release/${{ github.event.inputs.extension-name }}-${{ github.event.inputs.release-version }}'

      - name: Checkout Release tags
        run: |
          git fetch --prune --unshallow --tags
          echo $(git tag -l)
          echo "GIT_ROOT=$(pwd)" >> $GITHUB_ENV

      - name: Set up Java
        uses: actions/setup-java@v2
        with:
          java-version: 8
          distribution: 'adopt'

      - name: Extract Branch POM Version and Compare
        shell: bash
        run: |
          mvn -pl ${{ env.EXTENSION_DIR }} help:evaluate -Dexpression=project.artifactId
          ver=$(mvn -pl ${{ env.EXTENSION_DIR }} help:evaluate -Dexpression=project.version -q -DforceStdout)
          pom_ver=$(echo ${ver} | sed -e 's/^[[:space:]]*//')
          missmatch='true'
          [ "$pom_ver" == "${{ env.EXTENSION_VERSION }}" ] && missmatch='false'
          echo "Extension pom version: ${pom_ver}"
          echo "VERSIONS_MISMATCH=${missmatch}" >> $GITHUB_ENV
          echo "VERSION_POM=${pom_ver}" >> $GITHUB_ENV

      - name: Compare Release Versions With Branch Version
        if: ${{ env.VERSIONS_MISMATCH == 'true' }}
        uses: actions/github-script@v3
        with:
          script: |
            core.setFailed('Versions missmatch [branch=${{ env.EXTENSION_VERSION }}, pom=${{ env.VERSION_POM }}]')

      # The RC tag must points to the last commit in the release branch.
      - name: Extracting RC tag
        run: |
          rc_tag=$(git describe --tags --exact-match --abbrev=0)
          echo "Extension RC tag: ${rc_tag}"
          echo "EXTENSION_RC_TAG=${rc_tag}" >> $GITHUB_ENV

      - name: Download Binary and Sources
        run: |
          wget --recursive --no-parent --no-directories --tries=3 --retry-on-http-error=429,503,504 --accept '.zip,.asc,.sha512' \
            --execute robots=off "${{ env.SERVER_URL }}${{ env.EXTENSION_RC_TAG }}/" -P ${{ env.EXTENSION_RC_TAG }}
          ls ${{ env.EXTENSION_RC_TAG }}

      - name: Validate Binary and Sources Checksums
        run: |
          cd ${{ env.EXTENSION_RC_TAG }}
          sha512sum -c *.sha512

      - name: Validate PGP Signatures
        run: |
          wget https://dist.apache.org/repos/dist/release/ignite/KEYS
          gpg --import KEYS
          for asc in $(find . -name "*.asc" -type f); do gpg --verify $asc; done

      - name: Extenstion Sources Compilation with Checkstyle
        run: |
          cd ${{ env.GIT_ROOT }}
          mvn install -f ${{ env.EXTENSION_DIR }} -am -Pcheckstyle -DskipTests -B -V
