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
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
|
if not modules then modules = { } end modules ['luat-sta'] = {
version = 1.001,
author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
copyright = "PRAGMA ADE / ConTeXt Development Team",
license = "see context related readme files"
}
-- this code is used in the updater
local gmatch, match = string.gmatch, string.match
local type = type
states = states or { }
states.data = states.data or { }
states.hash = states.hash or { }
states.tag = states.tag or ""
states.filename = states.filename or ""
function states.save(filename,tag)
tag = tag or states.tag
filename = file.addsuffix(filename or states.filename,'lus')
io.savedata(filename,
"-- generator : luat-sta.lua\n" ..
"-- state tag : " .. tag .. "\n\n" ..
table.serialize(states.data[tag or states.tag] or {},true)
)
end
function states.load(filename,tag)
states.filename = filename
states.tag = tag or "whatever"
states.filename = file.addsuffix(states.filename,'lus')
states.data[states.tag], states.hash[states.tag] = (io.exists(filename) and dofile(filename)) or { }, { }
end
function states.set_by_tag(tag,key,value,default,persistent)
local d, h = states.data[tag], states.hash[tag]
if d then
if type(d) == "table" then
local dkey, hkey = key, key
local pre, post = match(key,"(.+)%.([^%.]+)$")
if pre and post then
for k in gmatch(pre,"[^%.]+") do
local dk = d[k]
if not dk then
dk = { }
d[k] = dk
elseif type(dk) == "string" then
-- invalid table, unable to upgrade structure
-- hope for the best or delete the state file
break
end
d = dk
end
dkey, hkey = post, key
end
if type(value) == nil then
value = value or default
elseif persistent then
value = value or d[dkey] or default
else
value = value or default
end
d[dkey], h[hkey] = value, value
elseif type(d) == "string" then
-- weird
states.data[tag], states.hash[tag] = value, value
end
end
end
function states.get_by_tag(tag,key,default)
local h = states.hash[tag]
if h and h[key] then
return h[key]
else
local d = states.data[tag]
if d then
for k in gmatch(key,"[^%.]+") do
local dk = d[k]
if dk then
d = dk
else
return default
end
end
return d or default
end
end
end
function states.set(key,value,default,persistent)
states.set_by_tag(states.tag,key,value,default,persistent)
end
function states.get(key,default)
return states.get_by_tag(states.tag,key,default)
end
--~ states.data.update = {
--~ ["version"] = {
--~ ["major"] = 0,
--~ ["minor"] = 1,
--~ },
--~ ["rsync"] = {
--~ ["server"] = "contextgarden.net",
--~ ["module"] = "minimals",
--~ ["repository"] = "current",
--~ ["flags"] = "-rpztlv --stats",
--~ },
--~ ["tasks"] = {
--~ ["update"] = true,
--~ ["make"] = true,
--~ ["delete"] = false,
--~ },
--~ ["platform"] = {
--~ ["host"] = true,
--~ ["other"] = {
--~ ["mswin"] = false,
--~ ["linux"] = false,
--~ ["linux-64"] = false,
--~ ["osx-intel"] = false,
--~ ["osx-ppc"] = false,
--~ ["sun"] = false,
--~ },
--~ },
--~ ["context"] = {
--~ ["available"] = {"current", "beta", "alpha", "experimental"},
--~ ["selected"] = "current",
--~ },
--~ ["formats"] = {
--~ ["cont-en"] = true,
--~ ["cont-nl"] = true,
--~ ["cont-de"] = false,
--~ ["cont-cz"] = false,
--~ ["cont-fr"] = false,
--~ ["cont-ro"] = false,
--~ },
--~ ["engine"] = {
--~ ["pdftex"] = {
--~ ["install"] = true,
--~ ["formats"] = {
--~ ["pdftex"] = true,
--~ },
--~ },
--~ ["luatex"] = {
--~ ["install"] = true,
--~ ["formats"] = {
--~ },
--~ },
--~ ["xetex"] = {
--~ ["install"] = true,
--~ ["formats"] = {
--~ ["xetex"] = false,
--~ },
--~ },
--~ ["metapost"] = {
--~ ["install"] = true,
--~ ["formats"] = {
--~ ["mpost"] = true,
--~ ["metafun"] = true,
--~ },
--~ },
--~ },
--~ ["fonts"] = {
--~ },
--~ ["doc"] = {
--~ },
--~ ["modules"] = {
--~ ["f-urwgaramond"] = false,
--~ ["f-urwgothic"] = false,
--~ ["t-bnf"] = false,
--~ ["t-chromato"] = false,
--~ ["t-cmscbf"] = false,
--~ ["t-cmttbf"] = false,
--~ ["t-construction-plan"] = false,
--~ ["t-degrade"] = false,
--~ ["t-french"] = false,
--~ ["t-lettrine"] = false,
--~ ["t-lilypond"] = false,
--~ ["t-mathsets"] = false,
--~ ["t-tikz"] = false,
--~ ["t-typearea"] = false,
--~ ["t-vim"] = false,
--~ },
--~ }
--~ states.save("teststate", "update")
--~ states.load("teststate", "update")
--~ print(states.get_by_tag("update","rsync.server","unknown"))
--~ states.set_by_tag("update","rsync.server","oeps")
--~ print(states.get_by_tag("update","rsync.server","unknown"))
--~ states.save("teststate", "update")
--~ states.load("teststate", "update")
--~ print(states.get_by_tag("update","rsync.server","unknown"))
|