#!/bin/bash
#
#    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 script will update the current checked out branch to be the
# specified version, either for release or development.
#
# This script should be the source of truth for all the locations in
# the codebase that require update.

set -e

function usage() {
  echo 'Usage: set_version.sh <version> [--release] [--debug] [--git-add] [--add-tag]'
}

IS_SNAPSHOT_VERSION=yes
GIT_ADD=no

while [[ $# -gt 0 ]] ; do
  arg="$1"

  case $arg in
      --release)
      unset IS_SNAPSHOT_VERSION
      shift
      ;;

      --debug)
      set -x
      shift
      ;;

      --git-add)
      GIT_ADD=yes
      shift
      ;;

      --add-tag)
      shift
      ADD_TAG="$1"
      shift
      ;;
      *)
      if [[ -z "$TARGET_VERSION" ]] ; then
        TARGET_VERSION="$1"
        shift
      else
        echo "Unknown argument: $1. Target version already set to $TARGET_VERSION"
        usage
        exit 1
      fi
      ;;
   esac
done

if [[ -z $TARGET_VERSION ]] ; then
  echo "No target version supplied"
  usage
  exit 1
fi

if ! [[ ${TARGET_VERSION} =~ ([0-9]+\.[0-9]+\.[0-9]+) ]];
  then  echo "The input for TARGET_VERSION: ${TARGET_VERSION} does not match a valid format [0-9]+\.[0-9]+\.[0-9]+"
  exit 1
fi

if [[ -n $ADD_TAG ]] ; then
  git tag "$ADD_TAG"
fi

if [[ -z "$IS_SNAPSHOT_VERSION" ]] ; then
  # Fixing a release version
  sed -i -e "s/version=.*/version=$TARGET_VERSION/" gradle.properties
  sed -i -e "s/project.version = .*/project.version = '$TARGET_VERSION'/" buildSrc/src/main/groovy/org/apache/beam/gradle/BeamModulePlugin.groovy
  sed -i -e "s/^__version__ = .*/__version__ = '${TARGET_VERSION}'/" sdks/python/apache_beam/version.py
  sed -i -e "s/sdk_version=.*/sdk_version=$TARGET_VERSION/" gradle.properties
  sed -i -e "s/SdkVersion = .*/SdkVersion = \"$TARGET_VERSION\"/" sdks/go/pkg/beam/core/core.go
  sed -i -e "s/\"version\": .*/\"version\": \"$TARGET_VERSION\",/" sdks/typescript/package.json
  sed -i -e "s/DEFAULT_BEAM_VERSION=\".*\"/DEFAULT_BEAM_VERSION=\"$TARGET_VERSION\"/" scripts/beam-sql.sh
else
  # For snapshot version:
  #   Java/gradle appends -SNAPSHOT
  #   In the Gradle plugin, the -SNAPSHOT is dynamic so we don't add it here
  #   Python appends .dev
  #   The Dataflow container remains unchanged as in this case it is beam-master-<date> form
  sed -i -e "s/version=.*/version=$TARGET_VERSION-SNAPSHOT/" gradle.properties
  sed -i -e "s/project.version = .*/project.version = '$TARGET_VERSION'/" buildSrc/src/main/groovy/org/apache/beam/gradle/BeamModulePlugin.groovy
  sed -i -e "s/^__version__ = .*/__version__ = '${TARGET_VERSION}.dev'/" sdks/python/apache_beam/version.py
  sed -i -e "s/sdk_version=.*/sdk_version=$TARGET_VERSION.dev/" gradle.properties
  sed -i -e "s/SdkVersion = .*/SdkVersion = \"${TARGET_VERSION}.dev\"/" sdks/go/pkg/beam/core/core.go
  sed -i -e "s/\"version\": .*/\"version\": \"$TARGET_VERSION-SNAPSHOT\",/" sdks/typescript/package.json
  sed -i -e "s/DEFAULT_BEAM_VERSION=\".*\"/DEFAULT_BEAM_VERSION=\"$TARGET_VERSION\"/" scripts/beam-sql.sh
fi

if [[ "$GIT_ADD" == yes ]] ; then
  git add gradle.properties
  git add buildSrc/src/main/groovy/org/apache/beam/gradle/BeamModulePlugin.groovy
  git add sdks/python/apache_beam/version.py
  git add sdks/go/pkg/beam/core/core.go
  git add runners/google-cloud-dataflow-java/build.gradle
  git add sdks/typescript/package.json
  git add scripts/beam-sql.sh
fi
