#!/bin/sh

# "git-doc" is a clone of the git.git repository and has the master
# branch checked out. We update the working tree and prepare
# preformatted documentation pages, and install them in doc-htmlpages
# and doc-manapges subdirectories. When they are updated, they are
# pushed back into their own repositories next to the git.git
# repository.

unset GIT_DIR

: ${TOP=/srv/project/git}

MASTERREPO=$TOP/git.git/
MANREPO=$TOP/git-manpages.git/
HTMLREPO=$TOP/git-htmldocs.git/

target_repo () {
	TARGETVAR=$(echo "$1"REPO | tr 'a-z' 'A-Z') &&
	eval "echo \$$TARGETVAR"
}

DOCREPO=$(pwd) ;# "git-doc"
exec >:doc.log 2>&1

ID=$(cd "$MASTERREPO" && git rev-parse --verify refs/heads/master) || exit $?

tmp=`pwd`/.doctmp-$$
trap 'rm -f "$tmp".*' 0

(
	git pull --ff-only "$MASTERREPO" master &&
	git fetch --tags "$MASTERREPO"
) || exit $?

test $(git rev-parse --verify refs/heads/master) = "$ID" &&
NID=$(git describe --abbrev=4 "$ID") &&
test -n "$NID" ||  exit $?

git reset --hard

# Set up subrepositories
for type in man html
do
	test -d doc-${type}pages && continue
	(
		git init doc-${type}pages &&
		cd doc-${type}pages || exit
		TARGETREPO=$(target_repo $type) &&
		git pull "$TARGETREPO" master
	) &&
	rm -fr doc-$type-inst &&
	mkdir -p doc-$type-inst &&
	(
		cd doc-${type}pages && git archive HEAD
	) |
	(
		cd doc-$type-inst && tar xf -
	)
done

# The below used to contain this instead...
# MAN_BASE_URL="http://www.kernel.org/pub/software/scm/git/docs/"
dd='
	MAN_BASE_URL="git-htmldocs/"
	BLK_SHA1=YesPlease
	GNU_ROFF=YesPlease
	MAN_BOLD_LITERAL=YesPlease
'

if test -z "$DOC_FROM_SCRATCH"
then
	case "$NID" in
	?*-g*) ;;
	?*) DOC_FROM_SCRATCH=yes ;;
	esac
fi
if test -n "$DOC_FROM_SCRATCH"
then
	make clean &&
	rm -fr doc-html-inst doc-man-inst &&
	mkdir doc-html-inst doc-man-inst || exit
fi

DIFF=diff
export DIFF

make \
	-C Documentation -j 2 $dd \
	WEBDOC_DEST="$DOCREPO/doc-html-inst" install-webdoc || exit

make \
	-C Documentation -j 2 $dd \
	man1="$DOCREPO/doc-man-inst/man1" \
	man5="$DOCREPO/doc-man-inst/man5" \
	man7="$DOCREPO/doc-man-inst/man7" \
	man1dir="$DOCREPO/doc-man-inst/man1" \
	man5dir="$DOCREPO/doc-man-inst/man5" \
	man7dir="$DOCREPO/doc-man-inst/man7" install || exit

for type in html man
do
	find doc-$type-inst -type f |
	while read path
	do
		it=$(expr "$path" : doc-$type-inst/'\(.*\)') || continue
		t="doc-${type}pages/$it"
		test -f "$t" && diff -q "$path" "$t" && continue
		mkdir -p "$(dirname "$t")" &&
		echo ": $t" && rm -f "$t" && ln "$path" "$t" || exit
		( cd doc-${type}pages && git add "$it" )
	done || exit

	find doc-$type-inst -type f |
	sed -e 's|^doc-'$type'-inst/||' | sort >"$tmp.1" &&
	(cd doc-${type}pages && git ls-files | sort) >"$tmp.2" &&
	comm -13 "$tmp.1" "$tmp.2" |
	( cd doc-${type}pages && xargs rm -f -- ) || exit

	(
		cd doc-${type}pages

		case "$type" in
		html)
			TYPE='HTML docs'
			rm -f index.html
			ln -sf git.html index.html
			git add index.html
			;;
		man)
			TYPE='manpages'
			;;
		esac

		if git commit -a -m "Autogenerated $TYPE for $NID"
		then
			TARGETREPO=$(target_repo $type) &&
			git push "$TARGETREPO" master:master
		else
			echo "* No changes in $type docs"
		fi
	) || exit
done

echo '

*** ALL DONE ***
'
