#! /bin/sh -efu
#
# Copyright (C) 2011  Aleksey Avdeev <solo@altlinux.ru>
#
# Common shell functions for cronbuild scripts.
#
# This file is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
#

#
# $1 -- specfile
#

# Set packagespecname
packagespecname="$1"

. moodle-lang-cronbuild-common-sh-functions

xsltfilename="%moodle_lang_cronbuildcommondir/moodle%moodlebranch.lang.xslt"

PROG="${0##*/}"
tmpdir=""

head_branch="`cat .git/HEAD | sed -r 's@[[:space:]]*ref:[[:space:]]+(refs/heads/|)@@'`"
head_commit="`git rev-parse "$head_branch"`"

srpms_branch="`get_mntsrpmsbranch`"
srpms_commit=""
lang_branch=""
lang_commit=""

updsrc_err()
{
	#
	# $1 -- exit code
	# $2 -- msg
	#

	echo 'cronbuild-update-source: Reset branches for exit'
	git checkout -f "$head_branch"
	git reset --hard "$head_commit"

	[ -n "$srpms_branch" -a -n "$srpms_commit" ] \
		&& git branch -f "$srpms_branch" "$srpms_commit"

	[ -n "$lang_branch" -a -n "$lang_commit" ] \
		&& git branch -f "$lang_branch" "$lang_commit"

	[ -n "$tmpdir" -a -d "$tmpdir" ] && rm -rf "$tmpdir"
	exit_err "$1" "$2"
}

update_source()
{
	# Use srpms branch
	pull_mntsrpmsbranch || updsrc_err 1 "ERR srpmsbranch pulling"
	if [ -n "$srpms_branch" -a "$srpms_branch" != "$head_branch" ]; then
		git branch -f "$srpms_branch"
		git checkout "$srpms_branch" || updsrc_err 1 "ERR checkout $srpms_branch"
	fi

	local langpackname="`get_langpackname "$packagespecname"`"
	[ -n "$langpackname" ] || updsrc_err 1 "ERR set langpackname"

	local moodlebranch="`get_moodlebranch "$packagespecname"`"
	[ -n "$moodlebranch" ] || updsrc_err 1 "ERR set moodlebranch"

	local langpacksurl="`get_langpacksurl "$moodlebranch"`"
	[ -n "$langpacksurl" ] || updsrc_err 1 "ERR set langpacksurl"

	local newtextdate="`wget -q -O - "$langpacksurl" \
		| xsltproc --html "$xsltfilename" - \
		| sed -n -r "/^[[:space:]]*$langpackname\\.zip[[:space:]]+[0-9-]+[[:space:]]+[0-9:]+[[:space:]]+[A-Z]+([[:space:]].*)?\$/{
			s/^[[:space:]]*$langpackname\\.zip[[:space:]]+([0-9-]+)[[:space:]]+([0-9:]+)[[:space:]]+([A-Z]+)([[:space:]].*)?\$/\1 \2 \3/p;
			q
		}"`"
	[ -n "$newtextdate" ] || updsrc_err 1 "ERR set newtextdate"

	local newdate="`echo "$newtextdate" \
		| sed -n -r 's/^[[:space:]]*([0-9]+)-([0-9]+)-([0-9]+)[[:space:]]+([0-9]+):([0-9]+)[[:space:]]+[A-Z]+[[:space:]]*$/\1\2\3\4\5/p'`"
	[ -n "$newdate" ] || updsrc_err 1 "ERR set newdate"

	local olddate="`get_packageverionrel "$packagespecname" \
		| sed -n -r 's/^[[:space:]]*[0-9.]+\.([0-9]+)-alt[^-]+$/\1/p'`"
	[ -n "$olddate" ] || updsrc_err 1 "ERR set olddate"

	# Check release update
	[ $newdate -gt $olddate ] || updsrc_err 0 "Warring! No file $langpackname.zip update"

	# Restore branches
	gear-rules-restore-branches -f

	GIT_DIR="$(git rev-parse --git-dir)"
	GIT_DIR="$(readlink -ev -- "$GIT_DIR")"
	export GIT_DIR

	local langbranchprefix="`get_langbranchprefix "$moodlebranch"`"
	[ -n "$langbranchprefix" ] || updsrc_err 1 "ERR set langbranchprefix"

	lang_branch="$langbranchprefix$langpackname/lang"
	lang_commit="`git rev-parse "$lang_branch"`"
	[ -n "$lang_commit" ] || updsrc_err 1 "ERR set lang_commit"
	git branch -f "$lang_branch" "$lang_commit" || updsrc_err 1 "ERR git branch -f $lang_branch $lang_commit"

	# Create tmpdir
	tmpdir="$(mktemp -dt "$PROG.XXXXXXXX")"

	# Get $langfilename
	local zipdir="$tmpdir/zip"
	local langfilename="$langpackname.zip"
	mkdir "$zipdir"
	pushd "$zipdir"
	wget "$langpacksurl/$langfilename" || updsrc_err 1 "ERR no wget $langpacksurl/$langfilename"
	popd

	# Update ALT/moodle2.*-lang-$langname/lang
	local workdir="$tmpdir/work"
	mkdir "$workdir"
	pushd "$workdir"
	git checkout -f "$lang_branch"
	git ls-tree HEAD | awk '{print $4}' | xargs git rm -r -f ||:
	unzip -q "$zipdir/$langfilename"
	git add "$langpackname"
	git commit --author='? <?>' --date="$newtextdate" \
		-m "$langfilename build $newtextdate" ||:

	popd
	rm -rf "$tmpdir"

	# Update srpms branch
	git checkout -f "$head_branch" || updsrc_err 1 "ERR git checkout -f $head_branch"

	# Set Release
	local numrelease="1"

	sed -r -i "
/^[[:space:]]*%define[[:space:]]+/{
	s/^([[:space:]]*%define[[:space:]]+packagedate[[:space:]]+)[0-9.]+([[:space:]]*)\$/\\1$newdate\\2/
}
/^[[:space:]]*Release:[[:space:]]+/{
	s/^([[:space:]]*Release:[[:space:]]+(.*[[:space:]]|)alt)[0-9][^[:space:]]*(|[[:space:]].*)\$/\\1$numrelease\\3/
}" "$packagespecname" || updsrc_err 1 "ERR sets Release"

	#Add changelog
	local adate=$(date +"%Y%m%d")
	add_changelog -e "- repocop cronbuild $adate. At your service.
- $langfilename build $newtextdate" \
	"$packagespecname" || updsrc_err 1 "ERR add_changelog -e ... $packagespecname"

	# Get commitmsg
	local commitmsg="`get_commitmsg "$packagespecname"`"
	[ -n "$commitmsg" ] || updsrc_err 1 "ERR set commitmsg"

	# Commit spec
	git add "$packagespecname" || updsrc_err 1 "git add $packagespecname"
	git commit -m "spec: Update version to $commitmsg" "$packagespecname" || updsrc_err 1 "git commit -m ... $packagespecname"

	# Merge source
	git merge -s ours "$lang_branch" || updsrc_err 1 "git merge -s ours $lang_branch"

	# Set default branch
	if [ -n "$srpms_branch" -a "$srpms_branch" != "$head_branch" ]; then
		git branch -f "$head_branch"
		git checkout "$head_branch" || updsrc_err 1 "ERR checkout $head_branch"
	fi

	# Use gear-update-tag
	gear-update-tag -ac || updsrc_err 1 "ERR gear-update-tag -ac"
}
