#!/bin/bash 
#
#
# example usage - you must have your repos checked out on the branch you
# expect to tag.
#
# USAGE: repoRoot relengRoot repoURL [repoURL]*
#    repoRoot   - absolute path to a folder containing cloned git repositories
#    relengRoot - asolute path to releng project containing map files
#    repoURL    - git repository urls to tag, must match entries in the map files
# EXAMPLE: git-map.sh  \
#   /opt/pwebster/git/eclipse \
#   /opt/pwebster/workspaces/gitMigration/org.eclipse.releng \
#   git://git.eclipse.org/gitroot/platform/eclipse.platform.runtime.git \
#   git://git.eclipse.org/gitroot/platform/eclipse.platform.ui.git >maps.txt
# examine the file
# grep -v ^OK maps.txt >run.txt
# /bin/bash run.txt
#

PLATFORM=$( uname -s )

get_repo_tag () {
	REPO=$1
	REPO_DIR=$( basename $REPO .git )
	cd $ROOT/$REPO_DIR
	REPO_COMMIT=$( git rev-list -1 HEAD  )
	NEW_DATE=$( git log -1 --format="%ct" "$REPO_COMMIT" )
	if [ "$PLATFORM" == "Darwin" ]; then
		echo v$( date -u -j -f "%s" "$NEW_DATE" "+%Y%m%d-%H%M" )
	else
		echo v$( date -u --date="@$NEW_DATE"  "+%Y%m%d-%H%M" )
	fi
}

tag_repo_commit () {
	REPO=$1
	REPO_DIR=$( basename $REPO .git )
	NEW_TAG=$( get_repo_tag $REPO )
	cd $ROOT/$REPO_DIR
	REPO_COMMIT=$( git rev-list -1 HEAD  )
	if ! ( git log -1  --format="%d" "$REPO_COMMIT" | grep "[ (]$NEW_TAG[,)]" >/dev/null); then
		OLD_TAG=$( git log --pretty=oneline --decorate | grep "[ (][vI][0-9]" \
			| head -1 | sed 's/^[^(]* (.*\([vI][0-9][0-9][0-9][0-9]\)/\1/g'   | sed 's/[,)].*$//g' ) 
		SUBMISSION_ARGS="$SUBMISSION_ARGS $REPO $OLD_TAG $NEW_TAG"
		echo Executed: cd $ROOT/$REPO_DIR \; git tag "$NEW_TAG" "$REPO_COMMIT"
		cd $ROOT/$REPO_DIR ; git tag "$NEW_TAG" "$REPO_COMMIT"
	fi
}

update_map () {
	#echo update_map "$@"
	REPO=$1
	REPO_DIR=$( basename $REPO .git )
	MAP=$2
	cd $ROOT/$REPO_DIR
	grep "repo=${REPO}," "$MAP" >/tmp/maplines_$$.txt
	if [ ! -s /tmp/maplines_$$.txt ]; then
		return
	fi
	while read LINE; do
		LINE_START=$( echo $LINE | sed 's/^\([^=]*\)=.*$/\1/g' )
		PROJ_PATH=$( echo $LINE | sed 's/^.*path=//g' )
		CURRENT_TAG=$( echo $LINE | sed 's/.*tag=\([^,]*\),.*$/\1/g' )
		LAST_COMMIT=$( git rev-list -1 HEAD -- "$PROJ_PATH" )
        if [ -z "$LAST_COMMIT" ]; then
            echo "#SKIPPING $LINE_START, no commits for $PROJ_PATH"
            continue
        fi
		
		if ! ( git tag --contains $LAST_COMMIT | grep $CURRENT_TAG >/dev/null ); then
			NEW_DATE=$( git log -1 --format="%ct" "$LAST_COMMIT" )		
			if [ "$PLATFORM" == "Darwin" ]; then
				NEW_TAG=v$( date -u -j -f "%s" "$NEW_DATE" "+%Y%m%d-%H%M" )
			else
				NEW_TAG=v$( date -u --date="@$NEW_DATE"  "+%Y%m%d-%H%M" )
			fi
			
			if ! ( git log -1  --format="%d" "$LAST_COMMIT" | grep "[ (]$NEW_TAG[,)]" >/dev/null); then
				echo Executed: cd $ROOT/$REPO_DIR \; git tag \"$NEW_TAG\" "$LAST_COMMIT"
				cd $ROOT/$REPO_DIR ; git tag "$NEW_TAG" "$LAST_COMMIT"
			fi
			echo sed "'s/$LINE_START=GIT,tag=$CURRENT_TAG/$LINE_START=GIT,tag=$NEW_TAG/g'" $MAP \>/tmp/t1_$$.txt \; mv /tmp/t1_$$.txt $MAP
		else
			echo OK $LINE_START $CURRENT_TAG 
		fi
	done </tmp/maplines_$$.txt
	rm -f /tmp/maplines_$$.txt
	echo \( cd $ROOT/$REPO_DIR \; git push --tags \)
}


STATUS=OK
STATUS_MSG=""
LATEST_SUBMISSION=""
SUBMISSION_ARGS=""

if [ $# -lt 3 ]; then
  echo "USAGE: $0 repoRoot relengRoot repoURL [repoURL]*"
  exit 1
fi


ROOT=$1; shift
RELENG=$1; shift
REPOS="$@"



for REPO in $REPOS; do
	cd $ROOT
	tag_repo_commit $REPO
	MAPS=$( find $RELENG -name "*.map" -exec grep -l "repo=${REPO}," {} \; )
	if [ ! -z "$MAPS" ]; then
		for MAP in $MAPS; do
			update_map $REPO $MAP
		done
	fi
done

echo "/bin/bash git-submission.sh $ROOT $SUBMISSION_ARGS > report.txt"
