summaryrefslogtreecommitdiff
path: root/scripts/context/lua/mtx-watch.lua
diff options
context:
space:
mode:
authorHans Hagen <pragma@wxs.nl>2008-03-10 23:20:00 +0100
committerHans Hagen <pragma@wxs.nl>2008-03-10 23:20:00 +0100
commite4c575ea1e6cb242b3b8441eb4febc0e469412f2 (patch)
tree5ddbbc41a6aea426dac1386905e1a0953b2ca3b6 /scripts/context/lua/mtx-watch.lua
parentf0302311dd47bf250c0e2b5f8be46f21437f43d8 (diff)
downloadcontext-e4c575ea1e6cb242b3b8441eb4febc0e469412f2.tar.gz
stable 2008.03.10 23:20
Diffstat (limited to 'scripts/context/lua/mtx-watch.lua')
-rw-r--r--scripts/context/lua/mtx-watch.lua194
1 files changed, 99 insertions, 95 deletions
diff --git a/scripts/context/lua/mtx-watch.lua b/scripts/context/lua/mtx-watch.lua
index 96f6f7eb2..f9e81da42 100644
--- a/scripts/context/lua/mtx-watch.lua
+++ b/scripts/context/lua/mtx-watch.lua
@@ -11,119 +11,123 @@ texmf.instance = instance -- we need to get rid of this / maybe current instance
scripts = scripts or { }
scripts.watch = scripts.watch or { }
-function scripts.watch.watch()
- local delay = environment.argument("delay") or 5
- local logpath = environment.argument("logpath") or ""
- local pipe = environment.argument("pipe") or false
- if #environment.files > 0 then
- for _, path in ipairs(environment.files) do
- logs.report("watch", "watching path ".. path)
- end
- local function glob(files,path)
- for name in lfs.dir(path) do
- if name:find("^%.") then
- -- skip . and ..
- else
- name = path .. "/" .. name
- local a = lfs.attributes(name)
- if not a then
- -- weird
- elseif a.mode == "directory" then
- if name:find("graphics$") or name:find("figures$") or name:find("resources$") then
- -- skip these too
- else
- glob(files,name)
+do
+
+ function scripts.watch.watch()
+ local delay = environment.argument("delay") or 5
+ local logpath = environment.argument("logpath") or ""
+ local pipe = environment.argument("pipe") or false
+ if #environment.files > 0 then
+ for _, path in ipairs(environment.files) do
+ logs.report("watch", "watching path ".. path)
+ end
+ local function glob(files,path)
+ for name in lfs.dir(path) do
+ if name:find("^%.") then
+ -- skip . and ..
+ else
+ name = path .. "/" .. name
+ local a = lfs.attributes(name)
+ if not a then
+ -- weird
+ elseif a.mode == "directory" then
+ if name:find("graphics$") or name:find("figures$") or name:find("resources$") then
+ -- skip these too
+ else
+ glob(files,name)
+ end
+ elseif name:find(".%luj$") then
+ files[name] = a.change or a.ctime or a.modification or a.mtime
end
- elseif name:find(".%luj$") then
- files[name] = a.change or a.ctime or a.modification or a.mtime
end
end
end
- end
- local n = 0
- local function process()
- local done = false
- for _, path in ipairs(environment.files) do
- lfs.chdir(path)
- local files = { }
- glob(files,path)
- table.sort(files) -- what gets sorted here
- 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))
- joblog.status = "queued"
- io.savedata(name, table.serialize(joblog,true))
- elseif joblog.status == "queued" then
- local command = joblog.command
- if command then
- local replacements = {
- inputpath = (joblog.paths and joblog.paths.input ) or ".",
- outputpath = (joblog.paths and joblog.paths.output) or ".",
- filename = joblog.filename or "",
- }
- command = command:gsub("%%(.-)%%", replacements)
- if command ~= "" then
- joblog.status = "processing"
- joblog.runtime = os.time() -- os.clock()
- io.savedata(name, table.serialize(joblog,true))
- logs.report("watch",string.format("running: %s", command))
- local newpath = file.dirname(name)
- io.flush()
- local result = ""
- if newpath ~= "" and newpath ~= "." then
- local oldpath = lfs.currentdir()
- lfs.chdir(newpath)
- if pipe then result = os.resultof(command) else result = os.spawn(command) end
- lfs.chdir(oldpath)
+ local function process()
+ local done = false
+ for _, path in ipairs(environment.files) do
+ lfs.chdir(path)
+ local files = { }
+ glob(files,path)
+ table.sort(files) -- what gets sorted here
+ 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))
+ joblog.status = "queued"
+ io.savedata(name, table.serialize(joblog,true))
+ elseif joblog.status == "queued" then
+ local command = joblog.command
+ if command then
+ local replacements = {
+ inputpath = (joblog.paths and joblog.paths.input ) or ".",
+ outputpath = (joblog.paths and joblog.paths.output) or ".",
+ filename = joblog.filename or "",
+ }
+ command = command:gsub("%%(.-)%%", replacements)
+ if command ~= "" then
+ joblog.status = "processing"
+ joblog.runtime = os.time() -- os.clock()
+ io.savedata(name, table.serialize(joblog,true))
+ logs.report("watch",string.format("running: %s", command))
+ local newpath = file.dirname(name)
+ io.flush()
+ local result = ""
+ if newpath ~= "" and newpath ~= "." then
+ local oldpath = lfs.currentdir()
+ lfs.chdir(newpath)
+ if pipe then result = os.resultof(command) else result = os.spawn(command) end
+ lfs.chdir(oldpath)
+ else
+ if pipe then result = os.resultof(command) else result = os.spawn(command) end
+ end
+ logs.report("watch",string.format("return value: %s", result))
+ done = true
+ local path, base = replacements.outputpath, file.basename(replacements.filename)
+ joblog.runtime = os.time() - joblog.runtime -- os.clock() - joblog.runtime
+ joblog.result = file.replacesuffix(file.join(path,base),"pdf")
+ joblog.size = lfs.attributes(joblog.result,"size")
+ joblog.status = "finished"
else
- if pipe then result = os.resultof(command) else result = os.spawn(command) end
+ joblog.status = "invalid command"
end
- logs.report("watch",string.format("return value: %s", result))
- done = true
- local path, base = replacements.outputpath, file.basename(replacements.filename)
- joblog.runtime = os.time() - joblog.runtime -- os.clock() - joblog.runtime
- joblog.result = file.replacesuffix(file.join(path,base),"pdf")
- joblog.size = lfs.attributes(joblog.result,"size")
- joblog.status = "finished"
else
- joblog.status = "invalid command"
+ joblog.status = "no command"
end
- else
- joblog.status = "no command"
- end
- -- 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))
+ -- pcall, when error sleep + again
io.savedata(name, table.serialize(joblog,true))
- logs.report("watch", "saving joblog ".. name)
+ if logpath ~= "" then
+ local name = string.format("%s/%s%04i%09i.lua", logpath, os.time(), math.floor((os.clock()*100)%1000), math.random(99999999))
+ io.savedata(name, table.serialize(joblog,true))
+ logs.report("watch", "saving joblog ".. name)
+ end
end
end
end
end
end
- end
- local function wait()
- io.flush()
- if not done then
- n = n + 1
- if n >= 10 then
- logs.report("watch", "still sleeping " .. os.clock())
- n = 0
+ local n, start = 0, os.clock()
+ 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))
+ n = 0
+ end
+ os.sleep(delay)
end
- os.sleep(delay)
end
+ while true do
+ pcall(process)
+ pcall(wait)
+ end
+ else
+ logs.report("watch", "no paths to watch")
end
- while true do
- pcall(process)
- pcall(wait)
- end
- else
- logs.report("watch", "no paths to watch")
end
+
end
function scripts.watch.collect_logs(path) -- clean 'm up too