# Recursively replace @@include@@ template variables with the referenced file,
# and write the resulting text to stdout.
process_template_includes() {
  INCSTACK+="$1->"
  # Includes are relative to the file that does the include.
  INCDIR=$(dirname $1)
  # Clear IFS so 'read' doesn't trim whitespace
  local OLDIFS="$IFS"
  IFS=''
  while read -r LINE
  do
    INCLINE=$(sed -e '/^[[:space:]]*@@include@@/!d' <<<$LINE)
    if [ -n "$INCLINE" ]; then
      INCFILE=$(echo $INCLINE | sed -e "s#@@include@@\(.*\)#\1#")
      # Simple filename match to detect cyclic includes.
      CYCLE=$(sed -e "\#$INCFILE#"'!d' <<<$INCSTACK)
      if [ "$CYCLE" ]; then
        echo "ERROR: Possible cyclic include detected." 1>&2
        echo "$INCSTACK$INCFILE" 1>&2
        exit 1
      fi
      if [ ! -r "$INCDIR/$INCFILE" ]; then
        echo "ERROR: Couldn't read include file: $INCDIR/$INCFILE" 1>&2
        exit 1
      fi
      process_template_includes "$INCDIR/$INCFILE"
    else
      echo "$LINE"
    fi
  done < "$1"
  IFS="$OLDIFS"
  INCSTACK=${INCSTACK%"$1->"}
}

# Replace template variables (@@VARNAME@@) in the given template file. If a
# second argument is given, save the processed text to that filename, otherwise
# modify the template file in place.
process_template() (
  # Don't worry if some of these substitution variables aren't set.
  # Note that this function is run in a sub-shell so we don't leak this
  # setting, since we still want unbound variables to be an error elsewhere.
  set +u

  local TMPLIN="$1"
  if [ -z "$2" ]; then
    local TMPLOUT="$TMPLIN"
  else
    local TMPLOUT="$2"
  fi
  # Process includes first so included text also gets substitutions.
  TMPLINCL="$(process_template_includes "$TMPLIN")"
  sed \
    -e "s#@@PACKAGE@@#${PACKAGE}#g" \
    -e "s#@@CHANNEL@@#${CHANNEL}#g" \
    -e "s#@@COMPANY_FULLNAME@@#${COMPANY_FULLNAME}#g" \
    -e "s#@@VERSION@@#${VERSION}#g" \
    -e "s#@@REVISION@@#${REVISION}#g" \
    -e "s#@@VERSIONFULL@@#${VERSIONFULL}#g" \
    -e "s#@@BUILDDIR@@#${BUILDDIR}#g" \
    -e "s#@@STAGEDIR@@#${STAGEDIR}#g" \
    -e "s#@@SCRIPTDIR@@#${SCRIPTDIR}#g" \
    -e "s#@@PRODUCTURL@@#${PRODUCTURL}#g" \
    -e "s#@@PREDEPENDS@@#${PREDEPENDS}#g" \
    -e "s#@@DEPENDS@@#${DEPENDS}#g" \
    -e "s#@@PROVIDES@@#${PROVIDES}#g" \
    -e "s#@@REPLACES@@#${REPLACES}#g" \
    -e "s#@@CONFLICTS@@#${CONFLICTS}#g" \
    -e "s#@@ARCHITECTURE@@#${HOST_ARCH}#g" \
    -e "s#@@MAINTNAME@@#${MAINTNAME}#g" \
    -e "s#@@MAINTMAIL@@#${MAINTMAIL}#g" \
    -e "s#@@REPOCONFIG@@#${REPOCONFIG}#g" \
    -e "s#@@SHORTDESC@@#${SHORTDESC}#g" \
    -e "s#@@FULLDESC@@#${FULLDESC}#g" \
    -e "s#@@APACHE_CONFDIR@@#${APACHE_CONFDIR}#g" \
    -e "s#@@APACHE_MODULEDIR@@#${APACHE_MODULEDIR}#g" \
    -e "s#@@APACHE_USER@@#${APACHE_USER}#g" \
    -e "s#@@MOD_PAGESPEED_CACHE@@#${MOD_PAGESPEED_CACHE}#g" \
    -e "s#@@MOD_PAGESPEED_LOG@@#${MOD_PAGESPEED_LOG}#g" \
    -e "s#@@MODPAGESPEED_ENABLE_UPDATES@@#${MODPAGESPEED_ENABLE_UPDATES}#g" \
    -e "s#@@COMMENT_OUT_DEFLATE@@#${COMMENT_OUT_DEFLATE}#g" \
    -e "s#@@SSL_CERT_DIR@@#${SSL_CERT_DIR}#g" \
    -e "s#@@SSL_CERT_FILE_COMMAND@@#${SSL_CERT_FILE_COMMAND}#g" \
    > "$TMPLOUT" <<< "$TMPLINCL"

  if grep "@@" "$TMPLOUT"; then
    echo "ERROR: $TMPLOUT contains @@-variables that were not"
    echo "substituted by installer.include."
    exit 1
  fi
)

# Setup the installation directory hierachy in the package staging area.
prep_staging_common() {
  install -m 755 -d \
    "${STAGEDIR}${APACHE_CONFDIR}" \
    "${STAGEDIR}${APACHE_MODULEDIR}" \
    "${STAGEDIR}${MOD_PAGESPEED_CACHE}" \
    "${STAGEDIR}${MOD_PAGESPEED_LOG}"
}

get_version_info() {
  # Default to a bogus low version, so if somebody creates and installs
  # a package with no version info, it won't prevent upgrading when
  # trying to install a properly versioned package (i.e. a proper
  # package will always be "newer").
  VERSION="0.0.0.0"
  # Use epoch timestamp so packages with bogus versions still increment
  # and will upgrade older bogus-versioned packages.
  REVISION=$(date +"%s")
  # Default to non-official build since official builds set this
  # properly.
  OFFICIAL_BUILD=0

  VERSIONFILE="${BUILDDIR}/installer/version.txt"
  if [ -f "${VERSIONFILE}" ]; then
    source "${VERSIONFILE}"
    VERSION="${MAJOR}.${MINOR}.${BUILD}.${PATCH}"
    REVISION="${LASTCHANGE}"
  fi
}

stage_install_common() {
  echo "Staging common install files in '${STAGEDIR}'..."

  # app and resources
  install -m 644 -s "${BUILDDIR}/libmod_pagespeed.so" "${STAGEDIR}${APACHE_MODULEDIR}/mod_pagespeed.so"
  install -m 644 -s "${BUILDDIR}/libmod_pagespeed_ap24.so" "${STAGEDIR}${APACHE_MODULEDIR}/mod_pagespeed_ap24.so"
}
