#!/bin/bash
set -euo pipefail
IFS=$'\n\t'

# source libs
mydir=$(dirname $(realpath $0))
source $mydir/cloner-lib-general
source $mydir/cloner-lib-auth
source $mydir/cloner-lib-cfg
source $mydir/detector-lib-cfg


# interval - in minutes
interval=${cloner_interval:-0}
stampfile=$CCLONE_CACHE/last-check-time

# does it exist - if not, sync
[ -d $CCLONE_CACHE ] || mkdir $CCLONE_CACHE
[ -f $stampfile ] || echo 0 > $stampfile


now=$(date +"%s")
last=$(cat $stampfile)
diff=$(($now - $last))
mindiff=$(($interval * 60))
unset now last

if [ $diff -lt $mindiff ]
then
	echo "Limit not reached - not syncing now"
	exit 0
fi

# check and clone repo
submodules=${cloner_submodules:-0}
depth=${cloner_submodule_depth:-}

export HOME=$CCLONE_CACHE

prepareGitAuth $CONFIG_DIR

# without submodule support
if [ ! "x$submodules" = "x1" ] 
then
	mirror-main-repo $repo 
else
	mirror-recursive $repo $depth
fi

date +"%s" > $stampfile

# if detector is not enabled, quit quietly
if ! detectorRunCapable 
then
	exit 0
fi

source $mydir/detector-lib-git
source $mydir/detector-lib-general

detectorLoadConfig

repodir=$(gen-mirror-path $repo)

if detectorCheckFetchHead $repodir
then
	# nothing changed, just die
	exit 0
fi

# try to init cache
detectorTryInit $repodir

# first, solve commits
# branches that were deleted or merged
find $DET_BRANCHES -type f | sort | while read branchpath
do
	branch=$(basename $branchpath)
	if ! gitListBranches $repodir | grep -q "^$branch$"
	then
		echo "Unexistent branch <$branch>!!"
		# rm it, should be merget etc...
		rm $DET_BRANCHES/$branch
	fi
done

# new branches or new commits in curent branches
# firstly list master branch, to make first commits in it
gitPrefBranches $repodir | while read branch
do
	[ -f $DET_BRANCHES/$branch ] || touch $DET_BRANCHES/$branch
	oldsha=$(cat $DET_BRANCHES/$branch)
	newsha=$(git --git-dir $repodir show-ref --heads $branch  | cut -d' ' -f1)
	[ -z "$oldsha" ] || oldsha=$oldsha..
	# walk through every commit in branch (since last change)
	for commitId in $(git --no-pager --git-dir $repodir log --reverse --format="%H" $oldsha$branch)
	do
		if detectorCheckCommit $commitId
		then
			# commit was not processed - start
			# COMMIT = $commitId
			# COMMIT_AUTHOR = $author
			author=$(git --git-dir $repodir log $commitId -1 --format="%an <%ae>")
			# COMMIT_ABBREV
			abbr=$(git --git-dir $repodir log $commitId -1 --format="%h")
			# COMMIT_LOG
			log=$(git --git-dir $repodir log $commitId -1 --format="%s")
			# BRANCH = $branch
			# PORJECT_NAME = $cloner_project_name

			set +e
			COMMIT="$commitId" \
				COMMIT_AUTHOR="$author" \
				COMMIT_BRANCH="$branch" \
				COMMIT_ABBREV="$abbr" \
				COMMIT_LOG="$log" \
				PROJECT_NAME="$cloner_project_name" \
				notify-commit
			rc=$?
			[ $rc -eq 0 ] || echo "Notify $branch/$commitId: return code = $rc"
			set -e
			detectorSaveCommit $commitId			
		fi

	done
	echo $newsha > $DET_BRANCHES/$branch
done


# solve tags - remove nonexistent refs
find $DET_TAGS -type f | sort |  while read tagname
do
	tag=$(basename $tagname)	
	if !  git --git-dir="$repodir" rev-parse "tags/$tag" > /dev/null 2>&1
	then
		echo "Removing tag: $tag (was [$(cat $tagname)])"
		rm $tagname
	fi
done

# tags that changed or were pushed as new
gitListTags $repodir | while read tagname
do
	[ -f $DET_TAGS/$tagname ] || touch $DET_TAGS/$tagname
	oldsha=$(cat $DET_TAGS/$tagname)
	newsha=$(git --git-dir $repodir show-ref --tags $tagname | cut -d' ' -f1)
	if ! [ "$oldsha" = "$newsha" ] 
	then
		# TAG_HASH = $newsha
		# TAG_NAME = $tagname
		# TAG_AUTHOR
		author=$(git --git-dir $repodir log $newsha -1 --pretty=format:"%an <%ae>")
		# TAG_ABBREV
		abbr=$(git --git-dir $repodir log $newsha -1 --format="%h")
		# TAG_LOG
		log=$(git --git-dir $repodir log $newsha -1 --format="%s")
		# PROJECT_NAME = $cloner_project_name
		
		# call the notify script
		set +e
		TAG_HASH="$newsha" \
			TAG_NAME="$tagname" \
			TAG_AUTHOR="$author" \
			TAG_ABBREV="$abbr" \
			TAG_LOG="$log" \
			PROJECT_NAME="$cloner_project_name" notify-tag
		rc=$?
		[ $rc -eq 0 ] || echo "Notify $tagname: return code = $rc"
		set -e
	fi
	echo $newsha > $DET_TAGS/$tagname
done

# save hash to keep things clear
detectorSumPersist $repodir