#!/bin/sh
# This script can be used to add git-annex metadata to files when they're
# committed.
#
# Copyright 2014 Joey Hess <id@joeyh.name>
# License: GPL-3+

extract="$(git config metadata.extract || true)" 
want="$(perl -e 'print (join("|", map {s/_/ /g; "^$_ - "} (split " ", shift())))' "$extract")"

if [ -z "$want" ]; then
	exit 0
fi

echo "$want"

case "$(git config --bool metadata.overwrite || true)" in
	true)
		overwrite=1
	;;
	*)
		overwrite=""
	;;
esac

addmeta () {
	file="$1"
	field="$2"
	value="$3"
	afield="$(echo "$field" | tr ' ' _)"
	if [ "$overwrite" ]; then
		p="$afield=$value"

	else
		p="$afield?=$value"
	fi
	git -c annex.alwayscommit=false annex metadata "$file" -s "$p" --quiet
}

if git rev-parse --verify HEAD >/dev/null 2>&1; then
	against=HEAD
else
	# Initial commit: diff against an empty tree object
	against=4b825dc642cb6eb9a060e54bf8d69288fbee4904
fi

IFS="
"
for f in $(git diff-index --name-only --cached $against); do
	if [ -e "$f" ]; then
		for l in $(extract "$f" | egrep "$want"); do
			field="${l%% - *}"
			value="${l#* - }"
			addmeta "$f" "$field" "$value"
		done
	fi
done