#!/bin/sh

# DEBUG
#set -e -x

usage() {
	printf '%s <repodir> <htmldir>\n' "$0"
	exit 1
}

header() {
	cat <<!__EOF__
<!DOCTYPE HTML>
<html dir="ltr" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta http-equiv="Content-Language" content="en" />
<title>${name} - ${description}</title>
<base href="${baseurl}" />
<link rel="stylesheet" type="text/css" href="style.css" />
</head>
<body>
<center>
<h1><img src="logo.png" alt="" /> ${name}</h1>
<span class="desc">${description}</span><br/>
<a href="log.html">Log</a> |
<a href="files.html">Files</a> |
<a href="stats.html">Stats</a> |
<a href="readme.html">README</a> |
<a href="license.html">LICENSE</a>
</center>
<hr/>
<pre>
!__EOF__
}

footer() {
	cat <<!__EOF__
</pre>
<hr/>
<i><center>Powered by urmoms vibrator</center></i>
</body>
</html>
!__EOF__
}

# usage: repodir and htmldir must be set.
if test x"$1" = x"" || test x"$2" = x""; then
	usage
fi

# make absolute path to htmldir.
htmldir="$(readlink -f $2)"
mkdir -p "${htmldir}"

# repodir must be a directory to go to.
cd "$1" || usage

# project name
# TODO: if bare repo just remove .git suffix?
name=$(basename "$(pwd)")

# read .git/description.
description=""
test -f ".git/description" && description="$(cat '.git/description')"

# TODO: make configurable.
baseurl="http://cow.codemadness.org/gitlog/"

indexpage="log.html"

firstcommit=$(git log | grep '^commit ' | tail -n 1 | cut -f 2 -d ' ')

# make log per file.
# TODO: just link to commit/commit? save some space and time?
git ls-tree -r --name-only master | while read -r file; do
	test -e "${htmldir}/file/${file}.html" && continue

	d=$(dirname "${file}")
	mkdir -p "${htmldir}/file/${d}"

	header > "${htmldir}/file/${file}.html"
	git show "${firstcommit}"...master "${file}" | \
		sed -E 's@^commit (.*)$@commit <a href="commit/\1.html">\1</a>@g' >> "${htmldir}/file/${file}.html"
	footer >> "${htmldir}/file/${file}.html"
done

# make log with all commits.
header > "${htmldir}/log.html"
printf '<table border="0">' >> "${htmldir}/log.html"
git log --pretty='<tr><td align="right">%cD</td><td><a href="commit/%H.html">%H</a></td><td>%an</td><td>%s</td></tr>' >> "${htmldir}/log.html"
printf '</table>' >> "${htmldir}/log.html"
footer >> "${htmldir}/log.html"

# make diff for each commit (all files).
mkdir -p "${htmldir}/commit"
git log --pretty='%H' | while read -r commit; do
	test -e "${htmldir}/commit/${commit}.html" && continue
	header > "${htmldir}/commit/${commit}.html"
	git show "${commit}" >> "${htmldir}/commit/${commit}.html"
	footer >> "${htmldir}/commit/${commit}.html"
done 

# make index with file links.
header >> "${htmldir}/files.html"
git ls-tree -r master | sed -E 's@	(.*)$@	<a href="file/\1.html">\1</a>@g' >> "${htmldir}/files.html"
footer >> "${htmldir}/files.html"

# readme page
# find README file.
readme=""
for f in README README.md readme.md; do
	test -e "${f}" && readme="${f}"
done
# make page.
header > "${htmldir}/readme.html"
if test x"${readme}" != x""; then
	cat "${readme}" >> "${htmldir}/readme.html"
else
	echo "no README file found" >> "${htmldir}/readme.html"
fi
footer >> "${htmldir}/readme.html"

# license page
# find LICENSE file.
license=""
for f in LICENSE LICENSE.md; do
	test -e "${f}" && license="${f}"
done
# make page.
header > "${htmldir}/license.html"
if test x"${readme}" != x""; then
	cat "${license}" >> "${htmldir}/license.html"
else
	echo "unknown license" >> "${htmldir}/license.html"
fi
footer >> "${htmldir}/license.html"

# stats (authors).
header > "${htmldir}/stats.html"
git shortlog -n -s >> "${htmldir}/stats.html"
footer >> "${htmldir}/stats.html"

# symlink to index page.
ln -sf "$indexpage" "${htmldir}/index.html"
