检查 pdf 是否是最新的 git pre-commit hook?

检查 pdf 是否是最新的 git pre-commit hook?

如果能执行并收到 git 的拒绝,那就太好了git commit -m "some stupid broken commit",因为文档的最新版本尚未成功编译(即更改尚未测试)。git 方面非常简单,只是一个返回非零退出代码的 shell 脚本。但为了做到这一点,我需要能够检查 pdf 是否是最新的。显然这是可以做到的,因为如果我在latexmk成功编译后运行,我会得到:

$ latexmk -pdf -f thesis
Latexmk: This is Latexmk, John Collins, 30 March 2012, version: 4.31.
**** Report bugs etc to John Collins <collins at phys.psu.edu>. ****
Latexmk: All targets (thesis.pdf) are up-to-date

这很好,我可以在脚本中使用它(假设它输出可用的退出代码)。但如果文档不是最新的,那么能够在没有 latexmk 编译文档的情况下做到这一点就太好了。

那么 latexmk 如何确定输出文件是最新的?或者,是否可以告诉 latexmk不是编译,然后只检查编译状态?

答案1

一个稍微好一点的解决方案是创建一个特殊的初始化文件,我将其称为latexmkrc-diagnose-change,内容如下

$pdflatex = $latex = 'internal die_pdflatex %S';
sub die_notepdflatex {
    # Stop now, otherwise latexmk will update its knowledge of the
    # source files and not realize files are out-of-date on the next run.
    die "I won't do anything, but just note that '$_[0]' is out of date\n";
}

然后latexmk使用命令行调用latexmk -r latexmkrc-diagnose-change -pdf thesis。如果文件已过期,您将收到一条适当的错误消息,并latexmk以非零退出代码退出。

答案2

Latexmk 以连续模式保存所涉及文件的哈希值(默认情况下),jobname.fdb_latexmk 然后循环遍历这些文件并不时进行检查(如果我没记错的话,每 2 秒一次)。

关于你的钩子:

似乎 latexmk 更新了哈希值编译。因此 latexmk 的第二次运行总是返回“最新”。

第一次,您可以使用类似 的东西latexmk -norc -latex=idonotexist jobname。运行此操作将不起作用,因此 latexmk 将返回负值。将-norc保护您免受设置文件的侵害,因此您不必使用-pdflatex或其他任何东西。

但只有一次。然后你必须再次更改一些文件。这不能防止“它没有编译”,但可以防止“我甚至没有尝试编译”

相关内容