#
# 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
    name: Check RC `${{ github.event.inputs.extension-name }}-${{ github.event.inputs.release-version }}`
    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
