From b5b0f282e7db1365a95e12401f9239cbe50b21f7 Mon Sep 17 00:00:00 2001
From: Philipp Gesang <phg42.2a@gmail.com>
Date: Sun, 21 Apr 2013 00:58:34 +0200
Subject: make mkluatexfontdb.lua behave differently if called as *fontdbutil*

---
 mkluatexfontdb.lua | 137 +++++++++++++++++++++++++++++++++++++++++++----------
 otfl-font-nms.lua  |  12 ++---
 2 files changed, 117 insertions(+), 32 deletions(-)

diff --git a/mkluatexfontdb.lua b/mkluatexfontdb.lua
index 80c0951..5ff6a5b 100755
--- a/mkluatexfontdb.lua
+++ b/mkluatexfontdb.lua
@@ -11,6 +11,8 @@ kpse.set_program_name"luatex"
 
 local stringformat  = string.format
 local texiowrite_nl = texio.write_nl
+local stringfind    = string.find
+local stringlower   = string.lower
 
 -- First we need to be able to load module (code copied from
 -- luatexbase-loader.sty):
@@ -21,11 +23,49 @@ local loader_path = assert(kpse.find_file(loader_file, "lua"),
 --texiowrite_nl("("..loader_path..")")
 dofile(loader_path) -- FIXME this pollutes stdout with filenames
 
-_G.config      = _G.config or { }
-local config   = _G.config
+--[[doc--
+Depending on how the script is called we change its behavior.
+For backwards compatibility, moving or symlinking the script to a
+file name starting with \fileent{mkluatexfontdb} will cause it to
+trigger a database update on every run.
+Running as \fileent{fontdbutil} -- the new name -- will do this upon
+request only.
+
+There are two naming conventions followed here: firstly that of
+utilities such as \fileent{mktexpk}, \fileent{mktexlsr} and the likes,
+and secondly that of \fileent{fmtutil}.
+After support for querying the database was added, the latter appeared
+to be the more appropriate.
+--doc]]--
+
+config              = config or { }
+local config        = config
+config.luaotfload   = config.luaotfload or { }
+
+do -- we don’t have file.basename and the likes yet, so inline parser ftw
+    local C, P         = lpeg.C, lpeg.P
+    local lpegmatch    = lpeg.match
+    local slash        = P"/"
+    local dot          = P"."
+    local noslash      = 1 - slash
+    local slashes      = slash^1
+    local path         =  slashes^-1 * (noslash^1 * slashes)^1
+    local thename      = (1 - slash - dot)^1
+    local extension    = dot * (1 - slash - dot)^1
+    local p_basename   = path^-1 * C(thename) * extension^-1 * P(-1)
+
+    -- if stringfind(stringlower(arg[0]), "^fontdbutil") then  
+    local self = lpegmatch(p_basename, stringlower(arg[0]))
+    if self == "fontdbutil" then
+        config.luaotfload.self = "fontdbutil"
+    else
+        config.luaotfload.self = "mkluatexfontdb"
+    end
+end
 
 config.lualibs                  = config.lualibs or { }
-config.lualibs.prefer_merged    = false
+config.lualibs.verbose          = false
+config.lualibs.prefer_merged    = true
 config.lualibs.load_extended    = false
 
 require"lualibs"
@@ -34,21 +74,24 @@ require"otfl-luat-ovr.lua"  --- this populates the logs.* namespace
 require"otfl-font-nms"
 require"alt_getopt"
 
-local name    = "mkluatexfontdb"
 local version = "2.2" -- same version number as luaotfload
 local names    = fonts.names
 
 local db_src_out = names.path.dir.."/"..names.path.basename
 local db_bin_out = file.replacesuffix(db_src_out, "luc")
-local function help_msg()
-    texiowrite_nl(stringformat([[
+
+local help_messages = {
+    fontdbutil = [[
 
 Usage: %s [OPTION]...
     
-Rebuild the LuaTeX font database.
+Operations on the LuaTeX font database.
+
+This tool is part of the luaotfload package. Valid options are:
+
+-------------------------------------------------------------------------------
+                             VERBOSITY AND LOGGING
 
-Valid options:
-  -f --force                   force re-indexing all fonts
   -q --quiet                   don't output anything
   -v --verbose=LEVEL           be more verbose (print the searched directories)
   -vv                          print the loaded fonts
@@ -56,6 +99,12 @@ Valid options:
   -V --version                 print version and exit
   -h --help                    print this message
 
+-------------------------------------------------------------------------------
+                                   DATABASE
+
+  -u --update                  update the database
+  -f --force                   force re-indexing all fonts
+
   --find="font name"           query the database for a font name
   -F --fuzzy                   look for approximate matches if --find fails
 
@@ -65,13 +114,39 @@ The font database will be saved to
    %s
    %s
 
-]], name, db_src_out, db_bin_out))
+]],
+    mkluatexfontdb = [[
+
+Usage: %s [OPTION]...
+    
+Rebuild the LuaTeX font database.
+
+Valid options:
+  -f --force                   force re-indexing all fonts
+  -q --quiet                   don't output anything
+  -v --verbose=LEVEL           be more verbose (print the searched directories)
+  -vv                          print the loaded fonts
+  -vvv                         print all steps of directory searching
+  -V --version                 print version and exit
+  -h --help                    print this message
+
+The font database will be saved to
+   %s
+   %s
+
+]],
+}
+
+local help_msg = function ( )
+    local template = help_messages[config.luaotfload.self]
+                  or help.messages.fontdbutil
+    texiowrite_nl(stringformat(template, config.luaotfload.self, db_src_out, db_bin_out))
 end
 
-local function version_msg()
+local version_msg = function ( )
     texiowrite_nl(stringformat(
         "%s version %s, database version %s.\n",
-        name, version, names.version))
+        config.luaotfload.self, version, names.version))
 end
 
 --[[--
@@ -80,17 +155,19 @@ executed in the correct order. To avoid duplication we track them in a
 set.
 --]]--
 
-local action_sequence = { "loglevel", "help", "version", "generate", "query" }
+local action_sequence = {
+    "loglevel", "help", "version", "generate", "query"
+}
 local action_pending  = table.tohash(action_sequence, false)
 
-action_pending.loglevel = true --- always set the loglevel
-action_pending.generate = true --- this is the default action
+action_pending.loglevel = true  --- always set the loglevel
+action_pending.generate = false --- this is the default action
 
 local actions = { } --- (jobspec -> (bool * bool)) list
 
 actions.loglevel = function (job)
     logs.set_loglevel(job.log_level)
-    logs.names_report("log", 2,
+    logs.names_report("log", 2, "util",
                       "setting log level", "%d", job.log_level)
     return true, true
 end
@@ -108,8 +185,8 @@ end
 actions.generate = function (job)
     local fontnames, savedname
     fontnames = names.update(fontnames, job.force_reload)
-    logs.names_report("log", 0, "fonts in the database",
-                      "%i", #fontnames.mappings)
+    logs.names_report("log", 0, "db",
+        "fonts in the database", "%i", #fontnames.mappings)
     savedname = names.save(fontnames)
     if savedname then --- FIXME have names.save return bool
         return true, true
@@ -164,6 +241,10 @@ local process_cmdline = function ( ) -- unit -> jobspec
         log_level    = 1,
     }
 
+    if config.luaotfload.self == "mkluatexfontdb" then
+        action_pending["generate"] = true
+    end
+
     local long_options = {
         force            = "f",
         help             = "h",
@@ -174,9 +255,10 @@ local process_cmdline = function ( ) -- unit -> jobspec
         find             = 1,
         fuzzy            = "F",
         limit            = 1,
+        update           = "u",
     }
 
-    local short_options = "fFqvVh"
+    local short_options = "fFquvVh"
 
     local options, _, optarg =
         alt_getopt.get_ordered_opts (arg, short_options, long_options)
@@ -186,6 +268,8 @@ local process_cmdline = function ( ) -- unit -> jobspec
         local v = options[n]
         if     v == "q" then
             result.log_level = 0
+        elseif v == "u" then
+            action_pending["generate"] = true
         elseif v == "v" then
             if result.log_level > 0 then
                 result.log_level = result.log_level + 1
@@ -197,6 +281,7 @@ local process_cmdline = function ( ) -- unit -> jobspec
         elseif v == "h" then
             action_pending["help"] = true
         elseif v == "f" then
+            result.update       = true
             result.force_reload = 1
         elseif v == "verbose" then
             local lvl = optarg[n]
@@ -234,24 +319,24 @@ local main = function ( ) -- unit -> int
         local actionname = action_sequence[i]
         local exit       = false
         if action_pending[actionname] then
-            logs.names_report("log", 3, "preparing for task",
+            logs.names_report("log", 3, "util", "preparing for task",
                               "%s", actionname)
 
             local action             = actions[actionname]
             local success, continue  = action(job)
 
             if not success then
-                logs.names_report(false, 0, "could not finish task",
-                                  "%s", actionname)
+                logs.names_report(false, 0, "util",
+                    "could not finish task", "%s", actionname)
                 retval = -1
                 exit   = true
             elseif not continue then
-                logs.names_report(false, 3, "task completed, exiting",
-                                  "%s", actionname)
+                logs.names_report(false, 3, "util",
+                    "task completed, exiting", "%s", actionname)
                 exit   = true
             else
-                logs.names_report(false, 3, "task completed successfully",
-                                  "%s", actionname)
+                logs.names_report(false, 3, "util",
+                    "task completed successfully", "%s", actionname)
             end
         end
         if exit then break end
diff --git a/otfl-font-nms.lua b/otfl-font-nms.lua
index 6f236b6..048a90a 100644
--- a/otfl-font-nms.lua
+++ b/otfl-font-nms.lua
@@ -557,7 +557,7 @@ font_fullinfo = function (filename, subfont, texmf)
         end
     else
         -- no names table, propably a broken font
-        report("log", 1, "broken font rejected", "%s", basefile)
+        report("log", 1, "db", "broken font rejected", "%s", basefile)
         return
     end
     tfmdata.fontname    = metadata.fontname
@@ -589,7 +589,7 @@ local load_font = function (filename, fontnames, newfontnames, texmf)
     if filename then
         if names.blacklist[filename] or
            names.blacklist[basename] then
-            report("log", 2, "ignoring font", "%s", filename)
+            report("log", 2, "db", "ignoring font", "%s", filename)
             return
         end
         local timestamp, db_timestamp
@@ -612,7 +612,7 @@ local load_font = function (filename, fontnames, newfontnames, texmf)
                 newmappings[#newmappings+1]        = mappings[v]
                 newstatus[basefile].index[index+1] = #newmappings
             end
-            report("log", 1, "font already indexed", "%s", basefile)
+            report("log", 1, "db", "font already indexed", "%s", basefile)
             return
         end
         local info = fontloader.info(filename)
@@ -647,7 +647,7 @@ local load_font = function (filename, fontnames, newfontnames, texmf)
                 newstatus[basefile].index[1] = index
             end
         else
-            report("log", 1, "failed to load", "%s", basefile)
+            report("log", 1, "db", "failed to load", "%s", basefile)
         end
     end
 end
@@ -988,10 +988,10 @@ save_names = function (fontnames)
         local luaname, lucname = make_name(path)
         tabletofile(luaname, fontnames, true)
         caches.compile(fontnames,luaname,lucname)
-        report("info", 1, "db", "Font names database saved")
+        report("info", 0, "db", "Font names database saved")
         return path
     else
-        report("info", 1, "db", "Failed to save names database")
+        report("info", 0, "db", "Failed to save names database")
         return nil
     end
 end
-- 
cgit v1.2.3