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