#!/bin/bash
#
# Copyright 2016 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.
#
# Author: cheesy@google.com (Steve Hill)
#
# Install packages required for building mod_pagespeed.

if [ "$UID" -ne 0 ]; then
  echo Root is required to run this. Re-execing with sudo
  exec sudo $0 "$@"
  exit 1  # NOTREACHED
fi

additional_dev_packages=false
if [ "${1:-}" = "--additional_dev_packages" ]; then
  additional_dev_packages=true
  shift
fi

if [ $# -ne 0 ]; then
  echo "Usage: $(basename $0) [--additional_dev_packages]" >&2
  exit 1
fi

binary_packages=(subversion apache2 g++ gperf devscripts fakeroot git-core
  zlib1g-dev wget curl net-tools rsync ssl-cert psmisc libexpat1-dev)
src_packages=()

if version_compare $(lsb_release -rs) -lt 14.04; then
  binary_packages+=(gcc-mozilla)
fi

# Sometimes the names of packages change between versions.  This goes through
# its arguments and returns the first package name that exists on this OS.
function first_available_package() {
  for candidate_version in "$@"; do
    if [ -n "$(apt-cache search --names-only "^${candidate_version}$")" ]; then
      echo "$candidate_version"
      return
    fi
  done
  echo "error: no available version of $@" >&2
  exit 1
}

install_redis_from_src=false
if "$additional_dev_packages"; then
  binary_packages+=(memcached autoconf valgrind libev-dev libssl-dev
    libpcre3-dev openjdk-7-jre language-pack-tr-base gperf uuid-dev pkg-config)

  if version_compare $(lsb_release -sr) -ge 16.04; then
    binary_packages+=(redis-server)
  else
    src_packages+=(redis-server)
  fi

  binary_packages+=( \
    $(first_available_package libtool-bin libtool)
    $(first_available_package php-cgi php5-cgi)
    $(first_available_package libapache2-mod-php libapache2-mod-php5)
    $(first_available_package php-mbstring libapache2-mod-php5))
fi

# The 32 bits ubuntu 14.04 image has /etc/protocols modified which 
# will cause a prompt here. Force retaining the old configuration here.
apt-get -y -o Dpkg::Options::="--force-confdef" \
  -o Dpkg::Options::="--force-confold" install "${binary_packages[@]}"

# src_packages might be empty. The below placates set -u, see:
# http://stackoverflow.com/questions/7577052/bash-empty-array-expansion-with-set-u
install_from_src ${src_packages[@]+"${src_packages[@]}"}
