summaryrefslogtreecommitdiff
path: root/scripts/context/lua/mtx-cache.lua
blob: 56d3df188d2e3f9c3719c93312b729b3ce08b9ce (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
136
137
138
139
140
141
142
143
144
145
146
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">0.10</entry>
 </metadata>
 <flags>
  <category name="basic">
   <subcategory>
    <flag name="purge"><short>remove not used files</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 tmas, tmcs, rest = { }, { }, { }
    for i=1,#all do
        local name = all[i]
        local suffix = filesuffix(name)
        if suffix == "tma" then
            tmas[#tmas+1] = name
        elseif suffix == "tmc" then
            tmcs[#tmcs+1] = name
        else
            rest[#rest+1] = name
        end
    end
    return tmas, tmcs, rest, all
end

local function list(banner,path,tmas,tmcs,rest)
    report("%s: %s",banner,path)
    report()
    report("tma   : %4i",#tmas)
    report("tmc   : %4i",#tmcs)
    report("rest  : %4i",#rest)
    report("total : %4i",#tmas+#tmcs+#rest)
    report()
end

local function purge(banner,path,list,all)
    report("%s: %s",banner,path)
    report()
    local fonts = environment.argument("fonts")
    local n = 0
    for i=1,#list do
        local filename = list[i]
        if find(filename,"luatex%-cache") then -- safeguard
            if fonts and not find(filename,"fonts") then
                -- skip
            elseif all then
                remove(filename)
                n = n + 1
            elseif not fonts or find(filename,"fonts") then
                local suffix = filesuffix(filename)
                if suffix == "tma" then
                    local checkname = replacesuffix(filename,"tma","tmc")
                    if isfile(checkname) then
                        remove(filename)
                        n = n + 1
                    end
                end
            end
        end
    end
    report("removed tma files : %i",n)
    report()
    return n
end

function scripts.cache.purge()
    local writable = caches.getwritablepath()
    local tmas, tmcs, rest = collect(writable)
    list("writable path",writable,tmas,tmcs,rest)
    purge("writable path",writable,tmas)
    list("writable path",writable,tmas,tmcs,rest)
end

function scripts.cache.erase()
    local writable = caches.getwritablepath()
    local tmas, tmcs, rest, all = collect(writable)
    list("writable path",writable,tmas,tmcs,rest)
    purge("writable path",writable,all,true)
    list("writable path",writable,tmas,tmcs,rest)
end

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

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