#!/bin/bash
# Copyright 2020 The Chromium OS Authors.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
#
# Download a local_manifest file from a private overlay into the
# .repo/local_manifests directory

set -e

readonly OVERLAY="$1"
readonly MANIFEST="$2"
readonly LOCAL_MANIFEST_DIR=".repo/local_manifests"
readonly LOCAL_MANIFEST_FILE="${MANIFEST:-local_manifest.xml}"
readonly PRIVATE_OVERLAY="chromeos/overlays/overlay-${OVERLAY}-private"
readonly URL="https://chrome-internal.googlesource.com/${PRIVATE_OVERLAY}"
ROOTDIR=""

usage() {
  local exitval=$1
  echo "  Usage:"
  echo "  $0 <overlay> [local_manifest_file]"
  echo "  Example: $0 zork"
  exit "${exitval}"
}

# Find the .repo directory in any directory above the current
find_repo_dir() {
  local path="${PWD}"
  while [[ -n ${path} && ! -e "${path}/.repo" ]]; do
    path=${path%/*}
  done
  ROOTDIR="${path}"
}

echo_error() {
  echo "Error: $1" >&2
  exit 1
}

main() {
  if [[ -z ${OVERLAY} || "${OVERLAY}" = "--help" ]]; then
    usage 1
  fi

  find_repo_dir

  if [[ ! -d "${ROOTDIR}/.repo" ]]; then
    echo "Error: No .repo directory found." >&2
    echo "Run this script from inside the chroot directory structure." >&2
    exit 1
  fi

  mkdir -p "${ROOTDIR}/${LOCAL_MANIFEST_DIR}" ||
    echo_error "Could not create ${ROOTDIR}/${LOCAL_MANIFEST_DIR}"
  cd "${ROOTDIR}/${LOCAL_MANIFEST_DIR}" ||
    echo_error "Could not cd to ${ROOTDIR}/${LOCAL_MANIFEST_DIR}"
  local tmp_repo_dir
  tmp_repo_dir="$(mktemp -d)" ||
    echo_error "Could not create temp directory"

  # We can have only one manifest file - either internal or not. So move any
  # preexisting xml files to backup_file copies.  In theory, there should only
  # be one file to save, so just keep track of the last file that was
  # preserved
  local backup_file
  declare -a targets=("$(find . -maxdepth 1 -name "*.xml")")
  for oldfile in "${targets[@]}"; do
    if [[ -n ${oldfile} && -f ${oldfile} ]]; then
      oldfile="$(basename "${oldfile}")"
      backup_file=$(mktemp -p . -t "old_${oldfile}.XXXX")
      echo "Backing up existing manifest to ${backup_file}"
      mv -f "${oldfile}" "${backup_file}" ||
        echo_error "could not back up exisiting manifest"
    fi
  done

  echo "Downloading local manifest for ${OVERLAY}"
  git clone -qn "${URL}" --depth 1 -- "${tmp_repo_dir}" ||
    echo_error "clone of private overlay failed.  Do you have access rights?"
  git --git-dir="${tmp_repo_dir}/.git" checkout HEAD "${LOCAL_MANIFEST_FILE}" ||
    echo_error "checkout failed."
  rm -rf "${tmp_repo_dir}"

  if [[ -f ${backup_file} ]] && \
      cmp "${LOCAL_MANIFEST_FILE}" "${backup_file}" >/dev/null; then
    echo "No update needed. Old manifest was identical to new."
    echo "Removing backup."
    rm "${backup_file}"
    exit 0
  fi

  if [[ -f ${LOCAL_MANIFEST_FILE} ]]; then
    echo "${LOCAL_MANIFEST_FILE} downloaded successfully."
    echo "Please run 'repo sync' to refresh the tree."
  else
    echo_error "${LOCAL_MANIFEST_FILE} not downloaded correctly."
  fi
}

main
