From 6a386ee203c609894dc6e6e97bf6d5c651ab3e37 Mon Sep 17 00:00:00 2001 From: dacctal Date: Sat, 4 Jul 2026 05:27:09 +0000 Subject: lua checkpoint! --- src/lua_install.c | 128 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 128 insertions(+) create mode 100644 src/lua_install.c (limited to 'src/lua_install.c') diff --git a/src/lua_install.c b/src/lua_install.c new file mode 100644 index 0000000..9c2369f --- /dev/null +++ b/src/lua_install.c @@ -0,0 +1,128 @@ +/* + + pkgit - package it! + + Copyright (C) 2026 dacctal + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +*/ + + +#include + +#include "pkgit_lua.h" + +#include "globs.h" +#include "log.h" +#include "pkg.h" + +void install_dependencies(lua_State *L) { + while (lua_next(L, -2) != 0) { + const char *depname = lua_tostring(L, -2); + if (depname && lua_istable(L, -1)) { + lua_getfield(L, -1, "url"); + str_slc dep_url = mstrslc(lua_tostring(L, -1)); + lua_pop(L, 1); + lua_getfield(L, -1, "version"); + str_slc dep_version = mstrslc(lua_tostring(L, -1)); + lua_pop(L, 1); + package_t pkg = pkg_create(dep_url); + pkg.version = str_from_str_slc(dep_version); + const int top = lua_gettop(L); + char cwd[MAX_PATH_LEN]; + if (getcwd(cwd, sizeof(cwd)) != NULL) { + //install_pkg(pkg); + chdir(cwd); + } + lua_settop(L, top); + pkg_free(&pkg); + } + lua_pop(L, 1); + } +} + +bool target_loop_install(lua_State *L, char* lua_file, str *target) { + if (!lua_try_table(L, lua_file, target->data)) return false; + lua_try_function(L, lua_file, "pre_install"); + lua_try_function(L, lua_file, "install"); + lua_try_function(L, lua_file, "post_install"); + lua_pop(L, 1); + return true; +} + +bool repo_install(const char *repository, const char* target) { + lua_getglobal(L, "repositories"); + if (!config_loaded || !lua_istable(L, -1)) { + lua_isnt_type("repositories", "table"); + lua_pop(L, 1); + return false; + } + str str_repo = mstr(repository); + if (!lua_try_table(L, "init.lua", str_repo.data)) { + lua_pop(L, 1); + return false; + } + str_free(&str_repo); + if (!lua_try_table(L, "init.lua", "targets")) return false; + str str_target = mstr(target); + bool target_loop_success = target_loop_install(L, "init.lua", &str_target); + str_free(&str_target); + lua_pop(L, 3); + return target_loop_success; +} + +bool bldit_install(const char *target) { + init_bldit_state(); + //if (!is_bldit_usable()) { + // log_error("bldit version is newer than the installed pkgit version"); + // log_error("consider updating pkgit"); + // if (!flags.force) return false; + //} + lua_pushfstring(B, "%s", inst_dirs.prefix.data); + lua_setglobal(B, "prefix"); + lua_pop(B, 1); + lua_try_table(L, "bldit.lua", "targets"); + str str_target = mstr(target); + bool target_loop_success = target_loop_install(B, "bldit.lua", &str_target); + str_free(&str_target); + lua_pop(B, 1); + lua_close(B); + return target_loop_success; +} + +bool config_install(const char *path, const char *target) { + lua_getglobal(L, "build_systems"); + lua_pushnil(L); + bool target_loop_success = false; + while (lua_next(L, -2) != 0) { + const char *key = lua_tostring(L, -2); + if (!lua_istable(L, -1)) { + lua_pop(L, 1); + continue; + } + char file_path[MAX_PATH_LEN]; + snprintf(file_path, sizeof(file_path), "%s/%s", path, key); + if (access(file_path, F_OK) != 0) { + lua_pop(L, 1); + continue; + } + lua_try_table(L, "init.lua", "targets"); + str str_target = mstr(target); + target_loop_success = target_loop_install(L, "init.lua", &str_target); + str_free(&str_target); + lua_pop(L, 2); + } + lua_pop(L, 1); + return target_loop_success; +} -- cgit v1.2.3