#!/bin/bash
# Copyright (C) 2014 The Android Open Source Project
#
# Licensed 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.

function help
{
  cat <<'eof'
Usage: plugin_archetype_deploy [option]

Deploys Gerrit plugin Maven archetypes to Maven Central

Valid options:
  --help                     show this message.
  --dry-run                  don't execute commands, just print them.

eof
exit
}

function getver
{
  grep "$1" $root/VERSION | sed "s/.*'\(.*\)'/\1/"
}

function instroot
{
  bindir=${0%/*}

  case $bindir in
  ./*) bindir=$PWD/$bindir ;;
  esac

  cd $bindir/..
  pwd
}

function doIt
{
  case $dryRun in
    true) echo "$@" ;;
    *) "$@" ;;
  esac
}

function build_and_deploy
{
  module=${PWD##*/}
  doIt mvn package gpg:sign-and-deploy-file \
    -Durl=$url \
    -DrepositoryId=sonatype-nexus-staging \
    -DpomFile=pom.xml \
    -Dfile=target/$module-$ver.jar
}

function confirm
{
  read -n1 -p "Are you sure you want to deploy? [N/y]: " ready
  if [[ ! $ready == [Yy] ]]; then
    if [[ $ready == [Nn] || -z $ready ]]; then
      echo; exit
    else
      echo; confirm
    fi
  fi
}

function run
{
  test ${dryRun:-'false'} == 'false'  && confirm
  root=$(instroot)
  cd "$root"
  ver=$(getver GERRIT_VERSION)
  [[ $ver == *-SNAPSHOT ]] \
    && url="https://oss.sonatype.org/content/repositories/snapshots" \
    || url="https://oss.sonatype.org/service/local/staging/deploy/maven2"

  for d in gerrit-plugin-archetype \
           gerrit-plugin-js-archetype \
           gerrit-plugin-gwt-archetype ; do
    (cd "$d"; build_and_deploy)
  done
}

if [ "$1" == "--dry-run" ]; then
  dryRun=true && run
elif [ -z "$1" ]; then
  run
else
  help
fi
