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