commit
91f3100ab1
2 changed files with 294 additions and 0 deletions
-
21Makefile
-
273git-latexdiff
@ -0,0 +1,21 @@ |
|||
-include ./config.mak |
|||
|
|||
ifndef SHELL_PATH |
|||
SHELL_PATH = /bin/sh |
|||
endif |
|||
|
|||
SHELL_PATH_SQ = $(subst ','\'',$(SHELL_PATH)) |
|||
gitexecdir_SQ = $(subst ','\'',$(gitexecdir)) |
|||
|
|||
SCRIPT=git-latexdiff |
|||
|
|||
.PHONY: install help |
|||
help: |
|||
@echo 'This is the help target of the Makefile. Current configuration:' |
|||
@echo ' gitexecdir = $(gitexecdir_SQ)' |
|||
@echo ' SHELL_PATH = $(SHELL_PATH_SQ)' |
|||
@echo 'Run "$(MAKE) install" to install $(SCRIPT) in gitexecdir.' |
|||
|
|||
install: |
|||
sed -e '1s|#!.*/sh|#!$(SHELL_PATH_SQ)|' $(SCRIPT) > '$(gitexecdir_SQ)/$(SCRIPT)' |
|||
chmod 755 '$(gitexecdir)/$(SCRIPT)' |
@ -0,0 +1,273 @@ |
|||
#! /bin/sh |
|||
|
|||
# Author: Matthieu Moy <Matthieu.Moy@imag.fr> (2012) |
|||
# |
|||
# Copying and distribution of this file, with or without modification, |
|||
# are permitted in any medium without royalty provided the copyright |
|||
# notice and this notice are preserved. This file is offered as-is, |
|||
# without any warranty. |
|||
# |
|||
# git-latexdiff is a wrapper around latexdiff |
|||
# (http://www.ctan.org/pkg/latexdiff) that allows using it to diff two |
|||
# revisions of a LaTeX file. |
|||
# |
|||
# The script internally checks out the full tree for the specified |
|||
# revisions, and calls latexdiff with the --flatten option, hence this |
|||
# works if the document is split into multiple .tex files. |
|||
# |
|||
# Try "git latexdiff -h" for more information. |
|||
# |
|||
# To install, just copy git-latexdiff in your $PATH. |
|||
|
|||
# Missing features (patches welcome ;-): |
|||
# - diff the index or the current worktree |
|||
# - checkout only a subdirectory of the repo |
|||
# - hardlink temporary checkouts as much as possible |
|||
|
|||
usage () { |
|||
cat << EOF |
|||
Usage: $(basename $0) [options] OLD [NEW] |
|||
Call latexdiff on two Git revisions of a file. |
|||
|
|||
OLD and NEW are Git revision identifiers. NEW defaults to HEAD. |
|||
|
|||
Options: |
|||
--help this help message |
|||
--main <file.tex> name of the main LaTeX file |
|||
--no-view don't display the resulting PDF file |
|||
--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 |
|||
-o <file>, --output <file> |
|||
copy resulting PDF into <file> |
|||
(usually ending with .pdf) |
|||
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 |
|||
} |
|||
|
|||
old= |
|||
new= |
|||
main= |
|||
view=maybe |
|||
cleanup=1 |
|||
verbose=0 |
|||
output= |
|||
initial_dir=$PWD |
|||
|
|||
while test $# -ne 0; do |
|||
case "$1" in |
|||
"--help"|"-h") |
|||
usage |
|||
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=0 |
|||
;; |
|||
"-o"|"--output") |
|||
test $# -gt 1 && shift || die "missing argument for $1" |
|||
output=$1 |
|||
;; |
|||
"--verbose"|"-v") |
|||
verbose=1 |
|||
;; |
|||
*) |
|||
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 |
|||
|
|||
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 -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 |
|||
|
|||
verbose "Creating temporary directories" |
|||
|
|||
git_prefix=$(git rev-parse --show-prefix) |
|||
cd "$(git rev-parse --show-cdup)" || die "Can't cd back to repository root" |
|||
git_dir="$(git rev-parse --git-dir)" || die "Not a git repository?" |
|||
git_dir=$(cd "$git_dir"; pwd) |
|||
|
|||
main=$git_prefix/$main |
|||
|
|||
tmpdir=$initial_dir/git-latexdiff.$$ |
|||
mkdir "$tmpdir" || die "Cannot create temporary directory." |
|||
|
|||
cd "$tmpdir" || die "Cannot cd to $tmpdir" |
|||
|
|||
mkdir old new diff || die "Cannot create old, new and diff directories." |
|||
|
|||
verbose_done |
|||
verbose "Checking out old and new version" |
|||
|
|||
cd old || die "Cannot cd to old/" |
|||
git --git-dir="$git_dir" --work-tree=. checkout "$old" -- . || die "checkout failed for old/" |
|||
verbose_progress |
|||
cd ../new || die "Cannot cd to new/" |
|||
git --git-dir="$git_dir" --work-tree=. checkout "$new" -- . || die "checkout failed for new/" |
|||
verbose_progress |
|||
cd .. |
|||
|
|||
verbose_done |
|||
verbose "Running latexdiff --flatten old/$main new/$main > $main" |
|||
|
|||
latexdiff --flatten old/"$main" new/"$main" > diff.tex || die "latexdiff failed" |
|||
|
|||
mv -f diff.tex new/"$main" |
|||
|
|||
verbose_done |
|||
|
|||
mainbase=$(basename "$main" .tex) |
|||
maindir=$(dirname "$main") |
|||
|
|||
verbose "Compiling result" |
|||
|
|||
compile_error=0 |
|||
cd new/"$maindir" || die "Can't cd to new/$maindir" |
|||
if test -f Makefile ; then |
|||
make || compile_error=1 |
|||
else |
|||
pdflatex --interaction errorstopmode "$mainbase" || compile_error=1 |
|||
fi |
|||
|
|||
verbose_done |
|||
|
|||
pdffile="$mainbase".pdf |
|||
if test ! -r "$pdffile" ; then |
|||
echo "No PDF file generated." |
|||
compile_error=1 |
|||
fi |
|||
|
|||
if 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" |
|||
# Don't clean up to let the user diagnose. |
|||
exit 1 |
|||
fi |
|||
|
|||
if test -n "$output" ; then |
|||
abs_pdffile="$PWD/$pdffile" |
|||
(cd "$initial_dir" && cp "$abs_pdffile" "$output") |
|||
echo "Output written on $output" |
|||
fi |
|||
|
|||
if test "$view" = 1 || test "$view" = maybe && test -z "$output" ; then |
|||
"$PDFVIEWER" "$pdffile" |
|||
fi |
|||
|
|||
if test "$cleanup" = 1 ; then |
|||
verbose "Cleaning-up result" |
|||
rm -fr "$tmpdir" |
|||
verbose_done |
|||
fi |
Write
Preview
Loading…
Cancel
Save
Reference in new issue