#!/usr/bin/env texlua ----------------------------------------------------------------------- -- FILE: mkstatus.lua -- USAGE: ./mkstatus.lua -- DESCRIPTION: writes the repository state -- REQUIREMENTS: luatex, the lualibs package -- AUTHOR: Philipp Gesang (Phg), -- VERSION: 1.0 -- CREATED: 2013-07-07 14:01:12+0200 ----------------------------------------------------------------------- -- -- This script generates a list of hashes that serves as the input -- for the file integrity check (option --diagnose). md5 is all we can -- assume in Luatex, so it’s really only a superficial test. kpse.set_program_name "luatex" local md5 = require "md5" require "lualibs" local stringformat = string.format local md5sumhexa = md5.sumhexa local ioloaddata = io.loaddata local iosavedata = io.savedata local iopopen = io.popen local iowrite = io.write local lfsisdir = lfs.isdir local stringmatch = string.match ----------------------------------------------------------------------- -- settings ----------------------------------------------------------------------- local verbose = false local filelist = "./build/luaotfload-status.lua" --- result local names = { --- only the runtime files and scripts { "src", "luaotfload-auxiliary.lua", }, { "src/fontloader/runtime", "fontloader-basics-gen.lua", }, --{ "src/fontloader", "fontloader-basics-nod.lua", }, { "build", "luaotfload-characters.lua", }, { "src", "luaotfload-colors.lua", }, { "src", "luaotfload-database.lua", }, { "src", "luaotfload-diagnostics.lua", }, { "src", "luaotfload-features.lua", }, --{ "src/fontloader", "fontloader-fonts-cbk.lua", }, --{ "src/fontloader", "fontloader-fonts-def.lua", }, --{ "src/fontloader", "fontloader-fonts-enc.lua", }, --{ "src/fontloader", "fontloader-fonts-ext.lua", }, --{ "src/fontloader", "fontloader-fonts-lua.lua", }, --{ "src/fontloader", "fontloader-fonts-tfm.lua", }, { "build", "luaotfload-glyphlist.lua", }, { "src", "luaotfload-letterspace.lua", }, { "src", "luaotfload-loaders.lua", }, { "src", "luaotfload-log.lua", }, { "src", "luaotfload-main.lua", }, { "src/fontloader/runtime", "fontloader-reference.lua", }, --{ "src", "luaotfload-override.lua", }, --> part of init now { "src", "luaotfload-parsers.lua", }, { "src", "luaotfload-tool.lua", }, { "scripts", "mkcharacters", }, { "scripts", "mkglyphlist", }, { "scripts", "mkstatus", }, } ----------------------------------------------------------------------- -- helpers ----------------------------------------------------------------------- local die = function (...) io.stderr:write "[fatal error]: " io.stderr:write (stringformat (...)) io.stderr:write "\naborting.\n" os.exit (1) end local gitcmd = "git log -1 \z --format=\"return {\z %n revision = [[%H]],\z %n timestamp = [[%cd]],\z %n committer = [[%cn <%ce>]],\z %n}\" \z --date=iso" local git_info = function () --io.write (gitcmd) --io.write "\n" local chan = iopopen (gitcmd) if not chan then die ("this script needs to be run inside \z the luaotfload git repository") end local data = chan:read "*all" chan:close () if data and type (data) == "string" and data ~= "" then data = load (data) if not data then die "cannot parse git information" end return data () end die "cannot read from pipe" end ----------------------------------------------------------------------- -- functionality ----------------------------------------------------------------------- local hash_file = function (fname) if not lfs.isfile (fname) then die ("cannot find %s.", fname) end local raw = ioloaddata (fname) if not raw then die ("cannot read from %s.", fname) end return md5sumhexa (raw) end local hash_all hash_all = function (list, acc) if acc == nil then local base = table.fastcopy (names) return hash_all (table.append (base, list), { }) end local finfo = list[#list] list[#list] = nil if finfo then local fpath, fname if type (finfo) == "table" then local d, f = finfo [1], finfo [2] if lfs.isdir (d) then fpath = file.join (d, f) else fpath = f end fname = f else fpath = finfo end if verbose then iowrite "· md5(" iowrite (fpath) end local sum = hash_file (fpath) if verbose then iowrite ") = \"" iowrite (sum) iowrite "\"\n" end acc[#acc+1] = { fname, sum } return hash_all (list, acc) end return acc end local handle_argv = function (argv) local ret = { files = { }, loader = nil } local argc = #argv if argc < 1 then return ret end local argoff = 1 if argv [1] == "-v" then verbose = true if argc == 1 then return ret end argoff = 2 end local aux aux = function (acc, i) if i > argc then return acc else local cur = argv[i] if type (cur) == "string" then local loader = stringmatch (cur, "--fontloader=(.+)$") if loader then cur = loader acc.loader = file.basename (cur) end if lfs.isfile (cur) then local files = acc.files files[#files + 1] = cur end else die ("file not found: %s", tostring (cur)) end return aux (acc, i + 1) end end return aux (ret, argoff) end local add_files add_files = function (lst, acc) if lst == nil then return end if acc == nil then return add_files (lst, { }) end local len = #lst if len == 0 then return acc end local cur = lst[len] local fname = file.basename (cur) local path = file.dirname (cur) acc[#acc + 1] = { path, fname } lst[len] = nil return add_files (lst, acc) end local main = function () local raw_extra = handle_argv (arg) local cuit_extra = add_files (raw_extra.files) local hashes = hash_all (cuit_extra) local notes = git_info () notes.loader = raw_extra.loader local serialized = table.serialize ({ notes = notes, hashes = hashes }, true) local success = io.savedata (filelist, serialized) if success == false then die ("could not write to %s.", filelist) end return 0 end return main () --- vim:ft=lua:ts=2:et:sw=2