#!/bin/bash
#------------------------------------------------------------------------------
set -u

# Run this AFTER Copy Up (dev -> main) has already happened, from your
# local directory in your release workspace client switched to
# //p4-sdp/main, corresponding to //p4-sdp/main/tools. By this point in
# the release process, main already has all of dev's latest content, so
# this writes the new version into main's own Version file
# (VersionDepotFile below); 'p4 where'/'p4 edit' on that path need to
# resolve against a client actually mapping //p4-sdp/main.
#
# You must have a valid ticket.

# Version ID Block. Relies on +k filetype modifier.
#------------------------------------------------------------------------------
# shellcheck disable=SC2016
declare VersionID='$Id: //p4-sdp/r26.1.0/tools/preview_changes_and_update_version.sh#1 $ $Change: 33565 $'
declare VersionStream=${VersionID#*//}; VersionStream=${VersionStream#*/}; VersionStream=${VersionStream%%/*};
declare VersionCL=${VersionID##*: }; VersionCL=${VersionCL%% *}
declare Version=${VersionStream}.${VersionCL}
[[ "$VersionStream" == r* ]] || Version="${Version^^}"

declare ThisScript=${0##*/}
declare -i ErrorCount=0
declare OldMajorVersion=
declare NewMajorVersion=
declare OldReleaseCL=
declare NewReleaseCL=
declare NewReleaseDate=
declare VersionDepotFile="//p4-sdp/main/Version"
declare VersionLocalFile=
declare CL=
declare H1="=============================================================================="
declare H2="------------------------------------------------------------------------------"
declare Log=/tmp/${ThisScript%.sh}.log

function msg () { echo -e "$*"; }
function errmsg () { msg "\\nError: ${1:-Unknown Error}\\n"; ErrorCount+=1; }
function bail () { errmsg "${1:-Unknown Error}"; exit "${2:-$ErrorCount}"; }

# shellcheck disable=SC1091
source ./env.sh
OldMajorVersion=$(p4 print -q //p4-sdp/main/Version |cut -d '/' -f 3)
OldReleaseCL=$(p4 print -q //p4-sdp/main/Version |cut -d '/' -f 4|cut -d ' ' -f 1)
NewReleaseCL=$(p4 -ztag -F %change% changes -s submitted -m 1 //p4-sdp/main/...)
NewReleaseDate=$(p4 describe -s "$NewReleaseCL" | head -1 | cut -d ' ' -f 6)

# Redirect stdout and stderr to a log file.
exec > >(tee -a "$Log")
exec 2>&1

msg "${H1}\\nLog is: $Log\\n"

msg "Starting $ThisScript version $Version."

echo -n -e "Enter New Major Version: [$OldMajorVersion]: "
while [[ -z "$NewMajorVersion" ]]; do
   read -r NewMajorVersion

   if [[ -n "$NewMajorVersion" ]]; then
      if [[ ! "$NewMajorVersion" =~ ^[0-9]{4}\.[0-9]+$ ]]; then
         msg "Invalid version; form must by YYYY.N."
	 NewMajorVersion=
         echo -n -e "Enter New Major Version: [$OldMajorVersion]: "
      fi
   else
      NewMajorVersion="$OldMajorVersion"
   fi
done

msg "Released: Rev. SDP/MultiArch/${NewMajorVersion}/${NewReleaseCL} ($NewReleaseDate)\\n"

msg "${H2}\\nChanges since change $OldReleaseCL up to $NewReleaseCL (B=Bug, D=Doc, F=Feature).\\n"

for CL in $(p4 -ztag -F %change% changes -s submitted //p4-sdp/main/...@$((OldReleaseCL+1)),@now); do
   p4 describe -s "$CL" || bail "Could not do: p4 describe -s \"$CL\""
done

VersionLocalFile=$(p4 -ztag -F %path% where "$VersionDepotFile")

if [[ -n "$VersionLocalFile" ]]; then
   msg "Updating $VersionLocalFile file."
   if [[ -n "$(p4 files "$VersionDepotFile" 2>/dev/null)" ]]; then
      p4 edit "$VersionLocalFile" || bail "Could not do: p4 edit \"$VersionLocalFile\""
      echo "Rev. SDP/MultiArch/$NewMajorVersion/$NewReleaseCL ($NewReleaseDate)." > "$VersionLocalFile"
      p4 diff "$VersionLocalFile"
   else
      # First-ever release: Version has never been created on this stream.
      msg "$VersionDepotFile does not exist yet -- adding it (first release on this stream)."
      echo "Rev. SDP/MultiArch/$NewMajorVersion/$NewReleaseCL ($NewReleaseDate)." > "$VersionLocalFile"
      p4 add "$VersionLocalFile" || bail "Could not do: p4 add \"$VersionLocalFile\""
   fi
else
   errmsg "Could not determine local file for $VersionDepotFile"
fi

msg "\\n${H1}\\nLog is: $Log"

exit "$ErrorCount"
