diff options
| author | ruki <[email protected]> | 2026-07-30 22:48:00 +0800 |
|---|---|---|
| committer | ruki <[email protected]> | 2026-07-30 22:48:00 +0800 |
| commit | cb97bd6d308b83ab4eca3f0462d2690dd66960b5 (patch) | |
| tree | 22cd318c519c8db434a383370da7b0163728f18c | |
| parent | ba5ca9bc89f2511a53266577a17a64fb26932a96 (diff) | |
improve plugin structure
| -rw-r--r-- | tests/plugins/repository/test.lua | 8 | ||||
| -rw-r--r-- | xmake/plugins/plugin/main.lua | 15 |
2 files changed, 15 insertions, 8 deletions
diff --git a/tests/plugins/repository/test.lua b/tests/plugins/repository/test.lua index 0c4df3227..4f1347317 100644 --- a/tests/plugins/repository/test.lua +++ b/tests/plugins/repository/test.lua @@ -36,10 +36,10 @@ function main(t) end cleanup() - -- mock repository with installed and available plugins - _write_plugin(path.join(repodir, "plugins", hello_name), hello_name, "repo-ok") - _write_plugin(path.join(repodir, "plugins", formatter_name), formatter_name, "format-ok") - _write_plugin(path.join(repodir, "plugins", available_name), available_name, "available-ok") + -- mock repository with installed and available plugins (packages-like layout: plugins/<first-letter>/<name>) + _write_plugin(path.join(repodir, "plugins", hello_name:sub(1, 1), hello_name), hello_name, "repo-ok") + _write_plugin(path.join(repodir, "plugins", formatter_name:sub(1, 1), formatter_name), formatter_name, "format-ok") + _write_plugin(path.join(repodir, "plugins", available_name:sub(1, 1), available_name), available_name, "available-ok") os.mkdir(path.directory(cachefile)) local cache = os.isfile(cachefile) and io.load(cachefile) or {} cache.repositories = cache.repositories or {} diff --git a/xmake/plugins/plugin/main.lua b/xmake/plugins/plugin/main.lua index 0ea537a59..a21b4b264 100644 --- a/xmake/plugins/plugin/main.lua +++ b/xmake/plugins/plugin/main.lua @@ -81,8 +81,11 @@ function _save_manifest(manifest) end -- find a plugin directory in the given repository directory +-- +-- plugins in a repository follow the same layout as packages: +-- <repodir>/plugins/<first-letter>/<name>/xmake.lua function _find_plugin_in_repo(repodir, name) - local dir = path.join(repodir, "plugins", name) + local dir = path.join(repodir, "plugins", name:sub(1, 1):lower(), name) if os.isdir(dir) and os.isfile(path.join(dir, "xmake.lua")) then return dir end @@ -300,9 +303,13 @@ function _plugin_description(dir) end -- collect plugins (each subdirectory containing xmake.lua) under the given root -function _collect_plugins(root, seen) +-- +-- built-in/installed plugins are flat (<root>/<name>), while plugins in a +-- repository follow the packages layout (<root>/<first-letter>/<name>) +function _collect_plugins(root, seen, nested) local entries = {} - for _, dir in ipairs(os.dirs(path.join(root, "*")) or {}) do + local pattern = nested and path.join(root, "*", "*") or path.join(root, "*") + for _, dir in ipairs(os.dirs(pattern) or {}) do local name = path.filename(dir) if os.isfile(path.join(dir, "xmake.lua")) and (not seen or not seen[name]) then if seen then @@ -338,7 +345,7 @@ function _list() local installed = _collect_plugins(plugindir, seen) local avail = {} for _, repo in ipairs(_repositories()) do - table.join2(avail, _collect_plugins(path.join(repo:directory(), "plugins"), seen)) + table.join2(avail, _collect_plugins(path.join(repo:directory(), "plugins"), seen, true)) end -- compute the alignment width from all plugin names |
