#!/bin/bash
# SPDX-License-Identifier: GPL-2.0
#
# Update the common kernel git sha and the GKI kernel prebuilts build ID.

# Tracking bug of aosp update event
GKI_UPDATE_BUG=${GKI_UPDATE_BUG:-"NA"}

# GKI boot image build-id
BOOT_IMAGE_BUILDID=${BOOT_IMAGE_BUILDID:-}

# GKI Kernel Branch (on aosp gerrit)
AOSP_BRANCH=${AOSP_BRANCH:-"android14-5.15"}

# Kernel Manifest
KERNEL_MANIFEST_BRANCH=${KERNEL_MANIFEST:-"android14-5.15-kirkwood-sdk"}
KERNEL_MANIFEST_URL="https://eureka-partner.googlesource.com/kirkwood/manifest"

# Whether or not to push commits to gerrit
PUSH=${PUSH:-0}

# Gerrit Topic
TOPIC=${TOPIC:-WK`date +%U`_AOSP_UPDATE_${KERNEL_MANIFEST_BRANCH}_TO_${AOSP_BRANCH}}

DEVICE_MODULES_DIR=${DEVICE_KERNEL_DIR:-"kernel_device_modules-5.15"}
DEVICE_MODULES_BRANCH="android14-5.15-kirkwood-sdk"

GKI_KERNEL_DIR=${GKI_KERNEL_DIR:-"kernel-5.15"}

CUR_DIR=$(pwd)

KERNEL_VERSION=""
KERNEL_PATCHLEVEL=""
KERNEL_SUBLEVEL=""
AOSP_COMMIT_INFO=""

MANIFEST_DIR="../.repo/manifests"
SDK_MANIFEST="sdk_only.xml"

#-----------------------------------------------------------------------
# Reset color
Color_Off='\033[0m'       # Text Reset
# Regular Colors
Green='\033[0;32m'        # Green
Yellow='\033[0;33m'       # Yellow

function exit_if_error() {
  if [ $1 -ne 0 ]; then
    echo "ERROR: $2: retval=$1" >&2
    cd ${CUR_DIR}
    exit $1
  fi
}

function usage() {
  cat <<- EOF
    Usage:

    BOOT_IMAGE_BUILDID:     The build ID of the prebuilt boot image to download.
    AOSP_BRANCH:            The GKI branch that the boot image is from.
    KERNEL_MANIFEST_BRANCH: The kernel manifest branch to use for syncing the kernel repos.
    PUSH:                   Optional: Whether or not to automatically push generated commits
                            to gerrit for review. This is set to 0 by default.
    GKI_UPDATE_BUG:         Optional: The bug number associated with this update.

   Sample invocation:

   GKI_UPDATE_BUG=308444147 BOOT_IMAGE_BUILDID=11010967 \\
   AOSP_BRANCH=android14-5.15-2023-08 \\
   KERNEL_MANIFEST_BRANCH=android14-5.15-kirkwood-sdk $0

   Note:
     You can set PUSH=1 when invoking $0 to automatically push the generated commits
     to gerrit for review.
EOF
}

function sanitize_args() {
  if [[ -z "${BOOT_IMAGE_BUILDID}" ]]; then
    usage
    exit 1
  elif [[ ! -d "${CUR_DIR}/${GKI_KERNEL_DIR}" ]]; then
    echo "Cannot find GKI kernel directory ${GKI_KERNEL_DIR}/" >&2
    exit 1
  elif [[ ! -d "${CUR_DIR}/${DEVICE_MODULES_DIR}" ]]; then
    echo "Cannot find device kernel directory ${DEVICE_MODULES_DIR}/" >&2
    exit 1
  fi
}

function sync_kernel_repos() {
  echo -e "\n${Yellow}Running repo init and syncing ${KERNEL_MANIFEST_BRANCH}${Color_Off}"

  repo init -q -u "${KERNEL_MANIFEST_URL}" -b "${KERNEL_MANIFEST_BRANCH}" -m "${SDK_MANIFEST}"
  exit_if_error $? "Failed to initialize kernel repo branch ${KERNEL_MANIFEST_BRANCH}"

  repo sync -q -cd -j$(nproc)
  exit_if_error $? "Failed to sync kernel repos"
}

function get_gki_kernel_info() {
  pushd ${CUR_DIR}/${GKI_KERNEL_DIR} > /dev/null

  KERNEL_VERSION=$(grep -r -m 1 "VERSION =" Makefile | sed 's/.*VERSION = //g')
  KERNEL_PATCHLEVEL=$(grep -r -m 1 "PATCHLEVEL =" Makefile | \
                      sed 's/.*PATCHLEVEL = //g')
  KERNEL_SUBLEVEL=$(grep -r -m 1 "SUBLEVEL =" Makefile | \
                    sed 's/.*SUBLEVEL = //g')
  AOSP_COMMIT_INFO=$(git log --pretty=format:'%h %s' -1)

  popd > /dev/null
}

function update_manifest_and_sync_gki_kernel() {
  local rev_current_aosp
  local ci_url="https://ci.android.com/builds/submitted/${BOOT_IMAGE_BUILDID}/kernel_aarch64/latest/raw/manifest_${BOOT_IMAGE_BUILDID}.xml"

  wget ${ci_url}
  exit_if_error $? "Unable to download manifest_${BOOT_IMAGE_BUILDID}.xml"

  REV_NEW_AOSP=$(grep -r "=\"kernel/common\""\
                 manifest_${BOOT_IMAGE_BUILDID}.xml | \
                 sed 's/.*revision="//g'| sed 's/".*//g')
  rm manifest_${BOOT_IMAGE_BUILDID}.xml

  rev_current_aosp=$(repo info kernel/common | grep "Current revision" | \
                     sed 's/Current revision: //g')

  pushd ${MANIFEST_DIR} > /dev/null

  sed -i "s/${rev_current_aosp}/${REV_NEW_AOSP}/" ${SDK_MANIFEST}

  popd > /dev/null

  echo -e "\n${Yellow}Syncing the GKI kernel to new revision: ${REV_NEW_AOSP}${Color_Off}"
  repo sync -q -cd -j$(nproc) kernel/common
  exit_if_error $? "Unable to sync ${GKI_KERNEL_DIR}/"
}

function commit_and_push_manifest_update() {
  local merge_msg=$(printf "Update ${AOSP_BRANCH} sync point to (${KERNEL_VERSION}.${KERNEL_PATCHLEVEL}.${KERNEL_SUBLEVEL})\n\nSync SHA:\n${AOSP_COMMIT_INFO}\n\nBug: ${GKI_UPDATE_BUG}")

  pushd ${MANIFEST_DIR} > /dev/null

  git add ${SDK_MANIFEST}
  git commit --quiet -s -m "${merge_msg}"

  if [[ $PUSH -eq 1 ]]; then
    echo -e "\n${Yellow}Pushing manifest updates...${Color_Off}"
    git push origin HEAD:refs/for/${KERNEL_MANIFEST_BRANCH} -o topic=${TOPIC}
  fi

  popd > /dev/null
}

function update_gki_kernel() {
  get_gki_kernel_info

  echo -e "\n${Green}Current GKI Kernel Info${Color_Off}"
  echo -e "KERNEL_VERSION = [${Green}${KERNEL_VERSION}${Color_Off}]"
  echo -e "KERNEL_PATCHLEVEL = [${Green}${KERNEL_PATCHLEVEL}${Color_Off}]"
  echo -e "KERNEL_SUBLEVEL = [${Green}${KERNEL_SUBLEVEL}${Color_Off}]"
  echo -e "AOSP_COMMIT_INFO = [${Green}${AOSP_COMMIT_INFO}${Color_Off}]\n"

  update_manifest_and_sync_gki_kernel

  get_gki_kernel_info
  echo -e "\n${Green}New GKI Kernel Info:${Color_Off}"
  echo -e "KERNEL_VERSION = [${Green}${KERNEL_VERSION}${Color_Off}]"
  echo -e "KERNEL_PATCHLEVEL = [${Green}${KERNEL_PATCHLEVEL}${Color_Off}]"
  echo -e "KERNEL_SUBLEVEL = [${Green}${KERNEL_SUBLEVEL}${Color_Off}]"
  echo -e "AOSP_COMMIT_INFO = [${Green}${AOSP_COMMIT_INFO}${Color_Off}]"

  commit_and_push_manifest_update
}

function update_gki_prebuilts_id() {
  local current_build_id
  local merge_msg=$(printf "Update the GKI prebuilt build ID to ab/${BOOT_IMAGE_BUILDID}\n\nUse GKI prebuilt binaries from ab/${BOOT_IMAGE_BUILDID}\n\nBug: ${GKI_UPDATE_BUG}")

  echo -e "\n${Yellow}Updating GKI prebuilts build ID to: ${BOOT_IMAGE_BUILDID} with SHA: ${REV_NEW_AOSP} ...${Color_Off}"

  pushd ${CUR_DIR}/${DEVICE_MODULES_DIR} > /dev/null

  current_build_id=$(grep -e "gki_prebuilts=[0-9]*" ./device.bazelrc | grep -oe "[0-9]*")

  sed -i "s/${current_build_id}/${BOOT_IMAGE_BUILDID}/" ./device.bazelrc

  git add device.bazelrc
  git commit --quiet -s -m "${merge_msg}"

  if [[ $PUSH -eq 1 ]]; then
    echo -e "\n${Yellow}Pushing updates to GKI build ID${Color_Off}"
    git push eureka-partner HEAD:refs/for/${DEVICE_MODULES_BRANCH} -o topic=${TOPIC}
  fi

  popd > /dev/null
}

function log_push_disabled_notice() {
  cat <<- EOF
    Commits have been generated for integrating ACK SHA ${REV_NEW_AOSP}
    but have not been pushed to gerrit.

    To ensure that the commits are pushed to gerrit, rerun the script with
    PUSH=1 or push each commit to gerrit manually with the following
    commands:

    # Manifest update
    cd ${MANIFEST_DIR}
    git push origin HEAD:refs/for/${KERNEL_MANIFEST_BRANCH}
    cd ..

    # Device modules update
    cd ${DEVICE_MODULES_DIR}
    git push eureka-partner HEAD:refs/for/${DEVICE_MODULES_BRANCH}
    cd ..
EOF
}

sanitize_args

echo -e "\nBegin.\n"
echo -e "TOPIC = [${Green}${TOPIC}${Color_Off}]"

sync_kernel_repos

update_gki_kernel

update_gki_prebuilts_id

echo -e "\nDone.\n"

if [[ $PUSH -ne 1 ]]; then
  log_push_disabled_notice
fi
