|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
set -o errexit |
|
set -o pipefail |
|
set -o noclobber |
|
|
|
|
|
shopt -s dotglob |
|
|
|
|
|
|
|
|
|
unset GIT_DIR |
|
unset GIT_WORK_TREE |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
unset CDPATH |
|
|
|
|
|
|
|
git_latexdiff_version='@GIT_LATEXDIFF_VERSION@' |
|
|
|
git_latexdiff_compute_version () { |
|
printf '%s' "git latexdiff version " |
|
if [ "$git_latexdiff_version" = '@GIT_LATEXDIFF''_VERSION@' ]; then |
|
(cd "$(dirname "$0")" && git describe --tags HEAD 2>/dev/null || echo 'Unknown version') |
|
else |
|
echo "$git_latexdiff_version" |
|
fi |
|
echo |
|
echo "Using external commands:" |
|
command -v latexpand && latexpand --version |
|
command -v latexdiff && latexdiff --version |
|
} |
|
|
|
usage () { |
|
cat << EOF |
|
Usage: $(basename "$0" | sed 's/git-/git /') [options] OLD [NEW] |
|
$(basename "$0" | sed 's/git-/git /') [options] OLD -- |
|
$(basename "$0" | sed 's/git-/git /') [options] -- OLD |
|
Call latexdiff on two Git revisions of a file. |
|
|
|
OLD and NEW are Git revision identifiers. NEW defaults to HEAD. |
|
If "--" is used for NEW, then diff against the working directory. |
|
|
|
Options: |
|
--help this help message |
|
--help-examples show examples of usage |
|
--main <file> name of the main LaTeX, R Sweave, |
|
or Emacs Org mode file. |
|
The search for the only file containing 'documentclass' |
|
will be attempted, if not specified. |
|
For non-LaTeX files, a reasonable \`prepare\` command |
|
will be used unless explicitly provided |
|
--no-view don't display the resulting PDF file |
|
--latex run latex instead of pdflatex |
|
--xelatex run xelatex instead of pdflatex |
|
--lualatex run lualatex instead of pdflatex |
|
--tectonic run tectonic instead of pdflatex |
|
--bibtex, --bbl display changes in the bibliography |
|
(runs bibtex to generate *.bbl files and |
|
include them in the source file using |
|
latexpand --expand-bbl before computing |
|
the diff) |
|
--biber like --bibtex, but runs biber instead. |
|
--run-bibtex, -b run bibtex as well as latex to generate the PDF file |
|
(pdflatex,bibtex,pdflatex,pdflatex) |
|
NOTE: --bibtex usually works better |
|
--run-biber run BibLaTex-Biber as well as latex to generate the PDF file |
|
(pdflatex,biber,pdflatex,pdflatex) |
|
NOTE: --biber usually works better |
|
--view view the resulting PDF file |
|
(default if -o is not used) |
|
--pdf-viewer <cmd> use <cmd> to view the PDF file (default: \$PDFVIEWER) |
|
--no-cleanup don't cleanup temp dir after running |
|
--no-flatten don't call latexpand to flatten the document |
|
--cleanup MODE Cleanup temporary files according to MODE: |
|
|
|
- keeppdf (default): keep only the |
|
generated PDF file |
|
|
|
- none: keep all temporary files |
|
(may eat your diskspace) |
|
|
|
- all: erase all generated files. |
|
Problematic with --view when the |
|
viewer is e.g. evince, and doesn't |
|
like when the file being viewed is |
|
deleted. |
|
|
|
--latexmk use latexmk |
|
--build-dir use pdfs from specific build directory |
|
--latexopt pass additional options to latex (e.g. -shell-escape) |
|
-o <file>, --output <file> |
|
copy resulting PDF into <file> (usually ending with .pdf) |
|
Implies "--cleanup all" |
|
--tmpdirprefix where temporary directory will be created (default: /tmp). |
|
Relative path will use repository root as a base |
|
--verbose, -v give more verbose output |
|
--quiet redirect output from subprocesses to log files |
|
--prepare <cmd> run <cmd> before latexdiff (e.g. run make to generate |
|
included files) |
|
--filter <cmd> run <cmd> after latexdiff and before compilation |
|
(e.g. to fix up latexdiff output) |
|
--ln-untracked symlink uncommited files from the working directory |
|
--version show git-latexdiff version. |
|
--subtree checkout the tree at and below the main file |
|
(enabled by default, disable with --whole-tree) |
|
--whole-tree checkout the whole tree (contrast with --subtree) |
|
--ignore-latex-errors keep on going even if latex gives errors, so long as |
|
a PDF file is produced |
|
--ignore-makefile ignore the Makefile, build as though it doesn't exist |
|
-* other options are passed directly to latexdiff |
|
--latexpand OPT pass option OPT to latexpand. Use multiple times like |
|
--latexpand OPT1 --latexpand OPT2 to pass multiple options. |
|
--latexdiff-flatten use --flatten from latexdiff instead of latexpand |
|
|
|
Unrecognized options are passed unmodified to latexdiff. |
|
EOF |
|
} |
|
|
|
examples () { |
|
cat <<EOF |
|
Diff the previous revision with the latest commit: |
|
|
|
git latexdiff HEAD^ |
|
|
|
Diff the latest commit with the working tree: |
|
|
|
git latexdiff HEAD -- |
|
|
|
Diff latest commit with branch master: |
|
|
|
git latexdiff master HEAD |
|
|
|
Pass --type=CHANGEBAR to latexdiff to get changebars in the margins |
|
instead of red+trike/blue+underline diff: |
|
|
|
git latexdiff --type=CHANGEBAR HEAD^ |
|
|
|
Use a specific latexdiff configuration file: |
|
|
|
git latexdiff --config /path/to/file HEAD^ |
|
|
|
Add a \\makeatletter statement to hopefuly fix some LaTeX compilation errors |
|
involving commands containing an @ character: |
|
|
|
git latexdiff --latexpand --makeatletter HEAD^ |
|
EOF |
|
} |
|
|
|
die () { |
|
echo "fatal: $*" |
|
exit 1 |
|
} |
|
|
|
verbose () { |
|
if test "$verbose" = 1 ; then |
|
printf "%s ..." "$@" |
|
fi |
|
} |
|
|
|
verbose_progress () { |
|
if test "$verbose" = 1 ; then |
|
printf "." |
|
fi |
|
} |
|
|
|
verbose_done () { |
|
if test "$verbose" = 1 ; then |
|
echo " ${1:-done}." |
|
fi |
|
} |
|
|
|
verbose_say () { |
|
if test "$verbose" = 1 ; then |
|
printf "%s\n" "$@" |
|
fi |
|
} |
|
|
|
old= |
|
new= |
|
main= |
|
view=maybe |
|
cleanup=keeppdf |
|
verbose=0 |
|
bibtex=0 |
|
biber=0 |
|
output= |
|
initial_dir=$PWD |
|
tmpdir_prefix="/tmp" |
|
prepare_cmd= |
|
flatten=1 |
|
subtree=1 |
|
uselatexmk= |
|
use_build_dir= |
|
latexopt= |
|
ln_untracked=0 |
|
quiet=0 |
|
ignorelatexerrors=0 |
|
latexdiffopt=() |
|
latexpand=() |
|
bbl=0 |
|
latexdiff_flatten=0 |
|
latex=0 |
|
xelatex=0 |
|
lualatex=0 |
|
tectonic=0 |
|
BIBTEX_EXEC=bibtex |
|
|
|
while test $# -ne 0; do |
|
case "$1" in |
|
"--help"|"-h") |
|
usage |
|
exit 0 |
|
;; |
|
"--help-examples") |
|
examples |
|
exit 0 |
|
;; |
|
"--main") |
|
test $# -gt 1 && shift || die "missing argument for $1" |
|
main=$1 |
|
;; |
|
"--no-view") |
|
view=0 |
|
;; |
|
"--view") |
|
view=1 |
|
;; |
|
"--pdf-viewer") |
|
test $# -gt 1 && shift || die "missing argument for $1" |
|
PDFVIEWER="$1" |
|
;; |
|
"--no-cleanup") |
|
cleanup=none |
|
;; |
|
"--ignore-latex-errors") |
|
ignorelatexerrors=1 |
|
;; |
|
"--cleanup") |
|
shift |
|
case "$1" in |
|
"none"|"all"|"keeppdf") |
|
cleanup="$1" |
|
;; |
|
*) |
|
echo "Bad argument --cleanup $1" |
|
usage |
|
exit 1 |
|
;; |
|
esac |
|
;; |
|
"--no-flatten") |
|
flatten=0 |
|
;; |
|
"--ignore-makefile") |
|
ignoremake=1 |
|
;; |
|
"-o"|"--output") |
|
test $# -gt 1 && shift || die "missing argument for $1" |
|
output=$1 |
|
cleanup=all |
|
;; |
|
"-b"|"--bibtex") |
|
bbl=1 |
|
;; |
|
"--latex") |
|
latex=1 |
|
;; |
|
"--xelatex") |
|
xelatex=1 |
|
;; |
|
"--lualatex") |
|
lualatex=1 |
|
;; |
|
"--tectonic") |
|
tectonic=1 |
|
;; |
|
"--biber") |
|
BIBTEX_EXEC=biber |
|
bbl=1 |
|
;; |
|
"--run-bibtex") |
|
bibtex=1 |
|
;; |
|
"--run-biber") |
|
biber=1 |
|
;; |
|
"--verbose"|"-v") |
|
verbose=1 |
|
;; |
|
"--quiet") |
|
quiet=1 |
|
;; |
|
"--version") |
|
git_latexdiff_compute_version |
|
exit 0 |
|
;; |
|
"--subtree") |
|
subtree=1 |
|
;; |
|
"--whole-tree") |
|
subtree=0 |
|
;; |
|
"--prepare") |
|
shift |
|
prepare_cmd="$1" |
|
;; |
|
"--filter") |
|
shift |
|
filter_cmd="$1" |
|
;; |
|
"--build-dir") |
|
test $# -gt 1 && shift || die "missing argument for $1" |
|
use_build_dir=$1 |
|
;; |
|
"--latexmk") |
|
uselatexmk=1 |
|
;; |
|
"--latexpand") |
|
shift |
|
latexpand=("${latexpand[@]}" "$1") |
|
;; |
|
"--bbl") |
|
bbl=1 |
|
;; |
|
"--latexdiff-flatten") |
|
latexdiff_flatten=1 |
|
flatten=0 |
|
;; |
|
"--latexopt") |
|
shift |
|
latexopt=$1 |
|
;; |
|
"--ln-untracked") |
|
ln_untracked=1 |
|
;; |
|
"--no-ln-untracked") |
|
ln_untracked=0 |
|
;; |
|
"--tmpdirprefix") |
|
shift |
|
tmpdir_prefix="$1" |
|
;; |
|
-*) |
|
if test "$1" = "--" ; then |
|
if test -z "$new" ; then |
|
new=$1 |
|
else |
|
echo "Bad argument $1" |
|
usage |
|
exit 1 |
|
fi |
|
else |
|
case "$1" in |
|
'--type'|'-t'|'--subtype'|'-s'|'--floattype'|'-f'|\ |
|
'--config'|'-c'|'--encoding'|'-e'|\ |
|
'--label'|'-L'|'--exclude-safecmd'|'-A'|\ |
|
'--replace-safecmd'|'--append-safecmd'|'-a'|\ |
|
'--exclude-textcmd'|'-X'|'--replace-textcmd'|\ |
|
'--append-textcmd'|'-x'|'--replace-context1cmd'|\ |
|
'--append-context1cmd'|'--replace-context2cmd'|\ |
|
'--append-context2cmd'|'--packages'|'--math-markup'|\ |
|
'--driver') |
|
# Options taking an immediate argument in |
|
# latexdiff => add both the option and its |
|
# argument. |
|
latexdiffopt+=("$1" "$2") |
|
shift |
|
;; |
|
--preamble=*|-p*|"--preamble"|"-p") |
|
# Same, but with a file argument. Make it |
|
# absolute to avoid issues when cd-ing |
|
# somewhere else. |
|
doshift=1 |
|
if test "$1" = "--preamble" || test "$1" = "-p"; then |
|
relative="$2" |
|
else |
|
relative="$(printf "%s" "$1" | sed 's/^--preamble=//;s/^-p//')" |
|
doshift=0 |
|
fi |
|
absolute="$(cd $(dirname "$relative"); pwd)/$(basename "$relative")" |
|
latexdiffopt+=("-p" "$absolute") |
|
if test $doshift = 1; then |
|
shift |
|
fi |
|
;; |
|
*) |
|
latexdiffopt+=("$1") |
|
;; |
|
esac |
|
fi |
|
;; |
|
*) |
|
if test -z "$1" ; then |
|
echo "Empty string not allowed as argument" |
|
usage |
|
exit 1 |
|
elif test -z "$old" ; then |
|
old=$1 |
|
elif test -z "$new" ; then |
|
new=$1 |
|
else |
|
echo "Bad argument $1" |
|
usage |
|
exit 1 |
|
fi |
|
;; |
|
esac |
|
shift |
|
done |
|
|
|
initial_repo=$(git rev-parse --show-toplevel) |
|
|
|
if test -z "$new" ; then |
|
new=HEAD |
|
fi |
|
|
|
if test -z "$old" ; then |
|
echo "fatal: Please, provide at least one revision to diff with." |
|
usage |
|
exit 1 |
|
fi |
|
|
|
if test -z "$PDFVIEWER" ; then |
|
verbose "Auto-detecting PDF viewer" |
|
candidates="xdg-open evince okular xpdf acroread" |
|
if test "$(uname)" = Darwin ; then |
|
# open exists on GNU/Linux, but does not open PDFs |
|
candidates="open $candidates" |
|
fi |
|
|
|
for command in $candidates; do |
|
if command -v "$command" >/dev/null 2>&1; then |
|
PDFVIEWER="$command" |
|
break |
|
else |
|
verbose_progress |
|
fi |
|
done |
|
verbose_done "$PDFVIEWER" |
|
fi |
|
|
|
case "$view" in |
|
maybe|1) |
|
if test -z "$PDFVIEWER" ; then |
|
echo "warning: could not find a PDF viewer on your system." |
|
echo "warning: Please set \$PDFVIEWER or use --pdf-viewer CMD." |
|
PDFVIEWER=false |
|
fi |
|
;; |
|
esac |
|
|
|
if test $flatten = 1 && |
|
! command -v latexpand >/dev/null 2>&1; then |
|
echo "Warning: latexpand not found. Falling back to latexdiff --flatten." |
|
latexdiff_flatten=1 |
|
flatten=0 |
|
fi |
|
|
|
if test $latex = 1; then |
|
LATEX_EXEC=latex |
|
elif test $xelatex = 1; then |
|
LATEX_EXEC=xelatex |
|
elif test $lualatex = 1; then |
|
LATEX_EXEC=lualatex |
|
elif test $tectonic = 1; then |
|
LATEX_EXEC=tectonic |
|
else |
|
LATEX_EXEC=pdflatex |
|
fi |
|
|
|
if test $biber = 1; then |
|
BIBTEX_EXEC=biber |
|
fi |
|
|
|
## end option parsing ## |
|
|
|
check_knitr () { |
|
if test -z "$prepare_cmd"; then |
|
prepare_cmd="Rscript -e \"library(knitr); knit('$main')\"" |
|
fi |
|
main="${main%\.*}.tex" |
|
} |
|
|
|
check_org () { |
|
if test -z "$prepare_cmd"; then |
|
init_file= |
|
load_init_file= |
|
for f in ~/.emacs ~/.emacs.el ~/.emacs.d/init.elc ~/.emacs.d/init.el; do |
|
if test -f "$f"; then |
|
init_file="$f" |
|
break |
|
fi |
|
done |
|
if test -n "$init_file"; then |
|
load_init_file="--eval \"(load \\\"$init_file\\\")\"" |
|
fi |
|
prepare_cmd="emacs --batch $load_init_file \"$main\" -f org-latex-export-to-latex --kill" |
|
fi |
|
main="${main%\.*}.tex" |
|
} |
|
|
|
log_cmd () { |
|
log=$1 |
|
shift |
|
if [ "$quiet" = 1 ]; then |
|
"$@" >$log 2>&1 |
|
else |
|
"$@" |
|
fi |
|
} |
|
|
|
# main is relative to initial_dir (if returned) |
|
if test -z "$main" ; then |
|
printf "%s" "No --main provided, trying to guess ... " |
|
main=$(git grep -l '^[ \t]*\\documentclass') |
|
# May return multiple results, but if so the result won't be a file. |
|
if test -r "$main" ; then |
|
echo "Using $main as the main file." |
|
else |
|
if test -z "$main" ; then |
|
echo "No candidate for main file." |
|
else |
|
echo "Multiple candidates for main file:" |
|
printf "%s\n" "$main" | sed 's/^/\t/' |
|
fi |
|
die "Please, provide a main file with --main FILE.tex." |
|
fi |
|
fi |
|
|
|
if test ! -r "$main" ; then |
|
die "Cannot read $main." |
|
fi |
|
|
|
ext=${main##*\.} |
|
case "$ext" in |
|
Rnw) check_knitr ;; |
|
Rtex) check_knitr ;; |
|
org) check_org ;; |
|
*) ;; |
|
esac |
|
|
|
# Set LATEXDIFF_EXEC to either latexdiff or latexdiff-so. Prefer |
|
# latexdiff-so if available. |
|
if command -v latexdiff-so >/dev/null 2>&1; then |
|
LATEXDIFF_EXEC=latexdiff-so |
|
elif command -v latexdiff >/dev/null 2>&1; then |
|
LATEXDIFF_EXEC=latexdiff |
|
else |
|
die "latexdiff-so and latexdiff couldn't be found. Check your PATH." |
|
fi |
|
verbose_done "$LATEXDIFF_EXEC" |
|
|
|
verbose "Creating temporary directories" |
|
|
|
git_prefix=$(git rev-parse --show-prefix) |
|
git_dir="$(git rev-parse --git-dir)" || die "Not a git repository?" |
|
cd "$(git rev-parse --show-cdup)" || die "Can't cd back to repository root" |
|
git_dir=$(cd "$git_dir"; pwd) |
|
git_worktree=$(pwd) |
|
|
|
relative_main_dir=$(dirname "$main") |
|
# make main relative to git root directory |
|
if test -n "$git_prefix" ; then |
|
main=$git_prefix$main |
|
fi |
|
mainbase=$(basename "$main" .tex) |
|
maindir=$(dirname "$main") |
|
|
|
tmpdir=$tmpdir_prefix/git-latexdiff.$$ |
|
mkdir "$tmpdir" || die "Cannot create temporary directory." |
|
|
|
cd "$tmpdir" || die "Cannot cd to $tmpdir" |
|
if test "$(uname -o 2>/dev/null)" = "Msys"; then |
|
tmpdir=$(pwd -W) |
|
else |
|
tmpdir=$(pwd) |
|
fi |
|
|
|
mkdir old new || die "Cannot create old and new directories." |
|
|
|
verbose_done |
|
verbose_say "Temporary directories: $tmpdir/old and $tmpdir/new" |
|
verbose "Checking out old and new version" |
|
|
|
cd old || die "Cannot cd to old/" |
|
if test "$ln_untracked" = 1; then |
|
( |
|
mkdir -p "$maindir" && cd "$maindir" && |
|
log_cmd ln-old.log ln -s "$initial_repo"/"$maindir"/* . |
|
) || true |
|
fi |
|
|
|
if test "$subtree" = 1 && test -n "$git_prefix"; then |
|
checkoutroot=$git_prefix |
|
else |
|
checkoutroot="./" |
|
fi |
|
# create the build directory (containing the final PDFs) if the param was set |
|
if test -n "$use_build_dir" ; then |
|
builddir="$use_build_dir" |
|
else |
|
builddir="$relative_main_dir" |
|
fi |
|
|
|
# Checkout a subtree, without touching the index ("git checkout" would) |
|
(cd "$git_dir" && git archive --format=tar "$old" "$checkoutroot") | tar -xf - |
|
# Also expand the possible submodules |
|
(cd "$git_worktree" && git ls-tree "$old":"$checkoutroot" | \ |
|
{ grep '^[^ ]* commit ' || true; } | \ |
|
while read -r mod type id name; do |
|
# Submodule's object may be in the submodule (if it was directly "git init && git add"-ed), |
|
# or in .git/modules, if it was cloned using "git submodule update <repository> <path>". |
|
ALTERNATES= |
|
for d in "$name"/.git/objects/ .git/modules/"$name"/objects/; do |
|
if test -d "$d"; then |
|
ALTERNATES="$ALTERNATES":"$d" |
|
fi |
|
done |
|
GIT_ALTERNATE_OBJECT_DIRECTORIES="$GIT_ALTERNATE_OBJECT_DIRECTORIES":"$ALTERNATES" \ |
|
git archive --format=tar "$id"^{tree} | tar -xf - --directory "$tmpdir/old/$name" |
|
done |
|
) |
|
verbose_progress |
|
cd ../new || die "Cannot cd to new/" |
|
if test "$new" == "--"; then |
|
# Copy working tree files |
|
(cd "$git_worktree" && git ls-files -- "$checkoutroot" | tar -cf - -T -) | tar -xf - |
|
else |
|
# checkout new revision |
|
(cd "$git_dir" && git archive --format=tar "$new" "$checkoutroot") | tar -xf - |
|
# In case the submodule isn't yet "git add && git commit"ed, its directory may not have been created. |
|
(cd "$git_worktree" && git submodule foreach --recursive 'mkdir -p '$tmpdir/new'/$displaypath') |
|
(cd "$git_worktree" && git submodule foreach --recursive 'git archive --format=tar "$sha1" | tar -xf - --directory '$tmpdir/new'/$displaypath') |
|
fi |
|
if test "$ln_untracked" = 1; then |
|
( |
|
mkdir -p "$maindir" && cd "$maindir" && |
|
log_cmd ln-new.log ln -s "$initial_repo"/"$maindir"/* . |
|
) || true |
|
fi |
|
|
|
verbose_progress |
|
cd .. |
|
|
|
verbose_done |
|
|
|
for dir in old new |
|
do |
|
verbose "Running preparation command $prepare_cmd in $dir/$git_prefix" |
|
( cd "$dir/$git_prefix/" && log_cmd prepare.log eval "$prepare_cmd" ) |
|
if test ! -f "$dir/$main"; then |
|
die "$prepare_cmd did not produce $dir/$main." |
|
fi |
|
verbose_done |
|
done |
|
|
|
if test $tectonic != 1; then |
|
if [ "$ignorelatexerrors" = 1 ]; then |
|
latexopt="$latexopt -interaction=batchmode" |
|
elif [ "$quiet" = 1 ]; then |
|
latexopt="$latexopt -interaction=nonstopmode" |
|
else |
|
latexopt="$latexopt -interaction=errorstopmode" |
|
fi |
|
fi |
|
|
|
# Option to use latexdiff --flatten instead of latexpand |
|
if test "$latexdiff_flatten" = 1; then |
|
latexdiffopt+=("--flatten") |
|
fi |
|
|
|
# Shortcut to include bbl |
|
if test "$bbl" = 1; then |
|
if test "$biber" = 1; then |
|
bblexpand=("--expand-bbl" "$mainbase.bbl") |
|
# In theory, this (with recent enough latexpand) should work |
|
# better. In practice it doesn't seem to work though. |
|
# bblexpand=("--biber" "$mainbase.bbl") |
|
else |
|
bblexpand=("--expand-bbl" "$mainbase.bbl") |
|
fi |
|
else |
|
bblexpand=() |
|
fi |
|
|
|
ignore_errors_maybe() { |
|
if [ "$compile_error" = 1 ] && [ "$ignorelatexerrors" = 1 ]; then |
|
echo "LaTeX errors were found - but attempting to carry on." |
|
compile_error=0 |
|
fi |
|
} |
|
|
|
# Create flattened documents and keep for debugging |
|
if test "$flatten" = 1; then |
|
if [ "$bbl" = 1 ]; then |
|
if [ ! -f "old/$maindir$mainbase.bbl" ]; then |
|
verbose "Attempting to regenerate missing old/$maindir$mainbase.bbl" |
|
oldPWD=$PWD |
|
cd old/"$maindir" |
|
log_cmd pdflatex0.log $LATEX_EXEC $latexopt "$mainbase" || { |
|
compile_error=1 |
|
error_msg="command 'pdflatex' (automatically run in old due to --bbl) failed." |
|
} |
|
log_cmd "$BIBTEX_EXEC"0.log $BIBTEX_EXEC "$mainbase" || { |
|
compile_error=1 |
|
error_msg="command '$BIBTEX_EXEC' (automatically run in old due to --bbl) failed." |
|
} |
|
cd "$oldPWD" |
|
ignore_errors_maybe |
|
if [ "$compile_error" = 1 ]; then |
|
die "Failed to regenerate .bbl for old version" |
|
fi |
|
fi |
|
if [ ! -f "new/$maindir$mainbase.bbl" ]; then |
|
verbose "Attempting to regenerate missing new/$maindir$mainbase.bbl" |
|
oldPWD=$PWD |
|
cd new/"$maindir" |
|
log_cmd pdflatex0.log $LATEX_EXEC $latexopt "$mainbase" || { |
|
compile_error=1 |
|
error_msg="command 'pdflatex' (automatically run in new due to --bbl) failed." |
|
} |
|
log_cmd "$BIBTEX_EXEC"0.log $BIBTEX_EXEC "$mainbase" || { |
|
compile_error=1 |
|
error_msg="command '$BIBTEX_EXEC' (automatically run in new due to --bbl) failed." |
|
} |
|
cd "$oldPWD" |
|
ignore_errors_maybe |
|
if [ "$compile_error" = 1 ]; then |
|
die "Failed to regenerate .bbl for new version" |
|
fi |
|
fi |
|
fi |
|
verbose "Running latexpand" |
|
( |
|
cd old/"$maindir" && |
|
latexpand "$mainbase".tex "${latexpand[@]}" "${bblexpand[@]}" |
|
) > old-"$mainbase"-fl.tex \ |
|
|| die "latexpand failed for old version" |
|
( |
|
cd new/"$maindir" && |
|
latexpand "$mainbase".tex "${latexpand[@]}" "${bblexpand[@]}" |
|
) > new-"$mainbase"-fl.tex \ |
|
|| die "latexpand failed for new version" |
|
verbose_done |
|
|
|
verbose "Running $LATEXDIFF_EXEC ${latexdiffopt[*]} old-${mainbase}-fl.tex new-${mainbase}-fl.tex > ./diff.tex" |
|
"$LATEXDIFF_EXEC" "${latexdiffopt[@]}" old-"$mainbase"-fl.tex new-"$mainbase"-fl.tex > diff.tex \ |
|
|| die "$LATEXDIFF_EXEC failed" |
|
verbose_done |
|
|
|
verbose "mv ./diff.tex new/$main" |
|
mv -f new/"$main" new/"$main".orig |
|
mv -f diff.tex new/"$main" |
|
verbose_done |
|
else |
|
verbose "Running $LATEXDIFF_EXEC ${latexdiffopt[*]} old/$main new/$main > ./diff.tex" |
|
"$LATEXDIFF_EXEC" "${latexdiffopt[@]}" old/"$main" new/"$main" > diff.tex \ |
|
|| die "$LATEXDIFF_EXEC failed" |
|
verbose_done |
|
|
|
verbose "mv ./diff.tex new/$main" |
|
mv -f new/"$main" new/"$main.orig" |
|
mv -f diff.tex new/"$main" |
|
verbose_done |
|
fi |
|
|
|
if [ ! -z "$filter_cmd" ]; then |
|
verbose "Running filter command $filter_cmd in new/" |
|
( cd "new/" && log_cmd filter.log eval "$filter_cmd" ) |
|
if [ ! -f "new/$main" ]; then |
|
die "$filter_cmd removed new/$main." |
|
fi |
|
verbose_done |
|
fi |
|
|
|
verbose "Compiling result" |
|
|
|
compile_error=0 |
|
|
|
oldPWD=$PWD |
|
cd new/"$maindir" || die "Can't cd to new/$maindir" |
|
if test -e Makefile && test "$ignoremake" != 1 ; then |
|
log_cmd make.log make || { |
|
compile_error=1 |
|
error_msg="command 'make' failed." |
|
} |
|
elif test "$uselatexmk" = 1; then |
|
log_cmd latexmk.log latexmk -f -pdf -silent $latexopt "$mainbase" || { |
|
compile_error=1 |
|
error_msg="command 'latexmk' failed." |
|
} |
|
elif test "$tectonic" = 1; then |
|
log_cmd tectonic.log tectonic $latexopt "$mainbase.tex" || { |
|
compile_error=1 |
|
error_msg="command 'tectonic' failed." |
|
} |
|
else |
|
log_cmd pdflatex1.log $LATEX_EXEC $latexopt "$mainbase" || { |
|
compile_error=1 |
|
error_msg="command pdflatex (first run) failed." |
|
} |
|
if test "$bibtex" = 1 || test "$biber" = 1 ; then |
|
log_cmd "$BIBTEX_EXEC".log $BIBTEX_EXEC "$mainbase" || { |
|
compile_error=1 |
|
error_msg="command '$BIBTEX_EXEC' failed." |
|
} |
|
fi |
|
log_cmd pdflatex2.log $LATEX_EXEC $latexopt "$mainbase" || { |
|
compile_error=1 |
|
error_msg="command 'pdflatex' (second run) failed." |
|
} |
|
log_cmd pdflatex3.log $LATEX_EXEC $latexopt "$mainbase" || { |
|
compile_error=1 |
|
error_msg="command 'pdflatex' (third run) failed." |
|
} |
|
fi |
|
cd "$oldPWD" |
|
|
|
# Same relative path as where we've been called from, but in the |
|
# temporary new/ directory: |
|
cd new/"$git_prefix" |
|
|
|
verbose_done |
|
|
|
ignore_errors_maybe |
|
|
|
if test $latex = 1; then |
|
dvips "$mainbase".dvi |
|
ps2pdf "$mainbase".ps |
|
fi |
|
|
|
pdffile="$builddir/$mainbase".pdf |
|
if test ! -r "$pdffile" ; then |
|
echo "No PDF file generated." |
|
echo "Working directory: $PWD" |
|
echo "Expected PDF: $pdffile" |
|
compile_error=1 |
|
elif test ! -s "$pdffile" ; then |
|
echo "PDF file generated is empty." |
|
compile_error=1 |
|
fi |
|
|
|
if test "$compile_error" = "1" ; then |
|
echo "Error during compilation. Please examine and cleanup if needed:" |
|
echo "Directory: $tmpdir/new/$maindir" |
|
echo " File: $mainbase.tex" |
|
echo " Problem: $error_msg" |
|
# Don't clean up to let the user diagnose. |
|
exit 1 |
|
fi |
|
|
|
if test -n "$output" ; then |
|
abs_pdffile="$PWD/$pdffile" |
|
(cd "$initial_dir" && mv "$abs_pdffile" "$output") |
|
pdffile="$output" |
|
echo "Output written on $pdffile" |
|
elif [ -f "$pdffile" ]; then |
|
new_pdffile="$tmpdir"/"$mainbase".pdf |
|
mv "$pdffile" "$new_pdffile" |
|
pdffile="$new_pdffile" |
|
fi |
|
|
|
# Change directory so nothing will keep us from cleaning |
|
cd "$initial_dir" |
|
|
|
if test "$view" = 1 || ( test "$view" = maybe && test -z "$output" ) ; then |
|
"$PDFVIEWER" "$pdffile" |
|
fi |
|
|
|
case "$cleanup" in |
|
"all") |
|
verbose "Cleaning-up result" |
|
rm -fr "$tmpdir" |
|
verbose_done |
|
;; |
|
"keeppdf") |
|
verbose "Cleaning-up all but pdf (kept in $pdffile)" |
|
rm -fr "$tmpdir"/old "$tmpdir"/new |
|
verbose_done |
|
;; |
|
"none") |
|
verbose_say "Generated files kept in $tmpdir/" |
|
;; |
|
esac |
|
|