Xpdf is not installed on all machines (e.g. it's not installed on my
office machine), so maybe it would be a good idea to use a environment
variable instead?
Right. I'm squashing this into the next version to allow configuration
(environment variable or --pdf-viewer) and sensible auto-detection:
@@ -20,6 +20,8 @@ Options: --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
@@ -75,6 +77,10 @@ while test $# -ne 0; do "--view") view=1 ;;+ "--pdf-viewer")+ shift+ PDFVIEWER="$1"+ ;; "--no-cleanup") cleanup=0 ;;
@@ -114,6 +120,28 @@ if [ "$old" = "" ]; then exit 1 fi+verbose "Auto-detecting PDF viewer"+for command in xdg-open evince okular xpdf acroread; do+ if [ "$PDFVIEWER" = "" ]; then+ if command -v "$command" >/dev/null 2>&1; then+ PDFVIEWER="$command"+ else+ verbose_progress+ fi+ fi+done+verbose_done "$PDFVIEWER"++case "$view" in+ maybe|1)+ if [ "$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 [ "$main" = "" ]; then printf "%s" "No --main provided, trying to guess ... " main=$(git grep -l '^[ \t]*\\documentclass')
@@ -212,7 +240,7 @@ if [ "$output" != "" ]; then fi if [ "$view" = 1 ] || [ "$view" = maybe ] && [ "$output" = "" ]; then- xpdf "$pdffile"+ "$PDFVIEWER" "$pdffile" fi if [ "$cleanup" = 1 ]; then
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.
git-latexdiff is made to work on documents split accross multiple .tex
files (plus possibly figures and other non-diffable files), hence could
not be implemented as a per-file diff driver.
Signed-off-by: Matthieu Moy <redacted>
---
Changes since v1:
- Configuration/autodetection of PDF viewer
- Reformat output of -h to match what PARSE_OPTION does for other commands
contrib/latex/Makefile | 22 ++++
contrib/latex/README | 12 ++
contrib/latex/git-latexdiff | 249 +++++++++++++++++++++++++++++++++++++++++++
3 files changed, 283 insertions(+), 0 deletions(-)
create mode 100644 contrib/latex/Makefile
create mode 100644 contrib/latex/README
create mode 100755 contrib/latex/git-latexdiff
@@ -0,0 +1,22 @@+-include ../../config.mak+-include ../../config.mak.autogen++ifndef SHELL_PATH+SHELL_PATH=/bin/sh+endif++SHELL_PATH_SQ=$(subst','\'',$(SHELL_PATH))+gitexecdir_SQ=$(subst','\'',$(gitexecdir))++SCRIPT=git-latexdiff++.PHONY:installhelp+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)'+chmod755'$(gitexecdir)/$(SCRIPT)'
@@ -0,0 +1,12 @@+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, either drop git-latexdiff in your $PATH, or run "make+install".
@@ -0,0 +1,249 @@+#! /bin/sh++# Author: Matthieu Moy <Matthieu.Moy@imag.fr> (2012)++# 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 [ "$verbose" = 1 ]; then+ printf "%s ..." "$@"+ fi+}++verbose_progress () {+ if [ "$verbose" = 1 ]; then+ printf "." "$@"+ fi+}++verbose_done () {+ if [ "$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")+ shift+ main=$1+ ;;+ "--no-view")+ view=0+ ;;+ "--view")+ view=1+ ;;+ "--pdf-viewer")+ shift+ PDFVIEWER="$1"+ ;;+ "--no-cleanup")+ cleanup=0+ ;;+ "-o"|"--output")+ shift+ output=$1+ ;;+ "--verbose"|"-v")+ verbose=1+ ;;+ *)+ if [ "$1" = "" ]; then+ echo "Empty string not allowed as argument"+ usage+ exit 1+ elif [ "$old" = "" ]; then+ old=$1+ elif [ "$new" = "" ]; then+ new=$1+ else+ echo "Bad argument $1"+ usage+ exit 1+ fi+ ;;+ esac+ shift+done++if [ "$new" = "" ]; then+ new=HEAD+fi++if [ "$old" = "" ]; then+ echo "fatal: Please, provide at least one revision to diff with."+ usage+ exit 1+fi++verbose "Auto-detecting PDF viewer"+for command in xdg-open evince okular xpdf acroread; do+ if [ "$PDFVIEWER" = "" ]; then+ if command -v "$command" >/dev/null 2>&1; then+ PDFVIEWER="$command"+ else+ verbose_progress+ fi+ fi+done+verbose_done "$PDFVIEWER"++case "$view" in+ maybe|1)+ if [ "$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 [ "$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 [ -r "$main" ]; then+ echo "Using $main as the main file."+ else+ if [ "$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 [ ! -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 [ -f Makefile ]; then+ make || compile_error=1+else+ pdflatex --interaction errorstopmode "$mainbase" || compile_error=1+fi++verbose_done++pdffile="$mainbase".pdf+if [ ! -r "$pdffile" ]; then+ echo "No PDF file generated."+ compile_error=1+fi++if [ ! -s "$pdffile" ]; then+ echo "PDF file generated is empty."+ compile_error=1+fi++if [ "$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 [ "$output" != "" ]; then+ abs_pdffile="$PWD/$pdffile"+ (cd "$initial_dir" && cp "$abs_pdffile" "$output")+ echo "Output written on $output"+fi++if [ "$view" = 1 ] || [ "$view" = maybe ] && [ "$output" = "" ]; then+ "$PDFVIEWER" "$pdffile"+fi++if [ "$cleanup" = 1 ]; then+ verbose "Cleaning-up result"+ rm -fr "$tmpdir"+ verbose_done+fi
From: Steven Michalske <hidden> Date: 2016-06-15 22:53:05
On Mac OS X use the open command and the OS will use the correct viewer chosen by the user
open "$pdffile"
On Feb 16, 2012, at 12:34 AM, Matthieu Moy wrote:
quoted hunk
Tim Haga [off-list ref] writes:
quoted
While testing your script on my office machine i discovered that the
following might be a problem:
Xpdf is not installed on all machines (e.g. it's not installed on my
office machine), so maybe it would be a good idea to use a environment
variable instead?
Right. I'm squashing this into the next version to allow configuration
(environment variable or --pdf-viewer) and sensible auto-detection:
--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
@@ -46,7 +48,7 @@ verbose_progress () {
verbose_done () {
if [ "$verbose" = 1 ]; then
- echo " done."
+ echo " ${1:-done}."
fi
}
@@ -114,6 +120,28 @@ if [ "$old" = "" ]; then exit 1
fi
+verbose "Auto-detecting PDF viewer"
+for command in xdg-open evince okular xpdf acroread; do
+ if [ "$PDFVIEWER" = "" ]; then
+ if command -v "$command" >/dev/null 2>&1; then
+ PDFVIEWER="$command"
+ else
+ verbose_progress
+ fi
+ fi
+done
+verbose_done "$PDFVIEWER"
+
+case "$view" in
+ maybe|1)
+ if [ "$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 [ "$main" = "" ]; then
printf "%s" "No --main provided, trying to guess ... "
main=$(git grep -l '^[ \t]*\\documentclass')
@@ -212,7 +240,7 @@ if [ "$output" != "" ]; then
fi
if [ "$view" = 1 ] || [ "$view" = maybe ] && [ "$output" = "" ]; then
- xpdf "$pdffile"
+ "$PDFVIEWER" "$pdffile"
fi
if [ "$cleanup" = 1 ]; then
--
Matthieu Moy
http://www-verimag.imag.fr/~moy/
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
From: Jakub Narebski <hidden> Date: 2016-06-15 22:53:05
Matthieu Moy [off-list ref] writes:
+verbose "Auto-detecting PDF viewer"
+for command in xdg-open evince okular xpdf acroread; do
+ if [ "$PDFVIEWER" = "" ]; then
+ if command -v "$command" >/dev/null 2>&1; then
+ PDFVIEWER="$command"
+ else
+ verbose_progress
+ fi
+ fi
+done
+verbose_done "$PDFVIEWER"
Why we autodetect PDF viewer unconditionally? Why we do not stop on
first detected viewer rather than last? Why not
+if [ "$PDFVIEWER" = "" ]; then
+ verbose "Auto-detecting PDF viewer"
+ for command in xdg-open evince okular xpdf acroread; do
+ if command -v "$command" >/dev/null 2>&1; then
+ PDFVIEWER=$command
+ break
+ else
+ verbose_progress
+ fi
+ done
+ verbose_done "$PDFVIEWER"
+fi
Nb. Documentation/CodingGuidelines says:
For shell scripts specifically (not exhaustive):
[...]
- We prefer "test" over "[ ... ]".
I know that 'contrib/' is more relaxed...
--
Jakub Narebski
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.
git-latexdiff is made to work on documents split accross multiple .tex
files (plus possibly figures and other non-diffable files), hence could
not be implemented as a per-file diff driver.
Signed-off-by: Matthieu Moy <redacted>
---
Changes since v2:
- Try 'open' on MacOS to view PDF file.
- Shell style issues (thanks to Jakub)
contrib/latex/Makefile | 22 ++++
contrib/latex/README | 12 ++
contrib/latex/git-latexdiff | 255 +++++++++++++++++++++++++++++++++++++++++++
3 files changed, 289 insertions(+), 0 deletions(-)
create mode 100644 contrib/latex/Makefile
create mode 100644 contrib/latex/README
create mode 100755 contrib/latex/git-latexdiff
@@ -0,0 +1,22 @@+-include ../../config.mak+-include ../../config.mak.autogen++ifndef SHELL_PATH+SHELL_PATH=/bin/sh+endif++SHELL_PATH_SQ=$(subst','\'',$(SHELL_PATH))+gitexecdir_SQ=$(subst','\'',$(gitexecdir))++SCRIPT=git-latexdiff++.PHONY:installhelp+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)'+chmod755'$(gitexecdir)/$(SCRIPT)'
@@ -0,0 +1,12 @@+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, either drop git-latexdiff in your $PATH, or run "make+install".
@@ -0,0 +1,255 @@+#! /bin/sh++# Author: Matthieu Moy <Matthieu.Moy@imag.fr> (2012)++# 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 [ "$verbose" = 1 ]; then+ printf "%s ..." "$@"+ fi+}++verbose_progress () {+ if [ "$verbose" = 1 ]; then+ printf "." "$@"+ fi+}++verbose_done () {+ if [ "$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")+ shift+ main=$1+ ;;+ "--no-view")+ view=0+ ;;+ "--view")+ view=1+ ;;+ "--pdf-viewer")+ shift+ PDFVIEWER="$1"+ ;;+ "--no-cleanup")+ cleanup=0+ ;;+ "-o"|"--output")+ shift+ output=$1+ ;;+ "--verbose"|"-v")+ verbose=1+ ;;+ *)+ if [ "$1" = "" ]; then+ echo "Empty string not allowed as argument"+ usage+ exit 1+ elif [ "$old" = "" ]; then+ old=$1+ elif [ "$new" = "" ]; then+ new=$1+ else+ echo "Bad argument $1"+ usage+ exit 1+ fi+ ;;+ esac+ shift+done++if [ "$new" = "" ]; then+ new=HEAD+fi++if [ "$old" = "" ]; then+ echo "fatal: Please, provide at least one revision to diff with."+ usage+ exit 1+fi++verbose "Auto-detecting PDF viewer"+candidates="xdg-open evince okular xpdf acroread"+if [ "$(uname)" = Darwin ]; then+ # open exists on GNU/Linux, but does not open PDFs+ candidates="open $candidates"+fi++for command in $candidates; do+ if [ "$PDFVIEWER" = "" ]; then+ if command -v "$command" >/dev/null 2>&1; then+ PDFVIEWER="$command"+ else+ verbose_progress+ fi+ fi+done+verbose_done "$PDFVIEWER"++case "$view" in+ maybe|1)+ if [ "$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 [ "$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 [ -r "$main" ]; then+ echo "Using $main as the main file."+ else+ if [ "$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 [ ! -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 [ -f Makefile ]; then+ make || compile_error=1+else+ pdflatex --interaction errorstopmode "$mainbase" || compile_error=1+fi++verbose_done++pdffile="$mainbase".pdf+if [ ! -r "$pdffile" ]; then+ echo "No PDF file generated."+ compile_error=1+fi++if [ ! -s "$pdffile" ]; then+ echo "PDF file generated is empty."+ compile_error=1+fi++if [ "$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 [ "$output" != "" ]; then+ abs_pdffile="$PWD/$pdffile"+ (cd "$initial_dir" && cp "$abs_pdffile" "$output")+ echo "Output written on $output"+fi++if [ "$view" = 1 ] || [ "$view" = maybe ] && [ "$output" = "" ]; then+ "$PDFVIEWER" "$pdffile"+fi++if [ "$cleanup" = 1 ]; then+ verbose "Cleaning-up result"+ rm -fr "$tmpdir"+ verbose_done+fi
From: Jakub Narebski <hidden> Date: 2016-06-15 22:53:05
Matthieu Moy [off-list ref] writes:
Changes since v2:
[...]
- Shell style issues (thanks to Jakub)
[...]
+verbose "Auto-detecting PDF viewer"
+candidates="xdg-open evince okular xpdf acroread"
+if [ "$(uname)" = Darwin ]; then
+ # open exists on GNU/Linux, but does not open PDFs
+ candidates="open $candidates"
+fi
+
+for command in $candidates; do
+ if [ "$PDFVIEWER" = "" ]; then
+ if command -v "$command" >/dev/null 2>&1; then
+ PDFVIEWER="$command"
+ else
+ verbose_progress
+ fi
+ fi
+done
+verbose_done "$PDFVIEWER"
Eh? I don't see shell style issues fixed (loop inside conditional
instead of vice-versa, "test ..." instead of "[ ... ]").
Nb. I think it would be good to put detecting PDF viewer in its own
function, don't you?
--
Jakub Narebski
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.
git-latexdiff is made to work on documents split accross multiple .tex
files (plus possibly figures and other non-diffable files), hence could
not be implemented as a per-file diff driver.
Signed-off-by: Matthieu Moy <redacted>
---
Sorry, I forgot to commit before sending v3, so it was obviously wrong.
This one should contain what I promised in v2, i.e:
- Try 'open' on MacOS to view PDF file.
- Shell style issues (thanks to Jakub)
Jakub, I also forgot to send this before the patch (I got interrupted,
and it seems my mental context-switch implementation loses data ;-) ):
Why we autodetect PDF viewer unconditionally?
We don't really do that: the test is inside a test on $PDFVIEWER, so
it's essentially the same. I just wrote it this way because I thought
"break" wasn't POSIX, but it is actually, so I'm taking your version.
contrib/latex/Makefile | 22 ++++
contrib/latex/README | 12 ++
contrib/latex/git-latexdiff | 256 +++++++++++++++++++++++++++++++++++++++++++
3 files changed, 290 insertions(+), 0 deletions(-)
create mode 100644 contrib/latex/Makefile
create mode 100644 contrib/latex/README
create mode 100755 contrib/latex/git-latexdiff
@@ -0,0 +1,22 @@+-include ../../config.mak+-include ../../config.mak.autogen++ifndef SHELL_PATH+SHELL_PATH=/bin/sh+endif++SHELL_PATH_SQ=$(subst','\'',$(SHELL_PATH))+gitexecdir_SQ=$(subst','\'',$(gitexecdir))++SCRIPT=git-latexdiff++.PHONY:installhelp+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)'+chmod755'$(gitexecdir)/$(SCRIPT)'
@@ -0,0 +1,12 @@+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, either drop git-latexdiff in your $PATH, or run "make+install".
@@ -0,0 +1,256 @@+#! /bin/sh++# Author: Matthieu Moy <Matthieu.Moy@imag.fr> (2012)++# 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
From: David Aguilar <hidden> Date: 2016-06-15 22:53:05
On Thu, Feb 16, 2012 at 12:39 AM, Matthieu Moy [off-list ref] wrote:
+
+verbose () {
+ if [ "$verbose" = 1 ]; then
+ printf "%s ..." "$@"
+ fi
+}
In addition to preferring "test" over "[", we also prefer to write
these on several lines. It's probably time to update the CodingStyle
document with these notes.
e.g.
if test "$verbose" = 1
then
.... do stuff
fi
(with hard-tabs, not spaces (unlike my example))
--
David