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

##
# Perform a release.
#
# Performing a release involves Maven currently to build and test things and we ran into problems
# with the default dir structure maven assumes. This script works around those and we need to sign
# the release archives anyway, which can be easily automated as well to not need to follow manual
# instructions always.
#
# It's important to note that this script is expected to be executed in the branch "next_stable",
# most likely prepared by the preparing counterpart.
#

function main
{
  # log4cxx is able to build using private copies of apr and apr-util, which are expected in some
  # special relative dir structure. That doesn't work with the default working dir "perform" uses,
  # which is "target/checkout". So we either need to make apr and apr-util available in "target" or
  # change the working dir. Making available seems easy using symlinks, but "mvn clean" deletes the
  # contents(!) of the linked dirs then. And always copying things around seems a bit unnecessary as
  # well, so I'm using a relocation of the folder for now. The downside is that "mvn clean" ignores
  # that dir by default...
  WD_RELEASE="$( pwd)/../log4cxx-next_stable"
  WD_DIST_DEV="$(pwd)/../log4cxx-dist-dev"

  perform_release
  prepare_dist_dev
  sign_and_copy
  publish_for_vote
}

function perform_release
{
  rm -rf "${WD_RELEASE}"
  mvn release:perform "-DworkingDirectory=${WD_RELEASE}"
}

# Prepare dist/dev to get the release candidate published for a vote.
function prepare_dist_dev
{
  mkdir -p "${WD_DIST_DEV}"
  pushd    "${WD_DIST_DEV}" > /dev/null
  if [ ! -d ".svn" ]
  then
    svn co "https://dist.apache.org/repos/dist/dev/logging/log4cxx" .
  fi
  svn up
}

function sign_and_copy
{
  # Might be a good idea to have another look at the GPG plugin for Maven in the future:
  #
  # http://blog.sonatype.com/2010/01/how-to-generate-pgp-signatures-with-maven/
  # http://maven.apache.org/plugins/maven-gpg-plugin/
  pushd "${WD_RELEASE}/target" > /dev/null
  for file in *.tar.gz *.zip
  do
    echo "Processing ${file}:"

    gpg -ab --yes "${file}" > "${file}.asc"
    md5sum        "${file}" > "${file}.md5"
    sha512sum     "${file}" > "${file}.sha"

    # No symlinks because those would be treated as is, no hardlinks because it should be safer for
    # commits.
    cp  --force   "${file}"     "${WD_DIST_DEV}"
    cp  --force   "${file}.asc" "${WD_DIST_DEV}"
    cp  --force   "${file}.md5" "${WD_DIST_DEV}"
    cp  --force   "${file}.sha" "${WD_DIST_DEV}"
  done
}

function publish_for_vote
{
  pushd "${WD_DIST_DEV}" > /dev/null
  svn add --force *.*
  svn ci  -m "Publishing artifacts for new release to vote on."
}

main
