refine module support and package loading
This commit is contained in:
35
lua/dep/bench.lua
Normal file
35
lua/dep/bench.lua
Normal file
@ -0,0 +1,35 @@
|
||||
-- TODO: actually use this (ideally make a view that shows startuptime and
|
||||
-- which plugins are currently loaded)
|
||||
-- performance logging
|
||||
|
||||
---@class bench
|
||||
---@field perf number[] list of all perfs
|
||||
local bench = {}
|
||||
local b
|
||||
|
||||
function bench:setup()
|
||||
local o = {}
|
||||
self = {}
|
||||
self.__index = self
|
||||
setmetatable(o, self)
|
||||
|
||||
o.perf = {}
|
||||
o.inited = true
|
||||
|
||||
b = o
|
||||
end
|
||||
|
||||
--- benchmark a peice of code
|
||||
---@param name string the name of the benchmark
|
||||
---@param f function the code to benchmark
|
||||
---@vararg any args for f
|
||||
---@return any ret the result of f
|
||||
function bench.mark(name, f, ...)
|
||||
local start = os.clock()
|
||||
local ret = f(...)
|
||||
b.perf[name] = os.clock() - start
|
||||
|
||||
return ret
|
||||
end
|
||||
|
||||
return bench
|
39
lua/dep/modules/init.lua
Normal file
39
lua/dep/modules/init.lua
Normal file
@ -0,0 +1,39 @@
|
||||
local module = require("dep.modules.module")
|
||||
|
||||
---@class modules
|
||||
---@field modules module[] all modules in dep
|
||||
local modules = {}
|
||||
|
||||
--- Initialize all the modules
|
||||
---@param self table?
|
||||
---@param speclist table
|
||||
---@param overrides spec? overrides
|
||||
---@return modules modules manager
|
||||
---@nodisacard
|
||||
function modules:setup(speclist, overrides)
|
||||
overrides = overrides or {}
|
||||
|
||||
local o = {}
|
||||
self = {}
|
||||
self.__index = self
|
||||
setmetatable(o, self)
|
||||
|
||||
-- create a list of modules
|
||||
o.modules = {}
|
||||
|
||||
-- loop through all modules and initialize them
|
||||
for _, modpath in ipairs(speclist.modules) do
|
||||
local mod = module.new(
|
||||
nil,
|
||||
modpath,
|
||||
speclist.modules.prefix,
|
||||
overrides
|
||||
)
|
||||
|
||||
table.insert(o.modules, mod)
|
||||
end
|
||||
|
||||
return self
|
||||
end
|
||||
|
||||
return modules
|
55
lua/dep/modules/module.lua
Normal file
55
lua/dep/modules/module.lua
Normal file
@ -0,0 +1,55 @@
|
||||
local spec_man = require("dep.spec")
|
||||
local packager = require("dep.package")
|
||||
|
||||
---@class module
|
||||
---@field name string name of the module
|
||||
---@field path string path to the module
|
||||
---@field mod table the module
|
||||
local module = {}
|
||||
|
||||
--- Initialize a module
|
||||
---@param self table?
|
||||
---@param modpath string path to the module
|
||||
---@param prefix string? the prefix to all modules
|
||||
---@param overrides spec? a module override
|
||||
---@return module|false module false on failure to load module
|
||||
---@nodiscard
|
||||
function module:new(modpath, prefix, overrides)
|
||||
local ok, err
|
||||
local o = {}
|
||||
self = {}
|
||||
self.__index = self
|
||||
setmetatable(o, self)
|
||||
|
||||
o.name = "<unnamed module>"
|
||||
if type(modpath) == "string" then
|
||||
if prefix ~= nil then
|
||||
if prefix:sub(#prefix) ~= "." and modpath:sub(1, 2) ~= "." then
|
||||
modpath = "."..modpath
|
||||
end
|
||||
o.path = prefix..modpath
|
||||
else
|
||||
o.path = modpath
|
||||
end
|
||||
o.name = modpath
|
||||
ok, o.mod = pcall(require, o.path)
|
||||
if not ok then
|
||||
return false
|
||||
end
|
||||
end
|
||||
o.name = o.mod.name or o.name
|
||||
|
||||
-- allow a module to be a spec
|
||||
if spec_man.check(o.mod, true) ~= false then
|
||||
o.mod = { o.mod }
|
||||
end
|
||||
|
||||
ok, err = pcall(packager.register_speclist, o.mod, overrides)
|
||||
if not ok then
|
||||
error(string.format("%s <- %s", err, o.name))
|
||||
end
|
||||
|
||||
return self
|
||||
end
|
||||
|
||||
return module
|
@ -1,5 +1,6 @@
|
||||
local logger = require('dep.log')
|
||||
local spec_man = require("dep.spec")
|
||||
local bench = require("dep.bench")
|
||||
|
||||
---@class package
|
||||
---@field id string id of the package
|
||||
@ -443,4 +444,51 @@ function package.findcycle(pkgs)
|
||||
return false
|
||||
end
|
||||
|
||||
--- recurse over all packages and register them
|
||||
---@param speclist speclist table of specs
|
||||
---@param overrides spec? a package spec that is used to override options
|
||||
function package.register_speclist(speclist, overrides)
|
||||
overrides = overrides or {}
|
||||
|
||||
-- recurse the packages
|
||||
local over = overrides
|
||||
for _, spec in ipairs(speclist) do
|
||||
-- make sure the overrides override and take into account the packages spec
|
||||
---@diagnostic disable-next-line: missing-fields
|
||||
over = {
|
||||
pin = overrides.pin or spec.pin,
|
||||
disable = overrides.disable or spec.disable
|
||||
}
|
||||
|
||||
-- While a package can fail to load we just don't care, it will work itself
|
||||
-- out. The goal is to make sure every plugin that can load does load, not
|
||||
-- keep working plugins from loading because an unrelated one doesn't load.
|
||||
package:new(spec, over)
|
||||
end
|
||||
end
|
||||
|
||||
--- reload the package
|
||||
---@param self package the package to reload
|
||||
---@param force boolean? force all packages to load
|
||||
function package:reload(force)
|
||||
local reloaded = self:loadtree(force)
|
||||
|
||||
if reloaded then
|
||||
local ok, err
|
||||
-- TODO: make a benchmark function
|
||||
bench.mark("reload", function()
|
||||
ok, err = pcall(vim.cmd,
|
||||
[[
|
||||
silent! helptags ALL
|
||||
silent! UpdateRemotePlugins
|
||||
]])
|
||||
end)
|
||||
|
||||
if not ok then
|
||||
logger:log("error",
|
||||
"failed to reload helptags and remote plugins; reason: %s", err)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
return package
|
||||
|
@ -1,11 +1,11 @@
|
||||
local logger = require("dep.log")
|
||||
|
||||
---@class modules
|
||||
---@class specmodules
|
||||
---@field prefix string prefix to prepend to the modules
|
||||
---@field [integer] string list of all modules to load
|
||||
|
||||
---@class speclist
|
||||
---@field modules modules a list of modules
|
||||
---@field modules specmodules a list of modules
|
||||
---@field [integer] spec a spec
|
||||
|
||||
---@class spec
|
||||
@ -53,6 +53,8 @@ function spec:correct_spec()
|
||||
repeat
|
||||
if type(self[1]) ~= "string" then
|
||||
self = self[1]
|
||||
elseif self[1] == nil then
|
||||
break
|
||||
end
|
||||
until type(self[1]) == "string"
|
||||
end
|
||||
|
Reference in New Issue
Block a user