diff options
| author | Saikari <[email protected]> | 2026-07-10 22:28:38 +0300 |
|---|---|---|
| committer | ruki <[email protected]> | 2026-07-30 10:17:31 +0800 |
| commit | 4b6a2eb23d0903124871f837798db2dd718e86a1 (patch) | |
| tree | c0dda814d7b199e1c54db61803c4051f4a834a3b /xmake/plugins | |
| parent | a928217681c4c5dc60b80a230182e5254bc30c8d (diff) | |
feat: add support for plugin packages in xmake
Diffstat (limited to 'xmake/plugins')
| -rw-r--r-- | xmake/plugins/plugin/main.lua | 75 | ||||
| -rw-r--r-- | xmake/plugins/plugin/xmake.lua | 10 | ||||
| -rw-r--r-- | xmake/plugins/xfetch/main.lua | 289 | ||||
| -rw-r--r-- | xmake/plugins/xfetch/xmake.lua | 32 |
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"} + } + } |
