120 lines
3.6 KiB
Lua
120 lines
3.6 KiB
Lua
local lang = require 'language'
|
|
local platform = require 'bee.platform'
|
|
local subprocess = require 'bee.subprocess'
|
|
local json = require 'json'
|
|
local jsonb = require 'json-beautify'
|
|
local util = require 'utility'
|
|
|
|
local export = {}
|
|
|
|
local function logFileForThread(threadId)
|
|
return LOGPATH .. '/check-partial-' .. threadId .. '.json'
|
|
end
|
|
|
|
local function buildArgs(exe, numThreads, threadId, format, quiet)
|
|
local args = {exe}
|
|
local skipNext = false
|
|
for i = 1, #arg do
|
|
local arg = arg[i]
|
|
-- --check needs to be transformed into --check_worker
|
|
if arg:lower():match('^%-%-check$') or arg:lower():match('^%-%-check=') then
|
|
args[#args + 1] = arg:gsub('%-%-%w*', '--check_worker')
|
|
-- --check_out_path needs to be removed if we have more than one thread
|
|
elseif arg:lower():match('%-%-check_out_path') and numThreads > 1 then
|
|
if not arg:match('%-%-[%w_]*=') then
|
|
skipNext = true
|
|
end
|
|
else
|
|
if skipNext then
|
|
skipNext = false
|
|
else
|
|
args[#args + 1] = arg
|
|
end
|
|
end
|
|
end
|
|
args[#args + 1] = '--thread_id'
|
|
args[#args + 1] = tostring(threadId)
|
|
if numThreads > 1 then
|
|
if quiet then
|
|
args[#args + 1] = '--quiet'
|
|
end
|
|
if format then
|
|
args[#args + 1] = '--check_format=' .. format
|
|
end
|
|
args[#args + 1] = '--check_out_path'
|
|
args[#args + 1] = logFileForThread(threadId)
|
|
end
|
|
return args
|
|
end
|
|
|
|
function export.runCLI()
|
|
local numThreads = tonumber(NUM_THREADS or 1)
|
|
|
|
local exe
|
|
local minIndex = -1
|
|
while arg[minIndex] do
|
|
exe = arg[minIndex]
|
|
minIndex = minIndex - 1
|
|
end
|
|
-- TODO: is this necessary? got it from the shell.lua helper in bee.lua tests
|
|
if platform.os == 'windows' and not exe:match('%.[eE][xX][eE]$') then
|
|
exe = exe..'.exe'
|
|
end
|
|
|
|
if not QUIET and numThreads > 1 then
|
|
print(lang.script('CLI_CHECK_MULTIPLE_WORKERS', numThreads))
|
|
end
|
|
|
|
local procs = {}
|
|
for i = 1, numThreads do
|
|
local process, err = subprocess.spawn({buildArgs(exe, numThreads, i, CHECK_FORMAT, QUIET)})
|
|
if err then
|
|
print(err)
|
|
end
|
|
if process then
|
|
procs[#procs + 1] = process
|
|
end
|
|
end
|
|
|
|
local checkPassed = true
|
|
for _, process in ipairs(procs) do
|
|
checkPassed = process:wait() == 0 and checkPassed
|
|
end
|
|
|
|
if numThreads > 1 then
|
|
local mergedResults = {}
|
|
local count = 0
|
|
for i = 1, numThreads do
|
|
local result = json.decode(util.loadFile(logFileForThread(i)) or '[]')
|
|
for k, v in pairs(result) do
|
|
local entries = mergedResults[k] or {}
|
|
mergedResults[k] = entries
|
|
for _, entry in ipairs(v) do
|
|
entries[#entries + 1] = entry
|
|
count = count + 1
|
|
end
|
|
end
|
|
end
|
|
|
|
local outpath = nil
|
|
|
|
if CHECK_FORMAT == 'json' or CHECK_OUT_PATH then
|
|
outpath = CHECK_OUT_PATH or LOGPATH .. '/check.json'
|
|
util.saveFile(outpath, jsonb.beautify(mergedResults))
|
|
end
|
|
|
|
if not QUIET then
|
|
if count == 0 then
|
|
print(lang.script('CLI_CHECK_SUCCESS'))
|
|
elseif outpath then
|
|
print(lang.script('CLI_CHECK_RESULTS_OUTPATH', count, outpath))
|
|
else
|
|
print(lang.script('CLI_CHECK_RESULTS_PRETTY', count))
|
|
end
|
|
end
|
|
end
|
|
return checkPassed and 0 or 1
|
|
end
|
|
|
|
return export
|