#!/bin/sh
#
# Created by: Bjorn Nelson 051215
#
# Description: Autoinstall configuration files unless it has an RCS tag

BCTC_CI_LOC="/usr/bin/ci"
BCTC_CO_LOC="/usr/bin/co"
DIRNAME_LOC="/usr/bin/dirname"
BASENAME_LOC="/usr/bin/basename"
MKDIR_LOC="/bin/mkdir"
MKTEMP_LOC="/usr/bin/mktemp"
MV_LOC="/bin/mv"
PWD_LOC="/bin/pwd"
PRESERVE_FILES_SUBDIR="rcs_mergemaster"
IGNOREFILES="${IGNOREFILES} /var/run"
echo "Ignoring ${IGNOREFILES}"

# Check if RCS is enabled before running
if [ ! -d /etc/RCS ]; then
  echo "RCS is not enabled, using stock mergemaster method"
  return 0
else
  echo "RCS is enabled, using RCS mergemaster method"
fi

# Verify mergemaster.rc is configured properly or default
if [ $PRESERVE_FILES ]; then
  if [ -n $PRESERVE_FILES_DIR ]; then
    $MKDIR_LOC -p ${PRESERVE_FILES_DIR}/${PRESERVE_FILES_SUBDIR}
  else
    echo "PRESERVE_FILES is set to yes, but PRESERVE_FILES_DIR is empty"
    echo "fix your mergemaster.rc and rerun"
    exit 1
  fi
else
  PRESERVE_FILES_DIR=`$MKTEMP_LOC -d /var/tmp/XXXX`
  echo "Files will be preserved under ${PRESERVE_FILES_DIR}/${PRESERVE_FILES_SUBDIR}"
  $MKDIR_LOC -p ${PRESERVE_FILES_DIR}/${PRESERVE_FILES_SUBDIR}
fi

# make sure our current directory matches TEMPROOT.
# if this causes a problem then something must have happened to mergemaster
# and this script should be updated to reflect these changes
if [ "`${PWD_LOC}`" != "${TEMPROOT}" ]; then
  echo "$0 was called from `${PWD_LOC}` instead of ${TEMPROOT}.  Exiting"
  exit 1
fi

# preempt and clean mergemaster so that it runs with less interactivity
for BCTC_COMPFILE in `find . -type f -size +0`; do
  # extract out the dir and base
  BASE_COMPFILE=`$BASENAME_LOC ${DESTDIR}${BCTC_COMPFILE#.}`
  DIR_COMPFILE=`$DIRNAME_LOC ${DESTDIR}${BCTC_COMPFILE#.}`

  # Skip if the filesdirectory is on the ignore list
  SKIP=0;
  for i in $IGNOREFILES; do
    if [ "$DIR_COMPFILE" = "$i" -o "${DIR_COMPFILE}/${BASE_COMPFILE}" = "$i" ]; then
      echo "Ignoring ${DIR_COMPFILE}/${BASE_COMPFILE}"
      SKIP=1
    fi
  done
  if [ $SKIP -eq 1 ]; then
    continue
  fi

  # First, check to see if the file exists in DESTDIR.  If not, the
  # diff_loop function knows how to handle it.
  if [ ! -e ${DIR_COMPFILE}/${BASE_COMPFILE} ]; then
    # check if the file is still checked in?
    if [ -f "${DIR_COMPFILE}/${BASE_COMPFILE},v" -o -f "${DIR_COMPFILE}/RCS/${BASE_COMPFILE},v" ]; then
      echo "${DIR_COMPFILE}/${BASE_COMPFILE} will be checked out"
      `${BCTC_CO_LOC} -l ${DIR_COMPFILE}/${BASE_COMPFILE}`
      RETURN=$?
      if  [ $RETURN -gt 0 ]; then
        echo "Error checking out ${DIR_COMPFILE}/${BASE_COMPFILE}"
      else
        echo "Check out worked for ${DIR_COMPFILE}/${BASE_COMPFILE}"
      fi
    fi
  elif [ -e "${DIR_COMPFILE}/${BASE_COMPFILE}" ]; then
    # check if the file has a corresponding RCS version and checkout
    echo "${DIR_COMPFILE}/RCS/${BASE_COMPFILE},v"
    if [ -f "${DIR_COMPFILE}/${BASE_COMPFILE},v" -o -f "${DIR_COMPFILE}/RCS/${BASE_COMPFILE},v" ]; then
      echo "${DIR_COMPFILE}/${BASE_COMPFILE} will be checked out"
      `${BCTC_CO_LOC} -f -l ${DIR_COMPFILE}/${BASE_COMPFILE}`
      RETURN=$?
      if  [ $RETURN -gt 0 ]; then
        echo "Error checking out ${DIR_COMPFILE}/${BASE_COMPFILE}"
      else
        echo "Check out worked for ${DIR_COMPFILE}/${BASE_COMPFILE}"
      fi
    else 
      echo "${DIR_COMPFILE}/${BASE_COMPFILE} is not in RCS, must be a stock file"
      echo "$MV_LOC ${DIR_COMPFILE}/${BASE_COMPFILE} ${PRESERVE_FILES_DIR}/${PRESERVE_FILES_SUBDIR}${DIR_COMPFILE}/${BASE_COMPFILE}"
      if [ ! -d $PRESERVE_FILES_DIR/${PRESERVE_FILES_SUBDIR}${DIR_COMPFILE} ]; then
        $MKDIR_LOC -p $PRESERVE_FILES_DIR/${PRESERVE_FILES_SUBDIR}${DIR_COMPFILE}
      fi
      $MV_LOC ${DIR_COMPFILE}/${BASE_COMPFILE} ${PRESERVE_FILES_DIR}/${PRESERVE_FILES_SUBDIR}${DIR_COMPFILE}/${BASE_COMPFILE}
    fi
  else 
    echo "Error matching ${DIR_COMPFILE}/${BASE_COMPFILE}"
    echo "exiting"
    exit 1
  fi
done


