--- title: dirty-haskell.org´s git-based publication system published: 2016-12-08 tags: Blog Software --- Initially I set up dirty-haskell.org (which is currently powered by [hakyll]) to [rsync] the results of compiling up onto my server whenever I intone `dirty-haskell deploy`{.sh}. In my ever continuing quest to have my life consist mostly of an array of git repositories however this didn't seem satisfactory. Therefore I configured my [gitolite] instance to automatically compile und publish the current git version whenever I push to `master`. Gitolite provides us with facilities to install [githooks]. Publishing will be handled by `post-update`: ~~~{.sh} #!/usr/bin/env zsh touchedMaster=false for ref ($@); do [[ ${ref} =~ .*/master$ ]] || continue touchedMaster=true break done $touchedMaster || exit 0 { checkoutDir=/srv/git/checkouts/$(basename $(pwd)) print ${checkoutDir} mkdir -p $(dirname ${checkoutDir}) unset GIT_DIR if [[ -d ${checkoutDir} ]]; then git -C ${checkoutDir} fetch origin else rm -rf ${checkoutDir} git clone --depth 1 file://$(pwd) ${checkoutDir} fi git -C ${checkoutDir} checkout -f origin/master { umask 0022 cd ${checkoutDir} script=$(mktemp) delScript() { rm -v ${script} } trap delScript EXIT chmod +x ${script} >${script} <&1 | stdbuf -o 0 tr '\r' '\n' | logger --id=$$ -p daemon.info -t dirty-haskell ~~~ The script checks if the master branch was moved to a new commit or otherwise touched and, if so, clones a copy of the repo to a temporary directory and runs hakyll´s deploy command in it, which is set to rsync the compiled version to a folder where it´ll be picked up by nginx. ## Update ## It works. [hakyll]: https://jaspervdj.be/hakyll/ [rsync]: https://git.samba.org/rsync.git [gitolite]: http://gitolite.com [githooks]: http://githooks.com