# 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 workflow will update apache beam master branch with next release version
# and cut release branch for current development version.

# To learn more about GitHub Actions in Apache Beam check the CI.md

# Workflow used after https://github.com/apache/beam/commit/4183e747becebd18becee5fff547af365910fc9c
# If help is needed debugging issues, you can view the cut_release_branch.sh script at that commit
# for guidance on how to do this manually.
# (https://github.com/apache/beam/blob/4183e747becebd18becee5fff547af365910fc9c/release/src/main/scripts/cut_release_branch.sh).
name: Cut Release Branch
on:
  workflow_dispatch:
    inputs:
      RELEASE_VERSION:
        description: Beam version of current release (branch being cut)
        required: true
        default: '2.XX'
      NEXT_VERSION:
        description: Next release version
        required: true
        default: '2.XX'
      CREATE_RELEASE_BRANCH:
        description: Whether to cut the release branch. You shouldnt skip this unless it has already been completed successfully (yes/no)
        required: true
        default: 'yes'

permissions:
  contents: write
  pull-requests: write

jobs:
  update_release_branch:
    runs-on: ubuntu-latest
    env:
      RELEASE: ${{ github.event.inputs.RELEASE_VERSION }}
    steps:
      - name: Validate Release Version
        run: |
          if [[ ${RELEASE} =~ ([0-9]+\.[0-9]+) ]]; then
            echo "RELEASE_VERSION=${BASH_REMATCH[1]}" >> $GITHUB_ENV
            echo "RELEASE_BRANCH=release-${RELEASE}" >> $GITHUB_ENV
          else
            echo "The input for RELEASE does not match a valid format [0-9]+\.[0-9]+"
            exit 1
          fi
      - name: Check out code
        uses: actions/checkout@v4
      - name: Set git config
        run: |
          git config user.name $GITHUB_ACTOR
          git config user.email actions@"$RUNNER_NAME".local
      - name: Checkout to release branch
        run: |
          git checkout -b ${RELEASE_BRANCH}
          echo "==================Current working branch======================="
          echo ${RELEASE_BRANCH}
          echo "==============================================================="
      - name: Update release version for dataflow runner
        run: |
          sed -i -e "s/'beam-master-.*'/'${RELEASE}.0'/g" \
          runners/google-cloud-dataflow-java/build.gradle
          echo "===============Update release branch as following=============="
          git diff
          echo "==============================================================="
      - name: Commit and Push to release branch
        run: |
          git add runners/google-cloud-dataflow-java/build.gradle
          git commit -m "Set Dataflow container to release version."
          git push --set-upstream origin ${RELEASE_BRANCH}
        if: ${{github.event.inputs.CREATE_RELEASE_BRANCH == 'yes'}}

  update_master:
    needs: update_release_branch
    runs-on: ubuntu-latest
    env:
      MASTER_BRANCH: master
      NEXT_RELEASE: ${{ github.event.inputs.NEXT_VERSION }}
      SCRIPT_DIR: ./release/src/main/scripts
      RELEASE: ${{ github.event.inputs.RELEASE_VERSION }}
    steps:
      - name: Validate Next Version
        run: |
          if [[ ${RELEASE} =~ ([0-9]+\.[0-9]+) ]]; then
            echo "RELEASE_CUT_TAG=v${RELEASE}.0-RC00" >> $GITHUB_ENV
          else
            echo "The input for RELEASE does not match a valid format [0-9]+\.[0-9]+"
            exit 1
          fi
          if [[ $NEXT_RELEASE =~ ([0-9]+\.[0-9]+) ]]; then
            echo "NEXT_VERSION_IN_BASE_BRANCH=${BASH_REMATCH[1]}.0" >> $GITHUB_ENV
          else
            echo "The input for NEXT_RELEASE does not match a valid format [0-9]+\.[0-9]+"
            exit 1
          fi
      - name: Check out code
        uses: actions/checkout@v4
      - name: Set git config
        run: |
          git config user.name $GITHUB_ACTOR
          git config user.email actions@"$RUNNER_NAME".local
      - name: Install xmllint
        run: sudo apt-get install -y libxml2-utils
      - name: Update .asf.yaml to protect new release branch from force push
        run: |
          sed -i -e "s/master: {}/master: {}\n    release-${RELEASE}: {}/g" .asf.yaml
      - name: Update master branch
        run: |
          bash "${SCRIPT_DIR}/set_version.sh" "${NEXT_VERSION_IN_BASE_BRANCH}" "--add-tag" "${RELEASE_CUT_TAG}"
          echo "==============tag RC00 to current master branch================"
          git push origin tag "${RELEASE_CUT_TAG}"
          echo "==============Update master branch as following================"
          git diff
          echo "==============================================================="
      - name: Commit and Push to master branch files with Next Version
        run: |
          git add *
          git add .asf.yaml
          git commit -m "Moving to ${NEXT_VERSION_IN_BASE_BRANCH}-SNAPSHOT on master branch."
          git push origin ${MASTER_BRANCH}


  start_snapshot_build:
    needs: update_master
    runs-on: ubuntu-latest
    env:
      REMOTE_NAME: remote_repo
      REMOTE_URL: ${{ github.server_url }}/${{ github.repository }}
      BRANCH_NAME: snapshot_build-${{ github.event.inputs.RELEASE_VERSION }}
      RELEASE_BRANCH: release-${{ github.event.inputs.RELEASE_VERSION }}
    steps:
      - name: Trigger snapshot build
        run: |
          echo "Working in progress. Please trigger 'Release Nightly Snapshot' GHA workflow manually."
