From 76ee567986a12c22e6a606d74e31425facf9f5f4 Mon Sep 17 00:00:00 2001 From: dacctal Date: Fri, 17 Jul 2026 01:50:49 +0000 Subject: can install/remove packages, doesn't segfault (?) --- src/parse_args.c | 36 +++++++++++------------------- src/pkg_create.c | 65 ++++++++++++++++++++++++++----------------------------- src/pkg_free.c | 1 - src/pkg_install.c | 30 +++++++++++++++++-------- src/pkg_remove.c | 8 ++++--- 5 files changed, 70 insertions(+), 70 deletions(-) (limited to 'src') diff --git a/src/parse_args.c b/src/parse_args.c index 61e1fcb..0d283b5 100644 --- a/src/parse_args.c +++ b/src/parse_args.c @@ -27,18 +27,11 @@ #include "globs.h" #include "log.h" #include "str.h" -// #include "declare.h" // #include "easter_egg.h" #include "help.h" #include "pkg.h" -// #include "pkg_search.h" -// #include "pkg_install.h" #include "pkgit_lua.h" -// #include "pkg_list.h" -// #include "pkg_remove.h" -// #include "pkgit_globals.h" #include "add_repo.h" -// #include "update.h" #define COMMAND(large, small) \ (!strcmp(argv[i], large) || !strcmp(argv[i], small)) @@ -48,9 +41,8 @@ void cmd_add(char **argv, int i) { if (argv[i + 1]) { - printf("add repo %s\n", argv[i + 1]); - str_slc arg = mstrslc(argv[i + 1]); - package_t pkg = pkg_create(arg); + str arg = mstr(argv[i + 1]); + package_t pkg = pkg_create(&arg); add_repo(&pkg); pkg_free(&pkg); } else { @@ -63,14 +55,14 @@ void cmd_build(int argc, char **argv, int i) { for (int j = i + 1; j < argc; j++) { if (argv[j][0] == '-') continue; - str_slc arg = mstrslc(argv[j]); - package_t pkg = pkg_create(arg); + str arg = mstr(argv[j]); + package_t pkg = pkg_create(&arg); build(&pkg); pkg_free(&pkg); } } else { - str_slc arg = mstrslc("."); - package_t pkg = pkg_create(arg); + str arg = mstr("."); + package_t pkg = pkg_create(&arg); build(&pkg); pkg_free(&pkg); } @@ -81,8 +73,8 @@ void cmd_install(int argc, char **argv, int i) { for (int j = i + 1; j < argc; j++) { if (argv[j][0] == '-') continue; - str_slc arg = mstrslc(argv[j]); - package_t pkg = pkg_create(arg); + str arg = mstr(argv[j]); + package_t pkg = pkg_create(&arg); pkg_install(&pkg); pkg_free(&pkg); } @@ -94,12 +86,11 @@ void cmd_install(int argc, char **argv, int i) { void cmd_remove(int argc, char **argv, int i) { if (argv[i + 1]) { for (int j = i + 1; j < argc; j++) { - if (argv[j][0] == '-') - continue; - printf("remove pkg %s\n", argv[j]); - // str_slc arg = mstrslc(argv[j]); - // package_t pkg = pkg_create(arg); - // pkg_remove(pkg); + if (argv[j][0] == '-') continue; + str arg = mstr(argv[j]); + package_t pkg = pkg_create(&arg); + pkg_remove(&pkg); + pkg_free(&pkg); } } else { NOT_ENOUGH_ARGS(argv[i], "url/pkg"); @@ -171,7 +162,6 @@ void parse_cmds(int argc, char **argv) { } void parse_args(int argc, char **argv) { - // default flags.force = false; flags.verbose = true; if (argc == 1) { diff --git a/src/pkg_create.c b/src/pkg_create.c index 728a955..df10c46 100644 --- a/src/pkg_create.c +++ b/src/pkg_create.c @@ -27,14 +27,16 @@ #include "pkgit_lua.h" #include "str.h" -str new_arg_str; - -static str get_destdir(str_slc cwd, str_slc arg) { - str_slc name = str_slc_from_after_delim(arg, '/'); - if (str_slc_first(arg) == '.') - return str_format("%.*s/%.*s", str_fmt(&inst_dirs.src), str_fmt(&cwd)); - else - return str_format("%.*s/%.*s", str_fmt(&inst_dirs.src), str_fmt(&name)); +static str get_destdir(str *cwd, str *arg) { + str result; + if (str_first(arg) == '.') { + result = str_format("%.*s/%.*s", str_fmt(&inst_dirs.src), str_fmt(cwd)); + } else { + str name = str_from_after_delim(arg, '/'); + result = str_format("%.*s/%.*s", str_fmt(&inst_dirs.src), str_fmt(&name)); + str_free(&name); + } + return result; } static str get_pkgsrc(package_t pkg) { @@ -81,59 +83,54 @@ static void assign_pkg_target(package_t *pkg, str *new_arg_str) { } else pkg->target = mstr("default"); } -package_t pkg_create(str_slc arg) { +package_t pkg_create(str *arg) { package_t pkg = { .is_local = false, }; char cwd[MAX_PATH_LEN]; getcwd(cwd, MAX_PATH_LEN); - str_slc cwd_slc = mstrslc(cwd); str cwd_str = mstr(cwd); - str dest_dir = get_destdir(cwd_slc, arg); - str tmp_str = str_from_str_slc(arg); - str_copy_into(&new_arg_str, &tmp_str); - str_free(&tmp_str); + str dest_dir = get_destdir(&cwd_str, arg); bool is_installed_locally = is_directory(dest_dir.data); - bool is_in_repos = pkg_exists(&new_arg_str); - assign_pkg_version(&pkg, &new_arg_str); - assign_pkg_target(&pkg, &new_arg_str); - if (str_find_char(&new_arg_str, '@')) { - str tmp = str_from_after_delim(&new_arg_str, '@'); - new_arg_str.len -= tmp.len + 1; + assign_pkg_version(&pkg, arg); + assign_pkg_target(&pkg, arg); + if (str_find_char(arg, '@')) { + str tmp = str_from_after_delim(arg, '@'); + arg->len -= tmp.len + 1; str_free(&tmp); - } if (str_find_char(&new_arg_str, ',')) { - str tmp = str_from_after_delim(&new_arg_str, ','); - new_arg_str.len -= tmp.len + 1; + } if (str_find_char(arg, ',')) { + str tmp = str_from_after_delim(arg, ','); + arg->len -= tmp.len + 1; str_free(&tmp); } - if (strncmp(arg.data, "http", 4) == 0 || strncmp(arg.data, "ssh", 3) == 0) { - pkg.url = new_arg_str; - pkg.name = str_from_after_delim(&new_arg_str, '/'); - } else if (str_slc_equal_cstr(arg, ".")) { + if (strncmp(arg->data, "http", 4) == 0 || strncmp(arg->data, "ssh", 3) == 0) { + pkg.url = *arg; + pkg.name = str_from_after_delim(arg, '/'); + } else if (str_equal_cstr(arg, ".")) { pkg.url = mstr(""); pkg.name = str_from_after_delim(&cwd_str, '/'); pkg.is_local = true; - } else if (is_in_repos) { - str tmp_url = pkg_get_url(&new_arg_str); + } else if (pkg_exists(arg)) { + str tmp_url = pkg_get_url(arg); str_copy_into(&pkg.url, &tmp_url); str_free(&tmp_url); - pkg.name = new_arg_str; + pkg.name = *arg; } else if (is_installed_locally) { pkg.url = mstr(""); pkg.name = str_from_after_delim(&dest_dir, '/'); pkg.is_local = true; } else { - log_error("'%.*s' is not a valid package", str_fmt(&arg)); + log_error("'%.*s' is not a valid package", str_fmt(arg)); str_free(&cwd_str); str_free(&dest_dir); - str_free(&new_arg_str); + str_free(arg); exit(EXIT_FAILURE); } - if (str_find_char(&new_arg_str, ',') - && str_find_char(&new_arg_str, '@') + if (str_find_char(arg, ',') + && str_find_char(arg, '@') ) pkg.name.len--; pkg.src = get_pkgsrc(pkg); diff --git a/src/pkg_free.c b/src/pkg_free.c index 12659fe..5944c4d 100644 --- a/src/pkg_free.c +++ b/src/pkg_free.c @@ -7,5 +7,4 @@ void pkg_free(package_t *pkg) { str_free(&pkg->version); str_free(&pkg->target); str_free(&pkg->src); - str_free(&new_arg_str); } diff --git a/src/pkg_install.c b/src/pkg_install.c index b727d01..6a8f774 100644 --- a/src/pkg_install.c +++ b/src/pkg_install.c @@ -36,13 +36,13 @@ void install_dependencies(lua_State *L) { 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)); + str dep_url = mstr(lua_tostring(L, -1)); lua_pop(L, 1); + package_t pkg = pkg_create(&dep_url); + str_free(&dep_url); lua_getfield(L, -1, "version"); - str_slc dep_version = mstrslc(lua_tostring(L, -1)); + pkg.version = mstr(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) { @@ -157,21 +157,33 @@ void pkg_install(package_t *pkg) { //} 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)); + if (flags.verbose) 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)); + if (flags.verbose) 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 (flags.verbose) + 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 (flags.verbose) + 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 (flags.verbose) + log_info( + "attempting init.lua: 'build_systems'", + str_fmt(&pkg->name) + ); if (!install_success && config_install(pkg)) install_success = true; if (!install_success) { diff --git a/src/pkg_remove.c b/src/pkg_remove.c index 1d4be14..bec7a8f 100644 --- a/src/pkg_remove.c +++ b/src/pkg_remove.c @@ -164,7 +164,7 @@ static int remove_tree( return 0; } -void remove_pkg(package_t *pkg) { +void pkg_remove(package_t *pkg) { if (!is_directory(pkg->src.data)) { log_error("%.*s is not installed!", str_fmt(&pkg->name)); return; @@ -179,11 +179,13 @@ void remove_pkg(package_t *pkg) { if (!uninstall_available) if (config_uninstall(pkg)) uninstall_available = true; - if (!uninstall_available) + if (!uninstall_available) { log_error( "no uninstall function availible for package: %.*s", str_fmt(&pkg->name) ); + return; + } nftw(pkg->src.data, remove_installed, 64, FTW_PHYS); const char *last_slash = strrchr(pkg->src.data, '/'); @@ -195,5 +197,5 @@ void remove_pkg(package_t *pkg) { snprintf(target, sizeof(target), "%s", pkg->src.data); } nftw(pkg->src.data, remove_tree, 64, FTW_DEPTH | FTW_PHYS); - log_success("removed %s", str_fmt(&pkg->name)); + log_success("removed %.*s", str_fmt(&pkg->name)); } -- cgit v1.2.3