#!/usr/bin/env 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.
#

set -e

# changes the version everywhere
# usage, e.g.:  change-version.sh 0.3.0-SNAPSHOT 0.3.0-RC1
#          or:  change-version.sh MARKER 0.3.0-SNAPSHOT 0.3.0-RC1

[ -d .git ] || {
  echo "Must run in brooklyn project root directory"
  exit 1
}

if [ "$#" -eq 2 ]; then
  VERSION_MARKER=BROOKLYN_VERSION
elif [ "$#" -eq 3 ]; then
  VERSION_MARKER=$1_VERSION
  shift;
else
  echo "Usage:  "$0" [VERSION_MARKER] CURRENT_VERSION NEW_VERSION"
  echo " e.g.:  "$0" BROOKLYN 0.3.0-SNAPSHOT 0.3.0-RC1"
  exit 1
fi

VERSION_MARKER_NL=${VERSION_MARKER}_BELOW
CURRENT_VERSION=$1
NEW_VERSION=$2

# grep --exclude-dir working only in recent versions, not on all platforms, replace with find;
# skip folders named "ignored" or .xxx (but not the current folder ".");
# exclude log, war, swp, etc. files;
# use null delimiters so files containing spaces are supported;
# pass /dev/null as the first file to search in, so the command doesn't fail if find doesn't match any files;
# add || true for the case where grep doesn't have matches, so the script doesn't halt
# If there's an error "Argument list too long" add -n20 to xargs arguments and loop over $FILE around sed
FILES=`find . -type d \( -name ignored -or -name target -or -name node_modules -or \( -name .?\* -and -not -name .mvn \) \) -prune \
       -o -type f -not \( -name \*.log -or -name '*.war' -or -name '*.min.js' -or -name '*.min.css' -or -name '*.swp' \) -print0 | \
       xargs -0 grep -l "${VERSION_MARKER}\|${VERSION_MARKER_NL}" /dev/null || true`

FILES_COUNT=`echo $FILES | wc | awk '{print $2}'`

if [ ${FILES_COUNT} -ne 0 ]; then
    # search for files containing version markers
    sed -i.bak -e "/${VERSION_MARKER}/s/${CURRENT_VERSION}/${NEW_VERSION}/g" $FILES
    sed -i.bak -e "/${VERSION_MARKER_NL}/{n;s/${CURRENT_VERSION}/${NEW_VERSION}/g;}" $FILES
fi

echo "Changed ${VERSION_MARKER} from ${CURRENT_VERSION} to ${NEW_VERSION} for "${FILES_COUNT}" files"
echo "(Do a \`find . -name \"*.bak\" -delete\`  to delete the backup files.)"
