From bb61100ee320b749f644f6847dba5bcb92d3c5aa Mon Sep 17 00:00:00 2001 From: Maxime Devos Date: Tue, 10 Aug 2021 17:07:16 +0200 Subject: gnu: minetest: Search for mods in MINETEST_MOD_PATH. * gnu/packages/patches/minetest-add-MINETEST_MOD_PATH.patch: New file. * gnu/packages/games.scm (minetest)[source]{patches}: Add it. (minetest)[native-search-paths]: Add "MINETEST_MOD_PATH". * gnu/local.mk (dist_patch_DATA): Add the patch. Signed-off-by: Leo Prikler --- .../patches/minetest-add-MINETEST_MOD_PATH.patch | 156 +++++++++++++++++++++ 1 file changed, 156 insertions(+) create mode 100644 gnu/packages/patches/minetest-add-MINETEST_MOD_PATH.patch (limited to 'gnu/packages/patches') diff --git a/gnu/packages/patches/minetest-add-MINETEST_MOD_PATH.patch b/gnu/packages/patches/minetest-add-MINETEST_MOD_PATH.patch new file mode 100644 index 0000000000..a74034a2c5 --- /dev/null +++ b/gnu/packages/patches/minetest-add-MINETEST_MOD_PATH.patch @@ -0,0 +1,156 @@ +From d10ea2ad7efc2364a8a2007b4c6d3e85511e2f84 Mon Sep 17 00:00:00 2001 +From: Maxime Devos +Date: Tue, 3 Aug 2021 01:00:23 +0200 +Subject: [PATCH] Add environment variable MINETEST_MOD_PATH + +This adds an environment variable MINETEST_MOD_PATH. +When it exists, Minetest will look there for mods +in addition to ~/.minetest/mods/. Mods can still be +installed to ~/.minetest/mods/ with the built-in installer. + +With thanks to Leo Prikler. +--- + builtin/mainmenu/pkgmgr.lua | 7 +++---- + doc/menu_lua_api.txt | 8 +++++++- + src/content/subgames.cpp | 11 +++++++++++ + src/script/lua_api/l_mainmenu.cpp | 23 +++++++++++++++++++++++ + src/script/lua_api/l_mainmenu.h | 2 ++ + 5 files changed, 46 insertions(+), 5 deletions(-) + +diff --git a/builtin/mainmenu/pkgmgr.lua b/builtin/mainmenu/pkgmgr.lua +index 787936e31..d8fba0ebe 100644 +--- a/builtin/mainmenu/pkgmgr.lua ++++ b/builtin/mainmenu/pkgmgr.lua +@@ -682,10 +682,9 @@ function pkgmgr.preparemodlist(data) + local game_mods = {} + + --read global mods +- local modpath = core.get_modpath() +- +- if modpath ~= nil and +- modpath ~= "" then ++ local modpaths = core.get_modpaths() ++ --XXX what was ‘modpath ~= ""’ and ‘modpath ~= nil’ for? ++ for _,modpath in ipairs(modpaths) do + get_mods(modpath,global_mods) + end + +diff --git a/doc/menu_lua_api.txt b/doc/menu_lua_api.txt +index b3975bc1d..132444b14 100644 +--- a/doc/menu_lua_api.txt ++++ b/doc/menu_lua_api.txt +@@ -218,7 +218,13 @@ Package - content which is downloadable from the content db, may or may not be i + * returns path to global user data, + the directory that contains user-provided mods, worlds, games, and texture packs. + * core.get_modpath() (possible in async calls) +- * returns path to global modpath ++ * returns path to global modpath, where mods can be installed ++* core.get_modpaths() (possible in async calls) ++ * returns list of paths to global modpaths, where mods have been installed ++ ++ The difference with "core.get_modpath" is that no mods should be installed in these ++ directories by Minetest -- they might be read-only. ++ + * core.get_clientmodpath() (possible in async calls) + * returns path to global client-side modpath + * core.get_gamepath() (possible in async calls) +diff --git a/src/content/subgames.cpp b/src/content/subgames.cpp +index e9dc609b0..d73f95a1f 100644 +--- a/src/content/subgames.cpp ++++ b/src/content/subgames.cpp +@@ -61,6 +61,12 @@ std::string getSubgamePathEnv() + return subgame_path ? std::string(subgame_path) : ""; + } + ++std::string getModPathEnv() ++{ ++ char *mod_path = getenv("MINETEST_MOD_PATH"); ++ return mod_path ? std::string(mod_path) : ""; ++} ++ + SubgameSpec findSubgame(const std::string &id) + { + if (id.empty()) +@@ -110,6 +116,11 @@ SubgameSpec findSubgame(const std::string &id) + std::set mods_paths; + if (!user_game) + mods_paths.insert(share + DIR_DELIM + "mods"); ++ ++ Strfnd mod_search_paths(getModPathEnv()); ++ while (!mod_search_paths.at_end()) ++ mods_paths.insert(mod_search_paths.next(PATH_DELIM)); ++ + if (user != share || user_game) + mods_paths.insert(user + DIR_DELIM + "mods"); + +diff --git a/src/script/lua_api/l_mainmenu.cpp b/src/script/lua_api/l_mainmenu.cpp +index 3e9709bde..903ac3a22 100644 +--- a/src/script/lua_api/l_mainmenu.cpp ++++ b/src/script/lua_api/l_mainmenu.cpp +@@ -21,6 +21,7 @@ with this program; if not, write to the Free Software Foundation, Inc., + #include "lua_api/l_internal.h" + #include "common/c_content.h" + #include "cpp_api/s_async.h" ++#include "util/strfnd.h" + #include "gui/guiEngine.h" + #include "gui/guiMainMenu.h" + #include "gui/guiKeyChangeMenu.h" +@@ -502,6 +503,26 @@ int ModApiMainMenu::l_get_modpath(lua_State *L) + return 1; + } + ++/******************************************************************************/ ++int ModApiMainMenu::l_get_modpaths(lua_State *L) ++{ ++ const char *c_modpath = getenv("MINETEST_MOD_PATH"); ++ if (c_modpath == NULL) ++ c_modpath = ""; ++ int index = 1; ++ lua_newtable(L); ++ Strfnd mod_search_paths{std::string(c_modpath)}; ++ while (!mod_search_paths.at_end()) { ++ std::string component = mod_search_paths.next(PATH_DELIM); ++ lua_pushstring(L, component.c_str()); ++ lua_rawseti(L, -2, index); ++ index++; ++ } ++ ModApiMainMenu::l_get_modpath(L); ++ lua_rawseti(L, -2, index); ++ return 1; ++} ++ + /******************************************************************************/ + int ModApiMainMenu::l_get_clientmodpath(lua_State *L) + { +@@ -949,6 +970,7 @@ void ModApiMainMenu::Initialize(lua_State *L, int top) + API_FCT(get_mapgen_names); + API_FCT(get_user_path); + API_FCT(get_modpath); ++ API_FCT(get_modpaths); + API_FCT(get_clientmodpath); + API_FCT(get_gamepath); + API_FCT(get_texturepath); +@@ -983,6 +1005,7 @@ void ModApiMainMenu::InitializeAsync(lua_State *L, int top) + API_FCT(get_mapgen_names); + API_FCT(get_user_path); + API_FCT(get_modpath); ++ API_FCT(get_modpaths); + API_FCT(get_clientmodpath); + API_FCT(get_gamepath); + API_FCT(get_texturepath); +diff --git a/src/script/lua_api/l_mainmenu.h b/src/script/lua_api/l_mainmenu.h +index 33ac9e721..a6a54a2cb 100644 +--- a/src/script/lua_api/l_mainmenu.h ++++ b/src/script/lua_api/l_mainmenu.h +@@ -112,6 +112,8 @@ class ModApiMainMenu: public ModApiBase + + static int l_get_modpath(lua_State *L); + ++ static int l_get_modpaths(lua_State *L); ++ + static int l_get_clientmodpath(lua_State *L); + + static int l_get_gamepath(lua_State *L); +-- +2.32.0 + -- cgit v1.2.3