aboutsummaryrefslogtreecommitdiff
path: root/src/pkg_install.c
diff options
context:
space:
mode:
authordacctal <donotcontactmevia@email.invalid>2026-07-17 00:18:01 +0000
committerdacctal <donotcontactmevia@email.invalid>2026-07-17 00:18:01 +0000
commit7019724ab5c818e18fb5ee61b6b14487c47da3ec (patch)
tree0a7d60563c56a75fcfe7ecdd66f21bdc420fc1fa /src/pkg_install.c
parent43e35385f741a3c48cf667fd55bc1175d1d2b927 (diff)
more features but memory leak
Diffstat (limited to 'src/pkg_install.c')
-rw-r--r--src/pkg_install.c200
1 files changed, 200 insertions, 0 deletions
diff --git a/src/pkg_install.c b/src/pkg_install.c
new file mode 100644
index 0000000..b727d01
--- /dev/null
+++ b/src/pkg_install.c
@@ -0,0 +1,200 @@
+/*
+
+ 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 <https://www.gnu.org/licenses/>.
+
+*/
+
+
+#include <unistd.h>
+
+#include "pkgit_lua.h"
+
+#include "add_repo.h"
+#include "build.h"
+#include "fetch.h"
+#include "files.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_install(lua_State *L, char* lua_file, str *target) {
+ if (!lua_try_table(L, lua_file, target->data)) {
+ lua_pop(L, 1);
+ return false;
+ }
+ //lua_try_function(L, lua_file, "pre_install");
+ if (!lua_try_function(L, lua_file, "install")) {
+ lua_pop(L, 1);
+ return false;
+ }
+ //lua_try_function(L, lua_file, "post_install");
+ lua_pop(L, 1);
+ return true;
+}
+
+bool repo_install(package_t *pkg) {
+ lua_getglobal(L, "repositories");
+ if (!config_loaded || !lua_istable(L, -1)) {
+ lua_isnt_type("repositories", "table");
+ lua_pop(L, 1);
+ return false;
+ }
+ if (!lua_try_table(L, "init.lua", pkg->name.data)) {
+ lua_isnt_type(pkg->name.data, "table");
+ lua_pop(L, 2);
+ return false;
+ }
+ if (!lua_try_table(L, "init.lua", "targets")) return false;
+ bool target_success = target_install(L, "init.lua", &pkg->target);
+ lua_pop(L, 3);
+ return target_success;
+}
+
+bool bldit_install(package_t *pkg) {
+ init_bldit_state();
+ if (!bldit_loaded) {
+ lua_close(B);
+ return false;
+ }
+ //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);
+ if (!lua_try_table(B, "bldit.lua", "targets")) return false;
+ bool target_success = target_install(B, "bldit.lua", &pkg->target);
+ lua_pop(B, 2);
+ lua_close(B);
+ return target_success;
+}
+
+bool config_install(package_t *pkg) {
+ lua_getglobal(L, "build_systems");
+ lua_pushnil(L);
+ bool target_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;
+ }
+ str file_path = str_format("%.*s/%s", str_fmt(&pkg->src), key);
+ if (access(file_path.data, F_OK) != 0) {
+ lua_pop(L, 1);
+ str_free(&file_path);
+ continue;
+ }
+ str_free(&file_path);
+ if (!lua_try_table(L, "init.lua", "targets")) {
+ lua_pop(L, 2);
+ continue;
+ }
+ target_success = target_install(L, "init.lua", &pkg->target);
+ lua_pop(L, 2);
+ if (target_success) break;
+ }
+ lua_pop(L, 1);
+ return target_success;
+}
+
+void pkg_install(package_t *pkg) {
+ if (is_directory(pkg->src.data)) {
+ if (!flags.force) {
+ log_info("%.*s is already installed.", str_fmt(&pkg->name));
+ return;
+ } else {
+ if (flags.verbose) log_warn("%.*s is already installed.", str_fmt(&pkg->name));
+ }
+ }
+ char cwd[MAX_PATH_LEN];
+ getcwd(cwd, MAX_PATH_LEN);
+ if (str_equal_cstr(&pkg->src, cwd)) chdir(pkg->src.data);
+
+ //if (pkg->is_local) {
+ // cpdir(cwd, pkg->src);
+ //} else {
+ log_pkgit("fetching " GREEN "%.*s" COLOR_RESET , str_fmt(&pkg->name));
+ if (!fetch(pkg)) return;
+ log_pkgit("fetched " GREEN "%.*s" COLOR_RESET , str_fmt(&pkg->name));
+ //}
+
+ log_pkgit("building " GREEN "%.*s" COLOR_RESET , str_fmt(&pkg->name));
+ if (!build(pkg)) return;
+ log_pkgit("built " GREEN "%.*s" COLOR_RESET , str_fmt(&pkg->name));
+
+ bool install_success = false;
+ log_info("attempting init.lua: 'repositories.%.*s.install'", str_fmt(&pkg->name));
+ if (!install_success && repo_install(pkg))
+ install_success = true;
+ log_info("attempting bldit.lua: 'repositories.%.*s.install'", str_fmt(&pkg->name));
+ if (!install_success && bldit_install(pkg))
+ install_success = true;
+ log_info("attempting init.lua: 'build_systems'", str_fmt(&pkg->name));
+ if (!install_success && config_install(pkg))
+ install_success = true;
+ if (!install_success) {
+ log_error("no install function availible for package: %.*s", str_fmt(&pkg->name));
+ return;
+ }
+ log_success("installed " GREEN "%.*s" COLOR_RESET , str_fmt(&pkg->name));
+
+ //bool repo_exists = false;
+
+ //for (size_t i = 0; i < cached_repos_count; i++) {
+ //char *repo_name = name_from_url(cached_repos[i].source_key);
+ //if (strcmp(repo_name, pkg.name) == 0) { repo_exists = true; }
+ //free(repo_name);
+ //}
+
+ //if (!repo_exists) {
+ // log_pkgit("adding " GREEN "%.*s" COLOR_RESET , &pkg->name);
+ // if (pkg->url.len > 0) {
+ // add_repo(pkg);
+ // log_pkgit("added " GREEN "%.*s" COLOR_RESET , &pkg->name);
+ // }
+ //} else {
+ // log_info("repo already exists, done");
+ //}
+}