#!/bin/sh
OPTIONS_SPEC="\
doc-diff [options] <from> <to> [-- <diff-options>]
doc-diff (-c|--clean)
--
j=n parallel argument to pass to make
f force rebuild; do not rely on cached results
c,clean cleanup temporary working files
"
SUBDIRECTORY_OK=1
. "$(git --exec-path)/git-sh-setup"
parallel=
force=
clean=
while test $do
case "$1" in
-j)
parallel=$2; shift ;;
-c|--clean)
clean=t ;;
-f)
force=t ;;
--)
shift; break ;;
*)
usage ;;
esac
shift
done
tmp="$(git rev-parse --show-toplevel)/Documentation/tmp-doc-diff" || exit 1
if test -n "$clean"
then
test $ git worktree remove --force "$tmp/worktree" 2>/dev/null
rm -rf "$tmp"
exit 0
fi
if test -z "$parallel"
then
parallel=$(getconf _NPROCESSORS_ONLN 2>/dev/null)
if test $? != 0 || test -z "$parallel"
then
parallel=1
fi
fi
test $from=$1; shift
to=$1; shift
from_oid=$(git rev-parse --verify "$from") || exit 1
to_oid=$(git rev-parse --verify "$to") || exit 1
if test -n "$force"
then
rm -rf "$tmp"
fi
if ! test -d "$tmp/worktree"
then
git worktree add -f --detach "$tmp/worktree" "$from" &&
dots=$(echo "$tmp/worktree" | sed 's ln -s "$dots/config.mak" "$tmp/worktree/config.mak"
fi
generate_render_makefile () {
find "$1" -type f |
while read src
do
dst=$2/${src printf 'all:: %s\n' "$dst"
printf '%s: %s\n' "$dst" "$src"
printf '\t@echo >&2 " RENDER $(notdir $@)" && \\\n'
printf '\tmkdir -p $(dir $@) && \\\n'
printf '\tMANWIDTH=80 man $< >$@+ && \\\n'
printf '\tmv $@+ $@\n'
done
}
render_tree () {
if ! test -d "$tmp/installed/$1"
then
git -C "$tmp/worktree" checkout --detach "$1" &&
make -j$parallel -C "$tmp/worktree" \
GIT_VERSION=omitted \
SOURCE_DATE_EPOCH=0 \
DESTDIR="$tmp/installed/$1+" \
install-man &&
mv "$tmp/installed/$1+" "$tmp/installed/$1"
fi &&
if ! test -d "$tmp/rendered/$1"
then
generate_render_makefile "$tmp/installed/$1" "$tmp/rendered/$1+" |
make -j$parallel -f - &&
mv "$tmp/rendered/$1+" "$tmp/rendered/$1"
fi
}
render_tree $from_oid &&
render_tree $to_oid &&
git -C $tmp/rendered diff --no-index "$@" $from_oid $to_oid