From 29c426e86ad54e035c1e9501b8dcade8e352f1a4 Mon Sep 17 00:00:00 2001 From: Philipp Gesang Date: Mon, 20 May 2013 21:12:12 +0200 Subject: add temporary workaround for cache directory creation --- luaotfload.dtx | 102 ++++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 94 insertions(+), 8 deletions(-) (limited to 'luaotfload.dtx') diff --git a/luaotfload.dtx b/luaotfload.dtx index eabc240..706ee1c 100644 --- a/luaotfload.dtx +++ b/luaotfload.dtx @@ -1455,12 +1455,14 @@ local luatexbase = luatexbase local type, next = type, next local setmetatable = setmetatable -local find_file = kpse.find_file +local kpsefind_file = kpse.find_file +local kpseexpand_path = kpse.expand_path +local kpseexpand_var = kpse.expand_var local lfsisfile = lfs.isfile -local stringfind = string.find -local stringformat = string.format -local stringmatch = string.match -local stringsub = string.sub +local lfsisdir = lfs.isdir +local lfsmkdir = lfs.mkdir +local stringexplode = string.explode +local stringgmatch = string.gmatch local add_to_callback, create_callback = luatexbase.add_to_callback, luatexbase.create_callback @@ -1508,6 +1510,80 @@ if tex.luatexversion < luatex_version then end end +% \end{macrocode} +% Create $TEXMFCACHE if not present. This is necessary due to +% two bugs in Luatex-Fonts that surface simultaneously if none +% of the possible cache directories exists. We add a fixed version +% of lfs.mkdirs() first. +% +% \begin{macrocode} + +local ostype = os.type + +local mkdirs = function (path) + local full + for sub in stringgmatch(path, "([^\\/]+)") do + if full then + full = full .. "/" .. sub + else + if ostype == "windows" then + full = sub + else + full = "/" .. sub + end + end + if not lfsisdir(full) then + lfsmkdir(full) + end + end +end + +--- + +local phantom_kpse, normal_expand_path +do --- take care of writable path + local cachepath = kpseexpand_path"$TEXMFCACHE" + if cachepath == "" then + cachepath = kpseexpand_path"$TEXMFVAR" + end + if cachepath == "" then --- dir missing, create + texio.write_nl("term and log", + "(luaotfload: cache directory inaccessible)") + local cachedest = kpseexpand_var"$TEXMFCACHE" + local pathsep = ostype == "windows" and ";" or ":" + if cachedest then + cachedest = stringexplode(cachedest, pathsep) + end + for _, path in next, cachedest do + if not lfsisdir(path) then + texio.write_nl("term and log", + "(luaotfload: creating path " .. path) + mkdirs(path) + if lfsisdir(path) then + local writable = kpseexpand_path("$TEXMFCACHE", true) + texio.write("term and log", " -- success)") + phantom_kpse = kpse.new "luatex" + goto writable_cache + end + texio.write("term and log", " FAILED!)") + end + end + end +end + +::writable_cache:: +if phantom_kpse ~= nil then + normal_expand_path = kpseexpand_path + kpse.expand_path = function (spec) + --- the second kpse instance is needed because kpathsea + --- doesn’t update variables + --- http://www.ntg.nl/pipermail/dev-luatex/2007-December/001172.html + return phantom_kpse:expand_path(spec) + end +end + +--- + % \end{macrocode} % \subsection{Module loading} % We load the files imported from \CONTEXT with this function. @@ -1537,10 +1613,10 @@ local p_suffix = (p_dot * (1 - p_dot - p_slash)^1 * P(-1)) / "" local p_removesuffix = Cs((p_suffix + 1)^1) local find_vf_file = function (name) - local fullname = find_file(name, "ovf") + local fullname = kpsefind_file(name, "ovf") if not fullname then - --fullname = find_file(file.removesuffix(name), "ovf") - fullname = find_file(lpegmatch(p_removesuffix, name), "ovf") + --fullname = kpsefind_file(file.removesuffix(name), "ovf") + fullname = kpsefind_file(lpegmatch(p_removesuffix, name), "ovf") end if fullname then log("loading virtual font file %s.", fullname) @@ -1745,6 +1821,16 @@ pop_namespaces(our_environment, false)-- true) log("fontloader loaded in %0.3f seconds", os.gettimeofday()-starttime) +% \end{macrocode} +% Restore original \luafunction{kpse.expand_path} function. +% +% \begin{macrocode} + +if normal_expand_path ~= nil then + kpse.expand_path = normal_expand_path + phantom_kpse = nil +end + % \end{macrocode} % \subsection{Callbacks} % After the fontloader is ready we can restore the callback trap from -- cgit v1.2.3 From c1406e4fff6268137d2fad0a96cf6382e625bf16 Mon Sep 17 00:00:00 2001 From: Philipp Gesang Date: Mon, 20 May 2013 21:24:52 +0200 Subject: [doc] escape verbatims --- luaotfload.dtx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'luaotfload.dtx') diff --git a/luaotfload.dtx b/luaotfload.dtx index 706ee1c..1c21460 100644 --- a/luaotfload.dtx +++ b/luaotfload.dtx @@ -1511,10 +1511,10 @@ if tex.luatexversion < luatex_version then end % \end{macrocode} -% Create $TEXMFCACHE if not present. This is necessary due to +% Create \verb|$TEXMFCACHE| if not present. This is necessary due to % two bugs in Luatex-Fonts that surface simultaneously if none % of the possible cache directories exists. We add a fixed version -% of lfs.mkdirs() first. +% of \verb|lfs.mkdirs()| first. % % \begin{macrocode} -- cgit v1.2.3 From 6bb6f091d1a7a0327cea59cb7c124b4b84e31059 Mon Sep 17 00:00:00 2001 From: Philipp Gesang Date: Tue, 21 May 2013 22:31:01 +0200 Subject: new, less brutal workaround for updated-yet-not-completely-satisfying ``lfs.mkdirs()`` --- luaotfload.dtx | 106 +++++++++++++++++++++++---------------------------------- 1 file changed, 42 insertions(+), 64 deletions(-) (limited to 'luaotfload.dtx') diff --git a/luaotfload.dtx b/luaotfload.dtx index 1c21460..af43615 100644 --- a/luaotfload.dtx +++ b/luaotfload.dtx @@ -1451,18 +1451,23 @@ luaotfload.module = { license = "GPL v2.0" } -local luatexbase = luatexbase +local luatexbase = luatexbase -local type, next = type, next +local getmetatable = getmetatable +local rawset = rawset local setmetatable = setmetatable -local kpsefind_file = kpse.find_file +local type, next = type, next + + local kpseexpand_path = kpse.expand_path local kpseexpand_var = kpse.expand_var -local lfsisfile = lfs.isfile +local kpsefind_file = kpse.find_file local lfsisdir = lfs.isdir +local lfsisfile = lfs.isfile local lfsmkdir = lfs.mkdir local stringexplode = string.explode local stringgmatch = string.gmatch +local stringsub = string.sub local add_to_callback, create_callback = luatexbase.add_to_callback, luatexbase.create_callback @@ -1511,77 +1516,50 @@ if tex.luatexversion < luatex_version then end % \end{macrocode} -% Create \verb|$TEXMFCACHE| if not present. This is necessary due to -% two bugs in Luatex-Fonts that surface simultaneously if none -% of the possible cache directories exists. We add a fixed version -% of \verb|lfs.mkdirs()| first. +% Create $TEXMFCACHE if not present. This is necessary due to a bug +% in Luatex-Fonts that surfaces if none of the possible cache +% directories exists. We add a fixed version of lfs.mkdirs() first +% that will be installed as soon as l-file.lua tries to insert its +% buggy version. % % \begin{macrocode} -local ostype = os.type - +local ostype = os.type local mkdirs = function (path) - local full - for sub in stringgmatch(path, "([^\\/]+)") do - if full then - full = full .. "/" .. sub - else - if ostype == "windows" then - full = sub - else - full = "/" .. sub - end - end - if not lfsisdir(full) then - lfsmkdir(full) - end + local full + if ostype ~= "windows" and stringsub(path, 1, 1) == "/" then + --- absolute path, force initial backslash + full = "" + end + for sub in stringgmatch(path,"([^\\/]+)") do + if full then + full = full .. "/" .. sub + else + full = sub + end + if not lfsisdir(full) then + lfsmkdir(full) end + end end ---- +--- -local phantom_kpse, normal_expand_path -do --- take care of writable path - local cachepath = kpseexpand_path"$TEXMFCACHE" - if cachepath == "" then - cachepath = kpseexpand_path"$TEXMFVAR" - end - if cachepath == "" then --- dir missing, create - texio.write_nl("term and log", - "(luaotfload: cache directory inaccessible)") - local cachedest = kpseexpand_var"$TEXMFCACHE" - local pathsep = ostype == "windows" and ";" or ":" - if cachedest then - cachedest = stringexplode(cachedest, pathsep) - end - for _, path in next, cachedest do - if not lfsisdir(path) then - texio.write_nl("term and log", - "(luaotfload: creating path " .. path) - mkdirs(path) - if lfsisdir(path) then - local writable = kpseexpand_path("$TEXMFCACHE", true) - texio.write("term and log", " -- success)") - phantom_kpse = kpse.new "luatex" - goto writable_cache - end - texio.write("term and log", " FAILED!)") - end - end - end -end +local backup_mkdirs -- just in case -::writable_cache:: -if phantom_kpse ~= nil then - normal_expand_path = kpseexpand_path - kpse.expand_path = function (spec) - --- the second kpse instance is needed because kpathsea - --- doesn’t update variables - --- http://www.ntg.nl/pipermail/dev-luatex/2007-December/001172.html - return phantom_kpse:expand_path(spec) - end +local lfs_mt = getmetatable(lfs) or { } --- should be empty + +lfs_mt.__newindex = function (t, k, v) + if k == "mkdirs" then + backup_mkdirs = v --> backup + rawset(t, "mkdirs", mkdirs) --> ours + else -- insert normally + t[k] = v + end end +setmetatable(lfs, lfs_mt) + --- % \end{macrocode} -- cgit v1.2.3 From bd84183e5fb0e97e974b4a9c5fdfac776fdf369a Mon Sep 17 00:00:00 2001 From: Philipp Gesang Date: Tue, 21 May 2013 22:38:35 +0200 Subject: [doc] fix verbatim etc. (again...) --- luaotfload.dtx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'luaotfload.dtx') diff --git a/luaotfload.dtx b/luaotfload.dtx index af43615..8042a6f 100644 --- a/luaotfload.dtx +++ b/luaotfload.dtx @@ -1516,10 +1516,10 @@ if tex.luatexversion < luatex_version then end % \end{macrocode} -% Create $TEXMFCACHE if not present. This is necessary due to a bug +% Create \verb+$TEXMFCACHE+ if not present. This is necessary due to a bug % in Luatex-Fonts that surfaces if none of the possible cache -% directories exists. We add a fixed version of lfs.mkdirs() first -% that will be installed as soon as l-file.lua tries to insert its +% directories exists. We add a fixed version of \luafunction{lfs.mkdirs} first +% that will be installed as soon as \fileent{l-file.lua} tries to insert its % buggy version. % % \begin{macrocode} -- cgit v1.2.3