#!/bin/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.

####

# Convinience script to generates the SVN command line for you to run in order to 
# remove old (arvhived) versions of the solr ref guide from the dist repo, and 
# (if neccessary) clean up any old RC files.
#
# See: https://cwiki.apache.org/confluence/display/solr/Internal+-+How+To+Publish+This+Documentation

if [ $# -ne 1 ] ; then
    echo "Usage: $0 <X.Y>"
    echo ""
    echo "Where X.Y is the version of the ref guide that has recently been"
    echo "published, and all previous versions have already been archived"
    echo ""
    echo "Example: "
    echo "    $0 4.5"
    exit 1
fi

VERSION="$1"
DIST_PREFIX="apache-solr-ref-guide-$VERSION."

DIST_DIR_URL="https://dist.apache.org/repos/dist/release/lucene/solr/ref-guide"
RC_DIR_URL="https://dist.apache.org/repos/dist/dev/lucene/solr/ref-guide"

RM_OLD_CMD="svn rm -m 'removing archived ref guide files prior to $VERSION' "
RM_RC_CMD="svn rm -m 'cleaning up old RCs now that $VERSION has been released' "

NEW_COUNT=0
OLD_COUNT=0
RC_COUNT=0

for FILE in `svn list $DIST_DIR_URL`; do
  if [[ $FILE == $DIST_PREFIX* ]] ; then
    NEW_COUNT=`expr $NEW_COUNT + 1`
    continue # one of our just published files
  fi
  OLD_COUNT=`expr $OLD_COUNT + 1`
  RM_OLD_CMD="$RM_OLD_CMD $DIST_DIR_URL/$FILE"
done

if [ $NEW_COUNT -eq 0 ] ; then
   echo "FAIL: Unable to find any current (ie: $DIST_PREFIX*) release files in $DIST_DIR_URL"
   exit -1;
fi

if [ $OLD_COUNT -eq 0 ] ; then
   echo "FAIL: Unable to find any releases to clean up in $DIST_DIR_URL"
   exit -1;
fi

for FILE in `svn list $RC_DIR_URL`; do
  RC_COUNT=`expr $RC_COUNT + 1`
  RM_RC_CMD="$RM_RC_CMD $RC_DIR_URL/$FILE"
done

echo "## Run the following commands when ready..."
echo "# Delete old releases"
echo $RM_OLD_CMD

if [ $RC_COUNT -eq 0 ] ; then
   echo "# No old RC files to clean up"
else
   echo "# Delete old RC files"
   echo $RM_RC_CMD
fi




