From d4399bf6189977336a94795f25986fb89a22a5e7 Mon Sep 17 00:00:00 2001 From: Steven Barth Date: Mon, 26 May 2008 12:16:16 +0000 Subject: [PATCH] * Reworked host-Target for global Makefile * Fixed dispatcher to correctly support fastindex --- Makefile | 5 ++- applications/sgi-haserl/root/www/cgi-bin/luci | 3 +- build/module.mk | 2 +- core/src/dispatcher.lua | 45 ++++++++++++++++--- 4 files changed, 43 insertions(+), 12 deletions(-) diff --git a/Makefile b/Makefile index 32ef02d4e..5dd89c0bb 100644 --- a/Makefile +++ b/Makefile @@ -15,8 +15,9 @@ clean: for i in $(MODULES); do make -C$$i clean; done host: build - mkdir -p host/luci - for i in $(MODULES); do cp $$i/dist$(LUCI_INSTALLDIR) host/ -R 2>/dev/null || true; done + mkdir -p host + for i in $(MODULES); do cp $$i/dist/* host/ -R 2>/dev/null || true; done + ln -sf .$(LUCI_INSTALLDIR) host/luci hostclean: clean rm host -rf diff --git a/applications/sgi-haserl/root/www/cgi-bin/luci b/applications/sgi-haserl/root/www/cgi-bin/luci index 8b06527a0..13fec754e 100755 --- a/applications/sgi-haserl/root/www/cgi-bin/luci +++ b/applications/sgi-haserl/root/www/cgi-bin/luci @@ -1,3 +1,2 @@ #!/usr/bin/haserl --shell=luac -require("luci.dispatcher").createindex() -luci.dispatcher.httpdispatch() \ No newline at end of file +require("luci.dispatcher").httpdispatch() \ No newline at end of file diff --git a/build/module.mk b/build/module.mk index 52c0e5268..9c17df18c 100644 --- a/build/module.mk +++ b/build/module.mk @@ -9,7 +9,7 @@ source: for i in $$(find dist -name .svn); do rm $$i -rf; done compile: source - for i in $$(find dist -name *.lua); do $(LUAC) $(LUAC_OPTIONS) -o $$i $$i; done + for i in $$(find dist -name *.lua -not -name debug.lua); do $(LUAC) $(LUAC_OPTIONS) -o $$i $$i; done clean: rm dist -rf diff --git a/core/src/dispatcher.lua b/core/src/dispatcher.lua index d69045c02..103260c48 100644 --- a/core/src/dispatcher.lua +++ b/core/src/dispatcher.lua @@ -31,12 +31,19 @@ require("luci.fs") -- Local dispatch database local tree = {nodes={}} +-- Index table +local index = {} + -- Global request object request = {} -- Active dispatched node dispatched = nil +-- Status fields +built_index = false +built_tree = false + -- Builds a URL function build_url(...) @@ -68,7 +75,7 @@ function error500(message) return false end --- Dispatches a request depending on the PATH_INFO variable +-- Creates a request object for dispatching function httpdispatch() local pathinfo = luci.http.env.PATH_INFO or "" local c = tree @@ -80,7 +87,12 @@ function httpdispatch() dispatch() end +-- Dispatches a request function dispatch() + if not built_tree then + createtree() + end + local c = tree local track = {} @@ -131,6 +143,7 @@ end -- Generates the dispatching tree function createindex() + index = {} local path = luci.sys.libpath() .. "/controller/" local suff = ".lua" @@ -139,6 +152,8 @@ function createindex() else createindex_plain(path, suff) end + + built_index = true end -- Uses fastindex to create the dispatching tree @@ -149,10 +164,7 @@ function createindex_fastindex(path, suffix) fi.scan() for k, v in pairs(fi.indexes) do - local stat, mod = pcall(require, v[2]) - - luci.util.updfenv(v[1], luci.dispatcher) - pcall(v[1]) + index[v[2]] = v[1] end end @@ -168,12 +180,31 @@ function createindex_plain(path, suffix) stat, mod = pcall(require, c) if stat and mod and type(mod.index) == "function" then - luci.util.updfenv(mod.index, luci.dispatcher) - pcall(mod.index) + index[c] = mod.index end end end +-- Creates the dispatching tree from the index +function createtree() + if not built_index then + createindex() + end + + for k, v in pairs(index) do + luci.util.updfenv(v, _M) + + local stat, mod = pcall(require, k) + if stat then + luci.util.updfenv(v, mod) + end + + pcall(v) + end + + built_tree = true +end + -- Shortcut for creating a dispatching node function entry(path, target, title, order, add) add = add or {} -- 2.25.1