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

##
# Purge (some) releases during development of release scripts.
#
# This script is mainly used during development of the release scripts itself and simply deletes
# branches and tags created during tests of the release process. Be very careful with execution!
#

function main
{
  purge_branch_and_tag
  revert_pom
  revert_changes
  commit_reverts
}

function purge_branch_and_tag
{
  git checkout  "release_scripts"

  git branch -D "next_stable"
  git push --delete "origin" "next_stable"

  for tag in $(git tag -l | grep "v0.11.0-RC")
  do
    git tag  --delete          "${tag}"
    git push --delete "origin" "${tag}"
  done
}

function revert_pom
{
  sed -i -r "s/^(\t<version>).+(<)/\10.11.0-SNAPSHOT\2/" "pom.xml"
}

function revert_changes
{
  if [ -n "$(grep "version=\"0.11.1\"" "src/changes/changes.xml")" ]
  then
    # Remove not needed "release" node.
    sed -i -r "1,/.+<release.+/ s/.+<release.+//"         "src/changes/changes.xml"
    sed -i -r "1,/.+date=.+/ s/.+date=.+//"               "src/changes/changes.xml"
    sed -i -r "1,/.+description=.+/ s/.+description=.+//" "src/changes/changes.xml"
    sed -i -r "1,/.+<\/release.+/ s/.+<\/release.+//"     "src/changes/changes.xml"

    # Don't know how to remove the left newlines easier...
    local changes=$(cat "src/changes/changes.xml")
    echo "${changes/$'\n\n\n\n\n'/}" > "src/changes/changes.xml"
  fi

  # Last release date needs to be "unknown":
  sed -i -r "1,/.+date=.+/ s/date=\".+\"/date=\"XXXX-XX-XX\"/" "src/changes/changes.xml"
}

function commit_reverts
{
  git add "pom.xml"
  git add "src/changes/changes.xml"

  git commit -m "No 0.11.1 yet."
}

main
