summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xluaotfload-tool.lua116
1 files changed, 103 insertions, 13 deletions
diff --git a/luaotfload-tool.lua b/luaotfload-tool.lua
index 0752cca..5a9e08d 100755
--- a/luaotfload-tool.lua
+++ b/luaotfload-tool.lua
@@ -26,6 +26,8 @@ see the luaotfload documentation for more info. Report bugs to
--doc]]--
+kpse.set_program_name "luatex"
+
--[[doc--
We test for Lua 5.1 by means of capability detection to see if
@@ -36,7 +38,15 @@ see the luaotfload documentation for more info. Report bugs to
--doc]]--
-kpse.set_program_name "luatex"
+local md5sumhexa = md5.sumhexa
+local stringexplode = string.explode
+local stringformat = string.format
+local stringlower = string.lower
+local stringrep = string.rep
+local tableconcat = table.concat
+local texiowrite_nl = texio.write_nl
+local texiowrite = texio.write
+local kpsefind_file = kpse.find_file
local runtime
if _G.getfenv ~= nil then -- 5.1 or LJ
@@ -44,26 +54,19 @@ if _G.getfenv ~= nil then -- 5.1 or LJ
runtime = { "jit", jit.version }
else
runtime = { "stock", _VERSION }
- local oldscript = kpse.find_file "luaotfload-legacy-tool.lua"
+ local oldscript = kpsefind_file "luaotfload-legacy-tool.lua"
return require (oldscript)
end
else -- 5.2
runtime = { "stock", _VERSION }
end
-local stringexplode = string.explode
-local stringformat = string.format
-local stringlower = string.lower
-local stringrep = string.rep
-local tableconcat = table.concat
-local texiowrite_nl = texio.write_nl
-local texiowrite = texio.write
local C, Ct, P, S = lpeg.C, lpeg.Ct, lpeg.P, lpeg.S
local lpegmatch = lpeg.match
local loader_file = "luatexbase.loader.lua"
-local loader_path = assert(kpse.find_file(loader_file, "lua"),
+local loader_path = assert(kpsefind_file(loader_file, "lua"),
"File '"..loader_file.."' not found")
@@ -121,6 +124,8 @@ config.lualibs.load_extended = false
require "lualibs"
+local ioloaddata = io.loaddata
+
--[[doc--
\fileent{luatex-basics-gen.lua} calls functions from the
\luafunction{texio.*} library; too much for our taste.
@@ -646,8 +651,9 @@ set.
--]]--
local action_sequence = {
- "loglevel", "help", "version", "blacklist", "cache",
- "flush", "generate", "list", "query",
+ "loglevel", "help", "version", "diagnose",
+ "blacklist", "cache", "flush", "generate",
+ "list", "query",
}
local action_pending = table.tohash(action_sequence, false)
@@ -913,6 +919,87 @@ actions.list = function (job)
return true, true
end
+do
+ local hash_list = "luaotfload-files"
+
+ local out = function (...)
+ logs.names_report (false, 0, "diagnose", ...)
+ end
+
+ local verify_files = function (errcnt)
+ out ("Loading file hashes.")
+ local hashes = require (hash_list)
+ if not hashes then
+ out ("Testing %d files for integrity.", nhashes)
+ return 1/0
+ end
+ local nhashes = #hashes
+ out ("Testing %d files for integrity.", nhashes)
+ for i = 1, nhashes do
+ local fname, canonicalsum = unpack (hashes[i])
+ local location = kpsefind_file (fname)
+ if not location then
+ errcnt = errcnt + 1
+ out ("FAILED: file %d missing.", fname)
+ else
+ out ("File: %s.", location)
+ local raw = ioloaddata (location)
+ if not raw then
+ errcnt = errcnt + 1
+ out ("FAILED: file %d not readable.", fname)
+ else
+ local sum = md5sumhexa (raw)
+ if sum ~= canonicalsum then
+ errcnt = errcnt + 1
+ out ("FAILED: checksum mismatch for file %s.",
+ fname)
+ out ("Expected %s, got %s.", canonicalsum, sum)
+ else
+ out ("Ok, %s passed.", fname)
+ end
+ end
+ end
+ end
+ return errcnt
+ end
+
+ actions.diagnose = function (job)
+ local errcnt = 0
+ errcnt = verify_files (errcnt)
+
+ if errcnt == 0 then --> success
+ out ("Everything appears to be in order, \z
+ you may sleep well.")
+ return true, false
+ else
+ out ( [[===============================================
+ WARNING
+ ===============================================
+
+ The diagnostic detected %d errors.
+
+ This version of luaotfload may have been
+ tampered with. Modified versions of the
+ luaotfload source are unsupported. Read the log
+ carefully and get a clean version from CTAN or
+ github:
+
+ × http://ctan.org/tex-archive/macros/luatex/generic/luaotfload
+ × https://github.com/lualatex/luaotfload/releases
+
+ If you are uncertain as to how to proceed, then
+ ask on the lualatex mailing list:
+
+ http://www.tug.org/mailman/listinfo/lualatex-dev
+
+ ===============================================
+]],
+ errcnt)
+ end
+ return false, false
+ end
+end
+
--- stuff to be carried out prior to exit
local finalizers = { }
@@ -952,6 +1039,7 @@ local process_cmdline = function ( ) -- unit -> jobspec
local long_options = {
alias = 1,
cache = 1,
+ diagnose = "d",
["dry-run"] = "D",
["flush-lookups"] = "l",
fields = 1,
@@ -973,7 +1061,7 @@ local process_cmdline = function ( ) -- unit -> jobspec
warnings = "w",
}
- local short_options = "bDfFiIlpquvVhw"
+ local short_options = "bdDfFiIlpquvVhw"
local options, _, optarg =
alt_getopt.get_ordered_opts (arg, short_options, long_options)
@@ -1047,6 +1135,8 @@ local process_cmdline = function ( ) -- unit -> jobspec
config.luaotfload.prioritize = "texmf"
elseif v == "b" then
action_pending["blacklist"] = true
+ elseif v == "d" then
+ action_pending["diagnose"] = true
end
end