# HG changeset patch # User Waqas Hussain # Date 1546030801 18000 # Node ID f888f236321fc47185a0f04822c6b0217bfd24aa # Parent fadae5511044b5cd46a9e6ef4547eb3298e0b1c2 Make current line number available in all error events diff -r fadae5511044 -r f888f236321f main.lua --- a/main.lua Fri Dec 28 11:38:56 2018 +0000 +++ b/main.lua Fri Dec 28 16:00:01 2018 -0500 @@ -140,9 +140,10 @@ return assert(parser.parse(data)); end -local function initialize_script(script) +local function initialize_script(script, context) local c = 0; for name, object in pairs(script.objects) do --luacheck: ignore name + context.line = object.defined_line local o = require("scansion.objects."..object.type); object.handler = o; object.script = script; @@ -181,11 +182,13 @@ return verse; end -local function main(log_data, script) +local function main(log_data, script, context) local ok, err = true; - initialize_script(script); + initialize_script(script, context); + + context.line = nil; if server_log_reader then if skip_server_startup_log then @@ -200,8 +203,21 @@ local runner = async.runner(function () for i, action in ipairs(script.actions) do + context.line = action.line_start; + local object = script.objects[action.object_name]; local handler = object.handler; + + log_data("action", { + action = action.action; + object = object.name; + object_type = object.type; + extra = action.extra; + annotation = action.annotation; + line_start = action.line_start; + line_end = action.line_end; + }); + if not handler[action.action] then local e = new_error("unsupported-action", { text = "Objects of type '"..object.type.."' do not support action '"..action.action.."'"; @@ -211,15 +227,6 @@ if server_log_reader then log_data("server", { lines = server_log_reader() }); end - log_data("action", { - action = action.action; - object = object.name; - object_type = object.type; - extra = action.extra; - annotation = action.annotation; - line_start = action.line_start; - line_end = action.line_end; - }); if action_timeout and action_timeout > 0 then local action_number = i; @@ -237,11 +244,12 @@ log_data("server", { lines = server_log_reader() }); end if not ok then - log_data("error", { message = err }); + log_data("error", { message = err, line = context.line }); error(err); end end end + context.line = nil; script.finished = true; verse.log("info", "Completed script!"); verse.quit(); @@ -328,7 +336,8 @@ log_data("script", script_data); - local ok, result, err = pcall(main, log_data, script); + local context = { line = nil }; + local ok, result, err = pcall(main, log_data, script, context); local event, status, reason; if not ok then @@ -339,7 +348,7 @@ event, status, reason = "test-passed", "ok", nil; end - local result_data = { name = script.title or script_name, status = status, reason = reason }; + local result_data = { name = script.title or script_name, status = status, reason = reason, line = context.line }; log_data(event, result_data); diff -r fadae5511044 -r f888f236321f scansion/parser.lua --- a/scansion/parser.lua Fri Dec 28 11:38:56 2018 +0000 +++ b/scansion/parser.lua Fri Dec 28 16:00:01 2018 -0500 @@ -9,13 +9,17 @@ local last_object; local annotation; + local function parse_error(text) + return nil, text .. " (line " .. line_number .. ")"; + end + for line in data:gmatch("([^\r\n]*)\r?\n") do line_number = line_number + 1; if line:sub(1,1) == "[" then local obj_type, name = line:match("^%[(%a+)%] (.+)$"); if parsed.objects[name] then - return nil, "Duplicate definition of "..name.." on line "..line_number; + return parse_error("Duplicate definition of '"..name.."'"); end parsed.objects[name] = { type = obj_type:lower(); @@ -25,7 +29,7 @@ last_object = parsed.objects[name]; elseif line:match("^%s+[%a_]+:.+$") then if not last_object then - return nil, "Line "..line_number.. "unexpected outside of an object definition"; + return parse_error("Unexpected outside of an object definition"); end local k, v = line:match("^%s+([%a_]+):%s*(.+)$") last_object[k] = v; @@ -69,10 +73,10 @@ last_object = nil; local name, action, extra = line:match("^([^:]+) (%a+):?%s?(.*)$"); if not name then - return nil, "Unable to parse action on line "..line_number; + return parse_error("Unable to parse action"); end if not parsed.objects[name] then - return nil, "The object '"..name.."' used on line "..line_number.." was not declared"; + return parse_error("The object '"..name.."' was not declared"); end table.insert(parsed.actions, { object_name = name; diff -r fadae5511044 -r f888f236321f scansion/serve.lua --- a/scansion/serve.lua Fri Dec 28 11:38:56 2018 +0000 +++ b/scansion/serve.lua Fri Dec 28 16:00:01 2018 -0500 @@ -48,7 +48,11 @@ local ok, ret = pcall(run_script, "web", event.request.body, log); if not ok then - log("error", ret); + local line = nil; + if type(ret) == "string" then + line = tonumber(ret:match("%(line (%d+)%)$")); + end + log("error", { message = ret, line = line }); end response.conn:write("0\r\n\r\n");