aboutsummaryrefslogtreecommitdiff
path: root/src/pkg_remove.c
diff options
context:
space:
mode:
authordacctal <donotcontactmevia@email.invalid>2026-07-18 07:16:31 +0000
committerdacctal <donotcontactmevia@email.invalid>2026-07-18 07:16:31 +0000
commit71b2cbcf9d1eb730fec8aa64436d7ea59d7cec08 (patch)
treecfd990e272d854063e6f4e98b686f3c29d7d13b4 /src/pkg_remove.c
parent7b5719b26119545e8877f2144c1476ec97d00abc (diff)
fix lua vm bugs, remove git repo when one already exists
Diffstat (limited to 'src/pkg_remove.c')
-rw-r--r--src/pkg_remove.c86
1 files changed, 39 insertions, 47 deletions
diff --git a/src/pkg_remove.c b/src/pkg_remove.c
index 9bc5305..3a0d0b2 100644
--- a/src/pkg_remove.c
+++ b/src/pkg_remove.c
@@ -17,6 +17,7 @@
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
+#define _XOPEN_SOURCE 700
#include <ftw.h>
#include <stdio.h>
@@ -25,12 +26,12 @@
#include <sys/stat.h>
#include <unistd.h>
-#include "pkgit_lua.h"
#include "files.h"
#include "globs.h"
#include "log.h"
+#include "pkgit_lua.h"
-bool target_uninstall(lua_State *L, char* lua_file, str *target) {
+bool target_uninstall(lua_State *L, char *lua_file, str *target) {
if (!lua_try_table(L, lua_file, target->data)) {
lua_pop(L, 1);
return false;
@@ -54,7 +55,8 @@ bool repo_uninstall(package_t *pkg) {
lua_pop(L, 2);
return false;
}
- if (!lua_try_table(L, "init.lua", "targets")) return false;
+ if (!lua_try_table(L, "init.lua", "targets"))
+ return false;
bool target_success = target_uninstall(L, "init.lua", &pkg->target);
lua_pop(L, 3);
return target_success;
@@ -69,12 +71,14 @@ bool bldit_uninstall(package_t *pkg) {
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;
+ 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;
+ if (!lua_try_table(B, "bldit.lua", "targets"))
+ return false;
bool target_success = target_uninstall(B, "bldit.lua", &pkg->target);
lua_pop(B, 2);
lua_close(B);
@@ -104,65 +108,50 @@ bool config_uninstall(package_t *pkg) {
}
target_success = target_uninstall(L, "init.lua", &pkg->target);
lua_pop(L, 2);
- if (target_success) break;
+ if (target_success)
+ break;
}
lua_pop(L, 1);
return target_success;
}
-static int remove_installed(
- const char *src_path, const struct stat *sb,
- int typeflag, struct FTW *ftwbuf
-) {
+static int remove_installed(const char *src_path, const struct stat *sb,
+ int typeflag, struct FTW *ftwbuf) {
(void)sb;
(void)ftwbuf;
if (typeflag == FTW_F) {
const char *filename = src_path + ftwbuf->base;
const char *ext = strrchr(filename, '.');
- if (!ext) ext = "";
+ if (!ext)
+ ext = "";
if (strncmp(ext, ".so", 3) == 0) {
char dest[MAX_PATH_LEN];
snprintf(dest, sizeof(dest), "%s/%s", inst_dirs.lib.data, filename);
if (file_exists(dest))
- remove(dest);
+ remove(dest);
} else if (access(src_path, X_OK) == 0) {
- if (
- strcmp(ext, ".sample") != 0 &&
- strcmp(filename, "bldit") != 0 &&
+ if (strcmp(ext, ".sample") != 0 && strcmp(filename, "bldit") != 0 &&
strcmp(filename, "build.sh") != 0 &&
- strcmp(filename, "compile.sh") != 0
- ) {
+ strcmp(filename, "compile.sh") != 0) {
char dest[MAX_PATH_LEN];
- snprintf(dest, sizeof(dest), "%s/%s", inst_dirs.bin.data, filename);
+ snprintf(dest, sizeof(dest), "%s/%s", inst_dirs.bin.data,
+ filename);
if (file_exists(dest))
- remove(dest);
+ remove(dest);
}
} else if (strcmp(ext, ".h") == 0) {
char dest[MAX_PATH_LEN];
- snprintf(dest, sizeof(dest), "%s/%s", inst_dirs.include.data, filename);
+ snprintf(dest, sizeof(dest), "%s/%s", inst_dirs.include.data,
+ filename);
if (file_exists(dest))
- remove(dest);
+ remove(dest);
}
}
return 0;
}
-static int remove_tree(
- const char *fpath, const struct stat *sb,
- int typeflag, struct FTW *ftwbuf
-) {
- (void)sb;
- (void)ftwbuf;
- if (typeflag == FTW_F || typeflag == FTW_SL) {
- unlink(fpath);
- } else if (typeflag == FTW_DP) {
- rmdir(fpath);
- }
- return 0;
-}
-
void pkg_remove(package_t *pkg) {
if (!is_directory(pkg->src.data)) {
log_error("%.*s is not installed!", str_fmt(&pkg->name));
@@ -171,30 +160,33 @@ void pkg_remove(package_t *pkg) {
chdir(pkg->src.data);
bool uninstall_available = false;
- if (!uninstall_available) if (repo_uninstall(pkg))
- uninstall_available = true;
- if (!uninstall_available) if (bldit_uninstall(pkg))
- uninstall_available = true;
- if (!uninstall_available) if (config_uninstall(pkg))
- uninstall_available = true;
+ if (!uninstall_available)
+ if (repo_uninstall(pkg))
+ uninstall_available = true;
+ if (!uninstall_available)
+ if (bldit_uninstall(pkg))
+ uninstall_available = true;
+ if (!uninstall_available)
+ if (config_uninstall(pkg))
+ uninstall_available = true;
if (!uninstall_available) {
- log_error(
- "no uninstall function availible for package: %.*s",
- str_fmt(&pkg->name)
- );
+ log_error("no uninstall function availible for package: %.*s",
+ str_fmt(&pkg->name));
return;
}
+ // TODO: refactor this
nftw(pkg->src.data, remove_installed, 64, FTW_PHYS);
const char *last_slash = strrchr(pkg->src.data, '/');
char target[MAX_PATH_LEN];
if (last_slash && last_slash != pkg->src.data) {
size_t parent_len = last_slash - pkg->src.data;
- snprintf(target, sizeof(target), "%.*s", (int)parent_len, pkg->src.data);
+ snprintf(target, sizeof(target), "%.*s", (int)parent_len,
+ pkg->src.data);
} else {
snprintf(target, sizeof(target), "%s", pkg->src.data);
}
- nftw(pkg->src.data, remove_tree, 64, FTW_DEPTH | FTW_PHYS);
+ remove_tree(pkg->src.data);
log_success("removed %.*s", str_fmt(&pkg->name));
}