diff options
Diffstat (limited to 'scripts')
| -rw-r--r-- | scripts/context/lua/mtx-watch.lua | 67 | 
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 | 
