summaryrefslogtreecommitdiff
path: root/xmake/plugins
diff options
context:
space:
mode:
authorSaikari <[email protected]>2026-07-10 22:28:38 +0300
committerruki <[email protected]>2026-07-30 10:17:31 +0800
commit4b6a2eb23d0903124871f837798db2dd718e86a1 (patch)
treec0dda814d7b199e1c54db61803c4051f4a834a3b /xmake/plugins
parenta928217681c4c5dc60b80a230182e5254bc30c8d (diff)
feat: add support for plugin packages in xmake
Diffstat (limited to 'xmake/plugins')
-rw-r--r--xmake/plugins/plugin/main.lua75
-rw-r--r--xmake/plugins/plugin/xmake.lua10
-rw-r--r--xmake/plugins/xfetch/main.lua289
-rw-r--r--xmake/plugins/xfetch/xmake.lua32
4 files changed, 404 insertions, 2 deletions
diff --git a/xmake/plugins/plugin/main.lua b/xmake/plugins/plugin/main.lua
index b362381e4..1ab4d1a9e 100644
--- a/xmake/plugins/plugin/main.lua
+++ b/xmake/plugins/plugin/main.lua
@@ -63,9 +63,43 @@ function _save_manifest(manifest)
io.save(_manifest_path(), manifest)
end
+-- is the plugin package name? e.g. hello-world, myrepo@hello-world
+--
+-- the plugin url is the git url or local path, e.g.
+-- https://github.com/xmake-io/xmake-plugins, [email protected]:xmake-io/xmake-plugins.git, /tmp/xmake-plugins
+function _is_package_name(str)
+ return not os.isdir(str) and not str:find("[/\\:]")
+end
+
+-- install the plugin package from repositories, e.g. xmake plugin --install hello-world
+function _install_package(name, opt)
+ opt = opt or {}
+ local argv = {"lua", "private.xrepo", "install", "--kind=plugin"}
+ if opt.force then
+ table.insert(argv, "--force")
+ end
+ if option.get("yes") then
+ table.insert(argv, "-y")
+ end
+ if option.get("verbose") then
+ table.insert(argv, "-v")
+ end
+ if option.get("diagnosis") then
+ table.insert(argv, "-D")
+ end
+ table.insert(argv, name)
+ os.execv(os.programfile(), argv)
+end
+
-- install plugins
function _install()
+ -- install the plugin package from repositories?
+ local name = option.get("plugins")
+ if name and _is_package_name(name) then
+ return _install_package(name)
+ end
+
-- enter environment
environment.enter()
@@ -118,6 +152,12 @@ end
-- update plugins
function _update()
+ -- update the plugin package from repositories? e.g. xmake plugin --update hello-world
+ local name = option.get("plugins")
+ if name and _is_package_name(name) then
+ return _install_package(name, {force = true})
+ end
+
-- enter environment
environment.enter()
@@ -158,6 +198,37 @@ function _update()
environment.leave()
end
+-- remove the given installed plugin
+function _remove()
+ local name = assert(option.get("plugins"), "please specify the plugin name to be removed!")
+ local plugindir = path.join(global.directory(), "plugins", name)
+ assert(os.isdir(plugindir), "plugin(%s) not found!", name)
+ os.rmdir(plugindir)
+ cprint("${color.success}remove plugin(%s) ok!", name)
+end
+
+-- list all installed plugins
+function _list()
+ local plugindir = path.join(global.directory(), "plugins")
+ cprint("plugins in ${bright}%s${clear}:", plugindir)
+ for _, dir in ipairs(os.dirs(path.join(plugindir, "*"))) do
+ if os.isfile(path.join(dir, "xmake.lua")) then
+ local version, description
+ local manifest_file = path.join(dir, "manifest.txt")
+ if os.isfile(manifest_file) then
+ local manifest = io.load(manifest_file)
+ if manifest then
+ version = manifest.version
+ description = manifest.description
+ end
+ end
+ cprint(" ${color.dump.string}%s${clear}%s: %s", path.filename(dir),
+ version and ("-" .. version) or "",
+ description or "")
+ end
+ end
+end
+
-- clear all installed plugins
function _clear()
local plugindir = path.join(global.directory(), "plugins")
@@ -172,6 +243,10 @@ function main()
_install()
elseif option.get("update") then
_update()
+ elseif option.get("remove") then
+ _remove()
+ elseif option.get("list") then
+ _list()
elseif option.get("clear") then
_clear()
end
diff --git a/xmake/plugins/plugin/xmake.lua b/xmake/plugins/plugin/xmake.lua
index 05d9e3631..b61dd05f9 100644
--- a/xmake/plugins/plugin/xmake.lua
+++ b/xmake/plugins/plugin/xmake.lua
@@ -27,10 +27,16 @@ task("plugin")
options = {
{'i', "install", "k", nil, "Install plugins."},
{'u', "update", "k", nil, "Update plugins."},
+ {'r', "remove", "k", nil, "Remove the given installed plugin."},
+ {'l', "list", "k", nil, "List all installed plugins."},
{'c', "clear", "k", nil, "Clear all installed plugins."},
- {nil, "plugins", "v", nil, "The plugins path or url.",
+ {nil, "plugins", "v", nil, "The plugins path, url or package name.",
"e.g.",
" $ xmake plugin --install https://github.com/xmake-io/xmake-plugins",
- " $ xmake plugin --update"}
+ " $ xmake plugin --install hello-world",
+ " $ xmake plugin --remove hello-world",
+ " $ xmake plugin --list",
+ " $ xmake plugin --update",
+ " $ xmake plugin --update hello-world"}
}
}
diff --git a/xmake/plugins/xfetch/main.lua b/xmake/plugins/xfetch/main.lua
new file mode 100644
index 000000000..357219486
--- /dev/null
+++ b/xmake/plugins/xfetch/main.lua
@@ -0,0 +1,289 @@
+--!A cross-platform build utility based on Lua
+--
+-- Licensed under the Apache License, Version 2.0 (the "License");
+-- you may not use this file except in compliance with the License.
+-- You may obtain a copy of the License at
+--
+-- http://www.apache.org/licenses/LICENSE-2.0
+--
+-- Unless required by applicable law or agreed to in writing, software
+-- distributed under the License is distributed on an "AS IS" BASIS,
+-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+-- See the License for the specific language governing permissions and
+-- limitations under the License.
+--
+-- Copyright (C) 2015-present, Xmake Open Source Community.
+--
+-- @author ruki
+-- @file main.lua
+--
+
+-- imports
+import("core.base.option")
+import("core.base.global")
+import("core.package.package", {alias = "core_package"})
+
+-- the small ascii logos for the known systems, like fastfetch
+local logos = {
+ xmake = {color = "green", lines = {
+ [[ _ ]],
+ [[__ ___ __ __ __ _| | ______]],
+ [[\ \/ / | \/ |/ _ | |/ / __ \]],
+ [[ > < | \__/ | /_| | < ___/]],
+ [[/_/\_\_|_| |_|\__ \|_|\_\____|]]}},
+ linux = {color = "yellow", lines = {
+ [[ .--.]],
+ [[ |o_o |]],
+ [[ |:_/ |]],
+ [[ // \ \]],
+ [[ (| | )]],
+ [[/'\_ _/`\]],
+ [[\___)=(___/]]}},
+ windows = {color = "blue", lines = {
+ [[ ______ ______]],
+ [[| | |]],
+ [[|______|______|]],
+ [[| | |]],
+ [[|______|______|]]}},
+ macosx = {color = "white", lines = {
+ [[ .:']],
+ [[ _ :'_]],
+ [[ .'`_`-'_``.]],
+ [[:________.-']],
+ [[:_______:]],
+ [[ :_______`-;]],
+ [[ `._.-._.']]}},
+ bsd = {color = "red", lines = {
+ [[/\,-'''''-,/\]],
+ [[\_) (_/]],
+ [[| |]],
+ [[| |]],
+ [[ ; ;]],
+ [[ '-_____-']]}},
+ archlinux = {color = "cyan", lines = {
+ [[ /\]],
+ [[ / \]],
+ [[ /\ \]],
+ [[ / \]],
+ [[ / ,, \]],
+ [[ / | | -\]],
+ [[/_-'' ''-_\]]}},
+ ubuntu = {color = "red", lines = {
+ [[ _]],
+ [[ ---(_)]],
+ [[ _/ --- \]],
+ [[(_) | |]],
+ [[ \ --- _/]],
+ [[ ---(_)]]}},
+ debian = {color = "red", lines = {
+ [[ _____]],
+ [[ / __ \]],
+ [[| / |]],
+ [[| \___-]],
+ [[-_]],
+ [[ --_]]}},
+ fedora = {color = "blue", lines = {
+ [[ _____]],
+ [[ / __)\]],
+ [[ | / \ \]],
+ [[ ___| |__/ /]],
+ [[ / (_ _)_/]],
+ [[/ / | |]],
+ [[\ \__/ |]],
+ [[ \(_____/]]}},
+ centos = {color = "yellow", lines = {
+ [[ ____^____]],
+ [[ |\ | /|]],
+ [[ | \ | / |]],
+ [[<---- ---->]],
+ [[ | / | \ |]],
+ [[ |/__|__\|]],
+ [[ v]]}},
+ linuxmint = {color = "green", lines = {
+ [[ ___________]],
+ [[|_ \]],
+ [[ | | _____ |]],
+ [[ | | | | | |]],
+ [[ | | | | | |]],
+ [[ | \_____/ |]],
+ [[ \_________/]]}},
+ gentoo = {color = "magenta", lines = {
+ [[ _-----_]],
+ [[( \]],
+ [[\ 0 \]],
+ [[ \ )]],
+ [[ / _/]],
+ [[( _-]],
+ [[\____-]]}},
+ opensuse = {color = "green", lines = {
+ [[ _______]],
+ [[__| __ \]],
+ [[ / .\ \]],
+ [[ \__/ |]],
+ [[ _______|]],
+ [[ \_______]],
+ [[__________/]]}},
+ manjaro = {color = "green", lines = {
+ [[||||||||| ||||]],
+ [[||||||||| ||||]],
+ [[|||| ||||]],
+ [[|||| |||| ||||]],
+ [[|||| |||| ||||]],
+ [[|||| |||| ||||]],
+ [[|||| |||| ||||]]}},
+ nixos = {color = "blue", lines = {
+ [[ \\ \\ //]],
+ [[ ==\\__\\/ //]],
+ [[ // \\//]],
+ [[==// //==]],
+ [[ //\\___//]],
+ [[// /\\ \\==]],
+ [[ // \\ \\]]}},
+ alpine = {color = "blue", lines = {
+ [[ /\ /\]],
+ [[ / \ \]],
+ [[ / \ \]],
+ [[/ \ \]],
+ [[ \ \]],
+ [[ \]]}}
+}
+-- get the logo of the current system
+function _get_logo()
+ local name = option.get("logo")
+ if not name then
+ -- os.host() is always the real host system, e.g. windows, linux, macosx ..
+ -- even if we are running in the msys/cygwin subsystem, @see os.subhost()
+ name = os.host()
+ if name == "linux" then
+ name = linuxos.name()
+ end
+ end
+ -- we will show the linux or xmake logo if the logo drawing is not found
+ local logo = logos[name]
+ if not logo then
+ logo = os.host() == "linux" and logos.linux or logos.xmake
+ end
+ return logo
+end
+
+-- get the user and host name
+function _get_title()
+ local user = os.getenv("USER") or os.getenv("USERNAME") or "user"
+ local host = os.getenv("HOSTNAME") or os.getenv("COMPUTERNAME")
+ if not host and is_host("linux", "macosx", "bsd") and os.isfile("/etc/hostname") then
+ local content = io.readfile("/etc/hostname")
+ if content then
+ host = content:trim()
+ end
+ end
+ return user .. "@" .. (host or os.host())
+end
+
+-- get the operation system name and version
+function _get_os()
+ if is_host("linux") then
+ -- the system version may be unavailable on the rolling release distributions
+ local version = try { function () return linuxos.version() end }
+ return linuxos.name() .. (version and (" " .. tostring(version)) or "") .. " " .. os.arch()
+ elseif is_host("macosx") then
+ local version = try { function () return macos.version() end }
+ return "macOS" .. (version and (" " .. tostring(version)) or "") .. " " .. os.arch()
+ elseif is_host("windows") then
+ local version = try { function () return winos.version() end }
+ return "Windows" .. (version and (" " .. tostring(version)) or "") .. " " .. os.arch()
+ end
+ return os.host() .. " " .. os.arch()
+end
+
+-- get the cpu name
+function _get_cpu()
+ local name = os.cpuinfo("model_name") or os.cpuinfo("vendor") or "unknown"
+ return string.format("%s (%d)", name, os.cpuinfo("ncpu") or 1)
+end
+
+-- format the given size in MB as GiB, we do not use `%.1f` to avoid the locale decimal separator
+function _format_gib(size_mb)
+ local gib10 = math.floor(size_mb / 1024 * 10 + 0.5)
+ return string.format("%d.%d GiB", math.floor(gib10 / 10), gib10 % 10)
+end
+
+-- get the memory usage, the sizes of os.meminfo() are in MB
+function _get_memory()
+ local meminfo = os.meminfo()
+ if meminfo.totalsize and meminfo.availsize then
+ -- `%%%%` will be shown as `%`, because cprint will format this string again
+ return string.format("%s / %s (%d%%%%)",
+ _format_gib(meminfo.totalsize - meminfo.availsize),
+ _format_gib(meminfo.totalsize),
+ math.floor(meminfo.usagerate * 100))
+ end
+end
+
+-- get the count of the installed packages
+function _get_packages()
+ local count = #os.dirs(path.join(core_package.installdir(), "*", "*"))
+ return string.format("%d (xrepo)", count)
+end
+
+-- get the count of the installed plugins
+function _get_plugins()
+ return tostring(#os.files(path.join(global.directory(), "plugins", "*", "xmake.lua")))
+end
+
+-- get all the information lines
+function _get_infolines(color)
+ local title = _get_title()
+ local infos = {
+ {"OS", _get_os()},
+ {"CPU", _get_cpu()},
+ {"Memory", _get_memory()},
+ {"Shell", os.shell()},
+ {"Terminal", os.term()},
+ {"xmake", "v" .. xmake.version()},
+ {"Packages", _get_packages()},
+ {"Plugins", _get_plugins()},
+ {"Theme", global.get("theme") or "default"}
+ }
+ if is_host("linux") then
+ local kernelver = try { function () return linuxos.kernelver() end }
+ if kernelver then
+ table.insert(infos, 2, {"Kernel", tostring(kernelver)})
+ end
+ end
+ local lines = {}
+ table.insert(lines, "${bright " .. color .. "}" .. title .. "${clear}")
+ table.insert(lines, string.rep("-", #title))
+ for _, info in ipairs(infos) do
+ if info[2] then
+ table.insert(lines, "${bright " .. color .. "}" .. info[1] .. "${clear}: " .. info[2])
+ end
+ end
+ table.insert(lines, "")
+ table.insert(lines, "${onblack} ${onred} ${ongreen} ${onyellow} ${onblue} ${onmagenta} ${oncyan} ${onwhite} ${clear}")
+ return lines
+end
+
+function main()
+ local logo = _get_logo()
+ local logolines = logo.lines
+ local infolines = _get_infolines(logo.color)
+ -- show the logo and information side by side, like fastfetch
+ local width = 0
+ for _, line in ipairs(logolines) do
+ width = math.max(width, #line)
+ end
+ local startline = 1
+ if #infolines > #logolines then
+ startline = math.floor((#infolines - #logolines) / 2) + 1
+ end
+ print("")
+ for i = 1, math.max(#logolines, #infolines) do
+ local left = logolines[i - startline + 1] or ""
+ local right = infolines[i] or ""
+ left = left .. string.rep(" ", width - #left)
+ -- escape `%`, because cprint will format this string again
+ left = left:gsub("%%", "%%%%")
+ cprint(" ${bright %s}%s${clear} %s", logo.color, left, right)
+ end
+ print("")
+end
diff --git a/xmake/plugins/xfetch/xmake.lua b/xmake/plugins/xfetch/xmake.lua
new file mode 100644
index 000000000..a3296d233
--- /dev/null
+++ b/xmake/plugins/xfetch/xmake.lua
@@ -0,0 +1,32 @@
+--!A cross-platform build utility based on Lua
+--
+-- Licensed under the Apache License, Version 2.0 (the "License");
+-- you may not use this file except in compliance with the License.
+-- You may obtain a copy of the License at
+--
+-- http://www.apache.org/licenses/LICENSE-2.0
+--
+-- Unless required by applicable law or agreed to in writing, software
+-- distributed under the License is distributed on an "AS IS" BASIS,
+-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+-- See the License for the specific language governing permissions and
+-- limitations under the License.
+--
+-- Copyright (C) 2015-present, Xmake Open Source Community.
+--
+-- @author ruki
+-- @file xmake.lua
+--
+
+task("xfetch")
+ set_category("plugin")
+ on_run("main")
+ set_menu {
+ usage = "xmake xfetch [options]",
+ description = "Fetch and show the system and xmake information.",
+ options = {
+ {'l', "logo", "kv", nil, "Show the given logo.",
+ "e.g.",
+ " $ xmake xfetch --logo=archlinux"}
+ }
+ }