#!/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 upload all debug symbols required for crash reporting
# purposes.  This script need only be used to upload release builds
# symbols or to debug crashes on non-release builds (in which case try
# to only upload the symbols for those executables involved).

# --- 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=(/usr/lib/crosutils $(dirname "$(readlink -f "$0")"))
  local path

  SCRIPT_ROOT=
  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" || { echo "Unable to load common.sh"; exit 1; }
# --- END COMMON.SH BOILERPLATE ---

# Script must be run inside the chroot
restart_in_chroot_if_needed "$@"

get_default_board

# Flags
DEFINE_string board "$DEFAULT_BOARD" "The board to build packages for."
DEFINE_string breakpad_root "" "Root directory for breakpad symbols."
DEFINE_boolean official_build ${FLAGS_FALSE} "Point to official symbol server."
DEFINE_boolean regenerate ${FLAGS_FALSE} "Regenerate all symbols."
DEFINE_boolean verbose ${FLAGS_FALSE} "Be verbose."
DEFINE_boolean yes ${FLAGS_FALSE} "Answer yes to all prompts."

SYM_UPLOAD="sym_upload"

ANY_ERRORS=0

OUT_DIR=$(mktemp -d "/tmp/err.XXXX")

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

function really_upload() {
  if [ ${FLAGS_yes} -eq ${FLAGS_TRUE} ]; then
    return 0
  fi
  echo "Uploading symbols for an entire Chromium OS build is really only "
  echo "necessary for release builds and in a few cases for developers "
  echo "to debug problems.  It will take considerable time to run.  For "
  echo "developer debugging purposes, consider instead passing specific files "
  echo "to upload."
  read -p "Are you sure you want to upload all build symbols (y/N)? " SURE
  SURE="${SURE:0:1}" # Get just the first character
  if [ "${SURE}" != "y" ]; then
    echo "Ok, better safe than sorry."
    return 1
  fi
  return 0
}

# Upload the given symbol file to given URL.
function upload_file() {
  local upload_file="$1"
  local upload_url="$2"
  if [ ${FLAGS_verbose} -eq ${FLAGS_TRUE} ]; then
    info "Uploading ${upload_file}"
  fi
  "${SYM_UPLOAD}" "${upload_file}" "${upload_url}" > "${OUT_DIR}/stdout" \
    2> "${OUT_DIR}/stderr"
  if ! grep -q "Successfully sent the symbol file." "${OUT_DIR}/stdout"; then
    error "Unable to upload symbols in ${upload_file}:"
    cat "${OUT_DIR}/stderr"
    ANY_ERRORS=1
    return 1
  fi
  if [ ${FLAGS_verbose} -eq ${FLAGS_TRUE} ]; then
    size=$(wc -c "${upload_file}" | cut -d' ' -f1)
    info "Successfully uploaded ${size}B."
  fi
  return 0
}

function main() {
  trap cleanup EXIT

  # Parse command line
  FLAGS_HELP="usage: $0 [flags] [<files...>]"
  FLAGS "$@" || exit 1
  eval set -- "${FLAGS_ARGV}"

  set -e

  [ -n "$FLAGS_board" ] ||  die "--board is required."

  SYSROOT="/build/${FLAGS_board}"

  local upload_url=""
  if [ $FLAGS_official_build -eq $FLAGS_TRUE ]; then
    upload_url="http://clients2.google.com/cr/symbol"
  else
    upload_url="http://clients2.google.com/cr/staging_symbol"
    warn "This is an unofficial build, uploading to staging server."
  fi
  info "Uploading symbols to ${upload_url} from ${SYSROOT}."

  DEFAULT_BREAKPAD_ROOT="${SYSROOT}/usr/lib/debug/breakpad"
  if [ -z "${FLAGS_breakpad_root}" ]; then
    FLAGS_breakpad_root="${DEFAULT_BREAKPAD_ROOT}"
  else
    if [ ${FLAGS_regenerate} -eq ${FLAGS_TRUE} ]; then
      warn "Assuming --noregenerate when --breakpad_root is specified"
      FLAGS_regenerate=${FLAGS_FALSE}
    fi
  fi

  if [ -z "${FLAGS_ARGV}" ]; then
    if [ ${FLAGS_regenerate} -eq ${FLAGS_TRUE} ]; then
      really_upload || exit 1
      info "Clearing ${DEFAULT_BREAKPAD_ROOT}"
      sudo rm -rf "${DEFAULT_BREAKPAD_ROOT}"
      info "Generating all breakpad symbol files."
      local verbosity=""
      local generate_script="${SCRIPTS_DIR}/cros_generate_breakpad_symbols"
      [ ${FLAGS_verbose} -eq ${FLAGS_TRUE} ] && verbosity="--verbose"
      if ! "${generate_script}" --board=${FLAGS_board} ${verbosity}; then
        error "Some errors while generating symbols; uploading anyway"
        ANY_ERRORS=1
      fi
    fi

    info "Uploading all breakpad symbol files."
    for sym_file in $(find "${FLAGS_breakpad_root}" -name \*.sym); do
      ! upload_file "${sym_file}" "${upload_url}"
    done
  else
    error "Unexpected args ${FLAGS_ARGV}"
  fi

  [ ${ANY_ERRORS} -ne 0 ] && die "Encountered problems"
  return 0
}

main "$@"
