#
# Copyright 2008 Google Inc.
#
# 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.

## 
## Source this script into your shell:
##
##   . test-utils.sh
##
## so that you can run:
##
##   gerrit clean
##   gerrit reset
##   gerrit gae
##   gerrit crm
##
## to setup a local testing environment using the Google App Engine
## SDK and a local Java installation.
##

TEST_DIR=test
TEST_CRM_DATA_DIR=$TEST_DIR/crm-data
TEST_GERRIT_DATASTORE_DIR=$TEST_DIR/gerrit-datastore

TEST_CLIENT0=$TEST_DIR/client0
TEST_CLIENT1=$TEST_DIR/client1
TEST_LOCAL_CONFIG=$TEST_DIR/localhost.config

TEST_CRM_PASSWORD_FILE=$TEST_DIR/.crm-password

function gerrit-clean()
{
  rm -rf $TEST_DIR
}

function gerrit-reset()
{
  FULL_GIT_BASE=`pwd`/$TEST_CRM_DATA_DIR

  # delete the old data
  gerrit-clean

  # make the crm data
  FULL_CRM_DATA_FILE=`pwd`/crm-data.tar.gz
  mkdir -p $TEST_DIR/crm-data
  ( cd $TEST_CRM_DATA_DIR ; tar zxf $FULL_CRM_DATA_FILE )

  # make two git clients (should use repo)
  mkdir -p $TEST_CLIENT0
  ( cd $TEST_CLIENT0 ; git clone $FULL_GIT_BASE/test.git > /dev/null)
  mkdir -p $TEST_CLIENT1
  ( cd $TEST_CLIENT1 ; git clone $FULL_GIT_BASE/test.git > /dev/null)

  make all

  # make localhost.config
  echo "[user]" > $TEST_LOCAL_CONFIG
  echo "  name = Gerrit Code Review" >> $TEST_LOCAL_CONFIG
  echo "  email = gerrit@localhost" >> $TEST_LOCAL_CONFIG
  echo "" >> $TEST_LOCAL_CONFIG
  echo "[codereview]" >> $TEST_LOCAL_CONFIG
  echo "  server = http://localhost:8080/" >> $TEST_LOCAL_CONFIG
  echo "  basedir = $(pwd)/$TEST_CRM_DATA_DIR"  >> $TEST_LOCAL_CONFIG
  echo "  username = android-git@google.com" >> $TEST_LOCAL_CONFIG
  echo "  secureconfig = .crm-password" \
      >> $TEST_LOCAL_CONFIG
  echo "  sleep = 10" >> $TEST_LOCAL_CONFIG
  echo "  threads = 1" >> $TEST_LOCAL_CONFIG

  echo
  echo "Finished.  Now you can run:"
  echo "   gerrit gae   to run the app engine server"
  echo "   gerrit crm   to run the crm server"
  echo
}


# pack the git repository into a new crm-data.tar.gz
function gerrit-pack-crm-data()
{
  FULL_CRM_DATA_FILE=`pwd`/crm-data.tar.gz
  rm -f crm-data.tar.gz
  ( cd $TEST_CRM_DATA_DIR ; tar czf $FULL_CRM_DATA_FILE * )
}

# run the google app engine dev server
function gerrit-gae()
{
  FULL_GERRIT_DATASTORE_DIR=`pwd`/$TEST_GERRIT_DATASTORE_DIR
  make serve DATASTORE=$FULL_GERRIT_DATASTORE_DIR
}

# run the crm server
function gerrit-crm()
{
  if [ ! -f $TEST_CRM_PASSWORD_FILE ] ; then
    ( curl http://localhost:8080/dev_init > $TEST_CRM_PASSWORD_FILE )
    ( ./mgrapp/bin/mgr $TEST_LOCAL_CONFIG sync)
  fi
  ( ./mgrapp/bin/mgr $TEST_LOCAL_CONFIG )
}

function gerrit-help()
{
  echo "commands:"
  echo "  clean"
  echo "  reset"
  echo "  pack-crm-data"
  echo "  gae"
  echo "  crm"
  echo "  upload"
}

function gerrit-upload()
{
  python2.5 ../../../webapp/git_upload.py -s localhost:8080 \
    -e author@example.com -p test -b refs/heads/master -B HEAD^
}

# main gerrit command
function gerrit()
{
  if [ ! -f test-utils.sh ] ; then
    echo Run gerrit from the directory that contains test-utils.sh
    return
  fi

  case $1 in
    clean)
      gerrit-clean
      ;;
    reset)
      gerrit-reset
      ;;
    pack-crm-data)
      gerrit-pack-crm-data
      ;;
    gae)
      gerrit-gae
      ;;
    crm)
      gerrit-crm
      ;;
    help)
      gerrit-help
      ;;
    *)
      echo invalid gerrit command $1
      ;;
  esac
}


# vi: sts=2 ts=2 sw=2 nocindent
