#!/bin/bash -e

if [ "$1" == "--help" ] || [ "$1" == "" ] || [ "$2" == "" ]
then
  echo "Gerrit Code Review - release upgrade verification script"
  echo "--------------------------------------------------------"
  echo "Verify that Gerrit <previous-version> can be migrated to <next-version>"
  echo "without online reindexing."
  echo ""
  echo "The gerrit-<previous-version>.war and gerrit-<next-version>.war are either found in the"
  echo "current directory or downloaded from https://gerrit-releases.storage.googleapis.com"
  echo ""
  echo "Use: $0 <previous-version> <next-version>"
  echo ""
  echo "Where: previous-version Gerrit version to migrate from"
  echo "       next-version Gerrit version to migrate to"
  echo ""
  echo "Example: $0 3.8.3 3.9.1"
  exit 1
fi

export gerritReleasesUrl=https://gerrit-releases.storage.googleapis.com
export previousVersionWar=gerrit-$1.war
export nextVersionWar=gerrit-$2.war

function downloadGerritWar
{
  if checkWar $1
  then
    echo "$1 found locally"
  else
    echo "Downloading $1 from $gerritReleasesUrl"
    curl -O $gerritReleasesUrl/$1
  fi
}

function checkWar
{
  if [ -f $1 ]
  then
    java -jar $1 --version || return 1
  else
    return 2
  fi

  return 0
}

function log
{
  echo ""
  echo $1
  echo $1 | sed 's/./=/g'
}

function queryNumOpenChanges
{
  curl -s --fail curl 'http://localhost:8080/changes/?q=status%3Aopen' | tail -1 | jq '. | length'
}

function checkQueryChanges
{
  log "Query changes ..."
  CHANGES=$(queryNumOpenChanges)
  echo "$CHANGES change(s) returned"
  if test $(queryNumOpenChanges) '<' 1
  then
    echo "*** FAILED ***"
    exit 1
  fi
}

log "Installing $previousVersionWar ... "

downloadGerritWar $previousVersionWar
gerritSite=$(basename $previousVersionWar .war)

if [ -d $gerritSite ]
then
  $gerritSite/bin/gerrit.sh stop
  rm -Rf $gerritSite
fi

java -jar $previousVersionWar init --install-all-plugins -d $gerritSite --batch --dev
echo "Gerrit $previousVersionWar installed and running as pid=$(cat $gerritSite/logs/gerrit.pid)"

testProject="test-project-upgrade"
log "Creating project $testProject ... "

curl -s --fail -u admin:secret -X PUT http://localhost:8080/a/projects/$testProject

rm -Rf $testProject
log "Cloning $testProject ..."

git clone http://admin:secret@localhost:8080/a/$testProject && (cd $testProject && f=`git rev-parse --git-dir`/hooks/commit-msg ; mkdir -p $(dirname $f) ; curl -Lo $f http://localhost:8080/tools/hooks/commit-msg ; chmod +x $f)
pushd $testProject
git config user.name "John Doe"
git config user.email "john@gerrit.mycompany.local"

log "Creating a local change ..."

echo "Test change" > README.md
git add README.md
git commit -m "Test change"
git push origin HEAD:refs/for/master

checkQueryChanges

log "Shutting down $gerritSite"
popd
$gerritSite/bin/gerrit.sh stop

log "Upgrading to $nextVersionWar ... "

downloadGerritWar $nextVersionWar
java -jar $nextVersionWar init --install-all-plugins  -d $gerritSite --batch
$gerritSite/bin/gerrit.sh start
echo "Gerrit upgraded to $nextVersionWar and running as pid=$(cat $gerritSite/logs/gerrit.pid)"

log "Checking if the change created with $previousVersionWar still exists"

checkQueryChanges

$gerritSite/bin/gerrit.sh stop
log "Upgrade from $previousVersionWar to $nextVersionWar SUCCEEDED"
