git/Documentation/doc-diff

187 lines
4.5 KiB
Bash
Executable File

#!/bin/sh
#
# Build two documentation trees and diff the resulting formatted output.
# Compared to a source diff, this can reveal mistakes in the formatting.
# For example:
#
# ./doc-diff origin/master HEAD
#
# would show the differences introduced by a branch based on master.
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
from-asciidoc use asciidoc with the 'from'-commit
from-asciidoctor use asciidoctor with the 'from'-commit
asciidoc use asciidoc with both commits
to-asciidoc use asciidoc with the 'to'-commit
to-asciidoctor use asciidoctor with the 'to'-commit
asciidoctor use asciidoctor with both commits
cut-footer cut away footer
"
SUBDIRECTORY_OK=1
. "$(git --exec-path)/git-sh-setup"
parallel=
force=
clean=
from_program=
to_program=
cut_footer=
while test $# -gt 0
do
case "$1" in
-j)
parallel=$2; shift ;;
-c|--clean)
clean=t ;;
-f)
force=t ;;
--from-asciidoctor)
from_program=-asciidoctor ;;
--to-asciidoctor)
to_program=-asciidoctor ;;
--asciidoctor)
from_program=-asciidoctor
to_program=-asciidoctor ;;
--from-asciidoc)
from_program=-asciidoc ;;
--to-asciidoc)
to_program=-asciidoc ;;
--asciidoc)
from_program=-asciidoc
to_program=-asciidoc ;;
--cut-footer)
cut_footer=-cut-footer ;;
--)
shift; break ;;
*)
usage ;;
esac
shift
done
tmp="$(git rev-parse --show-toplevel)/Documentation/tmp-doc-diff" || exit 1
if test -n "$clean"
then
test $# -eq 0 || usage
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 $# -gt 1 || usage
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
# We'll do both builds in a single worktree, which lets "make" reuse
# results that don't differ between the two trees.
if ! test -d "$tmp/worktree"
then
git worktree add -f --detach "$tmp/worktree" "$from" &&
dots=$(echo "$tmp/worktree" | sed 's#[^/]*#..#g') &&
ln -s "$dots/config.mak" "