#! /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="/usr/share/moodle-lang-cronbuild-common/moodle.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=""
zip_branch=""
zip_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 "$zip_branch" -a -n "$zip_commit" ] \
		&& git branch -f "$zip_branch" "$zip_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 new="`wget -q -O - "$langpacksurl" \
		| xsltproc --html "$xsltfilename" - \
		| grep -m 1 "^$langpackname\\.zip|"`"

	local newtextdate="`echo "$new" \
		| cut -d'|' -f 2`"
	[ -n "$newtextdate" ] || updsrc_err 1 "ERR set newtextdate"

	local newdate="`echo "$newtextdate" \
		| sed -n -r 's/^[[:space:]]*([0-9]+)-([0-9]+)-([0-9]+)[[:space:]]*$/\1\2\3/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"

	zip_branch="$langbranchprefix$langpackname/zip"
	zip_commit="`git rev-parse "$zip_branch"`"
	[ -n "$zip_commit" ] || updsrc_err 1 "ERR set zip_commit"
	git branch -f "$zip_branch" "$zip_commit" || updsrc_err 1 "ERR git branch -f $zip_branch $zip_commit"

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

	# Get $langfilename
	local zipdir="$tmpdir/zip"
	local langfilename="$langpackname.zip"

	local newurl="`echo "$new" \
		| cut -d'|' -f 4`"
	[ -n "$newurl" ] || updsrc_err 1 "ERR set newurl"

	mkdir "$zipdir"
	wget -q	-O "$zipdir/$langfilename" "$newurl" || updsrc_err 1 "ERR no wget $newurl"

	# Update ALT/moodle-lang-$langname/zip
	local workdir="$tmpdir/work"
	mkdir "$workdir"
	pushd "$workdir"
	git checkout -f "$zip_branch"
	git ls-tree HEAD | awk '{print $4}' | xargs git rm -r -f ||:
	unzip -q "$zipdir/$langfilename"
	git add "$langpackname"
	git commit --author='? <?>' --date="$(LANG=C date -u -R -r "$langpackname")" \
		-m "$langfilename build $newdate" ||:

	# Remove the "random" files
	find . -type f -name '*~' -print0 | xargs -0 rm -f ||:

	# Fix permissions
	find . -type f -perm +6111 ! -name '*.sh' -print0 | xargs -0 chmod a-xs ||:

	# Update ALT/moodle-lang-$langpackname/lang
	if [ "x$(git status -s -uno)" = "x" ]; then
		git branch -f "$lang_branch"
	else
		local commitmsg="Fix permissions"

		if [ "$lang_commit" = "$zip_commit" ]; then
			git branch -f "$lang_branch"
		fi

		git symbolic-ref HEAD "refs/heads/$lang_branch"

		if [ "$lang_commit" = "$zip_commit" ]; then
			git commit -a -s -m "$commitmsg" ||:
		else
			git reset --mixed "$lang_branch"
			git merge -s ours --no-commit "$zip_branch" ||:
			git commit -a -s -m "$commitmsg

	$(cat "$GIT_DIR/MERGE_MSG")
" ||:
		fi
	fi
	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"
}
