summaryrefslogtreecommitdiff
path: root/scripts/mkimport
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/mkimport')
-rwxr-xr-x[-rw-r--r--]scripts/mkimport152
1 files changed, 118 insertions, 34 deletions
diff --git a/scripts/mkimport b/scripts/mkimport
index a430587..0833ccb 100644..100755
--- a/scripts/mkimport
+++ b/scripts/mkimport
@@ -1,7 +1,7 @@
#!/usr/bin/env texlua
-------------------------------------------------------------------------------
-- FILE: mkimport.lua
--- USAGE: ./mkimport.lua
+-- USAGE: texlua ./mkimport.lua
-- DESCRIPTION: check luaotfload imports against Context
-- REQUIREMENTS: luatex, the lualibs package, Context MkIV
-- AUTHOR: Philipp Gesang (Phg), <phg@phi-gamma.net>
@@ -12,12 +12,15 @@
-------------------------------------------------------------------------------
--- PURPOSE
----
+---
--- - Facilitate detecting changes in the fontloader source.
--- - Assist in updating source code and (partially) automate importing.
+---
--- - Account for files in the plain fontloader distribution, alert in case of
--- additions or deletions.
----
+---
+--- - Fontloader packaging.
+---
-------------------------------------------------------------------------------
local debug = false
@@ -26,18 +29,23 @@ kpse.set_program_name "luatex"
local lfs = require "lfs"
local md5 = require "md5"
+local os = require "os"
require "lualibs"
+local filedirname = file.dirname
local fileiswritable = file.is_writable
local ioloaddata = io.loaddata
local iopopen = io.popen
local iowrite = io.write
local lfschdir = lfs.chdir
+local lfscurrentdir = lfs.currentdir
local lfsisdir = lfs.isdir
local lfsisfile = lfs.isfile
local md5sumhexa = md5.sumhexa
+local osdate = os.date
local osgettimeofday = os.gettimeofday
+local osrename = os.rename
local stringformat = string.format
local tableconcat = table.concat
@@ -71,6 +79,26 @@ local prefixes = {
fontloader = "luatex",
}
+--[[doc--
+
+ The output name is fixed so we have to deal with it but maybe we
+ can get a patch to mtx-package upstreamed in the future. In any
+ case, we are content with renaming the result for the time being.
+
+ The target name is constructed on the fly from the current date.
+ TODO It should be possible to supply a name and possibly
+ destination path on the command line.
+
+ Paths are relative to the base directory (``$PWD``).
+
+--doc]]--
+
+local loader_merge_name = "luaotfload-package.lua"
+local loader_output_name = "luaotfload-package-merged.lua"
+local loader_target_name = "fontloader-%s.lua"
+local loader_orig_dir = "/src/fontloader/"
+local loader_target_dir = "/build/"
+
-------------------------------------------------------------------------------
-- helpers
-------------------------------------------------------------------------------
@@ -169,7 +197,7 @@ local imports = {
{ name = "fonts-ext" , ours = nil , kind = kind_merged },
{ name = "fonts-inj" , ours = nil , kind = kind_merged },
{ name = "fonts-lua" , ours = nil , kind = kind_merged },
- { name = "fonts-merged" , ours = "fontloader" , kind = kind_essential },
+ { name = "fonts-merged" , ours = "reference" , kind = kind_essential },
{ name = "fonts-ota" , ours = nil , kind = kind_merged },
{ name = "fonts-otn" , ours = nil , kind = kind_merged },
{ name = "fonts" , ours = nil , kind = kind_merged },
@@ -641,6 +669,49 @@ local tell = function (arg)
return describe (target, location)
end
+local build_paths = function (argv)
+ if not argv or type (argv) ~= "table" then die "build_paths" end
+
+ local orig_dir = lfscurrentdir ()
+ local base_dir = orig_dir .. loader_orig_dir
+ local target_name = orig_dir .. loader_target_dir
+ .. stringformat (loader_target_name, os.date ("%F"))
+ local merge_name = base_dir .. loader_merge_name
+ local output_name = base_dir .. loader_output_name
+
+ if #argv >= 2 then
+ local fname = argv[2]
+ local dir = filedirname (fname) .. "/"
+ if not lfsisdir (dir) then
+ die ("second argument must be point into existing directory, not “%s”",
+ argv[2])
+ end
+ base_dir = dir
+ merge_name = fname
+ output_name = dir .. loader_output_name
+ end
+
+ if #argv == 3 then
+ --- also set the target name
+ local fname = argv[3]
+ local dir = filedirname (fname)
+ if not lfsisdir (dir) then
+ die ("third argument must be point into writable directory, not “%s”",
+ argv[3])
+ end
+ target_name = fname
+ end
+
+ local ret = {
+ orig_dir = orig_dir,
+ base_dir = base_dir,
+ merge_name = merge_name,
+ target_name = target_name,
+ output_name = output_name,
+ }
+ return ret
+end
+
--[[doc--
Packaging works as follows:
@@ -659,43 +730,40 @@ end
--doc]]--
-local package = function (args)
- local t0 = osgettimeofday ()
- local orig_dir = lfs.currentdir ()
- local base_dir = orig_dir .. "/src/fontloader/"
- local merge_name = base_dir .. "luaotfload-package.lua"
- --- output name is fixed so we have to deal with it but maybe we can
- --- get a patch to mtx-package upstreamed in the future
- local output_name = base_dir .. "luaotfload-package-merged.lua"
- local target_name = stringformat ("fontloader-%s.lua",
- os.date ("%F"))
- status ("assuming fontloader source in %s", base_dir)
- status ("reading merge instructions from %s", merge_name)
- status ("writing output to %s", target_name)
+local package = function (argv)
+ local t0 = osgettimeofday ()
+ local paths = build_paths (argv)
+
+ status ("assuming fontloader source in %s", paths.base_dir)
+ status ("reading merge instructions from %s", paths.merge_name)
+ status ("mtx-package result at %s", paths.output_name)
+ status ("writing output to %s", paths.target_name)
--- check preconditions
- if not lfsisdir (base_dir) then die ("directory %s does not exist", emphasis (base_dir )) end
- if not lfsisfile (merge_name) then die ("missing merge file at %s", emphasis (merge_name )) end
- if not fileiswritable (output_name) then die ("cannot write to %s", emphasis (output_name)) end
- if not fileiswritable (target_name) then die ("cannot write to %s", emphasis (target_name)) end
- if not lfschdir (base_dir) then die ("failed to cd into %s", emphasis (base_dir )) end
+ if not lfsisdir (paths.base_dir) then die ("directory %s does not exist", emphasis (paths.base_dir )) end
+ if not lfsisfile (paths.merge_name) then die ("missing merge file at %s", emphasis (paths.merge_name )) end
+ if not fileiswritable (paths.output_name) then die ("cannot write to %s", emphasis (paths.output_name)) end
+ if not fileiswritable (paths.target_name) then die ("cannot write to %s", emphasis (paths.target_name)) end
+---- not lfschdir (paths.base_dir) then die ("failed to cd into %s", emphasis (paths.base_dir )) end
- if lfsisfile (output_name) then
- status ("output file already exists at “%s”, unlinking", output_name)
- local ret, err = os.remove (output_name)
+ if lfsisfile (paths.output_name) then
+ status ("output file already exists at “%s”, unlinking",
+ paths.output_name)
+ local ret, err = os.remove (paths.output_name)
if ret == nil then
- if not lfschdir (orig_dir) then
- status ("warning: failed to cd retour into %s", emphasis (orig_dir))
+ if not lfschdir (paths.orig_dir) then
+ status ("warning: failed to cd retour into %s",
+ emphasis (paths.orig_dir))
end
die ("failed to remove existing merge package")
end
end
- --die ("missing merge file at %s", emphasis (merge_name )) end
+ --die ("missing merge file at %s", emphasis (paths.merge_name )) end
--- perform merge
- local cmd = { "mtxrun", "--script", "package", "--merge", merge_name }
+ local cmd = { "mtxrun", "--script", "package", "--merge", paths.merge_name }
local shl = tableconcat (cmd, " ")
status ("invoking %s as “%s”", emphasis "mtx-package", shl)
@@ -703,8 +771,9 @@ local package = function (args)
local fh = iopopen (shl, "r")
if not fh then
- if not lfschdir (orig_dir) then
- status ("warning: failed to cd retour into %s", emphasis (orig_dir))
+ if not lfschdir (paths.orig_dir) then
+ status ("warning: failed to cd retour into %s",
+ emphasis (paths.orig_dir))
end
die ("merge failed; failed to invoke mtxrun")
end
@@ -720,19 +789,34 @@ local package = function (args)
--- clean up
- if not lfschdir (orig_dir) then
- status ("warning: failed to cd retour into %s", emphasis (orig_dir))
+ if not lfschdir (paths.orig_dir) then
+ status ("warning: failed to cd retour into %s",
+ emphasis (paths.orig_dir))
end
--- check postconditions
- if not lfsisfile (output_name) then die ("merge failed; package not found at " .. output_name) end
+ if not lfsisfile (paths.output_name) then
+ die ("merge failed; package not found at " .. paths.output_name)
+ end
--- at this point we know that mtxrun was invoked correctly and the
--- result file has been created
+ if lfsisfile (paths.target_name) then
+ status ("target file %s exists, overwriting", emphasis (paths.target_name))
+ end
+
+ local res, err = osrename (paths.output_name, paths.target_name)
+
+ if res == nil then
+ die ("merge failed; failed to move package from %s to %s",
+ paths.output_name, paths.target_name)
+ end
+
status ("merge complete; operation finished in %.0f ms",
(osgettimeofday() - t0) * 1000)
+ status ("a fresh fontloader at %s is ready to roll", paths.target_name)
end
local help = function ()