#!/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>"
  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}"
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=
workpath=

# 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}"

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

workdir="/build/${BOARD}/tmp/portage/${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
  SANDBOX_WRITE=~/trunk CROS_WORKON_INPLACE=1 \
    FEATURES="${emerge_features} ${FEATURES}" "${EMERGECMD}" --nodeps "${pkg}"
  exit $?
fi

clean=
if [ "${FLAGS_reconf}" = "${FLAGS_TRUE}" ]; then
  clean="clean"
else
  rm -f "/build/${BOARD}/tmp/portage/${workpath}/.compiled"
fi
SANDBOX_WRITE=~/trunk CROS_WORKON_INPLACE=1 \
  "${EBUILDCMD}" "${pkgfile}" ${clean} "${to_do}"
