diff options
author | Karl Berry <karl@freefriends.org> | 2018-03-08 23:45:11 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2018-03-08 23:45:11 +0000 |
commit | 64ee185d962cd13195e329ab4ac8a9da6535b677 (patch) | |
tree | 652f96f04e1826a75ef1c3a38ab3d2a72ff9c067 /Master/texmf-dist/tex/latex/l3build/l3build-check.lua | |
parent | a502f321bf373ab83e239389e55d622e6c6980e2 (diff) |
l3build now cmdline script (9mar18)
git-svn-id: svn://tug.org/texlive/trunk@46894 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/latex/l3build/l3build-check.lua')
-rw-r--r-- | Master/texmf-dist/tex/latex/l3build/l3build-check.lua | 862 |
1 files changed, 0 insertions, 862 deletions
diff --git a/Master/texmf-dist/tex/latex/l3build/l3build-check.lua b/Master/texmf-dist/tex/latex/l3build/l3build-check.lua deleted file mode 100644 index 66319cc62bf..00000000000 --- a/Master/texmf-dist/tex/latex/l3build/l3build-check.lua +++ /dev/null @@ -1,862 +0,0 @@ ---[[ - -File l3build-check.lua Copyright (C) 2018 The LaTeX3 Project - -It may be distributed and/or modified under the conditions of the -LaTeX Project Public License (LPPL), either version 1.3c of this -license or (at your option) any later version. The latest version -of this license is in the file - - http://www.latex-project.org/lppl.txt - -This file is part of the "l3build bundle" (The Work in LPPL) -and all files in that bundle must be distributed together. - ------------------------------------------------------------------------ - -The development version of the bundle can be found at - - https://github.com/latex3/l3build - -for those people who are interested. - ---]] - --- Local access to functions -local open = io.open -local close = io.close -local write = io.write -local output = io.output - -local rnd = math.random - -local len = string.len -local char = string.char -local format = string.format -local gmatch = string.gmatch -local gsub = string.gsub -local match = string.match - -local insert = table.insert -local sort = table.sort - -local utf8_char = unicode.utf8.char - -local exit = os.exit -local execute = os.execute - --- --- Auxiliary functions which are used by more than one main function --- - --- Set up the check system files: needed for checking one or more tests and --- for saving the test files -function checkinit() - cleandir(testdir) - depinstall(checkdeps) - -- Copy dependencies to the test directory itself: this makes the paths - -- a lot easier to manage, and is important for dealing with the log and - -- with file input/output tests - for _,i in ipairs(filelist(localdir)) do - cp(i, localdir, testdir) - end - bundleunpack({sourcefiledir, testfiledir}) - for _,i in ipairs(installfiles) do - cp(i, unpackdir, testdir) - end - for _,i in ipairs(checkfiles) do - cp(i, unpackdir, testdir) - end - if direxists(testsuppdir) then - for _,i in ipairs(filelist(testsuppdir)) do - cp(i, testsuppdir, testdir) - end - end - for _,i in ipairs(checksuppfiles) do - cp(i, supportdir, testdir) - end - execute(os_ascii .. ">" .. testdir .. "/ascii.tcx") -end - --- Convert the raw log file into one for comparison/storage: keeps only --- the 'business' part from the tests and removes system-dependent stuff -local function formatlog(logfile, newfile, engine, errlevels) - local maxprintline = maxprintline - if engine == "luatex" or engine == "luajittex" then - maxprintline = maxprintline + 1 -- Deal with an out-by-one error - end - local function killcheck(line) - -- Skip lines containing file dates - if match(line, "[^<]%d%d%d%d/%d%d/%d%d") then - return true - elseif - -- Skip \openin/\openout lines in web2c 7.x - -- As Lua doesn't allow "(in|out)", a slightly complex approach: - -- do a substitution to check the line is exactly what is required! - match( - gsub(line, "^\\openin", "\\openout"), "^\\openout%d%d? = " - ) then - return true - end - return false - end - -- Substitutions to remove some non-useful changes - local function normalize(line, lastline) - -- Zap line numbers from \show, \showbox, \box_show and the like: - -- do this before wrapping lines - line = gsub(line, "^l%.%d+ ", "l. ...") - -- Also from lua stack traces. - line = gsub(line, "lua:%d+: in function", "lua:...: in function") - -- Allow for wrapped lines: preserve the content and wrap - -- Skip lines that have an explicit marker for truncation - if len(line) == maxprintline and - not match(line, "%.%.%.$") then - return "", (lastline or "") .. line - end - local line = (lastline or "") .. line - lastline = "" - -- Zap ./ at begin of filename - line = gsub(line, "%(%.%/", "(") - -- Zap paths if places other than 'here' are accessible - if checksearch then - -- The pattern excludes < and > as the image part can have - -- several entries on one line - local pattern = "%w?:?/[^ %<%>]*/([^/%(%)]*%.%w*)" - -- Files loaded from TeX: all start ( -- ) - line = gsub(line, "%(" .. pattern, "(../%1") - -- Images - line = gsub(line, "<" .. pattern .. ">", "<../%1>") - -- luaotfload files start with keywords - line = gsub(line, "from " .. pattern .. "%(", "from. ./%1(") - line = gsub(line, ": " .. pattern .. "%)", ": ../%1)") - -- Deal with XeTeX specials - if match(line, "^%.+\\XeTeX.?.?.?file") then - line = gsub(line, pattern, "../%1") - end - end - -- Deal with the fact that "(.aux)" may have still a leading space - line = gsub(line, "^ %(%.aux%)", "(.aux)") - -- Merge all of .fd data into one line so will be removed later - if match(line, "^ *%([%.%/%w]+%.fd[^%)]*$") then - lastline = (lastline or "") .. line - return "", (lastline or "") .. line - end - -- TeX90/XeTeX knows only the smaller set of dimension units - line = gsub( - line, - "cm, mm, dd, cc, bp, or sp", "cm, mm, dd, cc, nd, nc, bp, or sp" - ) - -- Normalise a case where fixing a TeX bug changes the message text - line = gsub(line, "\\csname\\endcsname ", "\\csname\\endcsname") - -- Zap "on line <num>" and replace with "on line ..." - -- Two similar cases, Lua patterns mean we need to do them separately - line = gsub(line, "on line %d*", "on line ...") - line = gsub(line, "on input line %d*", "on input line ...") - -- Tidy up to ^^ notation - for i = 0, 31 do - line = gsub(line, char(i), "^^" .. char(64 + i)) - end - -- Normalise register allocation to hard-coded numbers - -- No regex, so use a pattern plus lookup approach - local register_types = { - attribute = true, - box = true, - bytecode = true, - catcodetable = true, - count = true, - dimen = true, - insert = true, - language = true, - luabytecode = true, - luachunk = true, - luafunction = true, - marks = true, - muskip = true, - read = true, - skip = true, - toks = true, - whatsit = true, - write = true, - XeTeXcharclass = true - } - if register_types[match(line, "^\\[^%]]+=\\([a-z]+)%d+$")] then - line = gsub(line, "%d+$", "...") - end - -- Also deal with showing boxes - if match(line, "^> \\box%d+=$") or match(line, "^> \\box%d+=(void)$") then - line = gsub(line, "%d+=", "...=") - end - -- Remove 'normal' direction information on boxes with (u)pTeX - line = gsub(line, ",? yoko direction,?", "") - line = gsub(line, ",? yoko%(math%) direction,?", "") - -- Remove the \special line that in DVI mode keeps PDFs comparable - if match(line, "^%.*\\special%{pdf: docinfo << /Creator") then - return "" - end - -- Remove the \special line possibly present in DVI mode for paper size - if match(line, "^%.*\\special%{papersize") then - return "" - end - -- Remove ConTeXt stuff - if match(line, "^backend >") or - match(line, "^close source >") or - match(line, "^mkiv lua stats >") or - match(line, "^pages >") or - match(line, "^system >") or - match(line, "^used file >") or - match(line, "^used option >") or - match(line, "^used structure >") then - return "" - end - -- A tidy-up to keep LuaTeX and other engines in sync - line = gsub(line, utf8_char(127), "^^?") - -- Unicode engines display chars in the upper half of the 8-bit range: - -- tidy up to match pdfTeX if an ASCII engine is in use - if next(asciiengines) then - for i = 128, 255 do - line = gsub(line, utf8_char(i), "^^" .. format("%02x", i)) - end - end - return line, lastline - end - local lastline = "" - local newlog = "" - local prestart = true - local skipping = false - -- Read the entire log file as a binary: deals with ^@/^[, etc. - local file = assert(open(logfile, "rb")) - local contents = gsub(file:read("*all") .. "\n", "\r\n", "\n") - close(file) - for line in gmatch(contents, "([^\n]*)\n") do - if line == "START-TEST-LOG" then - prestart = false - elseif line == "END-TEST-LOG" or - match(line, "^Here is how much of .?.?.?TeX\'s memory you used:") then - break - elseif line == "OMIT" then - skipping = true - elseif match(line, "^%)?TIMO$") then - skipping = false - elseif not prestart and not skipping then - line, lastline = normalize(line, lastline) - if not match(line, "^ *$") and not killcheck(line) then - newlog = newlog .. line .. os_newline - end - end - end - local newfile = open(newfile, "w") - output(newfile) - write(newlog) - if recordstatus then - write('***************\n') - for i = 1, checkruns do - write('Compilation ' .. i .. ' of test file completed with exit status ' .. errlevels[i] .. '\n') - end - end - close(newfile) -end - --- Additional normalization for LuaTeX -local function formatlualog(logfile, newfile) - local function normalize(line, lastline, dropping) - -- Find \discretionary or \whatsit lines: - -- These may come back later - if match(line, "^%.+\\discretionary$") or - match(line, "^%.+\\discretionary %(penalty 50%)$") or - match(line, "^%.+\\discretionary50%|$") or - match(line, "^%.+\\discretionary50%| replacing $") or - match(line, "^%.+\\whatsit$") then - return "", line - end - -- For \mathon, we always need this line but the next - -- may be affected - if match(line, "^%.+\\mathon$") then - return line, line - end - -- LuaTeX has a flexible output box - line = gsub(line,"\\box\\outputbox", "\\box255") - -- LuaTeX identifies spaceskip glue - line = gsub(line,"%(\\spaceskip%) ", " ") - -- Remove 'display' at end of display math boxes: - -- LuaTeX omits this as it includes direction in all cases - line = gsub(line, "(\\hbox%(.*), display$", "%1") - -- Remove 'normal' direction information on boxes: - -- any bidi/vertical stuff will still show - line = gsub(line, ", direction TLT", "") - -- Find glue setting and round out the last place - local function round_digits(l, m) - return gsub( - l, - m .. " (%-?)%d+%.%d+", - m .. " %1" - .. format( - "%.3f", - match(line, m .. " %-?(%d+%.%d+)") or 0 - ) - ) - end - if match(line, "glue set %-?%d+%.%d+") then - line = round_digits(line, "glue set") - end - if match( - line, "glue %-?%d+%.%d+ plus %-?%d+%.%d+ minus %-?%d+%.%d+$" - ) - then - line = round_digits(line, "glue") - line = round_digits(line, "plus") - line = round_digits(line, "minus") - end - -- LuaTeX writes ^^M as a new line, which we lose - line = gsub(line, "%^%^M", "") - -- Remove U+ notation in the "Missing character" message - line = gsub( - line, - "Missing character: There is no (%^%^..) %(U%+(....)%)", - "Missing character: There is no %1" - ) - -- The first time a new font is used, it shows up - -- as being cached - line = gsub(line, "(save cache:", "(load cache:") - -- Changes in PDF specials - line = gsub(line, "\\pdfliteral origin", "\\pdfliteral") - -- A function to handle the box prefix part - local function boxprefix(s) - return gsub(match(s, "^(%.+)"), "%.", "%%.") - end - -- 'Recover' some discretionary data - if match(lastline, "^%.+\\discretionary %(penalty 50%)$") and - match(line, boxprefix(lastline) .. "%.= ") then - return gsub(line, "%.= ", ""),"" - end - -- Where the last line was a discretionary, looks for the - -- info one level in about what it represents - if match(lastline, "^%.+\\discretionary$") or - match(lastline, "^%.+\\discretionary %(penalty 50%)$") or - match(lastline, "^%.+\\discretionary50%|$") or - match(lastline, "^%.+\\discretionary50%| replacing $") then - local prefix = boxprefix(lastline) - if match(line, prefix .. "%.") or - match(line, prefix .. "%|") then - if match(lastline, " replacing $") and - not dropping then - -- Modify the return line - return gsub(line, "^%.", ""), lastline, true - else - return "", lastline, true - end - else - if dropping then - -- End of a \discretionary block - return line, "" - else - -- Not quite a normal discretionary - if match(lastline, "^%.+\\discretionary50%|$") then - lastline = gsub(lastline, "50%|$", "") - end - -- Remove some info that TeX90 lacks - lastline = gsub(lastline, " %(penalty 50%)$", "") - -- A normal (TeX90) discretionary: - -- add with the line break reintroduced - return lastline .. os_newline .. line, "" - end - end - end - -- Look for another form of \discretionary, replacing a "-" - pattern = "^%.+\\discretionary replacing *$" - if match(line, pattern) then - return "", line - else - if match(lastline, pattern) then - local prefix = boxprefix(lastline) - if match(line, prefix .. "%.\\kern") then - return gsub(line, "^%.", ""), lastline, true - elseif dropping then - return "", "" - else - return lastline .. os_newline .. line, "" - end - end - end - -- For \mathon, if the current line is an empty \hbox then - -- drop it - if match(lastline, "^%.+\\mathon$") then - local prefix = boxprefix(lastline) - if match(line, prefix .. "\\hbox%(0%.0%+0%.0%)x0%.0$") then - return "", "" - end - end - -- Various \local... things that other engines do not do: - -- Only remove the no-op versions - if match(line, "^%.+\\localpar$") or - match(line, "^%.+\\localinterlinepenalty=0$") or - match(line, "^%.+\\localbrokenpenalty=0$") or - match(line, "^%.+\\localleftbox=null$") or - match(line, "^%.+\\localrightbox=null$") then - return "", "" - end - -- Older LuaTeX versions set the above up as a whatsit - -- (at some stage this can therefore go) - if match(lastline, "^%.+\\whatsit$") then - local prefix = boxprefix(lastline) - if match(line, prefix .. "%.") then - return "", lastline, true - else - -- End of a \whatsit block - return line, "" - end - end - -- Wrap some cases that can be picked out - -- In some places LuaTeX does use max_print_line, then we - -- get into issues with different wrapping approaches - if len(line) == maxprintline then - return "", lastline .. line - elseif len(lastline) == maxprintline then - if match(line, "\\ETC%.%}$") then - -- If the line wrapped at \ETC we might have lost a space - return lastline - .. ((match(line, "^\\ETC%.%}$") and " ") or "") - .. line, "" - elseif match(line, "^%}%}%}$") then - return lastline .. line, "" - else - return lastline .. os_newline .. line, "" - end - -- Return all of the text for a wrapped (multi)line - elseif len(lastline) > maxprintline then - return lastline .. line, "" - end - -- Remove spaces at the start of lines: deals with the fact that LuaTeX - -- uses a different number to the other engines - return gsub(line, "^%s+", ""), "" - end - local newlog = "" - local lastline = "" - local dropping = false - -- Read the entire log file as a binary: deals with ^@/^[, etc. - local file = assert(open(logfile, "rb")) - local contents = gsub(file:read("*all") .. "\n", "\r\n", "\n") - close(file) - for line in gmatch(contents, "([^\n]*)\n") do - line, lastline, dropping = normalize(line, lastline, dropping) - if not match(line, "^ *$") then - newlog = newlog .. line .. os_newline - end - end - local newfile = open(newfile, "w") - output(newfile) - write(newlog) - close(newfile) -end - --- Run one test which may have multiple engine-dependent comparisons --- Should create a difference file for each failed test -function runcheck(name, hide) - local checkengines = checkengines - if options["engine"] then - checkengines = options["engine"] - end - local errorlevel = 0 - for _,i in ipairs(checkengines) do - -- Allow for luatex == luajittex for .tlg purposes - local engine = i - if i == "luajittex" then - engine = "luatex" - end - checkpdf = setup_check(name, engine) - runtest(name, i, hide, lvtext, checkpdf) - -- Generation of results depends on test type - local errlevel - if checkpdf then - errlevel = compare_pdf(name, engine) - else - errlevel = compare_tlg(name, engine) - end - if errlevel ~= 0 and options["halt-on-error"] then - showfaileddiff() - if errlevel ~= 0 then - return 1 - end - end - if errlevel > errorlevel then - errorlevel = errlevel - end - end - return errorlevel -end - -function setup_check(name, engine) - local testname = name .. "." .. engine - local pdffile = locate( - {testfiledir, unpackdir}, - {testname .. pdfext, name .. pdfext} - ) - local tlgfile = locate( - {testfiledir, unpackdir}, - {testname .. tlgext, name .. tlgext} - ) - -- Attempt to generate missing reference file from expectation - if not (pdffile or tlgfile) then - if not locate({unpackdir, testfiledir}, {name .. lveext}) then - print( - "Error: failed to find " .. pdfext .. ", " .. tlgext .. " or " - .. lveext .. " file for " .. name .. "!" - ) - exit(1) - end - runtest(name, engine, true, lveext, true) - pdffile = testdir .. "/" .. testname .. pdfext - -- If a PDF is generated use it for comparisons - if not fileexists(pdffile) then - pdffile = nil - ren(testdir, testname .. logext, testname .. tlgext) - end - else - -- Install comparison files found - for _,v in pairs({pdffile, tlgfile}) do - if v then - cp( - match(v, ".*/(.*)"), - match(v, "(.*)/.*"), - testdir - ) - end - end - end - if pdffile then - local pdffile = match(pdffile, ".*/(.*)") - ren( - testdir, - pdffile, - gsub(pdffile, pdfext .. "$", ".ref" .. pdfext) - ) - return true - else - return false - end -end - -function compare_pdf(name, engine) - local errorlevel - local testname = name .. "." .. engine - local cmpfile = testdir .. "/" .. testname .. os_cmpext - local pdffile = testdir .. "/" .. testname .. pdfext - local refpdffile = locate( - {testdir}, {testname .. ".ref" .. pdfext, name .. ".ref" .. pdfext} - ) - if not refpdffile then - return - end - errorlevel = execute( - os_cmpexe .. " " .. normalize_path(refpdffile) - .. " " .. pdffile .. " > " .. cmpfile - ) - if errorlevel == 0 then - os.remove(cmpfile) - end - return errorlevel -end - -function compare_tlg(name, engine) - local errorlevel - local testname = name .. "." .. engine - local difffile = testdir .. "/" .. testname .. os_diffext - local logfile = testdir .. "/" .. testname .. logext - local tlgfile = locate({testdir}, {testname .. tlgext, name .. tlgext}) - if not tlgfile then - return - end - -- Do additional log formatting if the engine is LuaTeX, there is no - -- LuaTeX-specific .tlg file and the default engine is not LuaTeX - if engine == "luatex" - and not match(tlgfile, "%.luatex" .. "%" .. tlgext) - and stdengine ~= "luatex" - and stdengine ~= "luajittex" - then - local luatlgfile = testdir .. "/" .. name .. ".luatex" .. tlgext - formatlualog(tlgfile, luatlgfile) - formatlualog(logfile, logfile) - -- This allows code sharing below: we only need the .tlg name in one place - tlgfile = luatlgfile - end - errorlevel = execute(os_diffexe .. " " - .. normalize_path(tlgfile .. " " .. logfile .. " > " .. difffile)) - if errorlevel == 0 then - os.remove(difffile) - end - return errorlevel -end - --- Run one of the test files: doesn't check the result so suitable for --- both creating and verifying .tlg files -function runtest(name, engine, hide, ext, makepdf) - local lvtfile = name .. (ext or lvtext) - cp(lvtfile, fileexists(testfiledir .. "/" .. lvtfile) - and testfiledir or unpackdir, testdir) - local engine = engine or stdengine - -- Set up the format file name if it's one ending "...tex" - local realengine = engine - local format - if - match(checkformat, "tex$") and - not match(engine, checkformat) then - format = " -fmt=" .. gsub(engine, "(.*)tex$", "%1") .. checkformat - else - format = "" - end - -- Special casing for e-LaTeX format - if - match(checkformat, "^latex$") and - match(engine, "^etex$") then - format = " -fmt=latex" - end - -- Special casing for (u)pTeX LaTeX formats - if - match(checkformat, "^latex$") and - match(engine, "^u?ptex$") then - realengine = "e" .. engine - end - -- Special casing for XeTeX engine - local checkopts = checkopts - if match(engine, "xetex") and not makepdf then - checkopts = checkopts .. " -no-pdf" - end - -- Special casing for ConTeXt - if match(checkformat, "^context$") then - format = "" - if engine == "luatex" or engine == "luajittex" then - realengine = "context" - elseif engine == "pdftex" then - realengine = "texexec" - elseif engine == "xetex" then - realengine = "texexec --xetex" - else - print("Engine incompatible with format") - exit(1) - end - end - local logfile = testdir .. "/" .. name .. logext - local newfile = testdir .. "/" .. name .. "." .. engine .. logext - local asciiopt = "" - for _,i in ipairs(asciiengines) do - if realengine == i then - asciiopt = "-translate-file ./ascii.tcx " - break - end - end - local errlevels = {} - for i = 1, checkruns do - errlevels[i] = run( - testdir, - -- No use of localdir here as the files get copied to testdir: - -- avoids any paths in the logs - os_setenv .. " TEXINPUTS=." .. (checksearch and os_pathsep or "") - .. os_concat .. - -- Avoid spurious output from (u)pTeX - os_setenv .. " GUESS_INPUT_KANJI_ENCODING=0" - .. os_concat .. - (forcecheckepoch and setepoch() or "") .. - -- Ensure lines are of a known length - os_setenv .. " max_print_line=" .. maxprintline - .. os_concat .. - realengine .. format .. " -jobname=" .. name .. " " - .. asciiopt .. " " .. checkopts .. " \"\\input " .. lvtfile .. "\" " - .. (hide and (" > " .. os_null) or "") - .. os_concat .. - runtest_tasks(jobname(lvtfile)) - ) - end - if makepdf and fileexists(testdir .. "/" .. name .. dviext) then - dvitopdf(name, testdir, engine, hide) - end - formatlog(logfile, newfile, engine, errlevels) - -- Store secondary files for this engine - for _,filetype in pairs(auxfiles) do - for _,file in pairs(filelist(testdir, filetype)) do - if match(file,"^" .. name) then - local ext = match(file, "%.[^.]+$") - if ext ~= lvtext and - ext ~= tlgext and - ext ~= lveext and - ext ~= logext then - ren(testdir, file, gsub(file, "(%.[^.]+)$", "." .. engine .. "%1")) - end - end - end - end -end - --- A hook to allow additional tasks to run for the tests -runtest_tasks = runtest_tasks or function(name) - return "" -end - --- Look for a test: could be in the testfiledir or the unpackdir -function testexists(test) - return(locate({testfiledir, unpackdir}, {test .. lvtext})) -end - --- Standard versions of the main targets for building modules - -function check(names) - local errorlevel = 0 - if testfiledir ~= "" and direxists(testfiledir) then - if not options["rerun"] then - checkinit() - end - local hide = true - if names and next(names) then - hide = false - end - names = names or { } - -- No names passed: find all test files - if not next(names) then - for _,i in pairs(filelist(testfiledir, "*" .. lvtext)) do - insert(names, jobname(i)) - end - for _,i in ipairs(filelist(unpackdir, "*" .. lvtext)) do - if fileexists(testfiledir .. "/" .. i) then - print("Duplicate test file: " .. i) - return 1 - else - insert(names, jobname(i)) - end - end - sort(names) - -- Deal limiting range of names - if options["first"] then - local allnames = names - local active = false - local firstname = options["first"] - names = { } - for _,name in ipairs(allnames) do - if name == firstname then - active = true - end - if active then - insert(names,name) - end - end - end - if options["last"] then - local allnames = names - local lastname = options["last"] - names = { } - for _,name in ipairs(allnames) do - insert(names,name) - if name == lastname then - break - end - end - end - end - -- https://stackoverflow.com/a/32167188 - local function shuffle(tbl) - local len, random = #tbl, rnd - for i = len, 2, -1 do - local j = random(1, i) - tbl[i], tbl[j] = tbl[j], tbl[i] - end - return tbl - end - if options["shuffle"] then - names = shuffle(names) - end - -- Actually run the tests - print("Running checks on") - local i = 0 - for _,name in ipairs(names) do - i = i + 1 - print(" " .. name .. " (" .. i.. "/" .. #names ..")") - local errlevel = runcheck(name, hide) - -- Return value must be 1 not errlevel - if errlevel ~= 0 then - if options["halt-on-error"] then - return 1 - else - errorlevel = 1 - -- visually show that something has failed - print(" --> failed\n") - end - end - end - if errorlevel ~= 0 then - checkdiff() - else - print("\n All checks passed\n") - end - end - return errorlevel -end - --- A short auxiliary to print the list of differences for check -function checkdiff() - print("\n Check failed with difference files") - for _,i in ipairs(filelist(testdir, "*" .. os_diffext)) do - print(" - " .. testdir .. "/" .. i) - end - for _,i in ipairs(filelist(testdir, "*" .. os_cmpext)) do - print(" - " .. testdir .. "/" .. i) - end - print("") -end - -function showfaileddiff() - print("\nCheck failed with difference file") - for _,i in ipairs(filelist(testdir, "*" .. os_diffext)) do - print(" - " .. testdir .. "/" .. i) - print("") - local f = open(testdir .. "/" .. i,"r") - local content = f:read("*all") - close(f) - print("-----------------------------------------------------------------------------------") - print(content) - print("-----------------------------------------------------------------------------------") - end - for _,i in ipairs(filelist(testdir, "*" .. os_cmpext)) do - print(" - " .. testdir .. "/" .. i) - end -end - -function save(names) - checkinit() - local engines = options["engine"] or {stdengine} - for _,name in pairs(names) do - local engine - for _,engine in pairs(engines) do - local tlgengine = ((engine == stdengine and "") or "." .. engine) - local tlgfile = name .. tlgengine .. tlgext - local spdffile = name .. tlgengine .. pdfext - local newfile = name .. "." .. engine .. logext - local pdffile = name .. "." .. engine .. pdfext - local refext = ((options["pdf"] and pdfext) or tlgext) - if testexists(name) then - print("Creating and copying " .. refext) - runtest(name, engine, false, lvtext, options["pdf"]) - if options["pdf"] then - ren(testdir, pdffile, spdffile) - cp(spdffile, testdir, testfiledir) - else - ren(testdir, newfile, tlgfile) - cp(tlgfile, testdir, testfiledir) - end - if fileexists(unpackdir .. "/" .. tlgfile) then - print( - "Saved " .. tlgext - .. " file overrides unpacked version of the same name" - ) - end - elseif locate({unpackdir, testfiledir}, {name .. lveext}) then - print( - "Saved " .. tlgext .. " file overrides a " - .. lveext .. " file of the same name" - ) - else - print( - "Test input \"" .. testfiledir .. "/" .. name .. lvtext - .. "\" not found" - ) - end - end - end -end - |