#!/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.

# Script to update a running device with an optionally built package out
# of your build directory

# --- BEGIN COMMON.SH BOILERPLATE ---
# Load common CrOS utilities.  Inside the chroot this file is installed in
# /usr/lib/crosutils.  Outside the chroot we find it relative to the script's
# location.
find_common_sh() {
  local common_paths=("$(dirname "$(readlink -f "$0")")/.." /usr/lib/crosutils)
  local path

  SCRIPT_ROOT="${common_paths[0]}"
  for path in "${common_paths[@]}"; do
    if [ -r "${path}/common.sh" ]; then
      SCRIPT_ROOT="${path}"
      break
    fi
  done
}

find_common_sh
. "${SCRIPT_ROOT}/common.sh" || exit 1
# --- END COMMON.SH BOILERPLATE ---

. "${SCRIPT_ROOT}/remote_access.sh" || exit 1

get_default_board

DEFINE_boolean verbose ${FLAGS_FALSE} \
  "Whether to output verbose information for debugging."
DEFINE_boolean build ${FLAGS_FALSE} "Build package before installing"
DEFINE_string board "$DEFAULT_BOARD" \
    "Board for which the package should be built/found"

FLAGS "$@" || exit 1

TMP=$(mktemp -d /tmp/cros_package_to_live.XXXX)

cleanup() {
    if [ "${root_mount_type}" = ro ]; then
        remote_sh "mount -o remount,ro /" || /bin/true
    fi
    if [ "${var_mount_noexec}" = yes ]; then
        remote_sh "mount -o remount,noexec /var" || /bin/true
    fi
    cleanup_remote_access
    rm -rf "${TMP}"
}

# Make sure we have a package name
if [ -z "${FLAGS_ARGV}" ]; then
    echo "Please specify packages to install.  For example:"
    echo "  $0 --remote=MyMachine flimflam"
    exit 1
fi

remote_access_init
learn_board

if [ -z "${FLAGS_board}" ]; then
    echo "Please specify a board using the --board=MyBoard argument"
    exit 1
fi

switch_to_strict_mode
trap cleanup EXIT

eval set -- "${FLAGS_ARGV}"

if [ ${FLAGS_build} -eq ${FLAGS_TRUE} ]; then
    emerge-${FLAGS_board} $@
fi

PKGROOT="/build/${FLAGS_board}/packages"

# Temporarily clear read-only flag on / if it is set
remote_sh "grep '\S* / ' /proc/mounts | tail -1 | awk '{ print \$4 }' |
           cut -d, -f1"
root_mount_type=${REMOTE_OUT}
if [ "${root_mount_type}" = ro ]; then
    remote_sh "mount -o remount,rw /"
fi

# Temporarily clear noexec flag on /var if it is set
remote_sh "grep '\S* /var ' /proc/mounts | tail -1 | awk '{ print \$4 }'"
if expr "${REMOTE_OUT}" : '.*noexec' >/dev/null; then
    var_mount_noexec=yes
    remote_sh "mount -o remount,exec /var"
fi

for pkg in $@; do
    latest_pkg=$(ls -tr $PKGROOT/*/${pkg}-[0-9]* | tail -1)
    if [ -z "${latest_pkg}" ]; then
        echo "Could not find latest built version of ${pkg}"
        exit 1
    fi
    pkg_dir=$(basename "$(dirname "$latest_pkg")")
    pkg_name=$(basename "$latest_pkg")
    echo "Installing ${latest_pkg}..."

    remote_sh "mktemp -d /tmp/cros_package_to_live.XXXX"
    temp_dir=$REMOTE_OUT
    remote_cp_to "${latest_pkg}" "${temp_dir}"
    remote_sh "mkdir -p /usr/portage/packages/${pkg_dir} &&
               mv ${temp_dir}/${pkg_name} /usr/portage/packages/${pkg_dir} &&
               env FEATURES=-sandbox emerge --usepkg \
                    /usr/portage/packages/${pkg_dir}/${pkg_name} 1>&2"
    echo "${pkg} has been installed"
    remote_sh "rm -rf ${temp_dir}"
done
