#!/bin/bash

# Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
#
# Simple wrapper script to build a cros_workon package incrementally.
# You must already be cros_workon'ing the package in question.

. /usr/lib/crosutils/common.sh || exit 1

DEFINE_string board "${DEFAULT_BOARD}" \
    "Board for which to build the package."
DEFINE_boolean test "${FLAGS_FALSE}" \
  "Compile and run tests as well."
DEFINE_boolean reconf "${FLAGS_FALSE}" \
  "Re-run configure and prepare steps."
DEFINE_boolean install "${FLAGS_FALSE}" \
  "Incrementally build and install your package."
DEFINE_boolean scrub "${FLAGS_FALSE}" \
  "Blow away all in-tree files not managed by git."

set -e
# Parse command line.
FLAGS "$@" || exit 1
eval set -- "${FLAGS_ARGV}"

if [ $# -lt 1 ]; then
  echo "Usage: ${0} [OPTIONS] <package (read: ebuild) basename> [target args]"
  exit 1
fi

if [ -n "${FLAGS_board}" ]; then
  BOARD_DIR=/build/"${FLAGS_board}"
  EBUILDCMD=ebuild-"${FLAGS_board}"
  EMERGECMD=emerge-"${FLAGS_board}"
  EQUERYCMD=equery-"${FLAGS_board}"
  BOARD="${FLAGS_board}"
fi

pkg="${1}"
shift
if [ "${pkg}" = "." ]; then
  if ! pkg=$(git config workon.pkg); then
    die "workon.pkg not set in git config for this project"
  fi
fi

unstable_suffix="9999"
workon_name="${pkg}-${unstable_suffix}"
pkgfile=

# Find the ebuild file, ensure the caller is workon'ing the package.
if ! pkgfile=$("${EQUERYCMD}" which "${workon_name}" 2> /dev/null); then
  BOARD_KEYWORD="$(portageq-${FLAGS_board} envvar ARCH)"
  if ACCEPT_KEYWORDS="~${BOARD_KEYWORD}" "${EQUERYCMD}" which "${workon_name}" \
      > /dev/null 2>&1; then
    die "run 'cros_workon --board ${BOARD} start ${pkg}' first!" 1>&2
  fi
  die "error looking up package ${pkg}"
fi

if [ "${FLAGS_scrub}" = "${FLAGS_TRUE}" ]; then
  warn "--scrub will destroy ALL FILES unknown to git!"
  read -p "Are you sure you want to do this? [y|N]" resp
  if egrep -qi "^y(es)?$" <(echo -n "${resp}"); then
    eval $(${EBUILDCMD} $(${EQUERYCMD} which ${workon_name}) info)
    srcdir=$(readlink -m ${CROS_WORKON_SRCDIR})
    trunkdir=$(readlink -m ${CHROOT_TRUNK_DIR})
    project_path=${srcdir#${trunkdir}/}
    if ! (cd "${GCLIENT_ROOT}/${project_path}" && git clean -dxf); then
      die "Could not scrub source directory"
    fi
  else
    info "Not scrubbing; exiting gracefully"
  fi
  exit 0
fi

# Find the portage work directory for this package.
workpath=$(\
    echo "${pkgfile}" | \
        awk -F '/' '{ print $(NF-2) "/" $(NF-1) }')-"${unstable_suffix}"
workpath="/build/${BOARD}/tmp/portage/${workpath}"

# Export vars that the ebuild env needs from us.
export SANDBOX_WRITE=~/trunk
export CROS_WORKON_INPLACE=1
export CROS_WORKON_MAKE_COMPILE_ARGS="$*"

# The ebuild commands we run rely on portage automatically running earlier
# phases for us.  Append in case there is something already in the env.
FEATURES+=" -noauto"
export FEATURES

# Vars that we want to pass through for the user.
PASS_THROUGH_VARS=(
  # cros-workon.eclass vars.
  CROS_WORKON_MAKE_COMPILE_ARGS
  # Common test vars.
  GTEST_ARGS
)

# Determine if we're going to do tests, set up commands appropriately.
to_do="compile"
if [ "${FLAGS_test}" = "${FLAGS_TRUE}" ]; then
  to_do="test"
  FEATURES+=" test"
  rm -f "${workpath}/.tested"
fi

workdir="${workpath}/work/${workon_name}"
if [ ! -h "${workdir}" ]; then
  warn "Cleaning up stale workdir: ${workdir}"
  FLAGS_reconf="${FLAGS_TRUE}"  # To force symlinking in the user's src dir.
fi

if [ "${FLAGS_install}" = "${FLAGS_TRUE}" ]; then
  exec "${EMERGECMD}" --nodeps "${pkg}"
fi

clean=
if [ "${FLAGS_reconf}" = "${FLAGS_TRUE}" ]; then
  clean="clean"
else
  rm -f "${workpath}/.compiled"
  envf="${workpath}/temp/environment"
  for v in ${PASS_THROUGH_VARS[@]}; do
    # We delete it independently in case the var wasn't set initially.
    sed -i -e "/^declare .. ${v}=/d" "${envf}"
    printf 'declare -x %s="%s"\n' "${v}" "${!v}" >> "${envf}"
  done
fi
exec "${EBUILDCMD}" "${pkgfile}" ${clean} "${to_do}"
