#!/bin/bash

if [ "$#" -ne 3 ]; then
	echo "Usage: $0 <orig tag>|<base release> <reconstruct> <options>" 1>&2
	exit 1
fi
tag="$1"
reconstruct="$2"
options="$3"

case "$tag" in
v*)	;;
*)	tag="v${tag%.*}" ;;
esac

# Validate the tag.
count=$( git tag -l "$tag" | wc -l )
if [ "$count" != 1 ]; then
	echo "$0: $tag: tag invalid" 1>&2
	exit 1
fi

#git ls-tree -r --full-tree HEAD | grep ^120 | \
#while read mode type blobid name

(
	# Identify all new symlinks since the proffered tag.
	echo "# Recreate any symlinks created since the orig."
	git diff "$tag.." --raw --no-renames | awk '(/^:000000 120000/ && $5 == "A") { print $NF }' | \
	while read name
	do
		link=$( readlink "$name" )

		echo "[ ! -L '$name' ] && ln -sf '$link' '$name'"
	done

	# Identify all removed files since the proffered tag.
	echo "# Remove any files deleted from the orig."
	git diff "$tag.." --raw --no-renames | awk '(/^:/ && $5 == "D") { print $NF }' | \
	while read name
	do
		echo "rm -f '$name'"
	done

	# Identify files with execute permissions added since the proffered tag.
	git diff "$tag.." --raw --no-renames | awk -F '[: \t]' '{print $2, $3, $NF }' | \
	while IFS=" " read old new name
	do
		old=$( printf "0%s" $old )
		new=$( printf "0%s" $new )
		changed=$(( (old ^ new) & 0111 ))
		if [ "$changed" -ne 0 ]; then
			echo "chmod +x '$name'"
		fi
	done

	# All done, make sure this does not complete in error.
	echo "exit 0"
) >"$reconstruct"

(
	# Identify all new symlinks since the proffered tag.
	echo "# Ignore any symlinks created since the orig which are rebuilt by reconstruct."
	git diff "$tag.." --raw --no-renames | awk '(/^:000000 120000/ && $5 == "A") { print $NF }' | \
	while read name
	do
		echo "extend-diff-ignore=^$name\$"
	done
) >"$options.update"


head='^## autoreconstruct -- begin$'
foot='^## autoreconstruct -- end$'
sed -i -e "
	/$head/,/$foot/{
		/$head/{
			p;
			r $options.update
		};
		/$foot/p;
		d
	}
" "$options"
rm -f "$options.update"
