# 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: Create Release Candidate
run-name: ${{ github.actor }} is executing Create Release Candidate
permissions:
  contents: write
  
on:
  workflow_dispatch:
    inputs:
      releasecandidatetag:
        description: 'Release Candidate Tag' 
        default: 'RC0'
        required: true
  
jobs:
  createReleaseCandidate:
    runs-on: ubuntu-24.04
    steps:
      - name: Init Release Candidate workflow
        run: echo "Starting Apache ManifoldCF workflow for building ${{ github.event.inputs.releasecandidatetag }}"
      
      - name: Checkout
        uses: actions/checkout@v6.0.2
      
      - name: Set up OpenJDK 21 Temurin x64
        uses: actions/setup-java@v5.2.0
        with:
          java-version: '21'
          distribution: 'temurin'
          architecture: x64
          cache: maven
          gpg-private-key: ${{ secrets.GPG_PRIVATE_KEY }}
          gpg-passphrase: GPG_PASSPHRASE
      
      - name: Get Maven POM version
        id: mavenProjectVersion
        run: echo "version=$(mvn help:evaluate -Dexpression=project.version -q -DforceStdout)" >> $GITHUB_OUTPUT
      
      - name: Initialize mandatory git config
        env:
          GH_TOKEN: ${{ github.token }}
        run: |
          git config user.name "$(gh api /users/${GITHUB_ACTOR} | jq .name -r)"
          git config user.email ${GITHUB_ACTOR_ID}+${GITHUB_ACTOR}@users.noreply.github.com
      
      - name: Create Branch Version
        id: branchVersion
        run: |
          currentMavenVersion="${{ steps.mavenProjectVersion.outputs.version }}"
          suffixToRemove="SNAPSHOT"
          branchVersion=${currentMavenVersion%"$suffixToRemove"}
          echo "version=${branchVersion}" >> $GITHUB_OUTPUT
      
      - name: Create Release Version
        id: releaseVersion
        run: |
          branchVersionOutput=${{ steps.branchVersion.outputs.version }}
          releaseVersion=${branchVersionOutput%"-"}
          echo "version=${releaseVersion}" >> $GITHUB_OUTPUT
      
      - name: Set Branch Tag output
        id: branchTag
        run: echo "tag=${{ steps.branchVersion.outputs.version }}${{ github.event.inputs.releasecandidatetag }}" >> $GITHUB_OUTPUT
        
      - name: Create new release candidate branch
        run: |
          git branch release-${{ steps.branchTag.outputs.tag }}
          git push --set-upstream origin release-${{ steps.branchTag.outputs.tag }}
          git checkout release-${{ steps.branchTag.outputs.tag }}
      
      - name: Update all the Maven modules with the new version
        run: mvn versions:set -DnewVersion=${{ steps.mavenProjectVersion.outputs.version }} -DremoveSnapshot -DgenerateBackupPoms=false
      
      - name: Update Ant script with the new RC version
        run: sed -i 's/${{ steps.releaseVersion.outputs.version }}-dev/${{ steps.releaseVersion.outputs.version }}/g' build.xml;
      
      - name: Update CHANGES.txt
        run: sed -i 's/${{ steps.releaseVersion.outputs.version }}-dev/Release ${{ steps.releaseVersion.outputs.version }}/g' CHANGES.txt;
      
      - name: Ant Build
        run: ant make-core-deps make-deps image
      
      - name: Maven Build
        run: mvn clean install -B -DskipTests -DskipITs
      
      - name: Update MCF version in the properties.xml files
        run: | 
          sed -i 's/${{ steps.releaseVersion.outputs.version }}-dev/${{ steps.releaseVersion.outputs.version }}/g' dist/example/properties.xml;
          sed -i 's/${{ steps.releaseVersion.outputs.version }}-dev/${{ steps.releaseVersion.outputs.version }}/g' dist/example-proprietary/properties.xml;
          sed -i 's/${{ steps.releaseVersion.outputs.version }}-dev/${{ steps.releaseVersion.outputs.version }}/g' dist/multiprocess-file-example/properties.xml;
          sed -i 's/${{ steps.releaseVersion.outputs.version }}-dev/${{ steps.releaseVersion.outputs.version }}/g' dist/multiprocess-file-example-proprietary/properties.xml;
      
      - name: Update Docker Image tag
        run: sed -i 's/SNAPSHOT/${{ github.event.inputs.releasecandidatetag }}/g' Dockerfile;
          
      - name: RAT licence checks
        run: mvn -pl . apache-rat:check
      
      - name: Generate RAT License Report
        if: always()
        run: |
          echo -e "Printing RAT report\n"
          cat target/rat.txt || true
      
      - name: Commit and Push
        run: |
          find . -name 'pom.xml' -exec git add {} \;
          git add CHANGES.txt build.xml Dockerfile
          git commit -am "Create ${{ github.event.inputs.releasecandidatetag }} tag for MCF ${{ steps.mavenProjectVersion.outputs.version }}"
          git push
      
      - name: Create Release Candidate
        id: create_release_candidate
        uses: actions/create-release@v1.1.4
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          tag_name: ${{ steps.branchTag.outputs.tag }}
          release_name: Release Candidate ${{ steps.branchTag.outputs.tag }}
          body: |
            Release Candidate ${{ steps.branchTag.outputs.tag }}
          draft: false
          prerelease: true
      
      - name: Set Artifact version output
        id: artifactVersion
        run: echo "version=${{ steps.branchVersion.outputs.version }}dev" >> $GITHUB_OUTPUT
      
      - name: Rename KEYS and CHANGES.txt artifacts
        run: | 
          cp KEYS apache-manifoldcf-${{ steps.releaseVersion.outputs.version }}.KEYS
          cp CHANGES.txt apache-manifoldcf-${{ steps.releaseVersion.outputs.version }}.CHANGES.txt
      
      - name: Upload artifacts - KEYS - text format
        uses: actions/upload-artifact@v7.0.0
        with:
          name: apache-manifoldcf-${{ steps.releaseVersion.outputs.version }}.KEYS
          path: apache-manifoldcf-${{ steps.releaseVersion.outputs.version }}.KEYS
      
      - name: Upload Release Candidate Asset - KEYS
        uses: actions/upload-release-asset@v1.0.2
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          upload_url: ${{ steps.create_release_candidate.outputs.upload_url }}
          asset_path: ./apache-manifoldcf-${{ steps.releaseVersion.outputs.version }}.KEYS
          asset_name: apache-manifoldcf-${{ steps.releaseVersion.outputs.version }}.KEYS
          asset_content_type: text/plain
      
      - name: Upload artifacts - CHANGES
        uses: actions/upload-artifact@v7.0.0
        with:
          name: apache-manifoldcf-${{ steps.releaseVersion.outputs.version }}.CHANGES.txt
          path: apache-manifoldcf-${{ steps.releaseVersion.outputs.version }}.CHANGES.txt
      
      - name: Upload Release Candidate Asset - CHANGES
        uses: actions/upload-release-asset@v1.0.2
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          upload_url: ${{ steps.create_release_candidate.outputs.upload_url }}
          asset_path: ./apache-manifoldcf-${{ steps.releaseVersion.outputs.version }}.CHANGES.txt
          asset_name: apache-manifoldcf-${{ steps.releaseVersion.outputs.version }}.CHANGES.txt
          asset_content_type: text/plain
      
      - name: Upload artifacts - Binary - zip format
        uses: actions/upload-artifact@v7.0.0
        with:
          name: apache-manifoldcf-${{ steps.releaseVersion.outputs.version }}-bin.zip
          path: apache-manifoldcf-${{ steps.releaseVersion.outputs.version }}-bin.zip
      
      - name: Upload Release Candidate Asset - Binary - zip format
        uses: actions/upload-release-asset@v1.0.2
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          upload_url: ${{ steps.create_release_candidate.outputs.upload_url }}
          asset_path: ./apache-manifoldcf-${{ steps.releaseVersion.outputs.version }}-bin.zip
          asset_name: apache-manifoldcf-${{ steps.releaseVersion.outputs.version }}-bin.zip
          asset_content_type: application/zip
      
      - name: Upload artifacts - Binary - tar.gz format
        uses: actions/upload-artifact@v7.0.0
        with:
          name: apache-manifoldcf-${{ steps.releaseVersion.outputs.version }}-bin.tar.gz
          path: apache-manifoldcf-${{ steps.releaseVersion.outputs.version }}-bin.tar.gz
      
      - name: Upload Release Candidate Asset - Binary - tar.gz format
        uses: actions/upload-release-asset@v1.0.2
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          upload_url: ${{ steps.create_release_candidate.outputs.upload_url }}
          asset_path: ./apache-manifoldcf-${{ steps.releaseVersion.outputs.version }}-bin.tar.gz
          asset_name: apache-manifoldcf-${{ steps.releaseVersion.outputs.version }}-bin.tar.gz
          asset_content_type: application/gzip
      
      - name: Upload artifacts - Lib - tar.gz format
        uses: actions/upload-artifact@v7.0.0
        with:
          name: apache-manifoldcf-${{ steps.releaseVersion.outputs.version }}-lib.tar.gz
          path: apache-manifoldcf-${{ steps.releaseVersion.outputs.version }}-lib.tar.gz
      
      - name: Upload Release Candidate Asset - Lib - tar.gz format
        uses: actions/upload-release-asset@v1.0.2
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          upload_url: ${{ steps.create_release_candidate.outputs.upload_url }}
          asset_path: ./apache-manifoldcf-${{ steps.releaseVersion.outputs.version }}-lib.tar.gz
          asset_name: apache-manifoldcf-${{ steps.releaseVersion.outputs.version }}-lib.tar.gz
          asset_content_type: application/gzip
      
      - name: Upload artifacts - Lib - zip format
        uses: actions/upload-artifact@v7.0.0
        with:
          name: apache-manifoldcf-${{ steps.releaseVersion.outputs.version }}-lib.zip
          path: apache-manifoldcf-${{ steps.releaseVersion.outputs.version }}-lib.zip
      
      - name: Upload Release Candidate Asset - Lib - zip format
        uses: actions/upload-release-asset@v1.0.2
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          upload_url: ${{ steps.create_release_candidate.outputs.upload_url }}
          asset_path: ./apache-manifoldcf-${{ steps.releaseVersion.outputs.version }}-lib.zip
          asset_name: apache-manifoldcf-${{ steps.releaseVersion.outputs.version }}-lib.zip
          asset_content_type: application/zip
      
      - name: Upload artifacts - Source code - tar.gz format
        uses: actions/upload-artifact@v7.0.0
        with:
          name: apache-manifoldcf-${{ steps.releaseVersion.outputs.version }}-src.tar.gz
          path: apache-manifoldcf-${{ steps.releaseVersion.outputs.version }}-src.tar.gz
      
      - name: Upload Release Candidate Asset - Source code - tar.gz format
        uses: actions/upload-release-asset@v1.0.2
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          upload_url: ${{ steps.create_release_candidate.outputs.upload_url }}
          asset_path: ./apache-manifoldcf-${{ steps.releaseVersion.outputs.version }}-src.tar.gz
          asset_name: apache-manifoldcf-${{ steps.releaseVersion.outputs.version }}-src.tar.gz
          asset_content_type: application/gzip
      
      - name: Upload artifacts - Source code - zip format
        uses: actions/upload-artifact@v7.0.0
        with:
          name: apache-manifoldcf-${{ steps.releaseVersion.outputs.version }}-src.zip
          path: apache-manifoldcf-${{ steps.releaseVersion.outputs.version }}-src.zip
      
      - name: Upload Release Candidate Asset - Source code - zip format
        uses: actions/upload-release-asset@v1.0.2
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          upload_url: ${{ steps.create_release_candidate.outputs.upload_url }}
          asset_path: ./apache-manifoldcf-${{ steps.releaseVersion.outputs.version }}-src.zip
          asset_name: apache-manifoldcf-${{ steps.releaseVersion.outputs.version }}-src.zip
          asset_content_type: application/zip
      
      - name: Set up QEMU
        uses: docker/setup-qemu-action@v4.0.0

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v4.0.0
      
      - name: Login to Docker Hub
        uses: docker/login-action@v4.0.0
        with:
          username: ${{ secrets.DOCKERHUB_USER }}
          password: ${{ secrets.DOCKERHUB_TOKEN }}
          
      - name: Docker meta
        id: meta
        uses: docker/metadata-action@v5.6.1
        with:
          images: apache/manifoldcf
          labels: |
            maintainer=Apache ManifoldCF Developers <dev@manifoldcf.apache.org>
            org.opencontainers.image.title=Apache ManifoldCF
            org.opencontainers.image.description=Apache ManifoldCF is a multi-repository crawler framework, with multiple connectors.
            org.opencontainers.image.vendor=Apache Software Foundation
            org.opencontainers.image.ref.name=manifoldcf
            org.opencontainers.image.authors=Apache ManifoldCF Developers <dev@manifoldcf.apache.org>
            org.opencontainers.image.url=https://hub.docker.com/r/apache/manifoldcf
            org.opencontainers.image.source=https://github.com/apache/manifoldcf/blob/trunk/Dockerfile
            org.opencontainers.image.documentation=https://hub.docker.com/r/apache/manifoldcf
            org.opencontainers.image.version=${{ steps.branchTag.outputs.tag }}
            org.opencontainers.image.licenses=Apache-2.0
      
      - name: Build and push ManifoldCF Docker Image
        uses: docker/build-push-action@v6.10.0
        with:
          context: .
          file: Dockerfile
          platforms: linux/amd64,linux/arm64/v8
          push: true
          tags: apache/manifoldcf:latest,apache/manifoldcf:${{ steps.branchTag.outputs.tag }}
          labels: ${{ steps.meta.outputs.labels }}
