.POSIX:


pod2man = \
	share/man/man1/x.1 \
	share/man/man1/z.1 \


derived-assets = \
	var/respiro                                       \
	var/result-home                                   \
	var/result-system                                 \
	$(pod2man)                                        \
	$(XDG_STATE_HOME)/ssh/conn                        \
	$(XDG_CONFIG_HOME)/ssh/id_rsa.pub                 \
	$(XDG_CONFIG_HOME)/ssh/config                     \
	$(XDG_CONFIG_HOME)/gnupg/gpg-agent.conf           \
	$(XDG_CONFIG_HOME)/xmobar/xmobarrc                \
	$(XDG_DATA_HOME)/euandreh/e.list.txt              \
	$(HOME)/.ssh                                      \


all: $(derived-assets) tilde

mnt: $(HOME)/mnt/suyin/enc $(HOME)/mnt/crypt/.keep

umnt:
	cryfs-unmount $(HOME)/mnt/crypt
	fusermount -u $(HOME)/mnt/suyin

tilde:
	@cd $(PRIV_CONFIG) && $(MAKE)


var/respiro:
	fallocate -l 8G $@

var/result-home:
	guix build -r $@ -v3 -f etc/guix/home.scm

var/result-system:
	guix build -r $@ -v3 -f etc/guix/system.scm

share/man/man1/x.1 share/man/man1/z.1:
	pod2man bin/`basename $@ .1` > $@

share/man/man1/x.1: bin/x
share/man/man1/z.1: bin/z

$(XDG_STATE_HOME)/ssh/conn:
	mkdir -p $@

$(XDG_CONFIG_HOME)/ssh/id_rsa.pub:
	gpg --export-ssh-key eu@euandre.org > $@
	chmod 600 $@

$(XDG_CONFIG_HOME)/ssh/config: $(XDG_CONFIG_HOME)/ssh/config.tmpl
	envsubst < $(XDG_CONFIG_HOME)/ssh/config.tmpl > $@

$(XDG_CONFIG_HOME)/gnupg/gpg-agent.conf: $(XDG_CONFIG_HOME)/gnupg/gpg-agent.conf.tmpl
	cp $(XDG_CONFIG_HOME)/gnupg/gpg-agent.conf.tmpl $@
	printf 'pinentry-program ' >> $@
	command -v pinentry-gtk-2  >> $@

$(XDG_CONFIG_HOME)/xmobar/xmobarrc:
	cd $(@D) && ln -s `hostname` xmobarrc

$(HOME)/.ssh:
	ln -s $(XDG_CONFIG_HOME)/ssh $@

$(HOME)/mnt/suyin/enc:
	if [ ! -e $(@D) ]; then mkdir -p $(@D); fi
	sshfs suyin: $(@D)

$(HOME)/mnt/crypt/.keep: $(HOME)/mnt/suyin/enc
	if [ ! -e $(@D) ]; then mkdir -p $(@D); fi
	if [ ! -e $@    ]; then cryfs $? $(@D); fi
	touch $@

$(HOME)/txt/TODOs.adoc:
	mkdir -p $(@D)
	touch $@

$(HOME)/txt/scratch.txt:
	mkdir -p $(@D)
	touch $@

$(XDG_DATA_HOME)/euandreh/e.list.txt: opt/aux/gen-e-list.sh \
		$(HOME)/txt/TODOs.adoc $(HOME)/txt/scratch.txt
	sh opt/aux/gen-e-list.sh > $@



check-shellcheck:
	git ls-files | \
		grep -v '^share/aux/' | \
		sor 'test -f' | \
		xargs awk '/^#!\/bin\/sh$$/ { print FILENAME } { nextfile }' | \
		xargs shellcheck -x

check-perlcritic:
	git ls-files | \
		sor 'test -f' | \
		xargs awk '/^#!\/usr\/bin\/env perl$$/ { print FILENAME } { nextfile }' | \
		xargs perlcritic --exclude=subroutine ||:

FIXME-excludes = \
	':(exclude)Makefile' \
	':(exclude)bin/aux' \
	':(exclude)etc/git/ignore' \
	':(exclude)opt/aux/gen-e-list.sh'
check-fixme:
	if git grep FIXME -- $(FIXME-excludes); then \
		printf 'Leftover FIXME markers.\n' >&2; \
		exit 1; \
	fi

check-dirty-public:
	if ! git diff --quiet || ! git diff --quiet --staged; then \
		printf 'Dirty ~/.usr/ repository.\n' >&2; \
		exit 1; \
	fi
	if git status --short --branch --porcelain | \
			head -n1 | grep -E '(ahead|behind)'; then \
		printf '~/.usr/ of sync with origin.\n' >&2; \
		exit 1; \
	fi

check-dirty-private:
	if ! git -C $(PRIV_CONFIG) diff --quiet || \
			! git -C $(PRIV_CONFIG) diff --quiet --staged; then \
		printf 'Dirty private tilde repository.\n' >&2; \
		exit 1; \
	fi
	if git -C $(PRIV_CONFIG) status --short --branch --porcelain | \
			head -n1 | grep -E '(ahead|behind)'; then \
		printf 'Private of sync with origin.\n' >&2; \
		exit 1; \
	fi

check-dirty-pass:
	if ! git -C $(PASSWORD_STORE_DIR) diff --quiet || \
			! git -C $(PASSWORD_STORE_DIR) diff --quiet --staged; then \
		printf 'Dirty password store repository.\n' >&2; \
		exit 1; \
	fi
	if git -C $(PASSWORD_STORE_DIR) status --short --branch --porcelain | \
			head -n1 | grep -E '(ahead|behind)'; then \
		printf 'Password store rut of sync with origin.\n' >&2; \
		exit 1; \
	fi

check-opt:
	find opt/tests/ -name '*.sh' -exec sh {} ';'

check-pod:
	podchecker bin/z

check-aliases:
	for alias in abuse admin hostmaster postmaster; do \
		uuid | email -s "\"$$alias\" alias test from $$(id -un)@$$(hostname)" "$$alias@euandre.org"; \
	done
	uuid | email -s "lawtech->toph" -f andre@pilotis.net
	uuid | email -s "toph->lawtech"    andre@pilotis.net

check: check-fixme              \
                check-dirty-public check-dirty-private check-dirty-pass        \
		check-opt check-pod check-aliases
	@cd $(PRIV_CONFIG) && $(MAKE) $@

clean:
	rm -rf $(derived-assets)
	@cd $(PRIV_CONFIG) && $(MAKE) $@

VM-DIR = /srv/www/s/vm
upload:
	rsync \
		--rsync-path='sudo -u deployer rsync' \
		-avP \
		--exclude mint-x86_64-cinnamon.qcow2 \
		 $(XDG_STATE_HOME)/vm/qemu/ euandre.org:$(VM-DIR)/qemu/
	ssh euandre.org find $(VM-DIR)/qemu/ -type f | \
		sed 's|^$(VM-DIR)/qemu/||' | \
		sed 's|\.qcow2$$||'        | \
		ssh euandre.org sudo -u deployer dd of=$(VM-DIR)/vms.txt