gnosygnu / xowa

xowa offline wiki application
Other
374 stars 41 forks source link

module `luabit.hex' not found #353

Closed desb42 closed 5 years ago

desb42 commented 5 years ago

Reviewing the logs of an enwiki html build I came across this error

invoke failed: St._Peter's_Lutheran_Church_(Ottawa) {{#invoke:Box-header|boxHeader}} [err 0] <gplx> @package.lua:81 module `luabit.hex' not found
  stack traceback:
  package.lua:73: in function <package.lua:71>
  package.lua:90: in function <package.lua:89>
  Module:Box-header:1: in main chunk
  mw.lua:491: in function <mw.lua:490>
  [Java]: in function '__index'
  d:/des/xowa_x/bin/any/xowa/xtns/Scribunto/engines/Luaj/MWServer.lua:75: in function <d:/des/xowa_x/bin/any/xowa/xtns/Scribunto/engines/Luaj/MWServer.lua:74>
  [Java]: in ?: ttl=St._Peter's_Lutheran_Church_(Ottawa) excerpt={{#invoke:Box-header|boxHeader}}
  [trace]:
    gplx.xowa.xtns.scribunto.Scrib_core.Handle_error(Scrib_core.java:216)
    gplx.xowa.xtns.scribunto.engines.luaj.Luaj_engine.Dispatch_as_kv_ary(Luaj_engine.java:80)
    gplx.xowa.xtns.scribunto.engines.luaj.Luaj_engine.CallFunction(Luaj_engine.java:59)
    gplx.xowa.xtns.scribunto.Scrib_core.Invoke(Scrib_core.java:178)
    gplx.xowa.xtns.scribunto.Scrib_invoke_func.Func_evaluate(Scrib_invoke_func.java:69)
    gplx.xowa.parsers.tmpls.Xot_invk_tkn_.Eval_func(Xot_invk_tkn_.java:30)
    gplx.xowa.parsers.tmpls.Xot_invk_tkn.Tmpl_evaluate(Xot_invk_tkn.java:258)
    gplx.xowa.parsers.tmpls.Xot_defn_tmpl.Tmpl_evaluate(Xot_defn_tmpl.java:86)
    gplx.xowa.parsers.tmpls.Xot_invk_tkn.Tmpl_evaluate(Xot_invk_tkn.java:288)
    gplx.xowa.parsers.tmpls.Xot_defn_tmpl.Tmpl_evaluate(Xot_defn_tmpl.java:86)
    gplx.xowa.parsers.tmpls.Xot_invk_tkn.Eval_sub(Xot_invk_tkn.java:359)
    gplx.xowa.parsers.tmpls.Xot_invk_tkn.SubEval(Xot_invk_tkn.java:392)
    gplx.xowa.parsers.tmpls.Xot_invk_tkn.Tmpl_evaluate(Xot_invk_tkn.java:113)
    gplx.xowa.parsers.tmpls.Xot_tmpl_wtr.Write_tkn(Xot_tmpl_wtr.java:101)
    gplx.xowa.parsers.tmpls.Xot_tmpl_wtr.Write_tkn(Xot_tmpl_wtr.java:33)
    gplx.xowa.parsers.tmpls.Xot_tmpl_wtr.Write_all(Xot_tmpl_wtr.java:22)
    gplx.xowa.parsers.Xop_parser.Expand_tmpl(Xop_parser.java:50)
    gplx.xowa.parsers.Xop_parser.Expand_tmpl(Xop_parser.java:44)
    gplx.xowa.parsers.Xop_parser.Parse_text_to_wdom(Xop_parser.java:102)
    gplx.xowa.parsers.Xow_parser_mgr.Parse(Xow_parser_mgr.java:98)
    gplx.xowa.wikis.pages.Xowe_page_mgr.Load_page(Xowe_page_mgr.java:91)
    gplx.xowa.apps.servers.http.Http_server_mgr.Parse_page_to_html(Http_server_mgr.java:128)
    gplx.xowa.apps.servers.http.Http_server_wkr.Write_wiki(Http_server_wkr.java:111)
    gplx.xowa.apps.servers.http.Http_server_wkr.Process_get(Http_server_wkr.java:82)
    gplx.xowa.apps.servers.http.Http_server_wkr.Run(Http_server_wkr.java:60)
    gplx.xowa.apps.servers.http.Http_server_wkr.Invk(Http_server_wkr.java:229)
    gplx.Gfo_invk_.Invk_by_msg(Gfo_invk_.java:34)
    gplx.core.threads.Thread_adp.run(Thread_adp.java:33)
    java.lang.Thread.run(Thread.java:748)

I tracked this down to Scrib_fsys_mgr.java It seems that Mediawik Lua allows for either luabit.hex or hex to load a lua module (from disk) So I changed the logic in function libs_init from (L44)

for (int i = 0; i < fils_len; i++) {
  Io_url fil = fils[i];
  if (!String_.Eq(fil.Ext(), ".lua")) continue;  // ignore readme.txt, readme
  gplx.core.ios.Io_fil fil_itm = new gplx.core.ios.Io_fil(fil, null);
  rv.Add_if_dupe_use_1st(fil.NameOnly(), fil_itm);
  rv.Add_if_dupe_use_1st(String_.Replace(String_.DelEndIf(fil.GenRelUrl_orEmpty(script_dir), ".lua"), "\\", "/"), fil_itm);
}

to

for (int i = 0; i < fils_len; i++) {
  Io_url fil = fils[i];
  if (!String_.Eq(fil.Ext(), ".lua")) continue;  // ignore readme.txt, readme
  gplx.core.ios.Io_fil fil_itm = new gplx.core.ios.Io_fil(fil, null);
  String fname = fil.Raw().substring(script_dir.Raw().length(), fil.Raw().length()-4).replace("\\", ".").replace("/", ".");
  int dot = fname.indexOf('.');
  if (dot > 0)
      rv.Add_if_dupe_use_1st(fil.NameOnly(), fil_itm);
  rv.Add_if_dupe_use_1st(fname, fil_itm);
}

This seem to make it work

desb42 commented 5 years ago

Turns out (as I am building dewiki html) that I have been over zealous in my trimming of the logic. It seems that the additional subdirectory can be delimited by a dot (.) or a slash (/) So the replacement should be:

for (int i = 0; i < fils_len; i++) {
  Io_url fil = fils[i];
  if (!String_.Eq(fil.Ext(), ".lua")) continue;  // ignore readme.txt, readme
  gplx.core.ios.Io_fil fil_itm = new gplx.core.ios.Io_fil(fil, null);
  String fname = fil.Raw().substring(script_dir.Raw().length(), fil.Raw().length()-4).replace("\\", ".").replace("/", ".");
  int dot = fname.indexOf('.');
  if (dot > 0) {
    // also add just the filename (no extension)
    rv.Add_if_dupe_use_1st(fil.NameOnly(), fil_itm);
    // also add using '/' instead of '.'
    rv.Add_if_dupe_use_1st(String_.Replace(String_.DelEndIf(fil.GenRelUrl_orEmpty(script_dir), ".lua"), "\\", "/"), fil_itm);
  }
  rv.Add_if_dupe_use_1st(fname, fil_itm);
}
gnosygnu commented 5 years ago

Nice! Great analysis, explanation, and code.

I pushed the commit above. I changed the code a little, but hopefully the comments and tests make the intent clear.

Thanks!