summaryrefslogtreecommitdiff
path: root/scripts/context/lua/mtx-cache.lua
blob: 4f378ff0a69a3f2af36f7f6943b59cd829b76fa4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
if not modules then modules = { } end modules ['mtx-cache'] = {
    version   = 1.001,
    comment   = "companion to mtxrun.lua",
    author    = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
    copyright = "PRAGMA ADE / ConTeXt Development Team",
    license   = "see context related readme files"
}

local helpinfo = [[
<?xml version="1.0"?>
<application>
 <metadata>
  <entry name="name">mtx-cache</entry>
  <entry name="detail">ConTeXt &amp; MetaTeX Cache Management</entry>
  <entry name="version">1.01</entry>
 </metadata>
 <flags>
  <category name="basic">
   <subcategory>
    <flag name="make"><short>generate databases and formats</short></flag>
    <flag name="erase"><short>completely remove cache</short></flag>
    <flag name="list"><short>show cache</short></flag>
   </subcategory>
   <subcategory>
    <flag name="fonts"><short>only wipe fonts</short></flag>
   </subcategory>
  </category>
 </flags>
</application>
]]


local find = string.find
local filesuffix, replacesuffix = file.suffix, file.replacesuffix
local isfile = lfs.isfile
local remove = os.remove

local application = logs.application {
    name     = "mtx-cache",
    banner   = "ConTeXt & MetaTeX Cache Management 0.10",
    helpinfo = helpinfo,
}

local report = application.report

scripts       = scripts       or { }
scripts.cache = scripts.cache or { }

local function collect(path)
    local all = dir.glob(path .. "/**/*")
    local ext = table.setmetatableindex("table")
    for i=1,#all do
        local name = all[i]
        local list = ext[filesuffix(name)]
        list[#list+1] = name
    end
    return ext
end

local function list(banner,path,ext)
    local total = 0
    report("%s: %s",banner,path)
    report()
    for k, v in table.sortedhash(ext) do
        total = total + #v
        report("%-6s : %4i",k,#v)
    end
    report()
    report("total  : %4i",total)
    report()
end

local function erase(banner,path,list)
    report("%s: %s",banner,path)
    report()
    for ext, list in table.sortedhash(list) do
        local gone = 0
        local kept = 0
        for i=1,#list do
            local filename = list[i]
            if find(filename,"luatex%-cache") then
                remove(filename)
                if isfile(filename) then
                    kept = kept + 1
                else
                    gone = gone + 1
                end
            end
        end
        report("%-6s : %4i gone, %4i kept",ext,gone,kept)
    end
    report()
end

function scripts.cache.make()
    os.execute("mtxrun --generate")
    os.execute("context --make")
    os.execute("mtxrun --script font --reload")
end

function scripts.cache.erase()
    local writable = caches.getwritablepath()
    local groups   = collect(writable)
    list("writable path",writable,groups)
    erase("writable path",writable,groups)
    if environment.argument("make") then
        scripts.cache.make()
    end
end

function scripts.cache.list()
    local readables = caches.getreadablepaths()
    local writable  = caches.getwritablepath()
    local groups    = collect(writable)
    list("writable path",writable,groups)
    for i=1,#readables do
        local readable = readables[i]
        if readable ~= writable then
            local groups = collect(readable)
            list("readable path",readable,groups)
        end
    end
end

if environment.argument("erase") then
    scripts.cache.erase()
elseif environment.argument("list") then
    scripts.cache.list()
elseif environment.argument("make") then
    scripts.cache.make()
elseif environment.argument("exporthelp") then
    application.export(environment.argument("exporthelp"),environment.files[1])
else
    application.help()
end