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

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"

warn "You are using a deprecated script!"
warn "Please use 'cros deploy' in the future. See 'cros deploy -h' for the usage."
warn "More information is available at:"
warn "http://www.chromium.org/chromium-os/build/cros-deploy"

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

command_completed
