# Locate Maven exe
export MAVEN_BIN=${MAVEN_BIN:=`which mvn`}
if [ -z "$MAVEN_BIN" ]; then
  echo "mvn not found. Add mvn to PATH or set MAVEN_BIN."
  exit
fi
echo Using $MAVEN_BIN

function set-random-dir() {
  export RANDOM_DIR=/tmp/random-dir-$RANDOM$RANDOM$RANDOM$RANDOM
  rm -rf $RANDOM_DIR
  mkdir -p $RANDOM_DIR
}

# arguments:
#   * url to maven repository (required)
#   * id of maven repository, to be used to get credentials from settings.xml
#     (required)
#   * artifact to upload (required)
#   * pom file for this artifact, if the artifact is the pom, this must be the same
#     value (required)
#   * javadoc artifact to upload (optional)
#   * sources artifact to upload (optional, but requires a javadoc artifact)
function maven-deploy-file() {
  local mavenRepoUrl=$1
  shift
  local mavenRepoId=$1
  shift
  local curFile=$1
  shift
  local pomFile=$1
  shift

  if [ $# -ne 0 ] && [ "$1" != "" ]; then
    local javadoc="-Djavadoc=$1"
    shift
  fi
  if [ $# -ne 0 ] && [ "$1" != "" ]; then
    local sources="-Dsources=$1"
    shift
  fi

  if [[ "$curFile" == "" ]]; then
    echo "ERROR: Unable to deploy $artifactId in repo! Cannot find corresponding file!"
    return 1
  fi

  local cmd="";
  if [[ "$mavenRepoUrl" == "install" ]]; then
    echo "Installing $curFile into local maven repository cache"
    cmd="$MAVEN_BIN \
           install:install-file
            -Dfile=$curFile \
            -DpomFile=$pomFile \
            -q"
  elif [[ "$gpgPassphrase" != "" ]]; then
    echo "Signing and Deploying $curFile to $mavenRepoUrl"
    cmd="$MAVEN_BIN \
           org.apache.maven.plugins:maven-gpg-plugin:1.4:sign-and-deploy-file \
            -Dfile=$curFile \
            -Durl=$mavenRepoUrl \
            -DrepositoryId=$mavenRepoId \
            -DpomFile=$pomFile \
            $javadoc \
            $sources \
            -q \
            -Dgpg.passphrase=\"$gpgPassphrase\""
  else
    echo "GPG passphrase not specified; will attempt to deploy files without signing"
    cmd="$MAVEN_BIN \
           org.apache.maven.plugins:maven-deploy-plugin:2.7:deploy-file \
            -Dfile=$curFile \
            -Durl=$mavenRepoUrl \
            -DrepositoryId=$mavenRepoId \
            -DpomFile=$pomFile \
            $javadoc \
            $sources \
            -q"
  fi
  eval $cmd
}

