#!/bin/bash
#
# Copyright (c) 2021-2022 Amlogic, Inc. All rights reserved.
#
# SPDX-License-Identifier: MIT
#

get_repo_path() {
	for keyword in $keyline; do
		if [[ $keyword == $pattern* ]]; then
			repo_path=`echo ${keyword#*${pattern}} | sed 's/\"//g'`
			break;
		fi
	done
}

cherry_pick() {
	if [ -d "$repo_path" ]; then
		pushd $repo_path > /dev/null
		git fetch ssh://${GERRIT_SERVER}:${GERRIT_PORT}/${GERRIT_PROJECT} ${GERRIT_REFSPEC}
		git cherry-pick FETCH_HEAD
		if [ "$?" -ne 0 ]; then
			git status
			git log -1
			echo -e "\nFailed to apply patch!\n"
			exit 1
		fi
		popd > /dev/null
	else
		echo -e "\nNo such directory! $repo_path\n"
		exit 1
	fi
}

apply_patch_by_change_number() {
	[ -z "$GERRIT_CHANGE_NUMBER" -o -z "$GERRIT_PROJECT" -o -z "$GERRIT_REFSPEC" ] && [ -z "$MANUAL_GERRIT_CHANGE_NUMBER" ] && return

	if [ -n "$GERRIT_CHANGE_NUMBER" ] && [ -n "$GERRIT_PROJECT" ] && [ -n "$GERRIT_REFSPEC" ]; then
		echo -e "======== Auto-applying Gerrit change $GERRIT_CHANGE_NUMBER on Project $GERRIT_PROJECT ========"
	elif [ -n "$MANUAL_GERRIT_CHANGE_NUMBER" ]; then
		ssh -p $GERRIT_PORT $GERRIT_SERVER gerrit query --format=JSON --current-patch-set status:open change:$MANUAL_GERRIT_CHANGE_NUMBER > $GERRIT_QUERY_RESULT
		GERRIT_PROJECT=$(jq -r '.project // empty' $GERRIT_QUERY_RESULT)
		GERRIT_REFSPEC=$(jq -r '.currentPatchSet.ref // empty' $GERRIT_QUERY_RESULT)
		echo -e "======== Manually applying Gerrit change $MANUAL_GERRIT_CHANGE_NUMBER on Project $GERRIT_PROJECT ========"
	fi

	keyline=`grep "name=\"$GERRIT_PROJECT\"" $CURRENT_MANIFEST`
	pattern="path="
	get_repo_path

	cherry_pick
	echo -e "======== Done ========\n"
}

apply_patch_by_gerrit_topic() {
	[ -z "$MANUAL_GERRIT_TOPIC" ] && return

	ssh -p $GERRIT_PORT $GERRIT_SERVER gerrit query --format=JSON --current-patch-set status:open topic:$MANUAL_GERRIT_TOPIC > $GERRIT_QUERY_RESULT
	GERRIT_PROJECTS=$(jq -r '.project // empty' $GERRIT_QUERY_RESULT)
	GERRIT_REFSPECS=$(jq -r '.currentPatchSet.ref // empty' $GERRIT_QUERY_RESULT)

	echo -e "======== Manually applying Gerrit Topic: $MANUAL_GERRIT_TOPIC ========"

	i=1
	for GERRIT_PROJECT in $GERRIT_PROJECTS; do
		echo "-------- Applying patch $i on Project $GERRIT_PROJECT --------"
		keyline=`grep "name=\"$GERRIT_PROJECT\"" $CURRENT_MANIFEST`
		pattern="path="
		get_repo_path

		GERRIT_REFSPEC=$(echo $GERRIT_REFSPECS | awk "{print \$$i}")
		cherry_pick
		echo -e "-------- Done --------\n"
		i=$((i+1))
	done

	i=$((i-1))
	[[ "$i" -eq 1 ]] && echo -e "======== Applied $i patch for $MANUAL_GERRIT_TOPIC ========\n"
	[[ "$i" -gt 1 ]] && echo -e "======== Applied $i patches for $MANUAL_GERRIT_TOPIC ========\n"
}

apply_patch_by_gerrit_url() {
	[ -z "$GIT_CHERRY_PICK" ] && return

	while IFS= read -r line
	do
		pattern=":29418/"
		for keyword in $line; do
			if [[ $keyword == *$pattern* ]]; then
				GIT_PROJECT=`echo ${keyword#*${pattern}} | sed 's/\"//g' | sed 's/\/>//g'`
				break;
			fi
		done

		echo -e "\n-------- Manually applying patch on Project $GIT_PROJECT --------"
		keyline=`grep "name=\"$GIT_PROJECT\"" $CURRENT_MANIFEST`
		pattern="path="
		get_repo_path

		if [ -d "$repo_path" ]; then
			pushd $repo_path > /dev/null
			cmd=`echo $line | sed -e 's/ssh:\/\/.*@scgit.amlogic.com/ssh:\/\/scgit.amlogic.com/'`
			eval $cmd
			if [ "$?" -ne 0 ]; then
				git status
				git log -1
				echo -e "-------- Failed to apply patch! --------"
				exit 1
			fi
			popd > /dev/null
		else
			echo "No such directory! $repo_path"
			exit 1
		fi
		echo -e "-------- Done --------\n"
	done <<< "$GIT_CHERRY_PICK"
}

[ -z "$OUTPUT_DIR" ] && OUTPUT_DIR=$PWD/output
[ ! -d $OUTPUT_DIR ] && mkdir -p $OUTPUT_DIR

[ -z "$CURRENT_MANIFEST" ] && CURRENT_MANIFEST="$OUTPUT_DIR/curr_manifest.xml"
[ ! -f $CURRENT_MANIFEST ] && repo manifest -r -o $CURRENT_MANIFEST

[ -z "$GERRIT_PORT" ] && GERRIT_PORT="29418"
GERRIT_SERVER="scgit.amlogic.com"
GERRIT_QUERY_RESULT="$OUTPUT_DIR/changes.txt"

apply_patch_by_change_number
apply_patch_by_gerrit_topic
