summaryrefslogtreecommitdiff
path: root/scripts
diff options
context:
space:
mode:
Diffstat (limited to 'scripts')
-rw-r--r--scripts/context/lua/mtx-watch.lua67
1 files changed, 50 insertions, 17 deletions
diff --git a/scripts/context/lua/mtx-watch.lua b/scripts/context/lua/mtx-watch.lua
index 9cfe2bbfd..15e0f81e9 100644
--- a/scripts/context/lua/mtx-watch.lua
+++ b/scripts/context/lua/mtx-watch.lua
@@ -9,27 +9,31 @@ if not modules then modules = { } end modules ['mtx-watch'] = {
scripts = scripts or { }
scripts.watch = scripts.watch or { }
+local format, concat, time, difftime = string.format, table.concat, os.difftime
+local pairs, ipairs, next, type = pairs, ipairs, next, type
+
function scripts.watch.save_exa_modes(joblog,ctmname)
- local t= { }
if joblog then
+ local t= { }
t[#t+1] = "<?xml version='1.0' standalone='yes'?>\n"
t[#t+1] = "<exa:variables xmlns:exa='htpp://www.pragma-ade.com/schemas/exa-variables.rng'>"
if joblog.values then
for k, v in pairs(joblog.values) do
- t[#t+1] = string.format("\t<exa:variable label='%s'>%s</exa:variable>", k, tostring(v))
+ t[#t+1] = format("\t<exa:variable label='%s'>%s</exa:variable>", k, tostring(v))
end
else
t[#t+1] = "<!-- no modes -->"
end
t[#t+1] = "</exa:variables>"
+ io.savedata(ctmname,concat(t,"\n"))
+ else
+ os.remove(ctmname)
end
- os.remove(ctmname)
- io.savedata(ctmname,table.concat(t,"\n"))
end
local function toset(t)
if type(t) == "table" then
- return table.concat(t,",")
+ return concat(t,",")
else
return t
end
@@ -67,10 +71,13 @@ local function glob(files,path)
end
end
+local clock = os.gettimeofday or os.time -- we cannot trust os.clock on linux
+
function scripts.watch.watch()
local delay = environment.argument("delay") or 5
local logpath = environment.argument("logpath") or ""
local pipe = environment.argument("pipe") or false
+ local watcher = "mtxwatch.run"
if #environment.files > 0 then
for _, path in ipairs(environment.files) do
logs.report("watch", "watching path ".. path)
@@ -81,13 +88,13 @@ function scripts.watch.watch()
lfs.chdir(path)
local files = { }
glob(files,path)
- table.sort(files) -- what gets sorted here
+ table.sort(files) -- what gets sorted here, todo: by time
for name, time in pairs(files) do
--~ local ok, joblog = xpcall(function() return dofile(name) end, function() end )
local ok, joblog = pcall(dofile,name)
if ok and joblog then
if joblog.status == "processing" then
- logs.report("watch",string.format("aborted job, %s added to queue",name))
+ logs.report("watch",format("aborted job, %s added to queue",name))
joblog.status = "queued"
io.savedata(name, table.serialize(joblog,true))
elseif joblog.status == "queued" then
@@ -98,12 +105,13 @@ function scripts.watch.watch()
outputpath = noset((joblog.paths and joblog.paths.output) or "."),
filename = joblog.filename or "",
}
+ -- todo: revision path etc
command = command:gsub("%%(.-)%%", replacements)
if command ~= "" then
joblog.status = "processing"
- joblog.runtime = os.clock()
+ joblog.runtime = clock()
io.savedata(name, table.serialize(joblog,true))
- logs.report("watch",string.format("running: %s", command))
+ logs.report("watch",format("running: %s", command))
local newpath = file.dirname(name)
io.flush()
local result = ""
@@ -120,10 +128,10 @@ function scripts.watch.watch()
scripts.watch.save_exa_modes(joblog,ctmname)
if pipe then result = os.resultof(command) else result = os.spawn(command) end
end
- logs.report("watch",string.format("return value: %s", result))
+ logs.report("watch",format("return value: %s", result))
done = true
local path, base = replacements.outputpath, file.basename(replacements.filename)
- joblog.runtime = os.clock() - joblog.runtime
+ joblog.runtime = clock() - joblog.runtime
if base ~= "" then
joblog.result = file.replacesuffix(file.join(path,base),"pdf")
joblog.size = lfs.attributes(joblog.result,"size")
@@ -138,7 +146,7 @@ function scripts.watch.watch()
-- pcall, when error sleep + again
io.savedata(name, table.serialize(joblog,true))
if logpath ~= "" then
- local name = string.format("%s/%s%04i%09i.lua", logpath, os.time(), math.floor((os.clock()*100)%1000), math.random(99999999))
+ local name = os.uuid() .. ".lua"
io.savedata(name, table.serialize(joblog,true))
logs.report("watch", "saving joblog ".. name)
end
@@ -147,18 +155,43 @@ function scripts.watch.watch()
end
end
end
- local n, start = 0, os.clock()
+ local n, start = 0, time()
local function wait()
io.flush()
if not done then
n = n + 1
if n >= 10 then
- logs.report("watch", string.format("run time: %i seconds, memory usage: %0.3g MB", os.clock() - start, (status.luastate_bytes/1024)/1000))
+ logs.report("watch", format("run time: %i seconds, memory usage: %0.3g MB", difftime(time(),start), (status.luastate_bytes/1024)/1000))
n = 0
end
os.sleep(delay)
end
end
+local function wait()
+ io.flush()
+ local wtime, ttime = 0, 0
+ if not done then
+ n = n + 1
+ if n >= 10 then
+ logs.report("watch", format("run time: %i seconds, memory usage: %0.3g MB", difftime(time(),start), (status.luastate_bytes/1024)/1000))
+ n = 0
+ end
+ while true do
+ local wt = lfs.attributes(watcher,"mtime")
+ if wt ~= wtime then
+ -- fast signal that there is a request
+ wtime = wt
+ break
+ else
+ ttime = ttime + 0.2
+ if ttime >= delay then
+ break
+ end
+ end
+ os.sleep(0.2)
+ end
+ end
+end
while true do
if false then
process()
@@ -197,7 +230,7 @@ function scripts.watch.save_logs(collection,path) -- play safe
if collection and not table.is_empty(collection) then
path = path or environment.argument("logpath") or ""
path = (path == "" and ".") or path
- local filename = string.format("%s/collected-%s.lua",path,tostring(os.time()))
+ local filename = format("%s/collected-%s.lua",path,tostring(time()))
io.savedata(filename,table.serialize(collection,true))
local check = dofile(filename)
for k,v in pairs(check) do
@@ -208,7 +241,7 @@ function scripts.watch.save_logs(collection,path) -- play safe
end
end
for k,v in pairs(check) do
- os.remove(string.format("%s.lua",k))
+ os.remove(format("%s.lua",k))
end
return true
else
@@ -243,7 +276,7 @@ function scripts.watch.show_logs(path) -- removes duplicates
for k,v in ipairs(table.sortedkeys(collection)) do
local c = collection[v]
local f, s, r, n = c.filename or "?", c.status or "?", c.runtime or 0, c.size or 0
- logs.report("watch", string.format("%s %s %3i %8i %s",string.padd(f,max," "),string.padd(s,10," "),r,n,v))
+ logs.report("watch", format("%s %s %3i %8i %s",string.padd(f,max," "),string.padd(s,10," "),r,n,v))
end
end