Spaces:
Runtime error
Runtime error
initial commit
Browse files- LICENSE +21 -0
- README.md +3 -3
- app.py +46 -0
- git-latexdiff +951 -0
- packages.txt +8 -0
- requirements.txt +2 -0
LICENSE
ADDED
@@ -0,0 +1,21 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
MIT License
|
2 |
+
|
3 |
+
Copyright (c) 2022 Mohammad Reza Taesiri
|
4 |
+
|
5 |
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6 |
+
of this software and associated documentation files (the "Software"), to deal
|
7 |
+
in the Software without restriction, including without limitation the rights
|
8 |
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9 |
+
copies of the Software, and to permit persons to whom the Software is
|
10 |
+
furnished to do so, subject to the following conditions:
|
11 |
+
|
12 |
+
The above copyright notice and this permission notice shall be included in all
|
13 |
+
copies or substantial portions of the Software.
|
14 |
+
|
15 |
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16 |
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17 |
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18 |
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19 |
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20 |
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
21 |
+
SOFTWARE.
|
README.md
CHANGED
@@ -1,8 +1,8 @@
|
|
1 |
---
|
2 |
-
title:
|
3 |
-
emoji:
|
4 |
colorFrom: pink
|
5 |
-
colorTo:
|
6 |
sdk: gradio
|
7 |
app_file: app.py
|
8 |
pinned: false
|
|
|
1 |
---
|
2 |
+
title: GitLatexDiff
|
3 |
+
emoji: 🚀
|
4 |
colorFrom: pink
|
5 |
+
colorTo: yellow
|
6 |
sdk: gradio
|
7 |
app_file: app.py
|
8 |
pinned: false
|
app.py
ADDED
@@ -0,0 +1,46 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import gradio as gr
|
2 |
+
import git
|
3 |
+
import tempfile
|
4 |
+
import shutil
|
5 |
+
import subprocess
|
6 |
+
import os
|
7 |
+
|
8 |
+
cwd = os.getcwd()
|
9 |
+
gcounter = 1000
|
10 |
+
|
11 |
+
def generate_git(OldVersion, NewVersion, tmp_dir_name):
|
12 |
+
new_repo = git.Repo.init(tmp_dir_name)
|
13 |
+
with new_repo.config_writer() as git_config:
|
14 |
+
git_config.set_value('user', 'email', '[email protected]')
|
15 |
+
git_config.set_value('user', 'name', 'git Latex Diff')
|
16 |
+
|
17 |
+
shutil.unpack_archive(OldVersion.name, tmp_dir_name)
|
18 |
+
|
19 |
+
new_repo.index.add('*')
|
20 |
+
new_repo.index.commit('Initial commit.')
|
21 |
+
|
22 |
+
shutil.unpack_archive(NewVersion.name, tmp_dir_name)
|
23 |
+
|
24 |
+
new_repo.index.add('*')
|
25 |
+
new_repo.index.commit('Changes')
|
26 |
+
|
27 |
+
def generate_diff(tmp_dir_name):
|
28 |
+
subprocess.check_call([f'{cwd}/git-latexdiff', 'HEAD~1', '--cleanup', 'keeppdf', '-o', 'mydiff.pdf'], cwd=tmp_dir_name)
|
29 |
+
|
30 |
+
def gen_all(OldVersion, NewVersion):
|
31 |
+
global gcounter
|
32 |
+
gcounter+=1
|
33 |
+
|
34 |
+
dirpath = tempfile.mkdtemp()
|
35 |
+
fake_git_name = 'something'
|
36 |
+
generate_git(OldVersion, NewVersion, dirpath)
|
37 |
+
generate_diff(dirpath)
|
38 |
+
shutil.move(f'{dirpath}/mydiff.pdf', f'{cwd}/results/{gcounter}.pdf')
|
39 |
+
shutil.rmtree(dirpath)
|
40 |
+
|
41 |
+
return f'{cwd}/results/{gcounter}.pdf'
|
42 |
+
|
43 |
+
os.makedirs('results', exist_ok=True)
|
44 |
+
|
45 |
+
iface = gr.Interface(gen_all, ["file", "file"], "file", allow_screenshot=False, allow_flagging=False)
|
46 |
+
iface.launch(enable_queue=True)
|
git-latexdiff
ADDED
@@ -0,0 +1,951 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
#! /bin/bash
|
2 |
+
|
3 |
+
# Main author: Matthieu Moy <[email protected]>
|
4 |
+
# (See the Git history for other contributors)
|
5 |
+
#
|
6 |
+
# BSD 2-Clause License
|
7 |
+
#
|
8 |
+
# Copyright (c) 2012 - 2020, Matthieu Moy
|
9 |
+
# All rights reserved.
|
10 |
+
#
|
11 |
+
# Redistribution and use in source and binary forms, with or without
|
12 |
+
# modification, are permitted provided that the following conditions are met:
|
13 |
+
#
|
14 |
+
# 1. Redistributions of source code must retain the above copyright notice, this
|
15 |
+
# list of conditions and the following disclaimer.
|
16 |
+
#
|
17 |
+
# 2. Redistributions in binary form must reproduce the above copyright notice,
|
18 |
+
# this list of conditions and the following disclaimer in the documentation
|
19 |
+
# and/or other materials provided with the distribution.
|
20 |
+
#
|
21 |
+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
22 |
+
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
23 |
+
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
24 |
+
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
25 |
+
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
26 |
+
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
27 |
+
# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
28 |
+
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
29 |
+
# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
30 |
+
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
31 |
+
#
|
32 |
+
# git-latexdiff is a wrapper around latexdiff
|
33 |
+
# (http://www.ctan.org/pkg/latexdiff) that allows using it to diff two
|
34 |
+
# revisions of a LaTeX file.
|
35 |
+
#
|
36 |
+
# The script internally checks out the full tree for the specified
|
37 |
+
# revisions, calls latexpand to flatten the document and then calls
|
38 |
+
# latexdiff-so (if available, otherwise latexdiff). Therefore,
|
39 |
+
# this works if the document is split into multiple .tex files.
|
40 |
+
#
|
41 |
+
# Try "git latexdiff -h" for more information.
|
42 |
+
#
|
43 |
+
# To install, just copy git-latexdiff in your $PATH.
|
44 |
+
|
45 |
+
# Missing features (patches welcome ;-):
|
46 |
+
# - diff the index
|
47 |
+
# - hardlink temporary checkouts as much as possible
|
48 |
+
|
49 |
+
# Alternatives:
|
50 |
+
#
|
51 |
+
# There is another script doing essentially the same here:
|
52 |
+
# https://github.com/cawka/latexdiff/blob/master/latexdiff-git
|
53 |
+
# My experience is that latexdiff-git is more buggy than
|
54 |
+
# git-latexdiff, but they probably just don't have the same bugs ;-)
|
55 |
+
#
|
56 |
+
# There are a bunch of other alternatives cited here:
|
57 |
+
#
|
58 |
+
# http://tex.stackexchange.com/questions/1325/using-latexdiff-with-git
|
59 |
+
#
|
60 |
+
# Ideally, these scripts should be merged.
|
61 |
+
|
62 |
+
set -o errexit
|
63 |
+
set -o pipefail
|
64 |
+
set -o noclobber
|
65 |
+
# Used when symlinking files from the working tree: symlink .* files
|
66 |
+
# too.
|
67 |
+
shopt -s dotglob
|
68 |
+
|
69 |
+
# Some versions of git set $GIT_WORK_TREE when ran through an alias.
|
70 |
+
# This wouldn't work with git-latexdiff which plays with different
|
71 |
+
# work trees.
|
72 |
+
unset GIT_DIR
|
73 |
+
unset GIT_WORK_TREE
|
74 |
+
|
75 |
+
# (Comment and 'unset' line borrowed from Git's source code)
|
76 |
+
# Having this variable in your environment would break scripts because
|
77 |
+
# you would cause "cd" to be taken to unexpected places. If you
|
78 |
+
# like CDPATH, define it for your interactive shell sessions without
|
79 |
+
# exporting it.
|
80 |
+
# But we protect ourselves from such a user mistake nevertheless.
|
81 |
+
unset CDPATH
|
82 |
+
|
83 |
+
# @GIT_LATEXDIFF_VERSION@ is substituted by the install script here,
|
84 |
+
# but not within git_latexdiff_compute_version().
|
85 |
+
git_latexdiff_version='@GIT_LATEXDIFF_VERSION@'
|
86 |
+
|
87 |
+
git_latexdiff_compute_version () {
|
88 |
+
printf '%s' "git latexdiff version "
|
89 |
+
if [ "$git_latexdiff_version" = '@GIT_LATEXDIFF''_VERSION@' ]; then
|
90 |
+
(cd "$(dirname "$0")" && git describe --tags HEAD 2>/dev/null || echo 'Unknown version')
|
91 |
+
else
|
92 |
+
echo "$git_latexdiff_version"
|
93 |
+
fi
|
94 |
+
echo
|
95 |
+
echo "Using external commands:"
|
96 |
+
command -v latexpand && latexpand --version
|
97 |
+
command -v latexdiff && latexdiff --version
|
98 |
+
}
|
99 |
+
|
100 |
+
usage () {
|
101 |
+
cat << EOF
|
102 |
+
Usage: $(basename "$0" | sed 's/git-/git /') [options] OLD [NEW]
|
103 |
+
$(basename "$0" | sed 's/git-/git /') [options] OLD --
|
104 |
+
$(basename "$0" | sed 's/git-/git /') [options] -- OLD
|
105 |
+
Call latexdiff on two Git revisions of a file.
|
106 |
+
|
107 |
+
OLD and NEW are Git revision identifiers. NEW defaults to HEAD.
|
108 |
+
If "--" is used for NEW, then diff against the working directory.
|
109 |
+
|
110 |
+
Options:
|
111 |
+
--help this help message
|
112 |
+
--help-examples show examples of usage
|
113 |
+
--main <file> name of the main LaTeX, R Sweave,
|
114 |
+
or Emacs Org mode file.
|
115 |
+
The search for the only file containing 'documentclass'
|
116 |
+
will be attempted, if not specified.
|
117 |
+
For non-LaTeX files, a reasonable \`prepare\` command
|
118 |
+
will be used unless explicitly provided
|
119 |
+
--no-view don't display the resulting PDF file
|
120 |
+
--latex run latex instead of pdflatex
|
121 |
+
--xelatex run xelatex instead of pdflatex
|
122 |
+
--lualatex run lualatex instead of pdflatex
|
123 |
+
--tectonic run tectonic instead of pdflatex
|
124 |
+
--bibtex, --bbl display changes in the bibliography
|
125 |
+
(runs bibtex to generate *.bbl files and
|
126 |
+
include them in the source file using
|
127 |
+
latexpand --expand-bbl before computing
|
128 |
+
the diff)
|
129 |
+
--biber like --bibtex, but runs biber instead.
|
130 |
+
--run-bibtex, -b run bibtex as well as latex to generate the PDF file
|
131 |
+
(pdflatex,bibtex,pdflatex,pdflatex)
|
132 |
+
NOTE: --bibtex usually works better
|
133 |
+
--run-biber run BibLaTex-Biber as well as latex to generate the PDF file
|
134 |
+
(pdflatex,biber,pdflatex,pdflatex)
|
135 |
+
NOTE: --biber usually works better
|
136 |
+
--view view the resulting PDF file
|
137 |
+
(default if -o is not used)
|
138 |
+
--pdf-viewer <cmd> use <cmd> to view the PDF file (default: \$PDFVIEWER)
|
139 |
+
--no-cleanup don't cleanup temp dir after running
|
140 |
+
--no-flatten don't call latexpand to flatten the document
|
141 |
+
--cleanup MODE Cleanup temporary files according to MODE:
|
142 |
+
|
143 |
+
- keeppdf (default): keep only the
|
144 |
+
generated PDF file
|
145 |
+
|
146 |
+
- none: keep all temporary files
|
147 |
+
(may eat your diskspace)
|
148 |
+
|
149 |
+
- all: erase all generated files.
|
150 |
+
Problematic with --view when the
|
151 |
+
viewer is e.g. evince, and doesn't
|
152 |
+
like when the file being viewed is
|
153 |
+
deleted.
|
154 |
+
|
155 |
+
--latexmk use latexmk
|
156 |
+
--build-dir use pdfs from specific build directory
|
157 |
+
--latexopt pass additional options to latex (e.g. -shell-escape)
|
158 |
+
-o <file>, --output <file>
|
159 |
+
copy resulting PDF into <file> (usually ending with .pdf)
|
160 |
+
Implies "--cleanup all"
|
161 |
+
--tmpdirprefix where temporary directory will be created (default: /tmp).
|
162 |
+
Relative path will use repository root as a base
|
163 |
+
--verbose, -v give more verbose output
|
164 |
+
--quiet redirect output from subprocesses to log files
|
165 |
+
--prepare <cmd> run <cmd> before latexdiff (e.g. run make to generate
|
166 |
+
included files)
|
167 |
+
--filter <cmd> run <cmd> after latexdiff and before compilation
|
168 |
+
(e.g. to fix up latexdiff output)
|
169 |
+
--ln-untracked symlink uncommited files from the working directory
|
170 |
+
--version show git-latexdiff version.
|
171 |
+
--subtree checkout the tree at and below the main file
|
172 |
+
(enabled by default, disable with --whole-tree)
|
173 |
+
--whole-tree checkout the whole tree (contrast with --subtree)
|
174 |
+
--ignore-latex-errors keep on going even if latex gives errors, so long as
|
175 |
+
a PDF file is produced
|
176 |
+
--ignore-makefile ignore the Makefile, build as though it doesn't exist
|
177 |
+
-* other options are passed directly to latexdiff
|
178 |
+
--latexpand OPT pass option OPT to latexpand. Use multiple times like
|
179 |
+
--latexpand OPT1 --latexpand OPT2 to pass multiple options.
|
180 |
+
--latexdiff-flatten use --flatten from latexdiff instead of latexpand
|
181 |
+
|
182 |
+
Unrecognized options are passed unmodified to latexdiff.
|
183 |
+
EOF
|
184 |
+
}
|
185 |
+
|
186 |
+
examples () {
|
187 |
+
cat <<EOF
|
188 |
+
Diff the previous revision with the latest commit:
|
189 |
+
|
190 |
+
git latexdiff HEAD^
|
191 |
+
|
192 |
+
Diff the latest commit with the working tree:
|
193 |
+
|
194 |
+
git latexdiff HEAD --
|
195 |
+
|
196 |
+
Diff latest commit with branch master:
|
197 |
+
|
198 |
+
git latexdiff master HEAD
|
199 |
+
|
200 |
+
Pass --type=CHANGEBAR to latexdiff to get changebars in the margins
|
201 |
+
instead of red+trike/blue+underline diff:
|
202 |
+
|
203 |
+
git latexdiff --type=CHANGEBAR HEAD^
|
204 |
+
|
205 |
+
Use a specific latexdiff configuration file:
|
206 |
+
|
207 |
+
git latexdiff --config /path/to/file HEAD^
|
208 |
+
|
209 |
+
Add a \\makeatletter statement to hopefuly fix some LaTeX compilation errors
|
210 |
+
involving commands containing an @ character:
|
211 |
+
|
212 |
+
git latexdiff --latexpand --makeatletter HEAD^
|
213 |
+
EOF
|
214 |
+
}
|
215 |
+
|
216 |
+
die () {
|
217 |
+
echo "fatal: $*"
|
218 |
+
exit 1
|
219 |
+
}
|
220 |
+
|
221 |
+
verbose () {
|
222 |
+
if test "$verbose" = 1 ; then
|
223 |
+
printf "%s ..." "$@"
|
224 |
+
fi
|
225 |
+
}
|
226 |
+
|
227 |
+
verbose_progress () {
|
228 |
+
if test "$verbose" = 1 ; then
|
229 |
+
printf "."
|
230 |
+
fi
|
231 |
+
}
|
232 |
+
|
233 |
+
verbose_done () {
|
234 |
+
if test "$verbose" = 1 ; then
|
235 |
+
echo " ${1:-done}."
|
236 |
+
fi
|
237 |
+
}
|
238 |
+
|
239 |
+
verbose_say () {
|
240 |
+
if test "$verbose" = 1 ; then
|
241 |
+
printf "%s\n" "$@"
|
242 |
+
fi
|
243 |
+
}
|
244 |
+
|
245 |
+
old=
|
246 |
+
new=
|
247 |
+
main=
|
248 |
+
view=maybe
|
249 |
+
cleanup=keeppdf
|
250 |
+
verbose=0
|
251 |
+
bibtex=0
|
252 |
+
biber=0
|
253 |
+
output=
|
254 |
+
initial_dir=$PWD
|
255 |
+
tmpdir_prefix="/tmp"
|
256 |
+
prepare_cmd=
|
257 |
+
flatten=1
|
258 |
+
subtree=1
|
259 |
+
uselatexmk=
|
260 |
+
use_build_dir=
|
261 |
+
latexopt=
|
262 |
+
ln_untracked=0
|
263 |
+
quiet=0
|
264 |
+
ignorelatexerrors=0
|
265 |
+
latexdiffopt=()
|
266 |
+
latexpand=()
|
267 |
+
bbl=0
|
268 |
+
latexdiff_flatten=0
|
269 |
+
latex=0
|
270 |
+
xelatex=0
|
271 |
+
lualatex=0
|
272 |
+
tectonic=0
|
273 |
+
BIBTEX_EXEC=bibtex
|
274 |
+
|
275 |
+
while test $# -ne 0; do
|
276 |
+
case "$1" in
|
277 |
+
"--help"|"-h")
|
278 |
+
usage
|
279 |
+
exit 0
|
280 |
+
;;
|
281 |
+
"--help-examples")
|
282 |
+
examples
|
283 |
+
exit 0
|
284 |
+
;;
|
285 |
+
"--main")
|
286 |
+
test $# -gt 1 && shift || die "missing argument for $1"
|
287 |
+
main=$1
|
288 |
+
;;
|
289 |
+
"--no-view")
|
290 |
+
view=0
|
291 |
+
;;
|
292 |
+
"--view")
|
293 |
+
view=1
|
294 |
+
;;
|
295 |
+
"--pdf-viewer")
|
296 |
+
test $# -gt 1 && shift || die "missing argument for $1"
|
297 |
+
PDFVIEWER="$1"
|
298 |
+
;;
|
299 |
+
"--no-cleanup")
|
300 |
+
cleanup=none
|
301 |
+
;;
|
302 |
+
"--ignore-latex-errors")
|
303 |
+
ignorelatexerrors=1
|
304 |
+
;;
|
305 |
+
"--cleanup")
|
306 |
+
shift
|
307 |
+
case "$1" in
|
308 |
+
"none"|"all"|"keeppdf")
|
309 |
+
cleanup="$1"
|
310 |
+
;;
|
311 |
+
*)
|
312 |
+
echo "Bad argument --cleanup $1"
|
313 |
+
usage
|
314 |
+
exit 1
|
315 |
+
;;
|
316 |
+
esac
|
317 |
+
;;
|
318 |
+
"--no-flatten")
|
319 |
+
flatten=0
|
320 |
+
;;
|
321 |
+
"--ignore-makefile")
|
322 |
+
ignoremake=1
|
323 |
+
;;
|
324 |
+
"-o"|"--output")
|
325 |
+
test $# -gt 1 && shift || die "missing argument for $1"
|
326 |
+
output=$1
|
327 |
+
cleanup=all
|
328 |
+
;;
|
329 |
+
"-b"|"--bibtex")
|
330 |
+
bbl=1
|
331 |
+
;;
|
332 |
+
"--latex")
|
333 |
+
latex=1
|
334 |
+
;;
|
335 |
+
"--xelatex")
|
336 |
+
xelatex=1
|
337 |
+
;;
|
338 |
+
"--lualatex")
|
339 |
+
lualatex=1
|
340 |
+
;;
|
341 |
+
"--tectonic")
|
342 |
+
tectonic=1
|
343 |
+
;;
|
344 |
+
"--biber")
|
345 |
+
BIBTEX_EXEC=biber
|
346 |
+
bbl=1
|
347 |
+
;;
|
348 |
+
"--run-bibtex")
|
349 |
+
bibtex=1
|
350 |
+
;;
|
351 |
+
"--run-biber")
|
352 |
+
biber=1
|
353 |
+
;;
|
354 |
+
"--verbose"|"-v")
|
355 |
+
verbose=1
|
356 |
+
;;
|
357 |
+
"--quiet")
|
358 |
+
quiet=1
|
359 |
+
;;
|
360 |
+
"--version")
|
361 |
+
git_latexdiff_compute_version
|
362 |
+
exit 0
|
363 |
+
;;
|
364 |
+
"--subtree")
|
365 |
+
subtree=1
|
366 |
+
;;
|
367 |
+
"--whole-tree")
|
368 |
+
subtree=0
|
369 |
+
;;
|
370 |
+
"--prepare")
|
371 |
+
shift
|
372 |
+
prepare_cmd="$1"
|
373 |
+
;;
|
374 |
+
"--filter")
|
375 |
+
shift
|
376 |
+
filter_cmd="$1"
|
377 |
+
;;
|
378 |
+
"--build-dir")
|
379 |
+
test $# -gt 1 && shift || die "missing argument for $1"
|
380 |
+
use_build_dir=$1
|
381 |
+
;;
|
382 |
+
"--latexmk")
|
383 |
+
uselatexmk=1
|
384 |
+
;;
|
385 |
+
"--latexpand")
|
386 |
+
shift
|
387 |
+
latexpand=("${latexpand[@]}" "$1")
|
388 |
+
;;
|
389 |
+
"--bbl")
|
390 |
+
bbl=1
|
391 |
+
;;
|
392 |
+
"--latexdiff-flatten")
|
393 |
+
latexdiff_flatten=1
|
394 |
+
flatten=0
|
395 |
+
;;
|
396 |
+
"--latexopt")
|
397 |
+
shift
|
398 |
+
latexopt=$1
|
399 |
+
;;
|
400 |
+
"--ln-untracked")
|
401 |
+
ln_untracked=1
|
402 |
+
;;
|
403 |
+
"--no-ln-untracked")
|
404 |
+
ln_untracked=0
|
405 |
+
;;
|
406 |
+
"--tmpdirprefix")
|
407 |
+
shift
|
408 |
+
tmpdir_prefix="$1"
|
409 |
+
;;
|
410 |
+
-*)
|
411 |
+
if test "$1" = "--" ; then
|
412 |
+
if test -z "$new" ; then
|
413 |
+
new=$1
|
414 |
+
else
|
415 |
+
echo "Bad argument $1"
|
416 |
+
usage
|
417 |
+
exit 1
|
418 |
+
fi
|
419 |
+
else
|
420 |
+
case "$1" in
|
421 |
+
'--type'|'-t'|'--subtype'|'-s'|'--floattype'|'-f'|\
|
422 |
+
'--config'|'-c'|'--encoding'|'-e'|\
|
423 |
+
'--label'|'-L'|'--exclude-safecmd'|'-A'|\
|
424 |
+
'--replace-safecmd'|'--append-safecmd'|'-a'|\
|
425 |
+
'--exclude-textcmd'|'-X'|'--replace-textcmd'|\
|
426 |
+
'--append-textcmd'|'-x'|'--replace-context1cmd'|\
|
427 |
+
'--append-context1cmd'|'--replace-context2cmd'|\
|
428 |
+
'--append-context2cmd'|'--packages'|'--math-markup'|\
|
429 |
+
'--driver')
|
430 |
+
# Options taking an immediate argument in
|
431 |
+
# latexdiff => add both the option and its
|
432 |
+
# argument.
|
433 |
+
latexdiffopt+=("$1" "$2")
|
434 |
+
shift
|
435 |
+
;;
|
436 |
+
--preamble=*|-p*|"--preamble"|"-p")
|
437 |
+
# Same, but with a file argument. Make it
|
438 |
+
# absolute to avoid issues when cd-ing
|
439 |
+
# somewhere else.
|
440 |
+
doshift=1
|
441 |
+
if test "$1" = "--preamble" || test "$1" = "-p"; then
|
442 |
+
relative="$2"
|
443 |
+
else
|
444 |
+
relative="$(printf "%s" "$1" | sed 's/^--preamble=//;s/^-p//')"
|
445 |
+
doshift=0
|
446 |
+
fi
|
447 |
+
absolute="$(cd $(dirname "$relative"); pwd)/$(basename "$relative")"
|
448 |
+
latexdiffopt+=("-p" "$absolute")
|
449 |
+
if test $doshift = 1; then
|
450 |
+
shift
|
451 |
+
fi
|
452 |
+
;;
|
453 |
+
*)
|
454 |
+
latexdiffopt+=("$1")
|
455 |
+
;;
|
456 |
+
esac
|
457 |
+
fi
|
458 |
+
;;
|
459 |
+
*)
|
460 |
+
if test -z "$1" ; then
|
461 |
+
echo "Empty string not allowed as argument"
|
462 |
+
usage
|
463 |
+
exit 1
|
464 |
+
elif test -z "$old" ; then
|
465 |
+
old=$1
|
466 |
+
elif test -z "$new" ; then
|
467 |
+
new=$1
|
468 |
+
else
|
469 |
+
echo "Bad argument $1"
|
470 |
+
usage
|
471 |
+
exit 1
|
472 |
+
fi
|
473 |
+
;;
|
474 |
+
esac
|
475 |
+
shift
|
476 |
+
done
|
477 |
+
|
478 |
+
initial_repo=$(git rev-parse --show-toplevel)
|
479 |
+
|
480 |
+
if test -z "$new" ; then
|
481 |
+
new=HEAD
|
482 |
+
fi
|
483 |
+
|
484 |
+
if test -z "$old" ; then
|
485 |
+
echo "fatal: Please, provide at least one revision to diff with."
|
486 |
+
usage
|
487 |
+
exit 1
|
488 |
+
fi
|
489 |
+
|
490 |
+
if test -z "$PDFVIEWER" ; then
|
491 |
+
verbose "Auto-detecting PDF viewer"
|
492 |
+
candidates="xdg-open evince okular xpdf acroread"
|
493 |
+
if test "$(uname)" = Darwin ; then
|
494 |
+
# open exists on GNU/Linux, but does not open PDFs
|
495 |
+
candidates="open $candidates"
|
496 |
+
fi
|
497 |
+
|
498 |
+
for command in $candidates; do
|
499 |
+
if command -v "$command" >/dev/null 2>&1; then
|
500 |
+
PDFVIEWER="$command"
|
501 |
+
break
|
502 |
+
else
|
503 |
+
verbose_progress
|
504 |
+
fi
|
505 |
+
done
|
506 |
+
verbose_done "$PDFVIEWER"
|
507 |
+
fi
|
508 |
+
|
509 |
+
case "$view" in
|
510 |
+
maybe|1)
|
511 |
+
if test -z "$PDFVIEWER" ; then
|
512 |
+
echo "warning: could not find a PDF viewer on your system."
|
513 |
+
echo "warning: Please set \$PDFVIEWER or use --pdf-viewer CMD."
|
514 |
+
PDFVIEWER=false
|
515 |
+
fi
|
516 |
+
;;
|
517 |
+
esac
|
518 |
+
|
519 |
+
if test $flatten = 1 &&
|
520 |
+
! command -v latexpand >/dev/null 2>&1; then
|
521 |
+
echo "Warning: latexpand not found. Falling back to latexdiff --flatten."
|
522 |
+
latexdiff_flatten=1
|
523 |
+
flatten=0
|
524 |
+
fi
|
525 |
+
|
526 |
+
if test $latex = 1; then
|
527 |
+
LATEX_EXEC=latex
|
528 |
+
elif test $xelatex = 1; then
|
529 |
+
LATEX_EXEC=xelatex
|
530 |
+
elif test $lualatex = 1; then
|
531 |
+
LATEX_EXEC=lualatex
|
532 |
+
elif test $tectonic = 1; then
|
533 |
+
LATEX_EXEC=tectonic
|
534 |
+
else
|
535 |
+
LATEX_EXEC=pdflatex
|
536 |
+
fi
|
537 |
+
|
538 |
+
if test $biber = 1; then
|
539 |
+
BIBTEX_EXEC=biber
|
540 |
+
fi
|
541 |
+
|
542 |
+
## end option parsing ##
|
543 |
+
|
544 |
+
check_knitr () {
|
545 |
+
if test -z "$prepare_cmd"; then
|
546 |
+
prepare_cmd="Rscript -e \"library(knitr); knit('$main')\""
|
547 |
+
fi
|
548 |
+
main="${main%\.*}.tex"
|
549 |
+
}
|
550 |
+
|
551 |
+
check_org () {
|
552 |
+
if test -z "$prepare_cmd"; then
|
553 |
+
init_file=
|
554 |
+
load_init_file=
|
555 |
+
for f in ~/.emacs ~/.emacs.el ~/.emacs.d/init.elc ~/.emacs.d/init.el; do
|
556 |
+
if test -f "$f"; then
|
557 |
+
init_file="$f"
|
558 |
+
break
|
559 |
+
fi
|
560 |
+
done
|
561 |
+
if test -n "$init_file"; then
|
562 |
+
load_init_file="--eval \"(load \\\"$init_file\\\")\""
|
563 |
+
fi
|
564 |
+
prepare_cmd="emacs --batch $load_init_file \"$main\" -f org-latex-export-to-latex --kill"
|
565 |
+
fi
|
566 |
+
main="${main%\.*}.tex"
|
567 |
+
}
|
568 |
+
|
569 |
+
log_cmd () {
|
570 |
+
log=$1
|
571 |
+
shift
|
572 |
+
if [ "$quiet" = 1 ]; then
|
573 |
+
"$@" >$log 2>&1
|
574 |
+
else
|
575 |
+
"$@"
|
576 |
+
fi
|
577 |
+
}
|
578 |
+
|
579 |
+
# main is relative to initial_dir (if returned)
|
580 |
+
if test -z "$main" ; then
|
581 |
+
printf "%s" "No --main provided, trying to guess ... "
|
582 |
+
main=$(git grep -l '^[ \t]*\\documentclass')
|
583 |
+
# May return multiple results, but if so the result won't be a file.
|
584 |
+
if test -r "$main" ; then
|
585 |
+
echo "Using $main as the main file."
|
586 |
+
else
|
587 |
+
if test -z "$main" ; then
|
588 |
+
echo "No candidate for main file."
|
589 |
+
else
|
590 |
+
echo "Multiple candidates for main file:"
|
591 |
+
printf "%s\n" "$main" | sed 's/^/\t/'
|
592 |
+
fi
|
593 |
+
die "Please, provide a main file with --main FILE.tex."
|
594 |
+
fi
|
595 |
+
fi
|
596 |
+
|
597 |
+
if test ! -r "$main" ; then
|
598 |
+
die "Cannot read $main."
|
599 |
+
fi
|
600 |
+
|
601 |
+
ext=${main##*\.}
|
602 |
+
case "$ext" in
|
603 |
+
Rnw) check_knitr ;;
|
604 |
+
Rtex) check_knitr ;;
|
605 |
+
org) check_org ;;
|
606 |
+
*) ;;
|
607 |
+
esac
|
608 |
+
|
609 |
+
# Set LATEXDIFF_EXEC to either latexdiff or latexdiff-so. Prefer
|
610 |
+
# latexdiff-so if available.
|
611 |
+
if command -v latexdiff-so >/dev/null 2>&1; then
|
612 |
+
LATEXDIFF_EXEC=latexdiff-so
|
613 |
+
elif command -v latexdiff >/dev/null 2>&1; then
|
614 |
+
LATEXDIFF_EXEC=latexdiff
|
615 |
+
else
|
616 |
+
die "latexdiff-so and latexdiff couldn't be found. Check your PATH."
|
617 |
+
fi
|
618 |
+
verbose_done "$LATEXDIFF_EXEC"
|
619 |
+
|
620 |
+
verbose "Creating temporary directories"
|
621 |
+
|
622 |
+
git_prefix=$(git rev-parse --show-prefix)
|
623 |
+
git_dir="$(git rev-parse --git-dir)" || die "Not a git repository?"
|
624 |
+
cd "$(git rev-parse --show-cdup)" || die "Can't cd back to repository root"
|
625 |
+
git_dir=$(cd "$git_dir"; pwd)
|
626 |
+
git_worktree=$(pwd)
|
627 |
+
|
628 |
+
relative_main_dir=$(dirname "$main")
|
629 |
+
# make main relative to git root directory
|
630 |
+
if test -n "$git_prefix" ; then
|
631 |
+
main=$git_prefix$main
|
632 |
+
fi
|
633 |
+
mainbase=$(basename "$main" .tex)
|
634 |
+
maindir=$(dirname "$main")
|
635 |
+
|
636 |
+
tmpdir=$tmpdir_prefix/git-latexdiff.$$
|
637 |
+
mkdir "$tmpdir" || die "Cannot create temporary directory."
|
638 |
+
|
639 |
+
cd "$tmpdir" || die "Cannot cd to $tmpdir"
|
640 |
+
if test "$(uname -o 2>/dev/null)" = "Msys"; then
|
641 |
+
tmpdir=$(pwd -W)
|
642 |
+
else
|
643 |
+
tmpdir=$(pwd)
|
644 |
+
fi
|
645 |
+
|
646 |
+
mkdir old new || die "Cannot create old and new directories."
|
647 |
+
|
648 |
+
verbose_done
|
649 |
+
verbose_say "Temporary directories: $tmpdir/old and $tmpdir/new"
|
650 |
+
verbose "Checking out old and new version"
|
651 |
+
|
652 |
+
cd old || die "Cannot cd to old/"
|
653 |
+
if test "$ln_untracked" = 1; then
|
654 |
+
(
|
655 |
+
mkdir -p "$maindir" && cd "$maindir" &&
|
656 |
+
log_cmd ln-old.log ln -s "$initial_repo"/"$maindir"/* .
|
657 |
+
) || true
|
658 |
+
fi
|
659 |
+
|
660 |
+
if test "$subtree" = 1 && test -n "$git_prefix"; then
|
661 |
+
checkoutroot=$git_prefix
|
662 |
+
else
|
663 |
+
checkoutroot="./"
|
664 |
+
fi
|
665 |
+
# create the build directory (containing the final PDFs) if the param was set
|
666 |
+
if test -n "$use_build_dir" ; then
|
667 |
+
builddir="$use_build_dir"
|
668 |
+
else
|
669 |
+
builddir="$relative_main_dir"
|
670 |
+
fi
|
671 |
+
|
672 |
+
# Checkout a subtree, without touching the index ("git checkout" would)
|
673 |
+
(cd "$git_dir" && git archive --format=tar "$old" "$checkoutroot") | tar -xf -
|
674 |
+
# Also expand the possible submodules
|
675 |
+
(cd "$git_worktree" && git ls-tree "$old":"$checkoutroot" | \
|
676 |
+
{ grep '^[^ ]* commit ' || true; } | \
|
677 |
+
while read -r mod type id name; do
|
678 |
+
# Submodule's object may be in the submodule (if it was directly "git init && git add"-ed),
|
679 |
+
# or in .git/modules, if it was cloned using "git submodule update <repository> <path>".
|
680 |
+
ALTERNATES=
|
681 |
+
for d in "$name"/.git/objects/ .git/modules/"$name"/objects/; do
|
682 |
+
if test -d "$d"; then
|
683 |
+
ALTERNATES="$ALTERNATES":"$d"
|
684 |
+
fi
|
685 |
+
done
|
686 |
+
GIT_ALTERNATE_OBJECT_DIRECTORIES="$GIT_ALTERNATE_OBJECT_DIRECTORIES":"$ALTERNATES" \
|
687 |
+
git archive --format=tar "$id"^{tree} | tar -xf - --directory "$tmpdir/old/$name"
|
688 |
+
done
|
689 |
+
)
|
690 |
+
verbose_progress
|
691 |
+
cd ../new || die "Cannot cd to new/"
|
692 |
+
if test "$new" == "--"; then
|
693 |
+
# Copy working tree files
|
694 |
+
(cd "$git_worktree" && git ls-files -- "$checkoutroot" | tar -cf - -T -) | tar -xf -
|
695 |
+
else
|
696 |
+
# checkout new revision
|
697 |
+
(cd "$git_dir" && git archive --format=tar "$new" "$checkoutroot") | tar -xf -
|
698 |
+
# In case the submodule isn't yet "git add && git commit"ed, its directory may not have been created.
|
699 |
+
(cd "$git_worktree" && git submodule foreach --recursive 'mkdir -p '$tmpdir/new'/$displaypath')
|
700 |
+
(cd "$git_worktree" && git submodule foreach --recursive 'git archive --format=tar "$sha1" | tar -xf - --directory '$tmpdir/new'/$displaypath')
|
701 |
+
fi
|
702 |
+
if test "$ln_untracked" = 1; then
|
703 |
+
(
|
704 |
+
mkdir -p "$maindir" && cd "$maindir" &&
|
705 |
+
log_cmd ln-new.log ln -s "$initial_repo"/"$maindir"/* .
|
706 |
+
) || true
|
707 |
+
fi
|
708 |
+
|
709 |
+
verbose_progress
|
710 |
+
cd ..
|
711 |
+
|
712 |
+
verbose_done
|
713 |
+
|
714 |
+
for dir in old new
|
715 |
+
do
|
716 |
+
verbose "Running preparation command $prepare_cmd in $dir/$git_prefix"
|
717 |
+
( cd "$dir/$git_prefix/" && log_cmd prepare.log eval "$prepare_cmd" )
|
718 |
+
if test ! -f "$dir/$main"; then
|
719 |
+
die "$prepare_cmd did not produce $dir/$main."
|
720 |
+
fi
|
721 |
+
verbose_done
|
722 |
+
done
|
723 |
+
|
724 |
+
if test $tectonic != 1; then
|
725 |
+
if [ "$ignorelatexerrors" = 1 ]; then
|
726 |
+
latexopt="$latexopt -interaction=batchmode"
|
727 |
+
elif [ "$quiet" = 1 ]; then
|
728 |
+
latexopt="$latexopt -interaction=nonstopmode"
|
729 |
+
else
|
730 |
+
latexopt="$latexopt -interaction=errorstopmode"
|
731 |
+
fi
|
732 |
+
fi
|
733 |
+
|
734 |
+
# Option to use latexdiff --flatten instead of latexpand
|
735 |
+
if test "$latexdiff_flatten" = 1; then
|
736 |
+
latexdiffopt+=("--flatten")
|
737 |
+
fi
|
738 |
+
|
739 |
+
# Shortcut to include bbl
|
740 |
+
if test "$bbl" = 1; then
|
741 |
+
if test "$biber" = 1; then
|
742 |
+
bblexpand=("--expand-bbl" "$mainbase.bbl")
|
743 |
+
# In theory, this (with recent enough latexpand) should work
|
744 |
+
# better. In practice it doesn't seem to work though.
|
745 |
+
# bblexpand=("--biber" "$mainbase.bbl")
|
746 |
+
else
|
747 |
+
bblexpand=("--expand-bbl" "$mainbase.bbl")
|
748 |
+
fi
|
749 |
+
else
|
750 |
+
bblexpand=()
|
751 |
+
fi
|
752 |
+
|
753 |
+
ignore_errors_maybe() {
|
754 |
+
if [ "$compile_error" = 1 ] && [ "$ignorelatexerrors" = 1 ]; then
|
755 |
+
echo "LaTeX errors were found - but attempting to carry on."
|
756 |
+
compile_error=0
|
757 |
+
fi
|
758 |
+
}
|
759 |
+
|
760 |
+
# Create flattened documents and keep for debugging
|
761 |
+
if test "$flatten" = 1; then
|
762 |
+
if [ "$bbl" = 1 ]; then
|
763 |
+
if [ ! -f "old/$maindir$mainbase.bbl" ]; then
|
764 |
+
verbose "Attempting to regenerate missing old/$maindir$mainbase.bbl"
|
765 |
+
oldPWD=$PWD
|
766 |
+
cd old/"$maindir"
|
767 |
+
log_cmd pdflatex0.log $LATEX_EXEC $latexopt "$mainbase" || {
|
768 |
+
compile_error=1
|
769 |
+
error_msg="command 'pdflatex' (automatically run in old due to --bbl) failed."
|
770 |
+
}
|
771 |
+
log_cmd "$BIBTEX_EXEC"0.log $BIBTEX_EXEC "$mainbase" || {
|
772 |
+
compile_error=1
|
773 |
+
error_msg="command '$BIBTEX_EXEC' (automatically run in old due to --bbl) failed."
|
774 |
+
}
|
775 |
+
cd "$oldPWD"
|
776 |
+
ignore_errors_maybe
|
777 |
+
if [ "$compile_error" = 1 ]; then
|
778 |
+
die "Failed to regenerate .bbl for old version"
|
779 |
+
fi
|
780 |
+
fi
|
781 |
+
if [ ! -f "new/$maindir$mainbase.bbl" ]; then
|
782 |
+
verbose "Attempting to regenerate missing new/$maindir$mainbase.bbl"
|
783 |
+
oldPWD=$PWD
|
784 |
+
cd new/"$maindir"
|
785 |
+
log_cmd pdflatex0.log $LATEX_EXEC $latexopt "$mainbase" || {
|
786 |
+
compile_error=1
|
787 |
+
error_msg="command 'pdflatex' (automatically run in new due to --bbl) failed."
|
788 |
+
}
|
789 |
+
log_cmd "$BIBTEX_EXEC"0.log $BIBTEX_EXEC "$mainbase" || {
|
790 |
+
compile_error=1
|
791 |
+
error_msg="command '$BIBTEX_EXEC' (automatically run in new due to --bbl) failed."
|
792 |
+
}
|
793 |
+
cd "$oldPWD"
|
794 |
+
ignore_errors_maybe
|
795 |
+
if [ "$compile_error" = 1 ]; then
|
796 |
+
die "Failed to regenerate .bbl for new version"
|
797 |
+
fi
|
798 |
+
fi
|
799 |
+
fi
|
800 |
+
verbose "Running latexpand"
|
801 |
+
(
|
802 |
+
cd old/"$maindir" &&
|
803 |
+
latexpand "$mainbase".tex "${latexpand[@]}" "${bblexpand[@]}"
|
804 |
+
) > old-"$mainbase"-fl.tex \
|
805 |
+
|| die "latexpand failed for old version"
|
806 |
+
(
|
807 |
+
cd new/"$maindir" &&
|
808 |
+
latexpand "$mainbase".tex "${latexpand[@]}" "${bblexpand[@]}"
|
809 |
+
) > new-"$mainbase"-fl.tex \
|
810 |
+
|| die "latexpand failed for new version"
|
811 |
+
verbose_done
|
812 |
+
|
813 |
+
verbose "Running $LATEXDIFF_EXEC ${latexdiffopt[*]} old-${mainbase}-fl.tex new-${mainbase}-fl.tex > ./diff.tex"
|
814 |
+
"$LATEXDIFF_EXEC" "${latexdiffopt[@]}" old-"$mainbase"-fl.tex new-"$mainbase"-fl.tex > diff.tex \
|
815 |
+
|| die "$LATEXDIFF_EXEC failed"
|
816 |
+
verbose_done
|
817 |
+
|
818 |
+
verbose "mv ./diff.tex new/$main"
|
819 |
+
mv -f new/"$main" new/"$main".orig
|
820 |
+
mv -f diff.tex new/"$main"
|
821 |
+
verbose_done
|
822 |
+
else
|
823 |
+
verbose "Running $LATEXDIFF_EXEC ${latexdiffopt[*]} old/$main new/$main > ./diff.tex"
|
824 |
+
"$LATEXDIFF_EXEC" "${latexdiffopt[@]}" old/"$main" new/"$main" > diff.tex \
|
825 |
+
|| die "$LATEXDIFF_EXEC failed"
|
826 |
+
verbose_done
|
827 |
+
|
828 |
+
verbose "mv ./diff.tex new/$main"
|
829 |
+
mv -f new/"$main" new/"$main.orig"
|
830 |
+
mv -f diff.tex new/"$main"
|
831 |
+
verbose_done
|
832 |
+
fi
|
833 |
+
|
834 |
+
if [ ! -z "$filter_cmd" ]; then
|
835 |
+
verbose "Running filter command $filter_cmd in new/"
|
836 |
+
( cd "new/" && log_cmd filter.log eval "$filter_cmd" )
|
837 |
+
if [ ! -f "new/$main" ]; then
|
838 |
+
die "$filter_cmd removed new/$main."
|
839 |
+
fi
|
840 |
+
verbose_done
|
841 |
+
fi
|
842 |
+
|
843 |
+
verbose "Compiling result"
|
844 |
+
|
845 |
+
compile_error=0
|
846 |
+
|
847 |
+
oldPWD=$PWD
|
848 |
+
cd new/"$maindir" || die "Can't cd to new/$maindir"
|
849 |
+
if test -e Makefile && test "$ignoremake" != 1 ; then
|
850 |
+
log_cmd make.log make || {
|
851 |
+
compile_error=1
|
852 |
+
error_msg="command 'make' failed."
|
853 |
+
}
|
854 |
+
elif test "$uselatexmk" = 1; then
|
855 |
+
log_cmd latexmk.log latexmk -f -pdf -silent $latexopt "$mainbase" || {
|
856 |
+
compile_error=1
|
857 |
+
error_msg="command 'latexmk' failed."
|
858 |
+
}
|
859 |
+
elif test "$tectonic" = 1; then
|
860 |
+
log_cmd tectonic.log tectonic $latexopt "$mainbase.tex" || {
|
861 |
+
compile_error=1
|
862 |
+
error_msg="command 'tectonic' failed."
|
863 |
+
}
|
864 |
+
else
|
865 |
+
log_cmd pdflatex1.log $LATEX_EXEC $latexopt "$mainbase" || {
|
866 |
+
compile_error=1
|
867 |
+
error_msg="command pdflatex (first run) failed."
|
868 |
+
}
|
869 |
+
if test "$bibtex" = 1 || test "$biber" = 1 ; then
|
870 |
+
log_cmd "$BIBTEX_EXEC".log $BIBTEX_EXEC "$mainbase" || {
|
871 |
+
compile_error=1
|
872 |
+
error_msg="command '$BIBTEX_EXEC' failed."
|
873 |
+
}
|
874 |
+
fi
|
875 |
+
log_cmd pdflatex2.log $LATEX_EXEC $latexopt "$mainbase" || {
|
876 |
+
compile_error=1
|
877 |
+
error_msg="command 'pdflatex' (second run) failed."
|
878 |
+
}
|
879 |
+
log_cmd pdflatex3.log $LATEX_EXEC $latexopt "$mainbase" || {
|
880 |
+
compile_error=1
|
881 |
+
error_msg="command 'pdflatex' (third run) failed."
|
882 |
+
}
|
883 |
+
fi
|
884 |
+
cd "$oldPWD"
|
885 |
+
|
886 |
+
# Same relative path as where we've been called from, but in the
|
887 |
+
# temporary new/ directory:
|
888 |
+
cd new/"$git_prefix"
|
889 |
+
|
890 |
+
verbose_done
|
891 |
+
|
892 |
+
ignore_errors_maybe
|
893 |
+
|
894 |
+
if test $latex = 1; then
|
895 |
+
dvips "$mainbase".dvi
|
896 |
+
ps2pdf "$mainbase".ps
|
897 |
+
fi
|
898 |
+
|
899 |
+
pdffile="$builddir/$mainbase".pdf
|
900 |
+
if test ! -r "$pdffile" ; then
|
901 |
+
echo "No PDF file generated."
|
902 |
+
echo "Working directory: $PWD"
|
903 |
+
echo "Expected PDF: $pdffile"
|
904 |
+
compile_error=1
|
905 |
+
elif test ! -s "$pdffile" ; then
|
906 |
+
echo "PDF file generated is empty."
|
907 |
+
compile_error=1
|
908 |
+
fi
|
909 |
+
|
910 |
+
if test "$compile_error" = "1" ; then
|
911 |
+
echo "Error during compilation. Please examine and cleanup if needed:"
|
912 |
+
echo "Directory: $tmpdir/new/$maindir"
|
913 |
+
echo " File: $mainbase.tex"
|
914 |
+
echo " Problem: $error_msg"
|
915 |
+
# Don't clean up to let the user diagnose.
|
916 |
+
exit 1
|
917 |
+
fi
|
918 |
+
|
919 |
+
if test -n "$output" ; then
|
920 |
+
abs_pdffile="$PWD/$pdffile"
|
921 |
+
(cd "$initial_dir" && mv "$abs_pdffile" "$output")
|
922 |
+
pdffile="$output"
|
923 |
+
echo "Output written on $pdffile"
|
924 |
+
elif [ -f "$pdffile" ]; then
|
925 |
+
new_pdffile="$tmpdir"/"$mainbase".pdf
|
926 |
+
mv "$pdffile" "$new_pdffile"
|
927 |
+
pdffile="$new_pdffile"
|
928 |
+
fi
|
929 |
+
|
930 |
+
# Change directory so nothing will keep us from cleaning
|
931 |
+
cd "$initial_dir"
|
932 |
+
|
933 |
+
if test "$view" = 1 || ( test "$view" = maybe && test -z "$output" ) ; then
|
934 |
+
"$PDFVIEWER" "$pdffile"
|
935 |
+
fi
|
936 |
+
|
937 |
+
case "$cleanup" in
|
938 |
+
"all")
|
939 |
+
verbose "Cleaning-up result"
|
940 |
+
rm -fr "$tmpdir"
|
941 |
+
verbose_done
|
942 |
+
;;
|
943 |
+
"keeppdf")
|
944 |
+
verbose "Cleaning-up all but pdf (kept in $pdffile)"
|
945 |
+
rm -fr "$tmpdir"/old "$tmpdir"/new
|
946 |
+
verbose_done
|
947 |
+
;;
|
948 |
+
"none")
|
949 |
+
verbose_say "Generated files kept in $tmpdir/"
|
950 |
+
;;
|
951 |
+
esac
|
packages.txt
ADDED
@@ -0,0 +1,8 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
texlive
|
2 |
+
texlive-full
|
3 |
+
latexdiff
|
4 |
+
biber
|
5 |
+
texlive-fonts-extra
|
6 |
+
texlive-fonts-recommended
|
7 |
+
texlive-bibtex-extra
|
8 |
+
texlive-lang-english
|
requirements.txt
ADDED
@@ -0,0 +1,2 @@
|
|
|
|
|
|
|
1 |
+
GitPython
|
2 |
+
gradio
|