#!/bin/bash -u
# -*- coding: utf-8 -*-
# Copyright 2022 The ChromiumOS Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

# llvm_bisection_template.sh
#
# This script is meant to be run inside a `git bisect` process, like so:
#
#   $ cd <your llvm-project dir>
#   $ git bisect start
#   $ git bisect bad <your bad ref>
#   $ git bisect good <your good ref>
#   $ git bisect run ~/chromimuos/src/scripts/llvm_bisection_template.sh
#
# This template exists as a "batteries included" LLVM bisection script,
# which will modify the LLVM_NEXT hash to help the mage track down issues
# locally.
#
# Modify the fixme sections below to customize to your bisection use-case.

# FIXME: Replace this for the location of your llvm clone within the chroot.
# We need this for the git history.
LLVM_CLONE_PATH="${HOME}/chromiumos/src/third_party/llvm-project"

main () {
  # Note this builds with USE="llvm-next debug -thinlto -llvm_pgo_use continue-on-patch-failure"
  build_llvm || exit

  # FIXME: Write your actual bisection command here which uses
  # LLVM_NEXT here.
  #
  # Example bisection command:
  #
  #   build_pkg efitools || exit 1
  #
  # You can use build_pkg if you want to emerge a package and print
  # out diagnostics along the way
  #
  #   Fail Example: build_pkg "${MY_PACKAGE}" || exit 1
  #   Skip Example: build_pkg "${MY_PACKAGE}" || exit 125
  #
}

# ---------------------------------------------------------------------

# Current LLVM_NEXT_HASH we're using. Does not need to be set.
CURRENT='UNKNOWN'

logdo () {
  local cmd="${1}"
  shift
  printf '%1 $ %2' "$(date '+%T')" "${cmd}"
  for i in "$@"; do
    printf "'%1'" "${i}"
  done
  printf "\n"
  "${cmd}" "$@"
}

log () {
  echo "$(date '+%T') | $*"
}

build_llvm () {
  cd "${LLVM_CLONE_PATH}" || exit 2  # Exit with error
  local llvm_ebuild_path
  llvm_ebuild_path="$(readlink -f "$(equery which llvm)")"
  CURRENT="$(git rev-parse --short HEAD)"
  log "Current hash=${CURRENT}"
  NEW_LINE="LLVM_NEXT_HASH=\"${CURRENT}\""
  sed -i "s/^LLVM_NEXT_HASH=\".*\"/${NEW_LINE}/" "${llvm_ebuild_path}"

  local logfile="/tmp/build-llvm.${CURRENT}.out"
  log "Writing logs to ${logfile}"
  log "sudo USE='llvm-next debug -thinlto -llvm_use_pgo continue-on-patch-failure'" \
      " emerge sys-devel/llvm"
  logdo sudo USE='llvm-next debug -thinlto -llvm_use_pgo continue-on-patch-failure' emerge \
    sys-devel/llvm \
    &> "${logfile}"
  local emerge_exit_code="$?"
  if [[ "${emerge_exit_code}" -ne 0 ]]; then
    log "FAILED to build llvm with hash=${CURRENT}"
    log 'Skipping this hash'
    return 125  # 125 is the "skip" exit code.
  fi
  log "Succesfully built LLVM with hash=${CURRENT}"
  return 0  # Explicitly returning 0 for "good" even if a command errors out
}

build_pkg () {
  local pkg="${1}"

  local logfile="/tmp/build-${pkg}.${CURRENT}.out"
  log "Writing logs to ${logfile}"
  log "sudo emerge ${pkg}"
  logdo sudo emerge "${pkg}" \
    &> "${logfile}"
  local emerge_exit_code="$?"
  if [[ "${emerge_exit_code}" -ne 0 ]]; then
    log "FAILED to build ${pkg} with hash=${CURRENT}"
    return 1  # 1 here isn't for bisection, but for chaining with `||`
  fi
  log "Successfully built ${pkg} with hash=${CURRENT}"
  return 0  # Explicitly returning 0 for "good" even if a command errors out
}

main
