diff options
| -rw-r--r-- | luaotfload-database.lua | 135 | ||||
| -rw-r--r-- | luaotfload-override.lua | 11 | ||||
| -rwxr-xr-x | luaotfload-tool.lua | 34 | 
3 files changed, 176 insertions, 4 deletions
diff --git a/luaotfload-database.lua b/luaotfload-database.lua index 33b6b29..ffcf536 100644 --- a/luaotfload-database.lua +++ b/luaotfload-database.lua @@ -1510,7 +1510,130 @@ save_names = function (fontnames)      return false  end ---- is this used anywhere? +--[[doc-- + +    Below set of functions is modeled after mtx-cache. + +--doc]]-- + +--- string -> string -> string list -> string list -> string list -> unit +local print_cache = function (category, path, luanames, lucnames, rest) +    local report_indeed = function (...) +        report("info", 0, "cache", ...) +    end +    report_indeed("Luaotfload cache: %s", category) +    report_indeed("location: %s", path) +    report_indeed("[raw]       %4i", #luanames) +    report_indeed("[compiled]  %4i", #lucnames) +    report_indeed("[other]     %4i", #rest) +    report_indeed("[total]     %4i", #luanames + #lucnames + #rest) +end + +--- string -> string -> string list -> bool -> bool +local purge_from_cache = function (category, path, list, all) +    report("info", 2, "cache", "Luaotfload cache: %s %s", +        (all and "erase" or "purge"), category) +    report("info", 2, "cache", "location: %s",path) +    local n = 0 +    for i=1,#list do +        local filename = list[i] +        if string.find(filename,"luatex%-cache") then -- safeguard +            if all then +                report("info", 5, "cache", "removing %s", filename) +                os.remove(filename) +                n = n + 1 +            else +                local suffix = file.suffix(filename) +                if suffix == "lua" then +                    local checkname = file.replacesuffix( +                        filename, "lua", "luc") +                    if lfs.isfile(checkname) then +                        report("info", 5, "cache", "removing %s", filename) +                        os.remove(filename) +                        n = n + 1 +                    end +                end +            end +        end +    end +    report("info", 2, "cache", "removed lua files : %i", n) +    return true +end +--- string -> string list -> int -> string list -> string list -> string list -> +---     (string list * string list * string list * string list) +local collect_cache collect_cache = function (path, all, n, luanames, +                                              lucnames, rest) +    if not all then +        local all = dirglob(path .. "/**/*") +        local luanames, lucnames, rest = { }, { }, { } +        return collect_cache(nil, all, 1, luanames, lucnames, rest) +    end + +    local filename = all[n] +    if filename then +        local suffix = file.suffix(filename) +        if suffix == "lua" then +            luanames[#luanames+1] = filename +        elseif suffix == "luc" then +            lucnames[#lucnames+1] = filename +        else +            rest[#rest+1] = filename +        end +        return collect_cache(nil, all, n+1, luanames, lucnames, rest) +    end +    return luanames, lucnames, rest, all +end + +--- unit -> unit +local purge_cache = function ( ) +    local writable_path = caches.getwritablepath() +    local luanames, lucnames, rest = collect_cache(writable_path) +    if logs.get_loglevel() > 1 then +        print_cache("writable path", writable_path, luanames, lucnames, rest) +    end +    local success = purge_from_cache("writable path", writable_path, luanames, false) +    return success +end + +--- unit -> unit +local erase_cache = function ( ) +    local writable_path = caches.getwritablepath() +    local luanames, lucnames, rest, all = collect_cache(writable_path) +    if logs.get_loglevel() > 1 then +        print_cache("writable path", writable_path, luanames, lucnames, rest) +    end +    local success = purge_from_cache("writable path", writable_path, all, true) +    return success +end + +local separator = function ( ) +    report("info", 0, string.rep("-", 67)) +end + +--- unit -> unit +local show_cache = function ( ) +    local readable_paths = caches.getreadablepaths() +    local writable_path  = caches.getwritablepath() +    local luanames, lucnames, rest = collect_cache(writable_path) + +    separator() +    print_cache("writable path", writable_path, luanames, lucnames, rest) +    texiowrite_nl"" +    for i=1,#readable_paths do +        local readable_path = readable_paths[i] +        if readable_path ~= writable_path then +            local luanames, lucnames = collect_cache(readable_path) +            print_cache("readable path", +                readable_path,luanames,lucnames,rest) +        end +    end +    separator() +    return true +end + +--- is this used anywhere? we decided to comment it for the +--- time being. +--- https://github.com/lualatex/luaotfload/pull/61  --scan_external_dir = function (dir)  --    local old_names, new_names  --    if fonts_loaded then @@ -1524,8 +1647,11 @@ end  --    return n_scanned, n_new  --end +-----------------------------------------------------------------------  --- export functionality to the namespace “fonts.names” -names.flush_cache                 = flush_cache +----------------------------------------------------------------------- + +names.flush_cache                 = flush_cache --- concerns lookups  names.save_lookups                = save_lookups  names.load                        = load_names  names.save                        = save_names @@ -1534,6 +1660,11 @@ names.update                      = update_names  names.crude_file_lookup           = crude_file_lookup  names.crude_file_lookup_verbose   = crude_file_lookup_verbose +--- font cache +names.purge_cache    = purge_cache +names.erase_cache    = erase_cache +names.show_cache     = show_cache +  --- replace the resolver from luatex-fonts  if config.luaotfload.resolver == "cached" then      report("both", 2, "cache", "caching of name: lookups active") diff --git a/luaotfload-override.lua b/luaotfload-override.lua index f143009..99a6611 100644 --- a/luaotfload-override.lua +++ b/luaotfload-override.lua @@ -30,14 +30,25 @@ We recreate the verbosity levels previously implemented in font-nms:  local loglevel = 1 --- default  local logout   = "log" +--- int -> bool  local set_loglevel = function (n)      if type(n) == "number" then          loglevel = n      end +    return true  end +logs.setloglevel    = set_loglevel  logs.set_loglevel   = set_loglevel  logs.set_log_level  = set_loglevel --- accomodating lazy typists +--- unit -> int +local get_loglevel = function ( ) +    return loglevel +end +logs.getloglevel    = get_loglevel +logs.get_loglevel   = get_loglevel +logs.get_log_level  = get_loglevel +  local set_logout = function (s)      if s == "stdout" then          logout = "term" diff --git a/luaotfload-tool.lua b/luaotfload-tool.lua index 93d6acf..89d3f78 100755 --- a/luaotfload-tool.lua +++ b/luaotfload-tool.lua @@ -171,6 +171,12 @@ The font database will be saved to     %s     %s +------------------------------------------------------------------------------- +                                   FONT CACHE + +  --cache=<directive>          operate on font cache, where <directive> is +                               “show”, “purge”, or “erase” +  ]],      mkluatexfontdb = [[ @@ -246,7 +252,8 @@ set.  --]]--  local action_sequence = { -    "loglevel", "help", "version", "flush", "generate", "list", "query" +    "loglevel", "help",     "version", "cache", +    "flush",    "generate", "list",    "query",  }  local action_pending  = table.tohash(action_sequence, false) @@ -290,13 +297,32 @@ actions.flush = function (job)      if success then          local success = names.save_lookups()          if success then -            logs.names_report("info", 2, "cache", "Cache emptied") +            logs.names_report("info", 2, "cache", "Lookup cache emptied")              return true, true          end      end      return false, false  end +local cache_directives = { +    ["purge"] = names.purge_cache, +    ["erase"] = names.erase_cache, +    ["show"]  = names.show_cache, +} + +actions.cache = function (job) +    local directive = cache_directives[job.cache] +    if not directive or type(directive) ~= "function" then +        logs.names_report("info", 2, "cache", +                          "Invalid font cache directive %s.", job.cache) +        return false, false +    end +    if directive() then +        return true, true +    end +    return false, false +end +  actions.query = function (job)      local query = job.query @@ -508,6 +534,7 @@ local process_cmdline = function ( ) -- unit -> jobspec      local long_options = {          alias            = 1, +        cache            = 1,          ["flush-cache"]  = "c",          fields           = 1,          find             = 1, @@ -580,6 +607,9 @@ local process_cmdline = function ( ) -- unit -> jobspec              result.criterion = optarg[n]          elseif v == "fields" then              result.asked_fields = optarg[n] +        elseif v == "cache" then +            action_pending["cache"] = true +            result.cache = optarg[n]          end      end  | 
