#!/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 - absolute 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="%ci" "$REPO_COMMIT" )
	if [ "$PLATFORM" == "Darwin" ]; then
		echo v$( date -u -j -f "%s" "$NEW_DATE" "+%Y%m%d-%H%M" )
	else
		echo v$( date --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 "#OK 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
	dos2unix /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="%ci" "$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 --date="$NEW_DATE"  "+%Y%m%d%H%M" )
			fi
			
			if ! ( git log -1  --format="%d" "$LAST_COMMIT" | grep "[ (]$NEW_TAG[,)]" >/dev/null); then
				SUBMISSION_ARGS="$SUBMISSION_ARGS $REPO $CURRENT_TAG $NEW_TAG"
				echo "#OK 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
			#echo \( cd $ROOT/$REPO_DIR \; git commit -a -m \"Update map file for "$LINE_START" by auto tag script\" \)
		else
			echo OK $LINE_START $CURRENT_TAG 
		fi
	done </tmp/maplines_$$.txt
	rm -f /tmp/maplines_$$.txt
	echo \( cd $ROOT/$REPO_DIR \; git commit -a -m \"Update map file for "$REPO_DIR" repository by auto tag script\" \)
	echo \( cd $ROOT/$REPO_DIR \; git push \; 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"
