#!/usr/bin/env bash

# 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.

USAGE="Usage: $0 [-i | -a] [-g <dir>] [-s <dir>]\n\
-h          Show this message\n\
-i          Prompts the user for input\n\
-a          Does not prompt the user. Potentially dangerous.\n\
-g          The local location of the HTrace git repository\n\
-s          The local location of the HTrace website svn checkout\n\
Either -i or -a is required.\n\
Edit the script to set default Git and SVN directories."

if [ "$#" == "0" ]; then
  echo -e "$USAGE"
  exit 1
fi

# Process args
INTERACTIVE=
AUTO=
GIT_DIR=
SVN_DIR=
while getopts "hiag:s:" OPTION
do
  case $OPTION in
    h)
      echo -e "$USAGE"
      exit
      ;;
    i)
      INTERACTIVE=1
      ;;
    a)
      # We don't actually use this variable but require it to be 
      # set explicitly because it will commit changes without asking
      AUTO=1
      ;;
    g)
      GIT_DIR=$OPTARG
      ;;
    s)
      SVN_DIR=$OPTARG
      ;;
  esac
done

if [ $INTERACTIVE ] && [ $AUTO ]; then
    echo "Only one of -i or -a can be used."
    echo -e $USAGE
    exit 1
fi

# Set GIT_DIR and SVN_DIR to defaults if not given
if [ ! "${GIT_DIR}" ]; then
  GIT_DIR=~/git/htrace
fi
if [ ! "${SVN_DIR}" ]; then
  SVN_DIR=~/svn/htrace.incubator.apache.org/master
fi

# Check that GIT_DIR and SVN_DIR exist
if [ ! -d "${GIT_DIR}" -o ! -d "${SVN_DIR}" ]; then
  echo "Both the GIT and SVN directories must exist."
  echo -e $USAGE
  exit 1
fi

cd $GIT_DIR

# Get the latest
echo "Updating Git"
git checkout master
git pull

# Generate the site to ~/git/htrace/target/stage
if [ $INTERACTIVE ]; then
    read -p "Build the site? (y/n)" yn
    case $yn in
        [Yy]* ) 
    			mvn clean package javadoc:aggregate site site:stage -DskipTests
          status=$?
          if [ $status != 0 ]; then
            echo "The website does not build. Aborting."
            exit $status
          fi
    			;;
        [Nn]* ) 
          echo "Not building the site."
        ;;
    esac
else
  echo "Building the site in auto mode."
  mvn clean package javadoc:aggregate site site:stage -DskipTests
  status=$?
  if [ $status != 0 ]; then
    echo "The website does not build. Aborting."
    exit $status
  fi
fi


# Refresh the local copy of the live website
echo "Updating Subversion..."
cd $SVN_DIR
# Be aware that this will restore all the files deleted a few lines down 
# if you are debugging this script 
# and need to run it multiple times without svn committing
svn update > /dev/null

# Get current size of svn directory and # files, for sanity checking before commit
SVN_OLD_SIZE=`du -sm . |awk '{print $1}'`
SVN_OLD_NUMFILES=`find . -type f |wc -l |awk '{print $1}'`

# Delete known auto-generated  content from trunk
echo "Deleting known auto-generated content from SVN"
rm -rf apidocs devapidocs xref xref-test book book.html java.html

# Copy generated site to svn -- cp takes different options on Darwin and GNU
echo "Copying the generated site to SVN"
if [ `uname` == "Darwin" ]; then
  COPYOPTS='-r'
elif [ `uname` == "Linux" ]; then
  COPYOPTS='-au'
fi

cp $COPYOPTS "${GIT_DIR}"/target/site/* .

# Look for things we need to fix up in svn

echo "Untracked files: svn add"
svn status |grep '?' |sed -e "s/[[:space:]]//g"|cut -d '?' -f 2|while read i
  do svn add $i 
done

echo "Locally deleted files: svn del"
svn status |grep '!' |sed -e "s/[[:space:]]//g"|cut -d '!' -f 2|while read i
  do svn del $i 
done

# Display the proposed changes. I filtered out 
# modified because there are so many.
if [ $INTERACTIVE ]; then
  svn status |grep -v '^M'|less -P "Enter 'q' to exit the list."
else
  echo "The following changes will be made to SVN."
  svn status
fi

# Get current size of svn directory, for sanity checking before commit
SVN_NEW_SIZE=`du -sm . |awk '{print $1}'`
SVN_NEW_NUMFILES=`find . -type f |wc -l |awk '{print $1}'`

# Get difference between new and old size and number of files
# We don't care about negatives so remove the sign
SVN_SIZE_DIFF=`expr $SVN_NEW_SIZE - $SVN_OLD_SIZE|sed 's/-//g'`
SVN_NUM_DIFF=`expr $SVN_NEW_NUMFILES - $SVN_OLD_NUMFILES|sed 's/-//g'`

# The whole site is only 500 MB so a difference of 10 MB is huge
# In this case, we should abort because something is wrong
# Leaving this commented out for now until we get some benchmarks
#if [ $SVN_SIZE_DIFF > 10 -o $SVN_NUM_DIFF > 50 ]; then
#  echo "This commit would cause the website to change sizes by \
#  $SVN_DIFF MB and $SVN_NUM_DIFF files. There is likely a problem. 
#  Aborting."
#  exit 1
#fi


if [ $INTERACTIVE ]; then
  read -p "Commit changes? This will publish the website. (y/n)" yn
  case $yn in
  [Yy]* ) 
    echo "Published website using script in interactive mode. \
This commit changed the size of the website by $SVN_SIZE_DIFF MB \
and the number of files by $SVN_NUM_DIFF files." |tee commit.txt
    cat /tmp/out.txt >> /tmp/commit.txt
    svn commit -F /tmp/commit.txt
    exit
    ;;
  [Nn]* ) 
    read -p "Revert SVN changes? (y/n)" revert
    case $revert in
    [Yy]* ) 
      svn revert -R .
      svn update
      exit
      ;;
    [Nn]* ) 
      exit
      ;;
    esac
    ;;
  esac
else
  echo "Published website using script in auto mode. This commit \
changed the size of the website by $SVN_SIZE_DIFF MB and the number of files \
by $SVN_NUM_DIFF files." |tee /tmp/commit.txt
  cat /tmp/out.txt >> /tmp/commit.txt
  svn commit -F /tmp/commit.txt
fi

