#!/bin/sh
set -e

VFLAG="$HOME/bin/dist/pull.verbose"

vmsg() {
	echo "dist/pull: $*" >&2
}

on_main() {
	[ "$(git symbolic-ref HEAD 2>/dev/null)" = refs/heads/main ]
}

if [ "$1" != "--child" ]; then
	export PATH="$HOME/bin:$PATH"

	if ! git var GIT_AUTHOR_IDENT >/dev/null; then
		vmsg "removing broken git configuration file"
		if [ -e ~/.config/git/config ]; then
			mv -vf ~/.config/git/config ~/.config/git/config.bad ||
			mv -vf ~/.config/git        ~/.config/git.bad
		fi
		if [ -e ~/.gitconfig ]; then
			rm -vf ~/.gitconfig
		fi
		touch "$VFLAG"
	fi

	if (cd ~/bin && on_main); then
		vmsg "updating ~/bin"
		(cd ~/bin && git pull --ff-only)
	else
		vmsg "skipping ~/bin (not on main branch)"
	fi

	exec "$0" --child
else
	if [ $(date +%d) -eq 7 ]; then
		vmsg "compacting ~/bin"
		(cd ~/bin && nice git gc)
	fi

	vmsg "updating authorized_keys"
	sshkeyupdate -q

	if [ -d ~/.dotfiles ]; then
		(cd ~/.dotfiles
		if on_main; then
			vmsg "updating ~/.dotfiles"
			git fetch origin
			git merge --ff-only origin/main || {
				git stash save "dist/pull on $(date)"
				git checkout -f main
				git reset --hard origin/main
			}
		else
			vmsg "skipping ~/.dotfiles (not on main branch)"
		fi)

		if [ $(date +%d) -eq 14 ]; then
			vmsg "compacting ~/.dotfiles"
			(cd ~/.dotfiles && nice git gc)
		fi

		vmsg "running ~/.dotfiles/install"
		~/.dotfiles/install -u
	fi

	wait

	# cause 'chronic' to send a cronmail for this run
	if [ -e "$VFLAG" ]; then
		rm -f "$VFLAG"; exit 1
	fi
fi
