#!/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 take an archived build result and prepare a hwqual release.

# Load common constants.  This should be the first executable line.
# The path to common.sh should be relative to your script's location.
. "$(dirname "$0")/common.sh"

# Flags
DEFINE_string from "" "Directory with build archive (zipname)"
DEFINE_string to "" "Directory to receive packaged hwqual"
DEFINE_string zipname "image.zip" "Name of zip file to create."
DEFINE_string output_tag "chromeos-hwqual" "Name used in tar"

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

function cleanup() {
  rm -rf "${TMP}"
}

function main() {
  assert_outside_chroot
  assert_not_root_user

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

  if [[ -z "${FLAGS_from}" ]]; then
    echo "Please specify --from directory"
    exit 1
  fi

  FLAGS_from=$(readlink -f "${FLAGS_from}")

  if [[ -z "${FLAGS_to}" ]]; then
    FLAGS_to="${FLAGS_from}"
  fi

  local script_dir=$(dirname "$0")

  script_dir=$(readlink -f "${script_dir}")
  docgen_dir="autotest/utils/docgen"
  html_target="${TMP}/autotest/client/site_tests/suite_HWQual/html"

  trap cleanup EXIT

  cd "${TMP}"

  echo "Extracting build artifacts..."
  unzip "${FLAGS_from}/${FLAGS_zipname}"
  mkdir -p image
  mkdir -p "tarball/${FLAGS_output_tag}"

  echo "Extracting autotest from build artifacts..."
  tar --bzip2 -xf autotest.tar.bz2

  # Create HTML and PDF test documentation for HWQual Tests.
  # We need doxygen 1.6.1 or later to run CreateDocs.py
  doxygen_version=$(doxygen --version)
  if [[ $? -eq 0 ]]; then
    if [[ "$doxygen_version" > "1.6.0" ]]; then
      echo "Generating test documentation..."
      cd "${docgen_dir}"
      ./CreateDocs.py --docversion ${FLAGS_output_tag} --html ${html_target}
      make -C latex pdf
      mv latex/refman.pdf "${html_target}/HWQual.pdf"
      # Clean up the generated files.
      rm -rf testsource latex *.log
    else
      warn "doxygen is $doxygen_version, should be 1.6.1 or later."
    fi
  else
    warn "doxygen is not installed. Install version 1.6.1 or later."
  fi

  cd "${TMP}"

  mv chromiumos_test_image.bin image/chromiumos_image.bin

  echo "Formatting rootfs as a USB image..."
  "${script_dir}/image_to_usb.sh" --from=image \
    --to="tarball/${FLAGS_output_tag}/chromeos-hwqual-usb.img"

  echo "Inserting documentation and autotest to tarball..."
  ln -s \
    "${FLAGS_output_tag}/autotest/client/site_tests/suite_HWQual/README.txt" \
    tarball
  ln -s \
    "${FLAGS_output_tag}/autotest/client/site_tests/suite_HWQual/html" tarball
  ln -s autotest/client/site_tests/suite_HWQual/manual \
    "tarball/${FLAGS_output_tag}"
  cp "${script_dir}/mod_for_test_scripts/ssh_keys/testing_rsa" \
    "tarball/${FLAGS_output_tag}"
  chmod 0400 "tarball/${FLAGS_output_tag}/testing_rsa"
  mv autotest "tarball/${FLAGS_output_tag}"
  cp "${script_dir}/generate_test_report.py" \
    "tarball/${FLAGS_output_tag}/generate_test_report"
  echo "Creating ${FLAGS_to}/${FLAGS_output_tag}.tar.bz2..."
  mkdir -p "${FLAGS_to}"
  cd tarball
  tar --bzip2 -cf "${FLAGS_to}/${FLAGS_output_tag}.tar.bz2" .

  trap - EXIT
  cleanup

  echo "Done."
  cd "${script_dir}"
}

main "$@"
